mirror of
https://github.com/arduino/arduino-ide.git
synced 2025-11-14 04:39:28 +00:00
Compare commits
25 Commits
2.3.4
...
dependabot
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1a55a5c560 | ||
|
|
3d8f3fa3e3 | ||
|
|
c1e5fbc8a5 | ||
|
|
ee4f74d566 | ||
|
|
0f9f0d07b7 | ||
|
|
2f0414a5a1 | ||
|
|
e3319dab1a | ||
|
|
a669a43449 | ||
|
|
56ab874177 | ||
|
|
e36f393682 | ||
|
|
4d52bb2843 | ||
|
|
39c8db8e90 | ||
|
|
8aa3c28c50 | ||
|
|
d293595b89 | ||
|
|
4b0982ccb3 | ||
|
|
9b15695c60 | ||
|
|
0dff87e29c | ||
|
|
7dafe7b0d3 | ||
|
|
859d29d41a | ||
|
|
d298b3ffc9 | ||
|
|
9ab87bf8b5 | ||
|
|
5ec1915000 | ||
|
|
6d96e227eb | ||
|
|
1712f9ea9d | ||
|
|
6eef09efd8 |
75
.github/workflows/build.yml
vendored
75
.github/workflows/build.yml
vendored
@@ -172,6 +172,7 @@ jobs:
|
|||||||
is-nightly: ${{ steps.determination.outputs.is-nightly }}
|
is-nightly: ${{ steps.determination.outputs.is-nightly }}
|
||||||
channel-name: ${{ steps.determination.outputs.channel-name }}
|
channel-name: ${{ steps.determination.outputs.channel-name }}
|
||||||
publish-to-s3: ${{ steps.determination.outputs.publish-to-s3 }}
|
publish-to-s3: ${{ steps.determination.outputs.publish-to-s3 }}
|
||||||
|
environment: production
|
||||||
permissions: {}
|
permissions: {}
|
||||||
steps:
|
steps:
|
||||||
- name: Determine the type of build
|
- name: Determine the type of build
|
||||||
@@ -203,7 +204,7 @@ jobs:
|
|||||||
echo "is-nightly=$is_nightly" >> $GITHUB_OUTPUT
|
echo "is-nightly=$is_nightly" >> $GITHUB_OUTPUT
|
||||||
echo "channel-name=$channel_name" >> $GITHUB_OUTPUT
|
echo "channel-name=$channel_name" >> $GITHUB_OUTPUT
|
||||||
# Only attempt upload to Amazon S3 if the credentials are available.
|
# Only attempt upload to Amazon S3 if the credentials are available.
|
||||||
echo "publish-to-s3=${{ secrets.AWS_SECRET_ACCESS_KEY != '' }}" >> $GITHUB_OUTPUT
|
echo "publish-to-s3=${{ secrets.AWS_ROLE_ARN != '' }}" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
select-targets:
|
select-targets:
|
||||||
needs: build-type-determination
|
needs: build-type-determination
|
||||||
@@ -284,8 +285,6 @@ jobs:
|
|||||||
- build-type-determination
|
- build-type-determination
|
||||||
- select-targets
|
- select-targets
|
||||||
env:
|
env:
|
||||||
# https://github.blog/changelog/2024-03-07-github-actions-all-actions-will-run-on-node20-instead-of-node16-by-default/
|
|
||||||
ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true
|
|
||||||
# Location of artifacts generated by build.
|
# Location of artifacts generated by build.
|
||||||
BUILD_ARTIFACTS_PATH: electron-app/dist/build-artifacts
|
BUILD_ARTIFACTS_PATH: electron-app/dist/build-artifacts
|
||||||
# to skip passing signing credentials to electron-builder
|
# to skip passing signing credentials to electron-builder
|
||||||
@@ -296,6 +295,7 @@ jobs:
|
|||||||
SIGNTOOL_PATH: "C:/Program Files (x86)/Windows Kits/10/bin/10.0.19041.0/x86/signtool.exe"
|
SIGNTOOL_PATH: "C:/Program Files (x86)/Windows Kits/10/bin/10.0.19041.0/x86/signtool.exe"
|
||||||
WIN_CERT_PASSWORD: ${{ secrets[matrix.config.certificate-password-secret] }}
|
WIN_CERT_PASSWORD: ${{ secrets[matrix.config.certificate-password-secret] }}
|
||||||
WIN_CERT_CONTAINER_NAME: ${{ secrets[matrix.config.certificate-container] }}
|
WIN_CERT_CONTAINER_NAME: ${{ secrets[matrix.config.certificate-container] }}
|
||||||
|
PUPPETEER_SKIP_DOWNLOAD: true
|
||||||
|
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
@@ -317,7 +317,7 @@ jobs:
|
|||||||
if not exist "${{ matrix.config.working-directory }}" mklink /d "${{ matrix.config.working-directory }}" "C:\actions-runner\_work\arduino-ide\arduino-ide"
|
if not exist "${{ matrix.config.working-directory }}" mklink /d "${{ matrix.config.working-directory }}" "C:\actions-runner\_work\arduino-ide\arduino-ide"
|
||||||
|
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v5
|
||||||
|
|
||||||
|
|
||||||
- name: Install Node.js
|
- name: Install Node.js
|
||||||
@@ -340,7 +340,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Install Python 3.x
|
- name: Install Python 3.x
|
||||||
if: fromJSON(matrix.config.container) == null && runner.name != 'WINDOWS-SIGN-PC'
|
if: fromJSON(matrix.config.container) == null && runner.name != 'WINDOWS-SIGN-PC'
|
||||||
uses: actions/setup-python@v5
|
uses: actions/setup-python@v6
|
||||||
with:
|
with:
|
||||||
python-version: '3.11.x'
|
python-version: '3.11.x'
|
||||||
|
|
||||||
@@ -363,8 +363,6 @@ jobs:
|
|||||||
AC_USERNAME: ${{ secrets.AC_USERNAME }}
|
AC_USERNAME: ${{ secrets.AC_USERNAME }}
|
||||||
AC_PASSWORD: ${{ secrets.AC_PASSWORD }}
|
AC_PASSWORD: ${{ secrets.AC_PASSWORD }}
|
||||||
AC_TEAM_ID: ${{ secrets.AC_TEAM_ID }}
|
AC_TEAM_ID: ${{ secrets.AC_TEAM_ID }}
|
||||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
|
||||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
|
||||||
IS_NIGHTLY: ${{ needs.build-type-determination.outputs.is-nightly }}
|
IS_NIGHTLY: ${{ needs.build-type-determination.outputs.is-nightly }}
|
||||||
IS_RELEASE: ${{ needs.build-type-determination.outputs.is-release }}
|
IS_RELEASE: ${{ needs.build-type-determination.outputs.is-release }}
|
||||||
CAN_SIGN: ${{ secrets[matrix.config.certificate-secret] != '' }}
|
CAN_SIGN: ${{ secrets[matrix.config.certificate-secret] != '' }}
|
||||||
@@ -443,10 +441,10 @@ jobs:
|
|||||||
echo "CHANNEL_FILES_PATH=${{ runner.temp }}/channel-files" >> "$GITHUB_ENV"
|
echo "CHANNEL_FILES_PATH=${{ runner.temp }}/channel-files" >> "$GITHUB_ENV"
|
||||||
|
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v5
|
||||||
|
|
||||||
- name: Download staged-for-merge channel file artifacts
|
- name: Download staged-for-merge channel file artifacts
|
||||||
uses: actions/download-artifact@v4
|
uses: actions/download-artifact@v5
|
||||||
with:
|
with:
|
||||||
merge-multiple: true
|
merge-multiple: true
|
||||||
path: ${{ env.CHANNEL_FILES_PATH }}
|
path: ${{ env.CHANNEL_FILES_PATH }}
|
||||||
@@ -475,6 +473,12 @@ jobs:
|
|||||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
version: 3.x
|
version: 3.x
|
||||||
|
|
||||||
|
- name: Install dependencies (Linux only)
|
||||||
|
if: runner.os == 'Linux'
|
||||||
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y libx11-dev libxkbfile-dev libsecret-1-dev
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: yarn
|
run: yarn
|
||||||
|
|
||||||
@@ -509,7 +513,7 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Download job transfer artifact that contains ${{ matrix.artifact.name }} tester build
|
- name: Download job transfer artifact that contains ${{ matrix.artifact.name }} tester build
|
||||||
uses: actions/download-artifact@v4
|
uses: actions/download-artifact@v5
|
||||||
with:
|
with:
|
||||||
name: ${{ env.JOB_TRANSFER_ARTIFACT_PREFIX }}${{ matrix.artifact.job-transfer-artifact-suffix }}
|
name: ${{ env.JOB_TRANSFER_ARTIFACT_PREFIX }}${{ matrix.artifact.job-transfer-artifact-suffix }}
|
||||||
path: ${{ env.BUILD_ARTIFACTS_FOLDER }}
|
path: ${{ env.BUILD_ARTIFACTS_FOLDER }}
|
||||||
@@ -529,7 +533,7 @@ jobs:
|
|||||||
BODY: ${{ steps.changelog.outputs.BODY }}
|
BODY: ${{ steps.changelog.outputs.BODY }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v5
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0 # To fetch all history for all branches and tags.
|
fetch-depth: 0 # To fetch all history for all branches and tags.
|
||||||
|
|
||||||
@@ -588,23 +592,29 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
ARTIFACTS_FOLDER: build-artifacts
|
ARTIFACTS_FOLDER: build-artifacts
|
||||||
|
|
||||||
|
environment: production
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
id-token: write
|
||||||
|
contents: read
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Download all job transfer artifacts
|
- name: Download all job transfer artifacts
|
||||||
uses: actions/download-artifact@v4
|
uses: actions/download-artifact@v5
|
||||||
with:
|
with:
|
||||||
merge-multiple: true
|
merge-multiple: true
|
||||||
path: ${{ env.ARTIFACTS_FOLDER }}
|
path: ${{ env.ARTIFACTS_FOLDER }}
|
||||||
pattern: ${{ env.JOB_TRANSFER_ARTIFACT_PREFIX }}*
|
pattern: ${{ env.JOB_TRANSFER_ARTIFACT_PREFIX }}*
|
||||||
|
|
||||||
|
- name: Configure AWS Credentials for Nightly [S3]
|
||||||
|
uses: aws-actions/configure-aws-credentials@v4
|
||||||
|
with:
|
||||||
|
role-to-assume: ${{ secrets.AWS_ROLE_ARN }}
|
||||||
|
aws-region: us-east-1
|
||||||
|
|
||||||
- name: Publish Nightly [S3]
|
- name: Publish Nightly [S3]
|
||||||
uses: docker://plugins/s3
|
run: |
|
||||||
env:
|
aws s3 sync ${{ env.ARTIFACTS_FOLDER }} s3://${{ secrets.DOWNLOADS_BUCKET }}/arduino-ide/nightly
|
||||||
PLUGIN_SOURCE: '${{ env.ARTIFACTS_FOLDER }}/*'
|
|
||||||
PLUGIN_STRIP_PREFIX: '${{ env.ARTIFACTS_FOLDER }}/'
|
|
||||||
PLUGIN_TARGET: '/arduino-ide/nightly'
|
|
||||||
PLUGIN_BUCKET: ${{ secrets.DOWNLOADS_BUCKET }}
|
|
||||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
|
||||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
|
||||||
|
|
||||||
release:
|
release:
|
||||||
needs:
|
needs:
|
||||||
@@ -625,9 +635,15 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
ARTIFACTS_FOLDER: build-artifacts
|
ARTIFACTS_FOLDER: build-artifacts
|
||||||
|
|
||||||
|
environment: production
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
id-token: write
|
||||||
|
contents: write
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Download all job transfer artifacts
|
- name: Download all job transfer artifacts
|
||||||
uses: actions/download-artifact@v4
|
uses: actions/download-artifact@v5
|
||||||
with:
|
with:
|
||||||
merge-multiple: true
|
merge-multiple: true
|
||||||
path: ${{ env.ARTIFACTS_FOLDER }}
|
path: ${{ env.ARTIFACTS_FOLDER }}
|
||||||
@@ -648,16 +664,17 @@ jobs:
|
|||||||
file_glob: true
|
file_glob: true
|
||||||
body: ${{ needs.changelog.outputs.BODY }}
|
body: ${{ needs.changelog.outputs.BODY }}
|
||||||
|
|
||||||
|
- name: Configure AWS Credentials for Release [S3]
|
||||||
|
if: needs.build-type-determination.outputs.publish-to-s3 == 'true'
|
||||||
|
uses: aws-actions/configure-aws-credentials@v4
|
||||||
|
with:
|
||||||
|
role-to-assume: ${{ secrets.AWS_ROLE_ARN }}
|
||||||
|
aws-region: us-east-1
|
||||||
|
|
||||||
- name: Publish Release [S3]
|
- name: Publish Release [S3]
|
||||||
if: needs.build-type-determination.outputs.publish-to-s3 == 'true'
|
if: needs.build-type-determination.outputs.publish-to-s3 == 'true'
|
||||||
uses: docker://plugins/s3
|
run: |
|
||||||
env:
|
aws s3 sync ${{ env.ARTIFACTS_FOLDER }} s3://${{ secrets.DOWNLOADS_BUCKET }}/arduino-ide
|
||||||
PLUGIN_SOURCE: '${{ env.ARTIFACTS_FOLDER }}/*'
|
|
||||||
PLUGIN_STRIP_PREFIX: '${{ env.ARTIFACTS_FOLDER }}/'
|
|
||||||
PLUGIN_TARGET: '/arduino-ide'
|
|
||||||
PLUGIN_BUCKET: ${{ secrets.DOWNLOADS_BUCKET }}
|
|
||||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
|
||||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
# This job must run after all jobs that use the transfer artifact.
|
# This job must run after all jobs that use the transfer artifact.
|
||||||
|
|||||||
2
.github/workflows/check-containers.yml
vendored
2
.github/workflows/check-containers.yml
vendored
@@ -40,7 +40,7 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v5
|
||||||
|
|
||||||
- name: Build and push to local registry
|
- name: Build and push to local registry
|
||||||
uses: docker/build-push-action@v6
|
uses: docker/build-push-action@v6
|
||||||
|
|||||||
8
.github/workflows/check-i18n-task.yml
vendored
8
.github/workflows/check-i18n-task.yml
vendored
@@ -56,7 +56,7 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v5
|
||||||
|
|
||||||
- name: Install Node.js 18.17
|
- name: Install Node.js 18.17
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
@@ -76,6 +76,12 @@ jobs:
|
|||||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
version: 3.x
|
version: 3.x
|
||||||
|
|
||||||
|
- name: Install dependencies (Linux only)
|
||||||
|
if: runner.os == 'Linux'
|
||||||
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y libx11-dev libxkbfile-dev libsecret-1-dev
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: yarn install --immutable
|
run: yarn install --immutable
|
||||||
env:
|
env:
|
||||||
|
|||||||
8
.github/workflows/check-javascript.yml
vendored
8
.github/workflows/check-javascript.yml
vendored
@@ -65,7 +65,7 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v5
|
||||||
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
@@ -73,6 +73,12 @@ jobs:
|
|||||||
cache: yarn
|
cache: yarn
|
||||||
node-version: ${{ env.NODE_VERSION }}
|
node-version: ${{ env.NODE_VERSION }}
|
||||||
|
|
||||||
|
- name: Install Dependencies (Linux only)
|
||||||
|
if: runner.os == 'Linux'
|
||||||
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y libx11-dev libxkbfile-dev libsecret-1-dev
|
||||||
|
|
||||||
- name: Install npm package dependencies
|
- name: Install npm package dependencies
|
||||||
env:
|
env:
|
||||||
# Avoid failure of @vscode/ripgrep installation due to GitHub API rate limiting:
|
# Avoid failure of @vscode/ripgrep installation due to GitHub API rate limiting:
|
||||||
|
|||||||
8
.github/workflows/check-yarn.yml
vendored
8
.github/workflows/check-yarn.yml
vendored
@@ -64,7 +64,7 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v5
|
||||||
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
@@ -72,6 +72,12 @@ jobs:
|
|||||||
cache: yarn
|
cache: yarn
|
||||||
node-version: ${{ env.NODE_VERSION }}
|
node-version: ${{ env.NODE_VERSION }}
|
||||||
|
|
||||||
|
- name: Install Dependencies (Linux only)
|
||||||
|
if: runner.os == 'Linux'
|
||||||
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y libx11-dev libxkbfile-dev libsecret-1-dev
|
||||||
|
|
||||||
- name: Install npm package dependencies
|
- name: Install npm package dependencies
|
||||||
env:
|
env:
|
||||||
# Avoid failure of @vscode/ripgrep installation due to GitHub API rate limiting:
|
# Avoid failure of @vscode/ripgrep installation due to GitHub API rate limiting:
|
||||||
|
|||||||
29
.github/workflows/compose-full-changelog.yml
vendored
29
.github/workflows/compose-full-changelog.yml
vendored
@@ -14,9 +14,14 @@ jobs:
|
|||||||
create-changelog:
|
create-changelog:
|
||||||
if: github.repository == 'arduino/arduino-ide'
|
if: github.repository == 'arduino/arduino-ide'
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
id-token: write
|
||||||
|
contents: read
|
||||||
|
environment: production
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v5
|
||||||
|
|
||||||
- name: Install Node.js
|
- name: Install Node.js
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
@@ -24,6 +29,12 @@ jobs:
|
|||||||
node-version: ${{ env.NODE_VERSION }}
|
node-version: ${{ env.NODE_VERSION }}
|
||||||
registry-url: 'https://registry.npmjs.org'
|
registry-url: 'https://registry.npmjs.org'
|
||||||
|
|
||||||
|
- name: Install Dependencies (Linux only)
|
||||||
|
if: runner.os == 'Linux'
|
||||||
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y libx11-dev libxkbfile-dev libsecret-1-dev
|
||||||
|
|
||||||
- name: Get Tag
|
- name: Get Tag
|
||||||
id: tag_name
|
id: tag_name
|
||||||
run: |
|
run: |
|
||||||
@@ -44,12 +55,12 @@ jobs:
|
|||||||
# Compose changelog
|
# Compose changelog
|
||||||
yarn run compose-changelog "${{ github.workspace }}/${{ env.CHANGELOG_ARTIFACTS }}/$CHANGELOG_FILE_NAME"
|
yarn run compose-changelog "${{ github.workspace }}/${{ env.CHANGELOG_ARTIFACTS }}/$CHANGELOG_FILE_NAME"
|
||||||
|
|
||||||
|
- name: Configure AWS Credentials for Changelog [S3]
|
||||||
|
uses: aws-actions/configure-aws-credentials@v4
|
||||||
|
with:
|
||||||
|
role-to-assume: ${{ secrets.AWS_ROLE_ARN }}
|
||||||
|
aws-region: us-east-1
|
||||||
|
|
||||||
- name: Publish Changelog [S3]
|
- name: Publish Changelog [S3]
|
||||||
uses: docker://plugins/s3
|
run: |
|
||||||
env:
|
aws s3 sync ${{ env.CHANGELOG_ARTIFACTS }} s3://${{ secrets.DOWNLOADS_BUCKET }}/arduino-ide/changelog
|
||||||
PLUGIN_SOURCE: '${{ env.CHANGELOG_ARTIFACTS }}/*'
|
|
||||||
PLUGIN_STRIP_PREFIX: '${{ env.CHANGELOG_ARTIFACTS }}/'
|
|
||||||
PLUGIN_TARGET: '/arduino-ide/changelog'
|
|
||||||
PLUGIN_BUCKET: ${{ secrets.DOWNLOADS_BUCKET }}
|
|
||||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
|
||||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
|
||||||
8
.github/workflows/i18n-nightly-push.yml
vendored
8
.github/workflows/i18n-nightly-push.yml
vendored
@@ -14,7 +14,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v5
|
||||||
|
|
||||||
- name: Install Node.js 18.17
|
- name: Install Node.js 18.17
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
@@ -34,6 +34,12 @@ jobs:
|
|||||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
version: 3.x
|
version: 3.x
|
||||||
|
|
||||||
|
- name: Install dependencies (Linux only)
|
||||||
|
if: runner.os == 'Linux'
|
||||||
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y libx11-dev libxkbfile-dev libsecret-1-dev
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: yarn install --immutable
|
run: yarn install --immutable
|
||||||
|
|
||||||
|
|||||||
8
.github/workflows/i18n-weekly-pull.yml
vendored
8
.github/workflows/i18n-weekly-pull.yml
vendored
@@ -14,7 +14,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v5
|
||||||
|
|
||||||
- name: Install Node.js 18.17
|
- name: Install Node.js 18.17
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
@@ -34,6 +34,12 @@ jobs:
|
|||||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
version: 3.x
|
version: 3.x
|
||||||
|
|
||||||
|
- name: Install dependencies (Linux only)
|
||||||
|
if: runner.os == 'Linux'
|
||||||
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y libx11-dev libxkbfile-dev libsecret-1-dev
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: yarn install --immutable
|
run: yarn install --immutable
|
||||||
|
|
||||||
|
|||||||
2
.github/workflows/push-container-images.yml
vendored
2
.github/workflows/push-container-images.yml
vendored
@@ -43,7 +43,7 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v5
|
||||||
|
|
||||||
- name: Log in to the Container registry
|
- name: Log in to the Container registry
|
||||||
uses: docker/login-action@v3
|
uses: docker/login-action@v3
|
||||||
|
|||||||
6
.github/workflows/sync-labels.yml
vendored
6
.github/workflows/sync-labels.yml
vendored
@@ -27,7 +27,7 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v5
|
||||||
|
|
||||||
- name: Download JSON schema for labels configuration file
|
- name: Download JSON schema for labels configuration file
|
||||||
id: download-schema
|
id: download-schema
|
||||||
@@ -106,10 +106,10 @@ jobs:
|
|||||||
echo "flag=--dry-run" >> $GITHUB_OUTPUT
|
echo "flag=--dry-run" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v5
|
||||||
|
|
||||||
- name: Download configuration file artifacts
|
- name: Download configuration file artifacts
|
||||||
uses: actions/download-artifact@v4
|
uses: actions/download-artifact@v5
|
||||||
with:
|
with:
|
||||||
merge-multiple: true
|
merge-multiple: true
|
||||||
pattern: ${{ env.CONFIGURATIONS_ARTIFACT_PREFIX }}*
|
pattern: ${{ env.CONFIGURATIONS_ARTIFACT_PREFIX }}*
|
||||||
|
|||||||
10
.github/workflows/test-javascript.yml
vendored
10
.github/workflows/test-javascript.yml
vendored
@@ -82,7 +82,7 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v5
|
||||||
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
@@ -92,7 +92,7 @@ jobs:
|
|||||||
|
|
||||||
# See: https://github.com/eclipse-theia/theia/blob/master/doc/Developing.md#prerequisites
|
# See: https://github.com/eclipse-theia/theia/blob/master/doc/Developing.md#prerequisites
|
||||||
- name: Install Python
|
- name: Install Python
|
||||||
uses: actions/setup-python@v5
|
uses: actions/setup-python@v6
|
||||||
with:
|
with:
|
||||||
python-version: '3.11.x'
|
python-version: '3.11.x'
|
||||||
|
|
||||||
@@ -107,6 +107,12 @@ jobs:
|
|||||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
version: 3.x
|
version: 3.x
|
||||||
|
|
||||||
|
- name: Install Dependencies (Linux only)
|
||||||
|
if: runner.os == 'Linux'
|
||||||
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y libx11-dev libxkbfile-dev libsecret-1-dev
|
||||||
|
|
||||||
- name: Install npm package dependencies
|
- name: Install npm package dependencies
|
||||||
env:
|
env:
|
||||||
# Avoid failure of @vscode/ripgrep installation due to GitHub API rate limiting:
|
# Avoid failure of @vscode/ripgrep installation due to GitHub API rate limiting:
|
||||||
|
|||||||
8
.github/workflows/themes-weekly-pull.yml
vendored
8
.github/workflows/themes-weekly-pull.yml
vendored
@@ -16,7 +16,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v5
|
||||||
|
|
||||||
- name: Install Node.js
|
- name: Install Node.js
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
@@ -36,6 +36,12 @@ jobs:
|
|||||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
version: 3.x
|
version: 3.x
|
||||||
|
|
||||||
|
- name: Install dependencies (Linux only)
|
||||||
|
if: runner.os == 'Linux'
|
||||||
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y libx11-dev libxkbfile-dev libsecret-1-dev
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: yarn install --immutable
|
run: yarn install --immutable
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "arduino-ide-extension",
|
"name": "arduino-ide-extension",
|
||||||
"version": "2.3.4",
|
"version": "2.3.7",
|
||||||
"description": "An extension for Theia building the Arduino IDE",
|
"description": "An extension for Theia building the Arduino IDE",
|
||||||
"license": "AGPL-3.0-or-later",
|
"license": "AGPL-3.0-or-later",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
@@ -24,28 +24,29 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@grpc/grpc-js": "^1.8.14",
|
"@grpc/grpc-js": "^1.8.14",
|
||||||
"@theia/application-package": "1.41.0",
|
"@theia/application-package": "1.57.0",
|
||||||
"@theia/core": "1.41.0",
|
"@theia/core": "1.57.0",
|
||||||
"@theia/debug": "1.41.0",
|
"@theia/debug": "1.57.0",
|
||||||
"@theia/editor": "1.41.0",
|
"@theia/editor": "1.57.0",
|
||||||
"@theia/electron": "1.41.0",
|
"@theia/electron": "1.57.0",
|
||||||
"@theia/filesystem": "1.41.0",
|
"@theia/filesystem": "1.57.0",
|
||||||
"@theia/keymaps": "1.41.0",
|
"@theia/keymaps": "1.57.0",
|
||||||
"@theia/markers": "1.41.0",
|
"@theia/markers": "1.57.0",
|
||||||
"@theia/messages": "1.41.0",
|
"@theia/messages": "1.57.0",
|
||||||
"@theia/monaco": "1.41.0",
|
"@theia/monaco": "1.57.0",
|
||||||
"@theia/monaco-editor-core": "1.72.3",
|
"@theia/monaco-editor-core": "1.83.101",
|
||||||
"@theia/navigator": "1.41.0",
|
"@theia/navigator": "1.57.0",
|
||||||
"@theia/outline-view": "1.41.0",
|
"@theia/outline-view": "1.57.0",
|
||||||
"@theia/output": "1.41.0",
|
"@theia/output": "1.57.0",
|
||||||
"@theia/plugin-ext": "1.41.0",
|
"@theia/plugin-ext": "1.57.0",
|
||||||
"@theia/plugin-ext-vscode": "1.41.0",
|
"@theia/plugin-ext-vscode": "1.57.0",
|
||||||
"@theia/preferences": "1.41.0",
|
"@theia/preferences": "1.57.0",
|
||||||
"@theia/scm": "1.41.0",
|
"@theia/scm": "1.57.0",
|
||||||
"@theia/search-in-workspace": "1.41.0",
|
"@theia/search-in-workspace": "1.57.0",
|
||||||
"@theia/terminal": "1.41.0",
|
"@theia/terminal": "1.57.0",
|
||||||
"@theia/typehierarchy": "1.41.0",
|
"@theia/test": "1.57.0",
|
||||||
"@theia/workspace": "1.41.0",
|
"@theia/typehierarchy": "1.57.0",
|
||||||
|
"@theia/workspace": "1.57.0",
|
||||||
"@tippyjs/react": "^4.2.5",
|
"@tippyjs/react": "^4.2.5",
|
||||||
"@types/auth0-js": "^9.21.3",
|
"@types/auth0-js": "^9.21.3",
|
||||||
"@types/btoa": "^1.2.3",
|
"@types/btoa": "^1.2.3",
|
||||||
@@ -57,7 +58,6 @@
|
|||||||
"@types/node-fetch": "^2.5.7",
|
"@types/node-fetch": "^2.5.7",
|
||||||
"@types/p-queue": "^2.3.1",
|
"@types/p-queue": "^2.3.1",
|
||||||
"@types/ps-tree": "^1.1.0",
|
"@types/ps-tree": "^1.1.0",
|
||||||
"@types/react-tabs": "^2.3.2",
|
|
||||||
"@types/temp": "^0.8.34",
|
"@types/temp": "^0.8.34",
|
||||||
"arduino-serial-plotter-webapp": "0.2.0",
|
"arduino-serial-plotter-webapp": "0.2.0",
|
||||||
"async-mutex": "^0.3.0",
|
"async-mutex": "^0.3.0",
|
||||||
@@ -99,7 +99,7 @@
|
|||||||
"react-markdown": "^8.0.0",
|
"react-markdown": "^8.0.0",
|
||||||
"react-perfect-scrollbar": "^1.5.8",
|
"react-perfect-scrollbar": "^1.5.8",
|
||||||
"react-select": "^5.6.0",
|
"react-select": "^5.6.0",
|
||||||
"react-tabs": "^3.1.2",
|
"react-tabs": "^6.1.0",
|
||||||
"react-window": "^1.8.6",
|
"react-window": "^1.8.6",
|
||||||
"semver": "^7.3.2",
|
"semver": "^7.3.2",
|
||||||
"string-natural-compare": "^2.0.3",
|
"string-natural-compare": "^2.0.3",
|
||||||
@@ -126,7 +126,7 @@
|
|||||||
"mockdate": "^3.0.5",
|
"mockdate": "^3.0.5",
|
||||||
"moment": "^2.24.0",
|
"moment": "^2.24.0",
|
||||||
"ncp": "^2.0.0",
|
"ncp": "^2.0.0",
|
||||||
"rimraf": "^2.6.1"
|
"rimraf": "^5.0.0"
|
||||||
},
|
},
|
||||||
"optionalDependencies": {
|
"optionalDependencies": {
|
||||||
"@pingghost/protoc": "^1.0.2",
|
"@pingghost/protoc": "^1.0.2",
|
||||||
@@ -172,7 +172,7 @@
|
|||||||
],
|
],
|
||||||
"arduino": {
|
"arduino": {
|
||||||
"arduino-cli": {
|
"arduino-cli": {
|
||||||
"version": "1.1.1"
|
"version": "1.2.0"
|
||||||
},
|
},
|
||||||
"arduino-fwuploader": {
|
"arduino-fwuploader": {
|
||||||
"version": "2.4.1"
|
"version": "2.4.1"
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
// @ts-check
|
// @ts-check
|
||||||
|
|
||||||
// The version to use.
|
// The version to use.
|
||||||
const version = '1.10.1';
|
const version = '1.10.2';
|
||||||
|
|
||||||
(async () => {
|
(async () => {
|
||||||
const os = require('node:os');
|
const os = require('node:os');
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { ColorContribution } from '@theia/core/lib/browser/color-application-contribution';
|
import { ColorContribution } from '@theia/core/lib/browser/color-application-contribution';
|
||||||
import { ColorRegistry } from '@theia/core/lib/browser/color-registry';
|
import { ColorRegistry } from '@theia/core/lib/browser/color-registry';
|
||||||
import { CommonMenus } from '@theia/core/lib/browser/common-frontend-contribution';
|
import { CommonMenus } from '@theia/core/lib/browser/common-frontend-contribution';
|
||||||
import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application';
|
import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application-contribution';
|
||||||
import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state';
|
import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state';
|
||||||
import {
|
import {
|
||||||
TabBarToolbarContribution,
|
TabBarToolbarContribution,
|
||||||
|
|||||||
@@ -1,18 +1,12 @@
|
|||||||
import '../../src/browser/style/index.css';
|
import '../../src/browser/style/index.css';
|
||||||
import {
|
import { Container, ContainerModule } from '@theia/core/shared/inversify';
|
||||||
Container,
|
|
||||||
ContainerModule,
|
|
||||||
interfaces,
|
|
||||||
} from '@theia/core/shared/inversify';
|
|
||||||
import { WidgetFactory } from '@theia/core/lib/browser/widget-manager';
|
import { WidgetFactory } from '@theia/core/lib/browser/widget-manager';
|
||||||
import { CommandContribution } from '@theia/core/lib/common/command';
|
import { CommandContribution } from '@theia/core/lib/common/command';
|
||||||
import { bindViewContribution } from '@theia/core/lib/browser/shell/view-contribution';
|
import { bindViewContribution } from '@theia/core/lib/browser/shell/view-contribution';
|
||||||
import { TabBarToolbarContribution } from '@theia/core/lib/browser/shell/tab-bar-toolbar';
|
import { TabBarToolbarContribution } from '@theia/core/lib/browser/shell/tab-bar-toolbar';
|
||||||
import { WebSocketConnectionProvider } from '@theia/core/lib/browser/messaging/ws-connection-provider';
|
import { WebSocketConnectionProvider } from '@theia/core/lib/browser/messaging/ws-connection-provider';
|
||||||
import {
|
import { FrontendApplication as TheiaFrontendApplication } from '@theia/core/lib/browser/frontend-application';
|
||||||
FrontendApplicationContribution,
|
import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application-contribution';
|
||||||
FrontendApplication as TheiaFrontendApplication,
|
|
||||||
} from '@theia/core/lib/browser/frontend-application';
|
|
||||||
import { LibraryListWidget } from './library/library-list-widget';
|
import { LibraryListWidget } from './library/library-list-widget';
|
||||||
import { ArduinoFrontendContribution } from './arduino-frontend-contribution';
|
import { ArduinoFrontendContribution } from './arduino-frontend-contribution';
|
||||||
import {
|
import {
|
||||||
@@ -57,8 +51,6 @@ import {
|
|||||||
DockPanelRenderer as TheiaDockPanelRenderer,
|
DockPanelRenderer as TheiaDockPanelRenderer,
|
||||||
TabBarRendererFactory,
|
TabBarRendererFactory,
|
||||||
ContextMenuRenderer,
|
ContextMenuRenderer,
|
||||||
createTreeContainer,
|
|
||||||
TreeWidget,
|
|
||||||
} from '@theia/core/lib/browser';
|
} from '@theia/core/lib/browser';
|
||||||
import { MenuContribution } from '@theia/core/lib/common/menu';
|
import { MenuContribution } from '@theia/core/lib/common/menu';
|
||||||
import {
|
import {
|
||||||
@@ -97,7 +89,6 @@ import {
|
|||||||
ArduinoDaemonPath,
|
ArduinoDaemonPath,
|
||||||
ArduinoDaemon,
|
ArduinoDaemon,
|
||||||
} from '../common/protocol/arduino-daemon';
|
} from '../common/protocol/arduino-daemon';
|
||||||
import { EditorCommandContribution as TheiaEditorCommandContribution } from '@theia/editor/lib/browser';
|
|
||||||
import {
|
import {
|
||||||
FrontendConnectionStatusService,
|
FrontendConnectionStatusService,
|
||||||
ApplicationConnectionStatusContribution,
|
ApplicationConnectionStatusContribution,
|
||||||
@@ -131,7 +122,10 @@ import { OpenSketch } from './contributions/open-sketch';
|
|||||||
import { Close } from './contributions/close';
|
import { Close } from './contributions/close';
|
||||||
import { SaveAsSketch } from './contributions/save-as-sketch';
|
import { SaveAsSketch } from './contributions/save-as-sketch';
|
||||||
import { SaveSketch } from './contributions/save-sketch';
|
import { SaveSketch } from './contributions/save-sketch';
|
||||||
import { VerifySketch } from './contributions/verify-sketch';
|
import {
|
||||||
|
CompileSummaryProvider,
|
||||||
|
VerifySketch,
|
||||||
|
} from './contributions/verify-sketch';
|
||||||
import { UploadSketch } from './contributions/upload-sketch';
|
import { UploadSketch } from './contributions/upload-sketch';
|
||||||
import { CommonFrontendContribution } from './theia/core/common-frontend-contribution';
|
import { CommonFrontendContribution } from './theia/core/common-frontend-contribution';
|
||||||
import { EditContributions } from './contributions/edit-contributions';
|
import { EditContributions } from './contributions/edit-contributions';
|
||||||
@@ -183,7 +177,6 @@ import {
|
|||||||
import { About } from './contributions/about';
|
import { About } from './contributions/about';
|
||||||
import { IconThemeService } from '@theia/core/lib/browser/icon-theme-service';
|
import { IconThemeService } from '@theia/core/lib/browser/icon-theme-service';
|
||||||
import { TabBarRenderer } from './theia/core/tab-bars';
|
import { TabBarRenderer } from './theia/core/tab-bars';
|
||||||
import { EditorCommandContribution } from './theia/editor/editor-command';
|
|
||||||
import { NavigatorTabBarDecorator as TheiaNavigatorTabBarDecorator } from '@theia/navigator/lib/browser/navigator-tab-bar-decorator';
|
import { NavigatorTabBarDecorator as TheiaNavigatorTabBarDecorator } from '@theia/navigator/lib/browser/navigator-tab-bar-decorator';
|
||||||
import { NavigatorTabBarDecorator } from './theia/navigator/navigator-tab-bar-decorator';
|
import { NavigatorTabBarDecorator } from './theia/navigator/navigator-tab-bar-decorator';
|
||||||
import { Debug, DebugDisabledStatusMessageSource } from './contributions/debug';
|
import { Debug, DebugDisabledStatusMessageSource } from './contributions/debug';
|
||||||
@@ -272,7 +265,7 @@ import {
|
|||||||
IDEUpdaterDialog,
|
IDEUpdaterDialog,
|
||||||
IDEUpdaterDialogProps,
|
IDEUpdaterDialogProps,
|
||||||
} from './dialogs/ide-updater/ide-updater-dialog';
|
} from './dialogs/ide-updater/ide-updater-dialog';
|
||||||
import { ElectronIpcConnectionProvider } from '@theia/core/lib/electron-browser/messaging/electron-ipc-connection-provider';
|
import { ElectronIpcConnectionProvider } from '@theia/core/lib/electron-browser/messaging/electron-ipc-connection-source';
|
||||||
import { MonitorModel } from './monitor-model';
|
import { MonitorModel } from './monitor-model';
|
||||||
import { MonitorManagerProxyClientImpl } from './monitor-manager-proxy-client-impl';
|
import { MonitorManagerProxyClientImpl } from './monitor-manager-proxy-client-impl';
|
||||||
import { EditorManager as TheiaEditorManager } from '@theia/editor/lib/browser/editor-manager';
|
import { EditorManager as TheiaEditorManager } from '@theia/editor/lib/browser/editor-manager';
|
||||||
@@ -292,10 +285,6 @@ import { PreferenceTreeGenerator } from './theia/preferences/preference-tree-gen
|
|||||||
import { PreferenceTreeGenerator as TheiaPreferenceTreeGenerator } from '@theia/preferences/lib/browser/util/preference-tree-generator';
|
import { PreferenceTreeGenerator as TheiaPreferenceTreeGenerator } from '@theia/preferences/lib/browser/util/preference-tree-generator';
|
||||||
import { AboutDialog } from './theia/core/about-dialog';
|
import { AboutDialog } from './theia/core/about-dialog';
|
||||||
import { AboutDialog as TheiaAboutDialog } from '@theia/core/lib/browser/about-dialog';
|
import { AboutDialog as TheiaAboutDialog } from '@theia/core/lib/browser/about-dialog';
|
||||||
import {
|
|
||||||
SurveyNotificationService,
|
|
||||||
SurveyNotificationServicePath,
|
|
||||||
} from '../common/protocol/survey-service';
|
|
||||||
import { WindowContribution } from './theia/core/window-contribution';
|
import { WindowContribution } from './theia/core/window-contribution';
|
||||||
import { WindowContribution as TheiaWindowContribution } from '@theia/core/lib/browser/window-contribution';
|
import { WindowContribution as TheiaWindowContribution } from '@theia/core/lib/browser/window-contribution';
|
||||||
import { CoreErrorHandler } from './contributions/core-error-handler';
|
import { CoreErrorHandler } from './contributions/core-error-handler';
|
||||||
@@ -378,19 +367,13 @@ import { DebugSessionWidget } from '@theia/debug/lib/browser/view/debug-session-
|
|||||||
import { DebugConfigurationWidget } from './theia/debug/debug-configuration-widget';
|
import { DebugConfigurationWidget } from './theia/debug/debug-configuration-widget';
|
||||||
import { DebugConfigurationWidget as TheiaDebugConfigurationWidget } from '@theia/debug/lib/browser/view/debug-configuration-widget';
|
import { DebugConfigurationWidget as TheiaDebugConfigurationWidget } from '@theia/debug/lib/browser/view/debug-configuration-widget';
|
||||||
import { DebugToolBar } from '@theia/debug/lib/browser/view/debug-toolbar-widget';
|
import { DebugToolBar } from '@theia/debug/lib/browser/view/debug-toolbar-widget';
|
||||||
import {
|
|
||||||
PluginTree,
|
|
||||||
PluginTreeModel,
|
|
||||||
TreeViewWidgetOptions,
|
|
||||||
VIEW_ITEM_CONTEXT_MENU,
|
|
||||||
} from '@theia/plugin-ext/lib/main/browser/view/tree-view-widget';
|
|
||||||
import { TreeViewDecoratorService } from '@theia/plugin-ext/lib/main/browser/view/tree-view-decorator-service';
|
|
||||||
import { PLUGIN_VIEW_DATA_FACTORY_ID } from '@theia/plugin-ext/lib/main/browser/view/plugin-view-registry';
|
|
||||||
import { TreeViewWidget } from './theia/plugin-ext/tree-view-widget';
|
|
||||||
import {
|
import {
|
||||||
VersionWelcomeDialog,
|
VersionWelcomeDialog,
|
||||||
VersionWelcomeDialogProps,
|
VersionWelcomeDialogProps,
|
||||||
} from './dialogs/version-welcome-dialog';
|
} from './dialogs/version-welcome-dialog';
|
||||||
|
import { TestViewContribution as TheiaTestViewContribution } from '@theia/test/lib/browser/view/test-view-contribution';
|
||||||
|
import { TestViewContribution } from './theia/test/test-view-contribution';
|
||||||
|
|
||||||
// Hack to fix copy/cut/paste issue after electron version update in Theia.
|
// Hack to fix copy/cut/paste issue after electron version update in Theia.
|
||||||
// https://github.com/eclipse-theia/theia/issues/12487
|
// https://github.com/eclipse-theia/theia/issues/12487
|
||||||
@@ -571,15 +554,6 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => {
|
|||||||
WorkspaceVariableContribution
|
WorkspaceVariableContribution
|
||||||
);
|
);
|
||||||
|
|
||||||
bind(SurveyNotificationService)
|
|
||||||
.toDynamicValue((context) => {
|
|
||||||
return ElectronIpcConnectionProvider.createProxy(
|
|
||||||
context.container,
|
|
||||||
SurveyNotificationServicePath
|
|
||||||
);
|
|
||||||
})
|
|
||||||
.inSingletonScope();
|
|
||||||
|
|
||||||
// Layout and shell customizations.
|
// Layout and shell customizations.
|
||||||
rebind(TheiaOutlineViewContribution)
|
rebind(TheiaOutlineViewContribution)
|
||||||
.to(OutlineViewContribution)
|
.to(OutlineViewContribution)
|
||||||
@@ -788,6 +762,8 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => {
|
|||||||
Contribution.configure(bind, BoardsDataMenuUpdater);
|
Contribution.configure(bind, BoardsDataMenuUpdater);
|
||||||
Contribution.configure(bind, AutoSelectProgrammer);
|
Contribution.configure(bind, AutoSelectProgrammer);
|
||||||
|
|
||||||
|
bind(CompileSummaryProvider).toService(VerifySketch);
|
||||||
|
|
||||||
bindContributionProvider(bind, StartupTaskProvider);
|
bindContributionProvider(bind, StartupTaskProvider);
|
||||||
bind(StartupTaskProvider).toService(BoardsServiceProvider); // to reuse the boards config in another window
|
bind(StartupTaskProvider).toService(BoardsServiceProvider); // to reuse the boards config in another window
|
||||||
|
|
||||||
@@ -851,13 +827,6 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
// Workaround for https://github.com/eclipse-theia/theia/issues/8722
|
|
||||||
// Do not trigger a save on IDE startup if `"editor.autoSave": "on"` was set as a preference.
|
|
||||||
// Note: `"editor.autoSave" was renamed to `"files.autoSave" and `"on"` was replaced with three
|
|
||||||
// different cases, but we treat `!== 'off'` as auto save enabled. (https://github.com/eclipse-theia/theia/issues/10812)
|
|
||||||
bind(EditorCommandContribution).toSelf().inSingletonScope();
|
|
||||||
rebind(TheiaEditorCommandContribution).toService(EditorCommandContribution);
|
|
||||||
|
|
||||||
// Silent the badge decoration in the Explorer view.
|
// Silent the badge decoration in the Explorer view.
|
||||||
bind(NavigatorTabBarDecorator).toSelf().inSingletonScope();
|
bind(NavigatorTabBarDecorator).toSelf().inSingletonScope();
|
||||||
rebind(TheiaNavigatorTabBarDecorator).toService(NavigatorTabBarDecorator);
|
rebind(TheiaNavigatorTabBarDecorator).toService(NavigatorTabBarDecorator);
|
||||||
@@ -1107,42 +1076,7 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => {
|
|||||||
TerminalFrontendContribution
|
TerminalFrontendContribution
|
||||||
);
|
);
|
||||||
|
|
||||||
bindViewsWelcome_TheiaGH14309({ bind, widget: TreeViewWidget });
|
// Hides the Test Explorer from the side-bar
|
||||||
|
bind(TestViewContribution).toSelf().inSingletonScope();
|
||||||
|
rebind(TheiaTestViewContribution).toService(TestViewContribution);
|
||||||
});
|
});
|
||||||
|
|
||||||
// Align the viewsWelcome rendering with VS Code (https://github.com/eclipse-theia/theia/issues/14309)
|
|
||||||
// Copied from Theia code but with customized TreeViewWidget with the customized viewsWelcome rendering
|
|
||||||
// https://github.com/eclipse-theia/theia/blob/0c5f69455d9ee355b1a7ca510ffa63d2b20f0c77/packages/plugin-ext/src/main/browser/plugin-ext-frontend-module.ts#L159-L181
|
|
||||||
function bindViewsWelcome_TheiaGH14309({
|
|
||||||
bind,
|
|
||||||
widget,
|
|
||||||
}: {
|
|
||||||
bind: interfaces.Bind;
|
|
||||||
widget: interfaces.Newable<TreeWidget>;
|
|
||||||
}) {
|
|
||||||
bind(WidgetFactory)
|
|
||||||
.toDynamicValue(({ container }) => ({
|
|
||||||
id: PLUGIN_VIEW_DATA_FACTORY_ID,
|
|
||||||
createWidget: (options: TreeViewWidgetOptions) => {
|
|
||||||
const props = {
|
|
||||||
contextMenuPath: VIEW_ITEM_CONTEXT_MENU,
|
|
||||||
expandOnlyOnExpansionToggleClick: true,
|
|
||||||
expansionTogglePadding: 22,
|
|
||||||
globalSelection: true,
|
|
||||||
leftPadding: 8,
|
|
||||||
search: true,
|
|
||||||
multiSelect: options.multiSelect,
|
|
||||||
};
|
|
||||||
const child = createTreeContainer(container, {
|
|
||||||
props,
|
|
||||||
tree: PluginTree,
|
|
||||||
model: PluginTreeModel,
|
|
||||||
widget,
|
|
||||||
decoratorService: TreeViewDecoratorService,
|
|
||||||
});
|
|
||||||
child.bind(TreeViewWidgetOptions).toConstantValue(options);
|
|
||||||
return child.get(TreeWidget);
|
|
||||||
},
|
|
||||||
}))
|
|
||||||
.inSingletonScope();
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -280,14 +280,6 @@ const properties: ArduinoPreferenceSchemaProperties = {
|
|||||||
),
|
),
|
||||||
default: 'https://auth.arduino.cc/login#/register',
|
default: 'https://auth.arduino.cc/login#/register',
|
||||||
},
|
},
|
||||||
'arduino.survey.notification': {
|
|
||||||
type: 'boolean',
|
|
||||||
description: nls.localize(
|
|
||||||
'arduino/preferences/survey.notification',
|
|
||||||
'True if users should be notified if a survey is available. True by default.'
|
|
||||||
),
|
|
||||||
default: true,
|
|
||||||
},
|
|
||||||
'arduino.cli.daemon.debug': {
|
'arduino.cli.daemon.debug': {
|
||||||
type: 'boolean',
|
type: 'boolean',
|
||||||
description: nls.localize(
|
description: nls.localize(
|
||||||
@@ -355,7 +347,6 @@ export interface ArduinoConfiguration {
|
|||||||
'arduino.auth.domain': string;
|
'arduino.auth.domain': string;
|
||||||
'arduino.auth.audience': string;
|
'arduino.auth.audience': string;
|
||||||
'arduino.auth.registerUri': string;
|
'arduino.auth.registerUri': string;
|
||||||
'arduino.survey.notification': boolean;
|
|
||||||
'arduino.cli.daemon.debug': boolean;
|
'arduino.cli.daemon.debug': boolean;
|
||||||
'arduino.sketch.inoBlueprint': string;
|
'arduino.sketch.inoBlueprint': string;
|
||||||
'arduino.checkForUpdates': boolean;
|
'arduino.checkForUpdates': boolean;
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import { Emitter } from '@theia/core/lib/common/event';
|
|||||||
import { JsonRpcProxy } from '@theia/core/lib/common/messaging/proxy-factory';
|
import { JsonRpcProxy } from '@theia/core/lib/common/messaging/proxy-factory';
|
||||||
import { WindowService } from '@theia/core/lib/browser/window/window-service';
|
import { WindowService } from '@theia/core/lib/browser/window/window-service';
|
||||||
import { DisposableCollection } from '@theia/core/lib/common/disposable';
|
import { DisposableCollection } from '@theia/core/lib/common/disposable';
|
||||||
import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application';
|
import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application-contribution';
|
||||||
import {
|
import {
|
||||||
CommandRegistry,
|
CommandRegistry,
|
||||||
CommandContribution,
|
CommandContribution,
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application';
|
import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application-contribution';
|
||||||
import { DisposableCollection } from '@theia/core/lib/common/disposable';
|
import { DisposableCollection } from '@theia/core/lib/common/disposable';
|
||||||
import { MessageService } from '@theia/core/lib/common/message-service';
|
import { MessageService } from '@theia/core/lib/common/message-service';
|
||||||
import { MessageType } from '@theia/core/lib/common/message-service-protocol';
|
import { MessageType } from '@theia/core/lib/common/message-service-protocol';
|
||||||
|
|||||||
@@ -98,6 +98,7 @@ export class BoardsConfigDialog extends ReactDialog<BoardsConfigDialogState> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override async open(
|
override async open(
|
||||||
|
disposeOnResolve = true,
|
||||||
params?: EditBoardsConfigActionParams
|
params?: EditBoardsConfigActionParams
|
||||||
): Promise<BoardsConfig | undefined> {
|
): Promise<BoardsConfig | undefined> {
|
||||||
this._searchSet = undefined;
|
this._searchSet = undefined;
|
||||||
@@ -119,7 +120,7 @@ export class BoardsConfigDialog extends ReactDialog<BoardsConfigDialogState> {
|
|||||||
this._searchSet = params.searchSet.slice();
|
this._searchSet = params.searchSet.slice();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return super.open();
|
return super.open(disposeOnResolve);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override onAfterAttach(msg: Message): void {
|
protected override onAfterAttach(msg: Message): void {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application';
|
import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application-contribution';
|
||||||
import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state';
|
import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state';
|
||||||
import { StorageService } from '@theia/core/lib/browser/storage-service';
|
import { StorageService } from '@theia/core/lib/browser/storage-service';
|
||||||
import type {
|
import type {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application';
|
import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application-contribution';
|
||||||
import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state';
|
import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state';
|
||||||
import { StorageService } from '@theia/core/lib/browser/storage-service';
|
import { StorageService } from '@theia/core/lib/browser/storage-service';
|
||||||
import {
|
import {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application';
|
import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application-contribution';
|
||||||
import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state';
|
import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state';
|
||||||
import { DisposableCollection } from '@theia/core/lib/common/disposable';
|
import { DisposableCollection } from '@theia/core/lib/common/disposable';
|
||||||
import { Emitter, Event } from '@theia/core/lib/common/event';
|
import { Emitter, Event } from '@theia/core/lib/common/event';
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ export class CheckForIDEUpdates extends Contribution {
|
|||||||
SKIP_IDE_VERSION
|
SKIP_IDE_VERSION
|
||||||
);
|
);
|
||||||
if (versionToSkip === updateInfo.version) return;
|
if (versionToSkip === updateInfo.version) return;
|
||||||
this.updaterDialog.open(updateInfo);
|
this.updaterDialog.open(true, updateInfo);
|
||||||
})
|
})
|
||||||
.catch((e) => {
|
.catch((e) => {
|
||||||
this.messageService.error(
|
this.messageService.error(
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
import { Dialog } from '@theia/core/lib/browser/dialogs';
|
import { Dialog } from '@theia/core/lib/browser/dialogs';
|
||||||
import type {
|
import type { FrontendApplication } from '@theia/core/lib/browser/frontend-application';
|
||||||
FrontendApplication,
|
import type { OnWillStopAction } from '@theia/core/lib/browser/frontend-application-contribution';
|
||||||
OnWillStopAction,
|
|
||||||
} from '@theia/core/lib/browser/frontend-application';
|
|
||||||
import { ApplicationShell } from '@theia/core/lib/browser/shell/application-shell';
|
import { ApplicationShell } from '@theia/core/lib/browser/shell/application-shell';
|
||||||
import { nls } from '@theia/core/lib/common/nls';
|
import { nls } from '@theia/core/lib/common/nls';
|
||||||
import type { MaybePromise } from '@theia/core/lib/common/types';
|
import type { MaybePromise } from '@theia/core/lib/common/types';
|
||||||
|
|||||||
@@ -779,7 +779,7 @@ export class CompilerErrors
|
|||||||
return undefined;
|
return undefined;
|
||||||
} else {
|
} else {
|
||||||
return this.editorManager
|
return this.editorManager
|
||||||
.getByUri(new URI(uriOrWidget))
|
.getByUri(new URI(uriOrWidget.toString()))
|
||||||
.then((editor) => {
|
.then((editor) => {
|
||||||
if (editor) {
|
if (editor) {
|
||||||
return this.monacoEditor(editor);
|
return this.monacoEditor(editor);
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
import { ClipboardService } from '@theia/core/lib/browser/clipboard-service';
|
import { ClipboardService } from '@theia/core/lib/browser/clipboard-service';
|
||||||
import {
|
import { FrontendApplication } from '@theia/core/lib/browser/frontend-application';
|
||||||
FrontendApplication,
|
import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application-contribution';
|
||||||
FrontendApplicationContribution,
|
|
||||||
} from '@theia/core/lib/browser/frontend-application';
|
|
||||||
import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state';
|
import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state';
|
||||||
import {
|
import {
|
||||||
KeybindingContribution,
|
KeybindingContribution,
|
||||||
|
|||||||
@@ -1,7 +1,11 @@
|
|||||||
|
import { nls } from '@theia/core/lib/common';
|
||||||
import { inject, injectable } from '@theia/core/shared/inversify';
|
import { inject, injectable } from '@theia/core/shared/inversify';
|
||||||
import { CommonCommands } from '@theia/core/lib/browser/common-frontend-contribution';
|
import { CommonCommands } from '@theia/core/lib/browser/common-frontend-contribution';
|
||||||
import { ClipboardService } from '@theia/core/lib/browser/clipboard-service';
|
import { ClipboardService } from '@theia/core/lib/browser/clipboard-service';
|
||||||
import { MonacoEditorService } from '@theia/monaco/lib/browser/monaco-editor-service';
|
import { StandaloneServices } from '@theia/monaco-editor-core/esm/vs/editor/standalone/browser/standaloneServices';
|
||||||
|
import { ICodeEditorService } from '@theia/monaco-editor-core/esm/vs/editor/browser/services/codeEditorService';
|
||||||
|
import type { ICodeEditor } from '@theia/monaco-editor-core/esm/vs/editor/browser/editorBrowser';
|
||||||
|
import type { StandaloneCodeEditor } from '@theia/monaco-editor-core/esm/vs/editor/standalone/browser/standaloneCodeEditor';
|
||||||
import {
|
import {
|
||||||
Contribution,
|
Contribution,
|
||||||
Command,
|
Command,
|
||||||
@@ -10,17 +14,11 @@ import {
|
|||||||
CommandRegistry,
|
CommandRegistry,
|
||||||
} from './contribution';
|
} from './contribution';
|
||||||
import { ArduinoMenus } from '../menu/arduino-menus';
|
import { ArduinoMenus } from '../menu/arduino-menus';
|
||||||
import { nls } from '@theia/core/lib/common';
|
|
||||||
import type { ICodeEditor } from '@theia/monaco-editor-core/esm/vs/editor/browser/editorBrowser';
|
|
||||||
import type { StandaloneCodeEditor } from '@theia/monaco-editor-core/esm/vs/editor/standalone/browser/standaloneCodeEditor';
|
|
||||||
|
|
||||||
// TODO: [macOS]: to remove `Start Dictation...` and `Emoji & Symbol` see this thread: https://github.com/electron/electron/issues/8283#issuecomment-269522072
|
// TODO: [macOS]: to remove `Start Dictation...` and `Emoji & Symbol` see this thread: https://github.com/electron/electron/issues/8283#issuecomment-269522072
|
||||||
// Depends on https://github.com/eclipse-theia/theia/pull/7964
|
// Depends on https://github.com/eclipse-theia/theia/pull/7964
|
||||||
@injectable()
|
@injectable()
|
||||||
export class EditContributions extends Contribution {
|
export class EditContributions extends Contribution {
|
||||||
@inject(MonacoEditorService)
|
|
||||||
private readonly codeEditorService: MonacoEditorService;
|
|
||||||
|
|
||||||
@inject(ClipboardService)
|
@inject(ClipboardService)
|
||||||
private readonly clipboardService: ClipboardService;
|
private readonly clipboardService: ClipboardService;
|
||||||
|
|
||||||
@@ -208,9 +206,10 @@ ${value}
|
|||||||
protected async current(): Promise<
|
protected async current(): Promise<
|
||||||
ICodeEditor | StandaloneCodeEditor | undefined
|
ICodeEditor | StandaloneCodeEditor | undefined
|
||||||
> {
|
> {
|
||||||
|
const codeEditorService = StandaloneServices.get(ICodeEditorService);
|
||||||
return (
|
return (
|
||||||
this.codeEditorService.getFocusedCodeEditor() ||
|
codeEditorService.getFocusedCodeEditor() ||
|
||||||
this.codeEditorService.getActiveCodeEditor() ||
|
codeEditorService.getActiveCodeEditor() ||
|
||||||
undefined
|
undefined
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import {
|
|||||||
ArduinoDaemon,
|
ArduinoDaemon,
|
||||||
BoardIdentifier,
|
BoardIdentifier,
|
||||||
BoardsService,
|
BoardsService,
|
||||||
|
CompileSummary,
|
||||||
ExecutableService,
|
ExecutableService,
|
||||||
isBoardIdentifierChangeEvent,
|
isBoardIdentifierChangeEvent,
|
||||||
sanitizeFqbn,
|
sanitizeFqbn,
|
||||||
@@ -23,6 +24,7 @@ import { HostedPluginEvents } from '../hosted/hosted-plugin-events';
|
|||||||
import { NotificationCenter } from '../notification-center';
|
import { NotificationCenter } from '../notification-center';
|
||||||
import { CurrentSketch } from '../sketches-service-client-impl';
|
import { CurrentSketch } from '../sketches-service-client-impl';
|
||||||
import { SketchContribution, URI } from './contribution';
|
import { SketchContribution, URI } from './contribution';
|
||||||
|
import { CompileSummaryProvider } from './verify-sketch';
|
||||||
|
|
||||||
interface DaemonAddress {
|
interface DaemonAddress {
|
||||||
/**
|
/**
|
||||||
@@ -107,6 +109,8 @@ export class InoLanguage extends SketchContribution {
|
|||||||
private readonly notificationCenter: NotificationCenter;
|
private readonly notificationCenter: NotificationCenter;
|
||||||
@inject(BoardsDataStore)
|
@inject(BoardsDataStore)
|
||||||
private readonly boardDataStore: BoardsDataStore;
|
private readonly boardDataStore: BoardsDataStore;
|
||||||
|
@inject(CompileSummaryProvider)
|
||||||
|
private readonly compileSummaryProvider: CompileSummaryProvider;
|
||||||
|
|
||||||
private readonly toDispose = new DisposableCollection();
|
private readonly toDispose = new DisposableCollection();
|
||||||
private readonly languageServerStartMutex = new Mutex();
|
private readonly languageServerStartMutex = new Mutex();
|
||||||
@@ -173,6 +177,13 @@ export class InoLanguage extends SketchContribution {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
|
this.compileSummaryProvider.onDidChangeCompileSummary(
|
||||||
|
(compileSummary) => {
|
||||||
|
if (compileSummary) {
|
||||||
|
this.fireBuildDidComplete(compileSummary);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
),
|
||||||
]);
|
]);
|
||||||
Promise.all([
|
Promise.all([
|
||||||
this.boardsServiceProvider.ready,
|
this.boardsServiceProvider.ready,
|
||||||
@@ -317,4 +328,32 @@ export class InoLanguage extends SketchContribution {
|
|||||||
params
|
params
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Execute the a command contributed by the Arduino Tools VSIX to send the `ino/buildDidComplete` notification to the language server
|
||||||
|
private async fireBuildDidComplete(
|
||||||
|
compileSummary: CompileSummary
|
||||||
|
): Promise<void> {
|
||||||
|
const params = {
|
||||||
|
...compileSummary,
|
||||||
|
};
|
||||||
|
console.info(
|
||||||
|
`Executing 'arduino.languageserver.notifyBuildDidComplete' with ${JSON.stringify(
|
||||||
|
params.buildOutputUri
|
||||||
|
)}`
|
||||||
|
);
|
||||||
|
|
||||||
|
try {
|
||||||
|
await this.commandService.executeCommand(
|
||||||
|
'arduino.languageserver.notifyBuildDidComplete',
|
||||||
|
params
|
||||||
|
);
|
||||||
|
} catch (err) {
|
||||||
|
console.error(
|
||||||
|
`Unexpected error when firing event on build did complete. ${JSON.stringify(
|
||||||
|
params.buildOutputUri
|
||||||
|
)}`,
|
||||||
|
err
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ export class OpenBoardsConfig extends Contribution {
|
|||||||
override registerCommands(registry: CommandRegistry): void {
|
override registerCommands(registry: CommandRegistry): void {
|
||||||
registry.registerCommand(OpenBoardsConfig.Commands.OPEN_DIALOG, {
|
registry.registerCommand(OpenBoardsConfig.Commands.OPEN_DIALOG, {
|
||||||
execute: async (params?: EditBoardsConfigActionParams) =>
|
execute: async (params?: EditBoardsConfigActionParams) =>
|
||||||
this.boardsConfigDialog.open(params),
|
this.boardsConfigDialog.open(true, params),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,78 +0,0 @@
|
|||||||
import { MessageService } from '@theia/core';
|
|
||||||
import { FrontendApplicationContribution } from '@theia/core/lib/browser';
|
|
||||||
import { inject, injectable } from '@theia/core/shared/inversify';
|
|
||||||
import { LocalStorageService } from '@theia/core/lib/browser';
|
|
||||||
import { nls } from '@theia/core/lib/common';
|
|
||||||
import { WindowService } from '@theia/core/lib/browser/window/window-service';
|
|
||||||
import { ArduinoPreferences } from '../arduino-preferences';
|
|
||||||
import { SurveyNotificationService } from '../../common/protocol/survey-service';
|
|
||||||
|
|
||||||
const SURVEY_MESSAGE = nls.localize(
|
|
||||||
'arduino/survey/surveyMessage',
|
|
||||||
'Please help us improve by answering this super short survey. We value our community and would like to get to know our supporters a little better.'
|
|
||||||
);
|
|
||||||
const DO_NOT_SHOW_AGAIN = nls.localize(
|
|
||||||
'arduino/survey/dismissSurvey',
|
|
||||||
"Don't show again"
|
|
||||||
);
|
|
||||||
const GO_TO_SURVEY = nls.localize(
|
|
||||||
'arduino/survey/answerSurvey',
|
|
||||||
'Answer survey'
|
|
||||||
);
|
|
||||||
|
|
||||||
const SURVEY_BASE_URL = 'https://surveys.hotjar.com/';
|
|
||||||
const surveyId = '17887b40-e1f0-4bd6-b9f0-a37f229ccd8b';
|
|
||||||
|
|
||||||
@injectable()
|
|
||||||
export class SurveyNotification implements FrontendApplicationContribution {
|
|
||||||
@inject(MessageService)
|
|
||||||
private readonly messageService: MessageService;
|
|
||||||
|
|
||||||
@inject(LocalStorageService)
|
|
||||||
private readonly localStorageService: LocalStorageService;
|
|
||||||
|
|
||||||
@inject(WindowService)
|
|
||||||
private readonly windowService: WindowService;
|
|
||||||
|
|
||||||
@inject(ArduinoPreferences)
|
|
||||||
private readonly arduinoPreferences: ArduinoPreferences;
|
|
||||||
|
|
||||||
@inject(SurveyNotificationService)
|
|
||||||
private readonly surveyNotificationService: SurveyNotificationService;
|
|
||||||
|
|
||||||
onStart(): void {
|
|
||||||
this.arduinoPreferences.ready.then(async () => {
|
|
||||||
if (
|
|
||||||
(await this.surveyNotificationService.isFirstInstance()) &&
|
|
||||||
this.arduinoPreferences.get('arduino.survey.notification')
|
|
||||||
) {
|
|
||||||
const surveyAnswered = await this.localStorageService.getData(
|
|
||||||
this.surveyKey(surveyId)
|
|
||||||
);
|
|
||||||
if (surveyAnswered !== undefined) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const answer = await this.messageService.info(
|
|
||||||
SURVEY_MESSAGE,
|
|
||||||
DO_NOT_SHOW_AGAIN,
|
|
||||||
GO_TO_SURVEY
|
|
||||||
);
|
|
||||||
switch (answer) {
|
|
||||||
case GO_TO_SURVEY:
|
|
||||||
this.windowService.openNewWindow(SURVEY_BASE_URL + surveyId, {
|
|
||||||
external: true,
|
|
||||||
});
|
|
||||||
this.localStorageService.setData(this.surveyKey(surveyId), true);
|
|
||||||
break;
|
|
||||||
case DO_NOT_SHOW_AGAIN:
|
|
||||||
this.localStorageService.setData(this.surveyKey(surveyId), false);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private surveyKey(id: string): string {
|
|
||||||
return `answered_survey:${id}`;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,13 +1,11 @@
|
|||||||
import { DisposableCollection } from '@theia/core/lib/common/disposable';
|
import { DisposableCollection } from '@theia/core/lib/common/disposable';
|
||||||
import URI from '@theia/core/lib/common/uri';
|
import URI from '@theia/core/lib/common/uri';
|
||||||
import { inject, injectable } from '@theia/core/shared/inversify';
|
import { inject, injectable } from '@theia/core/shared/inversify';
|
||||||
import { HostedPluginSupport } from '../hosted/hosted-plugin-support';
|
|
||||||
import type { ArduinoState } from 'vscode-arduino-api';
|
import type { ArduinoState } from 'vscode-arduino-api';
|
||||||
import {
|
import {
|
||||||
|
BoardsConfig,
|
||||||
BoardsService,
|
BoardsService,
|
||||||
CompileSummary,
|
CompileSummary,
|
||||||
isCompileSummary,
|
|
||||||
BoardsConfig,
|
|
||||||
PortIdentifier,
|
PortIdentifier,
|
||||||
resolveDetectedPort,
|
resolveDetectedPort,
|
||||||
} from '../../common/protocol';
|
} from '../../common/protocol';
|
||||||
@@ -18,8 +16,10 @@ import {
|
|||||||
} from '../../common/protocol/arduino-context-mapper';
|
} from '../../common/protocol/arduino-context-mapper';
|
||||||
import { BoardsDataStore } from '../boards/boards-data-store';
|
import { BoardsDataStore } from '../boards/boards-data-store';
|
||||||
import { BoardsServiceProvider } from '../boards/boards-service-provider';
|
import { BoardsServiceProvider } from '../boards/boards-service-provider';
|
||||||
|
import { HostedPluginSupport } from '../hosted/hosted-plugin-support';
|
||||||
import { CurrentSketch } from '../sketches-service-client-impl';
|
import { CurrentSketch } from '../sketches-service-client-impl';
|
||||||
import { SketchContribution } from './contribution';
|
import { SketchContribution } from './contribution';
|
||||||
|
import { CompileSummaryProvider } from './verify-sketch';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* (non-API) exported for tests
|
* (non-API) exported for tests
|
||||||
@@ -43,6 +43,8 @@ export class UpdateArduinoState extends SketchContribution {
|
|||||||
private readonly boardsDataStore: BoardsDataStore;
|
private readonly boardsDataStore: BoardsDataStore;
|
||||||
@inject(HostedPluginSupport)
|
@inject(HostedPluginSupport)
|
||||||
private readonly hostedPluginSupport: HostedPluginSupport;
|
private readonly hostedPluginSupport: HostedPluginSupport;
|
||||||
|
@inject(CompileSummaryProvider)
|
||||||
|
private readonly compileSummaryProvider: CompileSummaryProvider;
|
||||||
|
|
||||||
private readonly toDispose = new DisposableCollection();
|
private readonly toDispose = new DisposableCollection();
|
||||||
|
|
||||||
@@ -60,14 +62,13 @@ export class UpdateArduinoState extends SketchContribution {
|
|||||||
this.configService.onDidChangeSketchDirUri((userDirUri) =>
|
this.configService.onDidChangeSketchDirUri((userDirUri) =>
|
||||||
this.updateUserDirPath(userDirUri)
|
this.updateUserDirPath(userDirUri)
|
||||||
),
|
),
|
||||||
this.commandService.onDidExecuteCommand(({ commandId, args }) => {
|
this.compileSummaryProvider.onDidChangeCompileSummary(
|
||||||
if (
|
(compilerSummary) => {
|
||||||
commandId === 'arduino.languageserver.notifyBuildDidComplete' &&
|
if (compilerSummary) {
|
||||||
isCompileSummary(args[0])
|
this.updateCompileSummary(compilerSummary);
|
||||||
) {
|
}
|
||||||
this.updateCompileSummary(args[0]);
|
|
||||||
}
|
}
|
||||||
}),
|
),
|
||||||
this.boardsDataStore.onDidChange((event) => {
|
this.boardsDataStore.onDidChange((event) => {
|
||||||
const selectedFqbn =
|
const selectedFqbn =
|
||||||
this.boardsServiceProvider.boardsConfig.selectedBoard?.fqbn;
|
this.boardsServiceProvider.boardsConfig.selectedBoard?.fqbn;
|
||||||
@@ -88,6 +89,10 @@ export class UpdateArduinoState extends SketchContribution {
|
|||||||
this.updateSketchPath(this.sketchServiceClient.tryGetCurrentSketch());
|
this.updateSketchPath(this.sketchServiceClient.tryGetCurrentSketch());
|
||||||
this.updateUserDirPath(this.configService.tryGetSketchDirUri());
|
this.updateUserDirPath(this.configService.tryGetSketchDirUri());
|
||||||
this.updateDataDirPath(this.configService.tryGetDataDirUri());
|
this.updateDataDirPath(this.configService.tryGetDataDirUri());
|
||||||
|
const { compileSummary } = this.compileSummaryProvider;
|
||||||
|
if (compileSummary) {
|
||||||
|
this.updateCompileSummary(compileSummary);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
onStop(): void {
|
onStop(): void {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { Emitter } from '@theia/core/lib/common/event';
|
import { Emitter, Event } from '@theia/core/lib/common/event';
|
||||||
import { nls } from '@theia/core/lib/common/nls';
|
import { nls } from '@theia/core/lib/common/nls';
|
||||||
import { inject, injectable } from '@theia/core/shared/inversify';
|
import { inject, injectable } from '@theia/core/shared/inversify';
|
||||||
import type { CoreService } from '../../common/protocol';
|
import type { CompileSummary, CoreService } from '../../common/protocol';
|
||||||
import { ArduinoMenus } from '../menu/arduino-menus';
|
import { ArduinoMenus } from '../menu/arduino-menus';
|
||||||
import { CurrentSketch } from '../sketches-service-client-impl';
|
import { CurrentSketch } from '../sketches-service-client-impl';
|
||||||
import { ArduinoToolbar } from '../toolbar/arduino-toolbar';
|
import { ArduinoToolbar } from '../toolbar/arduino-toolbar';
|
||||||
@@ -15,6 +15,12 @@ import {
|
|||||||
} from './contribution';
|
} from './contribution';
|
||||||
import { CoreErrorHandler } from './core-error-handler';
|
import { CoreErrorHandler } from './core-error-handler';
|
||||||
|
|
||||||
|
export const CompileSummaryProvider = Symbol('CompileSummaryProvider');
|
||||||
|
export interface CompileSummaryProvider {
|
||||||
|
readonly compileSummary: CompileSummary | undefined;
|
||||||
|
readonly onDidChangeCompileSummary: Event<CompileSummary | undefined>;
|
||||||
|
}
|
||||||
|
|
||||||
export type VerifySketchMode =
|
export type VerifySketchMode =
|
||||||
/**
|
/**
|
||||||
* When the user explicitly triggers the verify command from the primary UI: menu, toolbar, or keybinding. The UI shows the output, updates the toolbar items state, etc.
|
* When the user explicitly triggers the verify command from the primary UI: menu, toolbar, or keybinding. The UI shows the output, updates the toolbar items state, etc.
|
||||||
@@ -46,13 +52,20 @@ export interface VerifySketchParams {
|
|||||||
type VerifyProgress = 'idle' | VerifySketchMode;
|
type VerifyProgress = 'idle' | VerifySketchMode;
|
||||||
|
|
||||||
@injectable()
|
@injectable()
|
||||||
export class VerifySketch extends CoreServiceContribution {
|
export class VerifySketch
|
||||||
|
extends CoreServiceContribution
|
||||||
|
implements CompileSummaryProvider
|
||||||
|
{
|
||||||
@inject(CoreErrorHandler)
|
@inject(CoreErrorHandler)
|
||||||
private readonly coreErrorHandler: CoreErrorHandler;
|
private readonly coreErrorHandler: CoreErrorHandler;
|
||||||
|
|
||||||
private readonly onDidChangeEmitter = new Emitter<void>();
|
private readonly onDidChangeEmitter = new Emitter<void>();
|
||||||
private readonly onDidChange = this.onDidChangeEmitter.event;
|
private readonly onDidChange = this.onDidChangeEmitter.event;
|
||||||
|
private readonly onDidChangeCompileSummaryEmitter = new Emitter<
|
||||||
|
CompileSummary | undefined
|
||||||
|
>();
|
||||||
private verifyProgress: VerifyProgress = 'idle';
|
private verifyProgress: VerifyProgress = 'idle';
|
||||||
|
private _compileSummary: CompileSummary | undefined;
|
||||||
|
|
||||||
override registerCommands(registry: CommandRegistry): void {
|
override registerCommands(registry: CommandRegistry): void {
|
||||||
registry.registerCommand(VerifySketch.Commands.VERIFY_SKETCH, {
|
registry.registerCommand(VerifySketch.Commands.VERIFY_SKETCH, {
|
||||||
@@ -117,6 +130,21 @@ export class VerifySketch extends CoreServiceContribution {
|
|||||||
super.handleError(error);
|
super.handleError(error);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get compileSummary(): CompileSummary | undefined {
|
||||||
|
return this._compileSummary;
|
||||||
|
}
|
||||||
|
|
||||||
|
private updateCompileSummary(
|
||||||
|
compileSummary: CompileSummary | undefined
|
||||||
|
): void {
|
||||||
|
this._compileSummary = compileSummary;
|
||||||
|
this.onDidChangeCompileSummaryEmitter.fire(this._compileSummary);
|
||||||
|
}
|
||||||
|
|
||||||
|
get onDidChangeCompileSummary(): Event<CompileSummary | undefined> {
|
||||||
|
return this.onDidChangeCompileSummaryEmitter.event;
|
||||||
|
}
|
||||||
|
|
||||||
private async verifySketch(
|
private async verifySketch(
|
||||||
params?: VerifySketchParams
|
params?: VerifySketchParams
|
||||||
): Promise<CoreService.Options.Compile | undefined> {
|
): Promise<CoreService.Options.Compile | undefined> {
|
||||||
@@ -141,7 +169,7 @@ export class VerifySketch extends CoreServiceContribution {
|
|||||||
return options;
|
return options;
|
||||||
}
|
}
|
||||||
|
|
||||||
await this.doWithProgress({
|
const compileSummary = await this.doWithProgress({
|
||||||
progressText: nls.localize(
|
progressText: nls.localize(
|
||||||
'arduino/sketch/compile',
|
'arduino/sketch/compile',
|
||||||
'Compiling sketch...'
|
'Compiling sketch...'
|
||||||
@@ -160,6 +188,9 @@ export class VerifySketch extends CoreServiceContribution {
|
|||||||
nls.localize('arduino/sketch/doneCompiling', 'Done compiling.'),
|
nls.localize('arduino/sketch/doneCompiling', 'Done compiling.'),
|
||||||
{ timeout: 3000 }
|
{ timeout: 3000 }
|
||||||
);
|
);
|
||||||
|
|
||||||
|
this.updateCompileSummary(compileSummary);
|
||||||
|
|
||||||
// Returns with the used options for the compilation
|
// Returns with the used options for the compilation
|
||||||
// so that follow-up tasks (such as upload) can reuse the compiled code.
|
// so that follow-up tasks (such as upload) can reuse the compiled code.
|
||||||
// Note that the `fqbn` is already decorated with the board settings, if any.
|
// Note that the `fqbn` is already decorated with the board settings, if any.
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application';
|
import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application-contribution';
|
||||||
import { DisposableCollection } from '@theia/core/lib/common/disposable';
|
import { DisposableCollection } from '@theia/core/lib/common/disposable';
|
||||||
import { Emitter, Event } from '@theia/core/lib/common/event';
|
import { Emitter, Event } from '@theia/core/lib/common/event';
|
||||||
import URI from '@theia/core/lib/common/uri';
|
import URI from '@theia/core/lib/common/uri';
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import {
|
|||||||
Disposable,
|
Disposable,
|
||||||
DisposableCollection,
|
DisposableCollection,
|
||||||
} from '@theia/core/lib/common/disposable';
|
} from '@theia/core/lib/common/disposable';
|
||||||
import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application';
|
import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application-contribution';
|
||||||
import {
|
import {
|
||||||
Stat,
|
Stat,
|
||||||
FileType,
|
FileType,
|
||||||
|
|||||||
@@ -261,6 +261,7 @@ export class IDEUpdaterDialog extends ReactDialog<UpdateInfo | undefined> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override async open(
|
override async open(
|
||||||
|
disposeOnResolve = true,
|
||||||
data: UpdateInfo | undefined = undefined
|
data: UpdateInfo | undefined = undefined
|
||||||
): Promise<UpdateInfo | undefined> {
|
): Promise<UpdateInfo | undefined> {
|
||||||
if (data && data.version) {
|
if (data && data.version) {
|
||||||
@@ -271,7 +272,7 @@ export class IDEUpdaterDialog extends ReactDialog<UpdateInfo | undefined> {
|
|||||||
error: undefined,
|
error: undefined,
|
||||||
});
|
});
|
||||||
this.updateInfo = data;
|
this.updateInfo = data;
|
||||||
return super.open();
|
return super.open(disposeOnResolve);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ export class IDEUpdaterCommands implements CommandContribution {
|
|||||||
try {
|
try {
|
||||||
const updateInfo = await this.updater.checkForUpdates(initialCheck);
|
const updateInfo = await this.updater.checkForUpdates(initialCheck);
|
||||||
if (!!updateInfo) {
|
if (!!updateInfo) {
|
||||||
this.updaterDialog.open(updateInfo);
|
this.updaterDialog.open(true, updateInfo);
|
||||||
} else {
|
} else {
|
||||||
this.messageService.info(
|
this.messageService.info(
|
||||||
nls.localize(
|
nls.localize(
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import {
|
|||||||
import { Emitter } from '@theia/core/lib/common/event';
|
import { Emitter } from '@theia/core/lib/common/event';
|
||||||
import { JsonRpcProxy } from '@theia/core/lib/common/messaging/proxy-factory';
|
import { JsonRpcProxy } from '@theia/core/lib/common/messaging/proxy-factory';
|
||||||
import { DisposableCollection } from '@theia/core/lib/common/disposable';
|
import { DisposableCollection } from '@theia/core/lib/common/disposable';
|
||||||
import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application';
|
import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application-contribution';
|
||||||
import {
|
import {
|
||||||
IndexUpdateDidCompleteParams,
|
IndexUpdateDidCompleteParams,
|
||||||
IndexUpdateDidFailParams,
|
IndexUpdateDidFailParams,
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import {
|
|||||||
Disposable,
|
Disposable,
|
||||||
DisposableCollection,
|
DisposableCollection,
|
||||||
} from '@theia/core/lib/common/disposable';
|
} from '@theia/core/lib/common/disposable';
|
||||||
import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application';
|
import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application-contribution';
|
||||||
import { Sketch, SketchesService } from '../common/protocol';
|
import { Sketch, SketchesService } from '../common/protocol';
|
||||||
import { ConfigServiceClient } from './config/config-service-client';
|
import { ConfigServiceClient } from './config/config-service-client';
|
||||||
import {
|
import {
|
||||||
@@ -74,6 +74,7 @@ export class SketchesServiceClientImpl
|
|||||||
const sketchDirUri = this.configService.tryGetSketchDirUri();
|
const sketchDirUri = this.configService.tryGetSketchDirUri();
|
||||||
this.watchSketchbookDir(sketchDirUri);
|
this.watchSketchbookDir(sketchDirUri);
|
||||||
const refreshCurrentSketch = async () => {
|
const refreshCurrentSketch = async () => {
|
||||||
|
await this.workspaceService.ready;
|
||||||
const currentSketch = await this.loadCurrentSketch();
|
const currentSketch = await this.loadCurrentSketch();
|
||||||
const ideTempFolderUri = await this.getIdeTempFolderUriForSketch(
|
const ideTempFolderUri = await this.getIdeTempFolderUriForSketch(
|
||||||
currentSketch
|
currentSketch
|
||||||
@@ -287,7 +288,7 @@ export class SketchesServiceClientImpl
|
|||||||
* `true` if the `uri` is not contained in any of the opened workspaces. Otherwise, `false`.
|
* `true` if the `uri` is not contained in any of the opened workspaces. Otherwise, `false`.
|
||||||
*/
|
*/
|
||||||
isReadOnly(uri: URI | monaco.Uri | string): boolean {
|
isReadOnly(uri: URI | monaco.Uri | string): boolean {
|
||||||
const toCheck = uri instanceof URI ? uri : new URI(uri);
|
const toCheck = uri instanceof URI ? uri : new URI(uri.toString());
|
||||||
if (toCheck.scheme === 'user-storage') {
|
if (toCheck.scheme === 'user-storage') {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -98,16 +98,12 @@
|
|||||||
color: var(--theia-textLink-foreground);
|
color: var(--theia-textLink-foreground);
|
||||||
}
|
}
|
||||||
|
|
||||||
.account-icon {
|
img.arduino-account-picture {
|
||||||
width: var(--theia-private-sidebar-icon-size);
|
width: var(--theia-private-sidebar-icon-size);
|
||||||
height: var(--theia-private-sidebar-icon-size);
|
height: var(--theia-private-sidebar-icon-size);
|
||||||
border-radius: 50%;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
.account-icon > img {
|
|
||||||
max-width: 100%;
|
max-width: 100%;
|
||||||
max-height: 100%;
|
max-height: 100%;
|
||||||
|
border-radius: 50%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.connected-status-icon {
|
.connected-status-icon {
|
||||||
|
|||||||
@@ -13,6 +13,8 @@ import { MessageService } from '@theia/core/lib/common/message-service';
|
|||||||
import { inject, injectable } from '@theia/core/shared/inversify';
|
import { inject, injectable } from '@theia/core/shared/inversify';
|
||||||
import { ApplicationConnectionStatusContribution } from './connection-status-service';
|
import { ApplicationConnectionStatusContribution } from './connection-status-service';
|
||||||
import { ToolbarAwareTabBar } from './tab-bars';
|
import { ToolbarAwareTabBar } from './tab-bars';
|
||||||
|
import { find } from '@theia/core/shared/@phosphor/algorithm';
|
||||||
|
import { OutputWidget } from '@theia/output/lib/browser/output-widget';
|
||||||
|
|
||||||
@injectable()
|
@injectable()
|
||||||
export class ApplicationShell extends TheiaApplicationShell {
|
export class ApplicationShell extends TheiaApplicationShell {
|
||||||
@@ -48,6 +50,38 @@ export class ApplicationShell extends TheiaApplicationShell {
|
|||||||
return super.addWidget(widget, { ...options, ref });
|
return super.addWidget(widget, { ...options, ref });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override doRevealWidget(id: string): Widget | undefined {
|
||||||
|
let widget = find(this.mainPanel.widgets(), (w) => w.id === id);
|
||||||
|
if (!widget) {
|
||||||
|
widget = find(this.bottomPanel.widgets(), (w) => w.id === id);
|
||||||
|
if (widget) {
|
||||||
|
this.expandBottomPanel();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (widget) {
|
||||||
|
const tabBar = this.getTabBarFor(widget);
|
||||||
|
if (tabBar) {
|
||||||
|
tabBar.currentTitle = widget.title;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!widget) {
|
||||||
|
widget = this.leftPanelHandler.expand(id);
|
||||||
|
}
|
||||||
|
if (!widget) {
|
||||||
|
widget = this.rightPanelHandler.expand(id);
|
||||||
|
}
|
||||||
|
if (widget) {
|
||||||
|
// Prevent focusing the output widget when is updated
|
||||||
|
// See https://github.com/arduino/arduino-ide/issues/2679
|
||||||
|
if (!(widget instanceof OutputWidget)) {
|
||||||
|
this.windowService.focus();
|
||||||
|
}
|
||||||
|
return widget;
|
||||||
|
} else {
|
||||||
|
return this.secondaryWindowHandler.revealWidget(id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override handleEvent(): boolean {
|
override handleEvent(): boolean {
|
||||||
// NOOP, dragging has been disabled
|
// NOOP, dragging has been disabled
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import {
|
|||||||
CommonCommands,
|
CommonCommands,
|
||||||
CommonFrontendContribution as TheiaCommonFrontendContribution,
|
CommonFrontendContribution as TheiaCommonFrontendContribution,
|
||||||
} from '@theia/core/lib/browser/common-frontend-contribution';
|
} from '@theia/core/lib/browser/common-frontend-contribution';
|
||||||
import type { OnWillStopAction } from '@theia/core/lib/browser/frontend-application';
|
import type { OnWillStopAction } from '@theia/core/lib/browser/frontend-application-contribution';
|
||||||
import type { KeybindingRegistry } from '@theia/core/lib/browser/keybinding';
|
import type { KeybindingRegistry } from '@theia/core/lib/browser/keybinding';
|
||||||
import type { CommandRegistry } from '@theia/core/lib/common/command';
|
import type { CommandRegistry } from '@theia/core/lib/common/command';
|
||||||
import type { MenuModelRegistry } from '@theia/core/lib/common/menu';
|
import type { MenuModelRegistry } from '@theia/core/lib/common/menu';
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
import {
|
import {
|
||||||
ApplicationConnectionStatusContribution as TheiaApplicationConnectionStatusContribution,
|
|
||||||
ConnectionStatus,
|
ConnectionStatus,
|
||||||
|
ApplicationConnectionStatusContribution as TheiaApplicationConnectionStatusContribution,
|
||||||
FrontendConnectionStatusService as TheiaFrontendConnectionStatusService,
|
FrontendConnectionStatusService as TheiaFrontendConnectionStatusService,
|
||||||
} from '@theia/core/lib/browser/connection-status-service';
|
} from '@theia/core/lib/browser/connection-status-service';
|
||||||
import type { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application';
|
import type { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application-contribution';
|
||||||
import { WebSocketConnectionProvider } from '@theia/core/lib/browser/index';
|
import { WebSocketConnectionSource } from '@theia/core/lib/browser/messaging/ws-connection-source';
|
||||||
import { StatusBarAlignment } from '@theia/core/lib/browser/status-bar/status-bar';
|
import { StatusBarAlignment } from '@theia/core/lib/browser/status-bar/status-bar';
|
||||||
import { Disposable } from '@theia/core/lib/common/disposable';
|
import { Disposable } from '@theia/core/lib/common/disposable';
|
||||||
import { Emitter, Event } from '@theia/core/lib/common/event';
|
import { Emitter, Event } from '@theia/core/lib/common/event';
|
||||||
@@ -114,8 +114,8 @@ export class FrontendConnectionStatusService extends TheiaFrontendConnectionStat
|
|||||||
private readonly daemonPort: DaemonPort;
|
private readonly daemonPort: DaemonPort;
|
||||||
@inject(IsOnline)
|
@inject(IsOnline)
|
||||||
private readonly isOnline: IsOnline;
|
private readonly isOnline: IsOnline;
|
||||||
@inject(WebSocketConnectionProvider)
|
@inject(WebSocketConnectionSource)
|
||||||
private readonly connectionProvider: WebSocketConnectionProvider;
|
private readonly connectionSource: WebSocketConnectionSource;
|
||||||
|
|
||||||
@postConstruct()
|
@postConstruct()
|
||||||
protected override init(): void {
|
protected override init(): void {
|
||||||
@@ -128,7 +128,7 @@ export class FrontendConnectionStatusService extends TheiaFrontendConnectionStat
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected override async performPingRequest(): Promise<void> {
|
protected override async performPingRequest(): Promise<void> {
|
||||||
if (!this.connectionProvider['socket'].connected) {
|
if (!this.connectionSource['socket'].connected) {
|
||||||
this.updateStatus(false);
|
this.updateStatus(false);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -171,8 +171,8 @@ export class ApplicationConnectionStatusContribution extends TheiaApplicationCon
|
|||||||
private readonly notificationManager: NotificationManager;
|
private readonly notificationManager: NotificationManager;
|
||||||
@inject(CreateFeatures)
|
@inject(CreateFeatures)
|
||||||
private readonly createFeatures: CreateFeatures;
|
private readonly createFeatures: CreateFeatures;
|
||||||
@inject(WebSocketConnectionProvider)
|
@inject(WebSocketConnectionSource)
|
||||||
private readonly connectionProvider: WebSocketConnectionProvider;
|
private readonly connectionSource: WebSocketConnectionSource;
|
||||||
|
|
||||||
private readonly offlineStatusDidChangeEmitter = new Emitter<
|
private readonly offlineStatusDidChangeEmitter = new Emitter<
|
||||||
OfflineConnectionStatus | undefined
|
OfflineConnectionStatus | undefined
|
||||||
@@ -202,7 +202,7 @@ export class ApplicationConnectionStatusContribution extends TheiaApplicationCon
|
|||||||
const params = <OfflineMessageParams>{
|
const params = <OfflineMessageParams>{
|
||||||
port: this.daemonPort.port,
|
port: this.daemonPort.port,
|
||||||
online: this.isOnline.online,
|
online: this.isOnline.online,
|
||||||
backendConnected: this.connectionProvider['socket'].connected, // https://github.com/arduino/arduino-ide/issues/2081
|
backendConnected: this.connectionSource['socket'].connected, // https://github.com/arduino/arduino-ide/issues/2081
|
||||||
};
|
};
|
||||||
this._offlineStatus = offlineConnectionStatusType(params);
|
this._offlineStatus = offlineConnectionStatusType(params);
|
||||||
const { text, tooltip } = offlineMessage(params);
|
const { text, tooltip } = offlineMessage(params);
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { SidebarBottomMenuWidget as TheiaSidebarBottomMenuWidget } from '@theia/core/lib/browser/shell/sidebar-bottom-menu-widget';
|
import { SidebarBottomMenuWidget as TheiaSidebarBottomMenuWidget } from '@theia/core/lib/browser/shell/sidebar-bottom-menu-widget';
|
||||||
import type { SidebarMenu } from '@theia/core/lib/browser/shell/sidebar-menu-widget';
|
import type { SidebarMenuItem } from '@theia/core/lib/browser/shell/sidebar-menu-widget';
|
||||||
import type { MenuPath } from '@theia/core/lib/common/menu';
|
import type { MenuPath } from '@theia/core/lib/common/menu';
|
||||||
import { nls } from '@theia/core/lib/common/nls';
|
import { nls } from '@theia/core/lib/common/nls';
|
||||||
import {
|
import {
|
||||||
@@ -46,46 +46,45 @@ export class SidebarBottomMenuWidget extends TheiaSidebarBottomMenuWidget {
|
|||||||
this.contextMenuRenderer.render(options);
|
this.contextMenuRenderer.render(options);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override render(): React.ReactNode {
|
override renderItem(item: SidebarMenuItem): React.ReactNode {
|
||||||
return (
|
|
||||||
<React.Fragment>
|
|
||||||
{this.menus.map((menu) => this.renderMenu(menu))}
|
|
||||||
</React.Fragment>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
private renderMenu(menu: SidebarMenu): React.ReactNode {
|
|
||||||
// Removes the _Settings_ (cog) icon from the left sidebar
|
// Removes the _Settings_ (cog) icon from the left sidebar
|
||||||
if (menu.id === 'settings-menu') {
|
if (item.menu.id === 'settings-menu') {
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
const arduinoAccount = menu.id === accountMenu.id;
|
const arduinoAccount = item.menu.id === accountMenu.id;
|
||||||
const picture =
|
const arduinoAccountPicture =
|
||||||
arduinoAccount &&
|
arduinoAccount &&
|
||||||
this.connectionStatue.offlineStatus !== 'internet' &&
|
this.connectionStatue.offlineStatus !== 'internet' &&
|
||||||
this.createFeatures.session?.account.picture;
|
this.createFeatures.session?.account.picture;
|
||||||
const className = typeof picture === 'string' ? undefined : menu.iconClass;
|
|
||||||
return (
|
return (
|
||||||
<i
|
<div
|
||||||
key={menu.id}
|
key={item.menu.id}
|
||||||
className={className}
|
className="theia-sidebar-menu-item"
|
||||||
title={menu.title}
|
title={item.menu.title}
|
||||||
onClick={(e) => this.onClick(e, menu.menuPath)}
|
onClick={(e) => this.onClick(e, item.menu.menuPath)}
|
||||||
onMouseDown={this.onMouseDown}
|
onMouseDown={this.onMouseDown}
|
||||||
|
onMouseEnter={(e) => this.onMouseEnter(e, item.menu.title)}
|
||||||
onMouseOut={this.onMouseOut}
|
onMouseOut={this.onMouseOut}
|
||||||
>
|
>
|
||||||
{picture && (
|
{arduinoAccountPicture ? (
|
||||||
<div className="account-icon">
|
<i>
|
||||||
<img
|
<img
|
||||||
src={picture}
|
className="arduino-account-picture"
|
||||||
|
src={arduinoAccountPicture}
|
||||||
alt={nls.localize(
|
alt={nls.localize(
|
||||||
'arduino/cloud/profilePicture',
|
'arduino/cloud/profilePicture',
|
||||||
'Profile picture'
|
'Profile picture'
|
||||||
)}
|
)}
|
||||||
/>
|
/>
|
||||||
</div>
|
</i>
|
||||||
|
) : (
|
||||||
|
<i className={item.menu.iconClass} />
|
||||||
)}
|
)}
|
||||||
</i>
|
{item.badge && (
|
||||||
|
<div className="theia-badge-decorator-sidebar">{item.badge}</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import { injectable } from '@theia/core/shared/inversify';
|
import { injectable } from '@theia/core/shared/inversify';
|
||||||
import { DebugSessionConnection } from '@theia/debug/lib/browser/debug-session-connection';
|
import { DebugSessionConnection } from '@theia/debug/lib/browser/debug-session-connection';
|
||||||
import { DefaultDebugSessionFactory as TheiaDefaultDebugSessionFactory } from '@theia/debug/lib/browser/debug-session-contribution';
|
import { DefaultDebugSessionFactory as TheiaDefaultDebugSessionFactory } from '@theia/debug/lib/browser/debug-session-contribution';
|
||||||
|
import { DebugSessionManager } from '@theia/debug/lib/browser/debug-session-manager';
|
||||||
import { DebugConfigurationSessionOptions } from '@theia/debug/lib/browser/debug-session-options';
|
import { DebugConfigurationSessionOptions } from '@theia/debug/lib/browser/debug-session-options';
|
||||||
import {
|
import {
|
||||||
DebugAdapterPath,
|
DebugAdapterPath,
|
||||||
@@ -12,6 +13,7 @@ import { DebugSession } from './debug-session';
|
|||||||
@injectable()
|
@injectable()
|
||||||
export class DefaultDebugSessionFactory extends TheiaDefaultDebugSessionFactory {
|
export class DefaultDebugSessionFactory extends TheiaDefaultDebugSessionFactory {
|
||||||
override get(
|
override get(
|
||||||
|
manager: DebugSessionManager,
|
||||||
sessionId: string,
|
sessionId: string,
|
||||||
options: DebugConfigurationSessionOptions,
|
options: DebugConfigurationSessionOptions,
|
||||||
parentSession?: DebugSession
|
parentSession?: DebugSession
|
||||||
@@ -20,12 +22,12 @@ export class DefaultDebugSessionFactory extends TheiaDefaultDebugSessionFactory
|
|||||||
sessionId,
|
sessionId,
|
||||||
() =>
|
() =>
|
||||||
new Promise<DebugChannel>((resolve) =>
|
new Promise<DebugChannel>((resolve) =>
|
||||||
this.connectionProvider.openChannel(
|
this.connectionProvider.listen(
|
||||||
`${DebugAdapterPath}/${sessionId}`,
|
`${DebugAdapterPath}/${sessionId}`,
|
||||||
(wsChannel) => {
|
(_, wsChannel) => {
|
||||||
resolve(new ForwardingDebugChannel(wsChannel));
|
resolve(new ForwardingDebugChannel(wsChannel));
|
||||||
},
|
},
|
||||||
{ reconnecting: false }
|
false
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
this.getTraceOutputChannel()
|
this.getTraceOutputChannel()
|
||||||
@@ -35,6 +37,9 @@ export class DefaultDebugSessionFactory extends TheiaDefaultDebugSessionFactory
|
|||||||
sessionId,
|
sessionId,
|
||||||
options,
|
options,
|
||||||
parentSession,
|
parentSession,
|
||||||
|
this.testService,
|
||||||
|
options.testRun,
|
||||||
|
manager,
|
||||||
connection,
|
connection,
|
||||||
this.terminalService,
|
this.terminalService,
|
||||||
this.editorManager,
|
this.editorManager,
|
||||||
|
|||||||
@@ -1,21 +0,0 @@
|
|||||||
import { injectable, postConstruct } from '@theia/core/shared/inversify';
|
|
||||||
import { EditorCommandContribution as TheiaEditorCommandContribution } from '@theia/editor/lib/browser/editor-command';
|
|
||||||
|
|
||||||
@injectable()
|
|
||||||
export class EditorCommandContribution extends TheiaEditorCommandContribution {
|
|
||||||
@postConstruct()
|
|
||||||
protected override init(): void {
|
|
||||||
// Workaround for https://github.com/eclipse-theia/theia/issues/8722.
|
|
||||||
this.editorPreferences.onPreferenceChanged(
|
|
||||||
({ preferenceName, newValue, oldValue }) => {
|
|
||||||
if (preferenceName === 'files.autoSave') {
|
|
||||||
const autoSaveWasOnBeforeChange = !oldValue || oldValue !== 'off';
|
|
||||||
const autoSaveIsOnAfterChange = !newValue || newValue !== 'off';
|
|
||||||
if (!autoSaveWasOnBeforeChange && autoSaveIsOnAfterChange) {
|
|
||||||
this.shell.saveAll();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,19 +1,18 @@
|
|||||||
import { injectable } from '@theia/core/shared/inversify';
|
import { injectable } from '@theia/core/shared/inversify';
|
||||||
import { TextEditor } from '@theia/editor/lib/browser';
|
|
||||||
import { EditorContribution as TheiaEditorContribution } from '@theia/editor/lib/browser/editor-contribution';
|
import { EditorContribution as TheiaEditorContribution } from '@theia/editor/lib/browser/editor-contribution';
|
||||||
|
|
||||||
@injectable()
|
@injectable()
|
||||||
export class EditorContribution extends TheiaEditorContribution {
|
export class EditorContribution extends TheiaEditorContribution {
|
||||||
protected override updateLanguageStatus(
|
protected override updateLanguageStatus(
|
||||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars, unused-imports/no-unused-vars
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
editor: TextEditor | undefined
|
..._: Parameters<TheiaEditorContribution['updateLanguageStatus']>
|
||||||
): void {
|
): void {
|
||||||
// NOOP
|
// NOOP
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override updateEncodingStatus(
|
protected override updateEncodingStatus(
|
||||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars, unused-imports/no-unused-vars
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
editor: TextEditor | undefined
|
..._: Parameters<TheiaEditorContribution['updateEncodingStatus']>
|
||||||
): void {
|
): void {
|
||||||
// https://github.com/arduino/arduino-ide/issues/1393
|
// https://github.com/arduino/arduino-ide/issues/1393
|
||||||
// NOOP
|
// NOOP
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ export class FileResourceResolver extends TheiaFileResourceResolver {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
return new WriteQueuedFileResource(uri, this.fileService, {
|
return new WriteQueuedFileResource(uri, this.fileService, {
|
||||||
isReadonly: stat?.isReadonly ?? false,
|
readOnly: stat?.isReadonly ?? false,
|
||||||
shouldOverwrite: () => this.shouldOverwrite(uri),
|
shouldOverwrite: () => this.shouldOverwrite(uri),
|
||||||
shouldOpenAsText: (error) => this.shouldOpenAsText(uri, error),
|
shouldOpenAsText: (error) => this.shouldOpenAsText(uri, error),
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import React from '@theia/core/shared/react';
|
|||||||
import { NotificationComponent as TheiaNotificationComponent } from '@theia/messages/lib/browser/notification-component';
|
import { NotificationComponent as TheiaNotificationComponent } from '@theia/messages/lib/browser/notification-component';
|
||||||
import { nls } from '@theia/core/lib/common';
|
import { nls } from '@theia/core/lib/common';
|
||||||
import { codicon } from '@theia/core/lib/browser';
|
import { codicon } from '@theia/core/lib/browser';
|
||||||
|
import { sanitize } from 'dompurify';
|
||||||
|
|
||||||
export class NotificationComponent extends TheiaNotificationComponent {
|
export class NotificationComponent extends TheiaNotificationComponent {
|
||||||
override render(): React.ReactNode {
|
override render(): React.ReactNode {
|
||||||
@@ -20,7 +21,7 @@ export class NotificationComponent extends TheiaNotificationComponent {
|
|||||||
/>
|
/>
|
||||||
<div className="theia-notification-message">
|
<div className="theia-notification-message">
|
||||||
<span
|
<span
|
||||||
dangerouslySetInnerHTML={{ __html: message }}
|
dangerouslySetInnerHTML={{ __html: sanitize(message) }}
|
||||||
onClick={this.onMessageClick}
|
onClick={this.onMessageClick}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -117,7 +117,7 @@ export function maybeUpdateReadOnlyState(
|
|||||||
const model = editor.document;
|
const model = editor.document;
|
||||||
const oldReadOnly = model.readOnly;
|
const oldReadOnly = model.readOnly;
|
||||||
const resource = model['resource'];
|
const resource = model['resource'];
|
||||||
const newReadOnly = Boolean(resource.isReadonly) || isReadOnly(resource.uri);
|
const newReadOnly = Boolean(resource.readOnly) || isReadOnly(resource.uri);
|
||||||
if (oldReadOnly !== newReadOnly) {
|
if (oldReadOnly !== newReadOnly) {
|
||||||
editor.getControl().updateOptions({ readOnly: newReadOnly });
|
editor.getControl().updateOptions({ readOnly: newReadOnly });
|
||||||
if (newReadOnly) {
|
if (newReadOnly) {
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ export class MonacoTextModelService extends TheiaMonacoTextModelService {
|
|||||||
.getContributions()
|
.getContributions()
|
||||||
.find(({ scheme }) => resource.uri.scheme === scheme);
|
.find(({ scheme }) => resource.uri.scheme === scheme);
|
||||||
const readOnly =
|
const readOnly =
|
||||||
Boolean(resource.isReadonly) ||
|
Boolean(resource.readOnly) ||
|
||||||
this.sketchesServiceClient.isReadOnly(resource.uri);
|
this.sketchesServiceClient.isReadOnly(resource.uri);
|
||||||
return factory
|
return factory
|
||||||
? factory.createModel(resource)
|
? factory.createModel(resource)
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application';
|
import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application-contribution';
|
||||||
import { ThemeService } from '@theia/core/lib/browser/theming';
|
import { ThemeService } from '@theia/core/lib/browser/theming';
|
||||||
import {
|
import {
|
||||||
Disposable,
|
Disposable,
|
||||||
|
|||||||
@@ -1,11 +1,9 @@
|
|||||||
import { DisposableCollection } from '@theia/core/lib/common/disposable';
|
import type { DisposableCollection } from '@theia/core/lib/common/disposable';
|
||||||
import { Emitter, Event } from '@theia/core/lib/common/event';
|
import { Emitter, Event } from '@theia/core/lib/common/event';
|
||||||
import { injectable, interfaces } from '@theia/core/shared/inversify';
|
import { injectable, interfaces } from '@theia/core/shared/inversify';
|
||||||
import {
|
import { HostedPluginSupport as TheiaHostedPluginSupport } from '@theia/plugin-ext/lib/hosted/browser/hosted-plugin';
|
||||||
PluginContributions,
|
import type { PluginContributions } from '@theia/plugin-ext/lib/hosted/common/hosted-plugin';
|
||||||
HostedPluginSupport as TheiaHostedPluginSupport,
|
import type { HostedPluginSupport } from '../../hosted/hosted-plugin-support';
|
||||||
} from '@theia/plugin-ext/lib/hosted/browser/hosted-plugin';
|
|
||||||
import { HostedPluginSupport } from '../../hosted/hosted-plugin-support';
|
|
||||||
|
|
||||||
@injectable()
|
@injectable()
|
||||||
export class HostedPluginSupportImpl
|
export class HostedPluginSupportImpl
|
||||||
|
|||||||
@@ -1,241 +0,0 @@
|
|||||||
import { LabelIcon } from '@theia/core/lib/browser/label-parser';
|
|
||||||
import { OpenerService, open } from '@theia/core/lib/browser/opener-service';
|
|
||||||
import { codicon } from '@theia/core/lib/browser/widgets/widget';
|
|
||||||
import { DisposableCollection } from '@theia/core/lib/common/disposable';
|
|
||||||
import { URI } from '@theia/core/lib/common/uri';
|
|
||||||
import { inject, injectable } from '@theia/core/shared/inversify';
|
|
||||||
import React from '@theia/core/shared/react';
|
|
||||||
import { URI as CodeUri } from '@theia/core/shared/vscode-uri';
|
|
||||||
import { TreeViewWidget as TheiaTreeViewWidget } from '@theia/plugin-ext/lib/main/browser/view/tree-view-widget';
|
|
||||||
|
|
||||||
// Copied back from https://github.com/eclipse-theia/theia/pull/14391
|
|
||||||
// Remove the patching when Arduino uses Eclipse Theia >1.55.0
|
|
||||||
// https://github.com/eclipse-theia/theia/blob/8d3c5a11af65448b6700bedd096f8d68f0675541/packages/core/src/browser/tree/tree-view-welcome-widget.tsx#L37-L54
|
|
||||||
// https://github.com/eclipse-theia/theia/blob/8d3c5a11af65448b6700bedd096f8d68f0675541/packages/core/src/browser/tree/tree-view-welcome-widget.tsx#L146-L298
|
|
||||||
|
|
||||||
interface ViewWelcome {
|
|
||||||
readonly view: string;
|
|
||||||
readonly content: string;
|
|
||||||
readonly when?: string;
|
|
||||||
readonly enablement?: string;
|
|
||||||
readonly order: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface IItem {
|
|
||||||
readonly welcomeInfo: ViewWelcome;
|
|
||||||
visible: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ILink {
|
|
||||||
readonly label: string;
|
|
||||||
readonly href: string;
|
|
||||||
readonly title?: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
type LinkedTextItem = string | ILink;
|
|
||||||
|
|
||||||
@injectable()
|
|
||||||
export class TreeViewWidget extends TheiaTreeViewWidget {
|
|
||||||
@inject(OpenerService)
|
|
||||||
private readonly openerService: OpenerService;
|
|
||||||
|
|
||||||
private readonly toDisposeBeforeUpdateViewWelcomeNodes =
|
|
||||||
new DisposableCollection();
|
|
||||||
|
|
||||||
protected override updateViewWelcomeNodes(): void {
|
|
||||||
this.viewWelcomeNodes = [];
|
|
||||||
this.toDisposeBeforeUpdateViewWelcomeNodes.dispose();
|
|
||||||
const items = this.visibleItems.sort((a, b) => a.order - b.order);
|
|
||||||
|
|
||||||
const enablementKeys: Set<string>[] = [];
|
|
||||||
// the plugin-view-registry will push the changes when there is a change in the `when` prop which controls the visibility
|
|
||||||
// this listener is to update the enablement of the components in the view welcome
|
|
||||||
this.toDisposeBeforeUpdateViewWelcomeNodes.push(
|
|
||||||
this.contextService.onDidChange((event) => {
|
|
||||||
if (enablementKeys.some((keys) => event.affects(keys))) {
|
|
||||||
this.updateViewWelcomeNodes();
|
|
||||||
this.update();
|
|
||||||
}
|
|
||||||
})
|
|
||||||
);
|
|
||||||
// Note: VS Code does not support the `renderSecondaryButtons` prop in welcome content either.
|
|
||||||
for (const item of items) {
|
|
||||||
const { content } = item;
|
|
||||||
const enablement = isEnablementAware(item) ? item.enablement : undefined;
|
|
||||||
const itemEnablementKeys = enablement
|
|
||||||
? this.contextService.parseKeys(enablement)
|
|
||||||
: undefined;
|
|
||||||
if (itemEnablementKeys) {
|
|
||||||
enablementKeys.push(itemEnablementKeys);
|
|
||||||
}
|
|
||||||
const lines = content.split('\n');
|
|
||||||
|
|
||||||
for (let line of lines) {
|
|
||||||
line = line.trim();
|
|
||||||
|
|
||||||
if (!line) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
const linkedTextItems = this.parseLinkedText_patch14309(line);
|
|
||||||
|
|
||||||
if (
|
|
||||||
linkedTextItems.length === 1 &&
|
|
||||||
typeof linkedTextItems[0] !== 'string'
|
|
||||||
) {
|
|
||||||
const node = linkedTextItems[0];
|
|
||||||
this.viewWelcomeNodes.push(
|
|
||||||
this.renderButtonNode_patch14309(
|
|
||||||
node,
|
|
||||||
this.viewWelcomeNodes.length,
|
|
||||||
enablement
|
|
||||||
)
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
const renderNode = (item: LinkedTextItem, index: number) =>
|
|
||||||
typeof item == 'string'
|
|
||||||
? this.renderTextNode_patch14309(item, index)
|
|
||||||
: this.renderLinkNode_patch14309(item, index, enablement);
|
|
||||||
|
|
||||||
this.viewWelcomeNodes.push(
|
|
||||||
<p key={`p-${this.viewWelcomeNodes.length}`}>
|
|
||||||
{...linkedTextItems.flatMap(renderNode)}
|
|
||||||
</p>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private renderButtonNode_patch14309(
|
|
||||||
node: ILink,
|
|
||||||
lineKey: string | number,
|
|
||||||
enablement: string | undefined
|
|
||||||
): React.ReactNode {
|
|
||||||
return (
|
|
||||||
<div key={`line-${lineKey}`} className="theia-WelcomeViewButtonWrapper">
|
|
||||||
<button
|
|
||||||
title={node.title}
|
|
||||||
className="theia-button theia-WelcomeViewButton"
|
|
||||||
disabled={!this.isEnabledClick_patch14309(enablement)}
|
|
||||||
onClick={(e) => this.openLinkOrCommand_patch14309(e, node.href)}
|
|
||||||
>
|
|
||||||
{node.label}
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
private renderTextNode_patch14309(
|
|
||||||
node: string,
|
|
||||||
textKey: string | number
|
|
||||||
): React.ReactNode {
|
|
||||||
return (
|
|
||||||
<span key={`text-${textKey}`}>
|
|
||||||
{this.labelParser
|
|
||||||
.parse(node)
|
|
||||||
.map((segment, index) =>
|
|
||||||
LabelIcon.is(segment) ? (
|
|
||||||
<span key={index} className={codicon(segment.name)} />
|
|
||||||
) : (
|
|
||||||
<span key={index}>{segment}</span>
|
|
||||||
)
|
|
||||||
)}
|
|
||||||
</span>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
private renderLinkNode_patch14309(
|
|
||||||
node: ILink,
|
|
||||||
linkKey: string | number,
|
|
||||||
enablement: string | undefined
|
|
||||||
): React.ReactNode {
|
|
||||||
return (
|
|
||||||
<a
|
|
||||||
key={`link-${linkKey}`}
|
|
||||||
className={this.getLinkClassName_patch14309(node.href, enablement)}
|
|
||||||
title={node.title || ''}
|
|
||||||
onClick={(e) => this.openLinkOrCommand_patch14309(e, node.href)}
|
|
||||||
>
|
|
||||||
{node.label}
|
|
||||||
</a>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
private getLinkClassName_patch14309(
|
|
||||||
href: string,
|
|
||||||
enablement: string | undefined
|
|
||||||
): string {
|
|
||||||
const classNames = ['theia-WelcomeViewCommandLink'];
|
|
||||||
// Only command-backed links can be disabled. All other, https:, file: remain enabled
|
|
||||||
if (
|
|
||||||
href.startsWith('command:') &&
|
|
||||||
!this.isEnabledClick_patch14309(enablement)
|
|
||||||
) {
|
|
||||||
classNames.push('disabled');
|
|
||||||
}
|
|
||||||
return classNames.join(' ');
|
|
||||||
}
|
|
||||||
|
|
||||||
private isEnabledClick_patch14309(enablement: string | undefined): boolean {
|
|
||||||
return typeof enablement === 'string'
|
|
||||||
? this.contextService.match(enablement)
|
|
||||||
: true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private openLinkOrCommand_patch14309 = (
|
|
||||||
event: React.MouseEvent,
|
|
||||||
value: string
|
|
||||||
): void => {
|
|
||||||
event.stopPropagation();
|
|
||||||
|
|
||||||
if (value.startsWith('command:')) {
|
|
||||||
const command = value.replace('command:', '');
|
|
||||||
this.commands.executeCommand(command);
|
|
||||||
} else if (value.startsWith('file:')) {
|
|
||||||
const uri = value.replace('file:', '');
|
|
||||||
open(this.openerService, new URI(CodeUri.file(uri).toString()));
|
|
||||||
} else {
|
|
||||||
this.windowService.openNewWindow(value, { external: true });
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
private parseLinkedText_patch14309(text: string): LinkedTextItem[] {
|
|
||||||
const result: LinkedTextItem[] = [];
|
|
||||||
|
|
||||||
const linkRegex =
|
|
||||||
/\[([^\]]+)\]\(((?:https?:\/\/|command:|file:)[^\)\s]+)(?: (["'])(.+?)(\3))?\)/gi;
|
|
||||||
let index = 0;
|
|
||||||
let match: RegExpExecArray | null;
|
|
||||||
|
|
||||||
while ((match = linkRegex.exec(text))) {
|
|
||||||
if (match.index - index > 0) {
|
|
||||||
result.push(text.substring(index, match.index));
|
|
||||||
}
|
|
||||||
|
|
||||||
const [, label, href, , title] = match;
|
|
||||||
|
|
||||||
if (title) {
|
|
||||||
result.push({ label, href, title });
|
|
||||||
} else {
|
|
||||||
result.push({ label, href });
|
|
||||||
}
|
|
||||||
|
|
||||||
index = match.index + match[0].length;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (index < text.length) {
|
|
||||||
result.push(text.substring(index));
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
interface EnablementAware {
|
|
||||||
readonly enablement: string | undefined;
|
|
||||||
}
|
|
||||||
|
|
||||||
function isEnablementAware(arg: unknown): arg is EnablementAware {
|
|
||||||
return !!arg && typeof arg === 'object' && 'enablement' in arg;
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
import { TestViewContribution as TheiaTestViewContribution } from '@theia/test/lib/browser/view/test-view-contribution';
|
||||||
|
import { injectable } from 'inversify';
|
||||||
|
|
||||||
|
@injectable()
|
||||||
|
export class TestViewContribution extends TheiaTestViewContribution {
|
||||||
|
override async initializeLayout(): Promise<void> {
|
||||||
|
// NOOP
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -4,6 +4,7 @@ import {
|
|||||||
TabBarToolbarRegistry,
|
TabBarToolbarRegistry,
|
||||||
TabBarToolbarItem,
|
TabBarToolbarItem,
|
||||||
ReactTabBarToolbarItem,
|
ReactTabBarToolbarItem,
|
||||||
|
RenderedToolbarItem,
|
||||||
} from '@theia/core/lib/browser/shell/tab-bar-toolbar';
|
} from '@theia/core/lib/browser/shell/tab-bar-toolbar';
|
||||||
import { CommandRegistry } from '@theia/core/lib/common/command';
|
import { CommandRegistry } from '@theia/core/lib/common/command';
|
||||||
import { ReactWidget } from '@theia/core/lib/browser';
|
import { ReactWidget } from '@theia/core/lib/browser';
|
||||||
@@ -14,7 +15,7 @@ export const ARDUINO_TOOLBAR_ITEM_CLASS = 'arduino-tool-item';
|
|||||||
export namespace ArduinoToolbarComponent {
|
export namespace ArduinoToolbarComponent {
|
||||||
export interface Props {
|
export interface Props {
|
||||||
side: 'left' | 'right';
|
side: 'left' | 'right';
|
||||||
items: (TabBarToolbarItem | ReactTabBarToolbarItem)[];
|
items: TabBarToolbarItem[];
|
||||||
commands: CommandRegistry;
|
commands: CommandRegistry;
|
||||||
labelParser: LabelParser;
|
labelParser: LabelParser;
|
||||||
commandIsEnabled: (id: string) => boolean;
|
commandIsEnabled: (id: string) => boolean;
|
||||||
@@ -34,7 +35,7 @@ export class ArduinoToolbarComponent extends React.Component<
|
|||||||
this.state = { tooltip: '' };
|
this.state = { tooltip: '' };
|
||||||
}
|
}
|
||||||
|
|
||||||
protected renderItem = (item: TabBarToolbarItem) => {
|
protected renderItem = (item: RenderedToolbarItem) => {
|
||||||
let innerText = '';
|
let innerText = '';
|
||||||
let className = `arduino-tool-icon ${item.id}-icon`;
|
let className = `arduino-tool-icon ${item.id}-icon`;
|
||||||
if (item.text) {
|
if (item.text) {
|
||||||
@@ -46,7 +47,8 @@ export class ArduinoToolbarComponent extends React.Component<
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const command = this.props.commands.getCommand(item.command);
|
const command =
|
||||||
|
item.command && this.props.commands.getCommand(item.command);
|
||||||
const cls = `${ARDUINO_TOOLBAR_ITEM_CLASS} ${
|
const cls = `${ARDUINO_TOOLBAR_ITEM_CLASS} ${
|
||||||
TabBarToolbar.Styles.TAB_BAR_TOOLBAR_ITEM
|
TabBarToolbar.Styles.TAB_BAR_TOOLBAR_ITEM
|
||||||
} ${command && this.props.commandIsEnabled(command.id) ? 'enabled' : ''} ${
|
} ${command && this.props.commandIsEnabled(command.id) ? 'enabled' : ''} ${
|
||||||
@@ -80,7 +82,9 @@ export class ArduinoToolbarComponent extends React.Component<
|
|||||||
const items = [
|
const items = [
|
||||||
<React.Fragment key={this.props.side + '-arduino-toolbar-tooltip'}>
|
<React.Fragment key={this.props.side + '-arduino-toolbar-tooltip'}>
|
||||||
{[...this.props.items].map((item) =>
|
{[...this.props.items].map((item) =>
|
||||||
TabBarToolbarItem.is(item) ? this.renderItem(item) : item.render()
|
ReactTabBarToolbarItem.is(item)
|
||||||
|
? item.render()
|
||||||
|
: this.renderItem(item)
|
||||||
)}
|
)}
|
||||||
</React.Fragment>,
|
</React.Fragment>,
|
||||||
];
|
];
|
||||||
@@ -94,10 +98,7 @@ export class ArduinoToolbarComponent extends React.Component<
|
|||||||
}
|
}
|
||||||
|
|
||||||
export class ArduinoToolbar extends ReactWidget {
|
export class ArduinoToolbar extends ReactWidget {
|
||||||
protected items = new Map<
|
protected items = new Map<string, TabBarToolbarItem>();
|
||||||
string,
|
|
||||||
TabBarToolbarItem | ReactTabBarToolbarItem
|
|
||||||
>();
|
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
protected readonly tabBarToolbarRegistry: TabBarToolbarRegistry,
|
protected readonly tabBarToolbarRegistry: TabBarToolbarRegistry,
|
||||||
@@ -112,9 +113,7 @@ export class ArduinoToolbar extends ReactWidget {
|
|||||||
this.tabBarToolbarRegistry.onDidChange(() => this.updateToolbar());
|
this.tabBarToolbarRegistry.onDidChange(() => this.updateToolbar());
|
||||||
}
|
}
|
||||||
|
|
||||||
protected updateItems(
|
protected updateItems(items: Array<TabBarToolbarItem>): void {
|
||||||
items: Array<TabBarToolbarItem | ReactTabBarToolbarItem>
|
|
||||||
): void {
|
|
||||||
this.items.clear();
|
this.items.clear();
|
||||||
const revItems = items
|
const revItems = items
|
||||||
.sort(TabBarToolbarItem.PRIORITY_COMPARATOR)
|
.sort(TabBarToolbarItem.PRIORITY_COMPARATOR)
|
||||||
@@ -163,7 +162,7 @@ export class ArduinoToolbar extends ReactWidget {
|
|||||||
|
|
||||||
protected executeCommand = (e: React.MouseEvent<HTMLElement>) => {
|
protected executeCommand = (e: React.MouseEvent<HTMLElement>) => {
|
||||||
const item = this.items.get(e.currentTarget.id);
|
const item = this.items.get(e.currentTarget.id);
|
||||||
if (TabBarToolbarItem.is(item)) {
|
if (item && item.command) {
|
||||||
this.commands.executeCommand(item.command, this, e.target);
|
this.commands.executeCommand(item.command, this, e.target);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application';
|
import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application-contribution';
|
||||||
import {
|
import {
|
||||||
OpenerOptions,
|
OpenerOptions,
|
||||||
OpenHandler,
|
OpenHandler,
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import { CommandRegistry } from '@theia/core/lib/common/command';
|
|||||||
import { MenuModelRegistry } from '@theia/core/lib/common/menu';
|
import { MenuModelRegistry } from '@theia/core/lib/common/menu';
|
||||||
import { PreferenceService } from '@theia/core/lib/browser/preferences/preference-service';
|
import { PreferenceService } from '@theia/core/lib/browser/preferences/preference-service';
|
||||||
import { AbstractViewContribution } from '@theia/core/lib/browser/shell/view-contribution';
|
import { AbstractViewContribution } from '@theia/core/lib/browser/shell/view-contribution';
|
||||||
import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application';
|
import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application-contribution';
|
||||||
import { MainMenuManager } from '../../../common/main-menu-manager';
|
import { MainMenuManager } from '../../../common/main-menu-manager';
|
||||||
import { ArduinoPreferences } from '../../arduino-preferences';
|
import { ArduinoPreferences } from '../../arduino-preferences';
|
||||||
import { SketchbookWidget } from './sketchbook-widget';
|
import { SketchbookWidget } from './sketchbook-widget';
|
||||||
|
|||||||
@@ -171,7 +171,7 @@ export interface CoreService {
|
|||||||
compile(
|
compile(
|
||||||
options: CoreService.Options.Compile,
|
options: CoreService.Options.Compile,
|
||||||
cancellationToken?: CancellationToken
|
cancellationToken?: CancellationToken
|
||||||
): Promise<void>;
|
): Promise<CompileSummary | undefined>;
|
||||||
upload(
|
upload(
|
||||||
options: CoreService.Options.Upload,
|
options: CoreService.Options.Upload,
|
||||||
cancellationToken?: CancellationToken
|
cancellationToken?: CancellationToken
|
||||||
|
|||||||
@@ -1,7 +0,0 @@
|
|||||||
export const SurveyNotificationServicePath =
|
|
||||||
'/services/survey-notification-service';
|
|
||||||
export const SurveyNotificationService = Symbol('SurveyNotificationService');
|
|
||||||
|
|
||||||
export interface SurveyNotificationService {
|
|
||||||
isFirstInstance(): Promise<boolean>;
|
|
||||||
}
|
|
||||||
@@ -38,3 +38,26 @@ export function uint8ArrayToString(uint8Array: Uint8Array): string {
|
|||||||
export function stringToUint8Array(text: string): Uint8Array {
|
export function stringToUint8Array(text: string): Uint8Array {
|
||||||
return Uint8Array.from(text, (char) => char.charCodeAt(0));
|
return Uint8Array.from(text, (char) => char.charCodeAt(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function poolWhile(
|
||||||
|
whileCondition: () => boolean,
|
||||||
|
intervalMs: number,
|
||||||
|
timeoutMs: number
|
||||||
|
): Promise<void> {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
if (!whileCondition) {
|
||||||
|
resolve();
|
||||||
|
}
|
||||||
|
|
||||||
|
const start = Date.now();
|
||||||
|
const interval = setInterval(() => {
|
||||||
|
if (!whileCondition()) {
|
||||||
|
clearInterval(interval);
|
||||||
|
resolve();
|
||||||
|
} else if (Date.now() - start > timeoutMs) {
|
||||||
|
clearInterval(interval);
|
||||||
|
reject(new Error('Timed out while polling.'));
|
||||||
|
}
|
||||||
|
}, intervalMs);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|||||||
@@ -38,33 +38,33 @@ export class ElectronMainMenuFactory extends TheiaElectronMainMenuFactory {
|
|||||||
this.preferencesService.onPreferenceChanged(
|
this.preferencesService.onPreferenceChanged(
|
||||||
debounce((e) => {
|
debounce((e) => {
|
||||||
if (e.preferenceName === 'window.menuBarVisibility') {
|
if (e.preferenceName === 'window.menuBarVisibility') {
|
||||||
this.setMenuBar();
|
this.doSetMenuBar();
|
||||||
}
|
}
|
||||||
if (this._menu) {
|
if (this.menu) {
|
||||||
for (const cmd of this._toggledCommands) {
|
for (const cmd of this.toggledCommands) {
|
||||||
const menuItem = this.findMenuById(this._menu, cmd);
|
const menuItem = this.findMenuById(this.menu, cmd);
|
||||||
if (menuItem) {
|
if (menuItem) {
|
||||||
menuItem.checked = this.commandRegistry.isToggled(cmd);
|
menuItem.checked = this.commandRegistry.isToggled(cmd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
window.electronArduino.setMenu(this._menu); // calls the IDE2-specific implementation
|
window.electronArduino.setMenu(this.menu); // calls the IDE2-specific implementation
|
||||||
}
|
}
|
||||||
}, 10)
|
}, 10)
|
||||||
);
|
);
|
||||||
this.keybindingRegistry.onKeybindingsChanged(() => {
|
this.keybindingRegistry.onKeybindingsChanged(() => {
|
||||||
this.setMenuBar();
|
this.doSetMenuBar();
|
||||||
});
|
});
|
||||||
// #endregion Theia `postConstruct`
|
// #endregion Theia `postConstruct`
|
||||||
this.appStateService.reachedState('ready').then(() => {
|
this.appStateService.reachedState('ready').then(() => {
|
||||||
this.appReady = true;
|
this.appReady = true;
|
||||||
if (this.updateWhenReady) {
|
if (this.updateWhenReady) {
|
||||||
this.setMenuBar();
|
this.doSetMenuBar();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
override createElectronMenuBar(): MenuDto[] {
|
override createElectronMenuBar(): MenuDto[] {
|
||||||
this._toggledCommands.clear(); // https://github.com/eclipse-theia/theia/issues/8977
|
this.toggledCommands.clear(); // https://github.com/eclipse-theia/theia/issues/8977
|
||||||
const menuModel = this.menuProvider.getMenu(MAIN_MENU_BAR);
|
const menuModel = this.menuProvider.getMenu(MAIN_MENU_BAR);
|
||||||
const menu = this.fillMenuTemplate([], menuModel, [], {
|
const menu = this.fillMenuTemplate([], menuModel, [], {
|
||||||
rootMenuPath: MAIN_MENU_BAR,
|
rootMenuPath: MAIN_MENU_BAR,
|
||||||
@@ -73,11 +73,11 @@ export class ElectronMainMenuFactory extends TheiaElectronMainMenuFactory {
|
|||||||
menu.unshift(this.createOSXMenu());
|
menu.unshift(this.createOSXMenu());
|
||||||
}
|
}
|
||||||
const escapedMenu = this.escapeAmpersand(menu);
|
const escapedMenu = this.escapeAmpersand(menu);
|
||||||
this._menu = escapedMenu;
|
this.menu = escapedMenu;
|
||||||
return escapedMenu;
|
return escapedMenu;
|
||||||
}
|
}
|
||||||
|
|
||||||
override async setMenuBar(): Promise<void> {
|
override async doSetMenuBar(): Promise<void> {
|
||||||
// Avoid updating menu items when the app is not ready.
|
// Avoid updating menu items when the app is not ready.
|
||||||
// Getting the current electron window is not free and synchronous.
|
// Getting the current electron window is not free and synchronous.
|
||||||
// Here, we defer all menu update requests, and fire one when the app is ready.
|
// Here, we defer all menu update requests, and fire one when the app is ready.
|
||||||
@@ -124,17 +124,17 @@ export class ElectronMainMenuFactory extends TheiaElectronMainMenuFactory {
|
|||||||
...args
|
...args
|
||||||
);
|
);
|
||||||
if (
|
if (
|
||||||
this._menu &&
|
this.menu &&
|
||||||
this.menuCommandExecutor.isVisible(menuPath, commandId, ...args)
|
this.menuCommandExecutor.isVisible(menuPath, commandId, ...args)
|
||||||
) {
|
) {
|
||||||
const item = this.findMenuById(this._menu, commandId);
|
const item = this.findMenuById(this.menu, commandId);
|
||||||
if (item) {
|
if (item) {
|
||||||
item.checked = this.menuCommandExecutor.isToggled(
|
item.checked = this.menuCommandExecutor.isToggled(
|
||||||
menuPath,
|
menuPath,
|
||||||
commandId,
|
commandId,
|
||||||
...args
|
...args
|
||||||
);
|
);
|
||||||
window.electronArduino.setMenu(this._menu); // overridden to call the IDE2-specific implementation.
|
window.electronArduino.setMenu(this.menu); // overridden to call the IDE2-specific implementation.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -342,7 +342,7 @@ export class ElectronMainMenuFactory extends TheiaElectronMainMenuFactory {
|
|||||||
parentItems.push(menuItem);
|
parentItems.push(menuItem);
|
||||||
|
|
||||||
if (this.commandRegistry.getToggledHandler(commandId, ...args)) {
|
if (this.commandRegistry.getToggledHandler(commandId, ...args)) {
|
||||||
this._toggledCommands.add(commandId);
|
this.toggledCommands.add(commandId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return parentItems;
|
return parentItems;
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import {
|
|||||||
hasStartupTasks,
|
hasStartupTasks,
|
||||||
StartupTasks,
|
StartupTasks,
|
||||||
} from '../../../electron-common/startup-task';
|
} from '../../../electron-common/startup-task';
|
||||||
|
import { WindowReloadOptions } from '@theia/core/lib/browser/window/window-service';
|
||||||
|
|
||||||
@injectable()
|
@injectable()
|
||||||
export class ElectronWindowService
|
export class ElectronWindowService
|
||||||
@@ -17,8 +18,12 @@ export class ElectronWindowService
|
|||||||
|
|
||||||
@postConstruct()
|
@postConstruct()
|
||||||
protected override init(): void {
|
protected override init(): void {
|
||||||
// NOOP
|
// Overridden to avoid calling the zoom level listener in super.
|
||||||
// IDE2 listens on the zoom level changes in `ArduinoFrontendContribution#onStart`
|
// IDE2 listens on the zoom level changes in `ArduinoFrontendContribution#onStart`
|
||||||
|
|
||||||
|
window.electronTheiaCore.onAboutToClose(() => {
|
||||||
|
this.connectionCloseService.markForClose(this.frontendIdProvider.getId());
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
async isFirstWindow(): Promise<boolean> {
|
async isFirstWindow(): Promise<boolean> {
|
||||||
@@ -38,11 +43,11 @@ export class ElectronWindowService
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Overridden to support optional task owner params and make `tsc` happy.
|
// Overridden to support optional task owner params and make `tsc` happy.
|
||||||
override reload(options?: StartupTasks): void {
|
override reload(options?: StartupTasks | WindowReloadOptions): void {
|
||||||
if (hasStartupTasks(options)) {
|
if (hasStartupTasks(options)) {
|
||||||
window.electronArduino.requestReload(options);
|
window.electronArduino.requestReload(options);
|
||||||
} else {
|
} else {
|
||||||
window.electronTheiaCore.requestReload();
|
super.reload(options);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
import { JsonRpcConnectionHandler } from '@theia/core/lib/common/messaging/proxy-factory';
|
import { ElectronConnectionHandler } from '@theia/core/lib/electron-main/messaging/electron-connection-handler';
|
||||||
|
import { RpcConnectionHandler } from '@theia/core/lib/common/messaging/proxy-factory';
|
||||||
import { ElectronMainWindowService } from '@theia/core/lib/electron-common/electron-main-window-service';
|
import { ElectronMainWindowService } from '@theia/core/lib/electron-common/electron-main-window-service';
|
||||||
import { ElectronConnectionHandler } from '@theia/core/lib/electron-common/messaging/electron-connection-handler';
|
|
||||||
import { TheiaMainApi } from '@theia/core/lib/electron-main/electron-api-main';
|
import { TheiaMainApi } from '@theia/core/lib/electron-main/electron-api-main';
|
||||||
import {
|
import {
|
||||||
ElectronMainApplication as TheiaElectronMainApplication,
|
|
||||||
ElectronMainApplicationContribution,
|
ElectronMainApplicationContribution,
|
||||||
|
ElectronMainApplication as TheiaElectronMainApplication,
|
||||||
} from '@theia/core/lib/electron-main/electron-main-application';
|
} from '@theia/core/lib/electron-main/electron-main-application';
|
||||||
import { TheiaElectronWindow as DefaultTheiaElectronWindow } from '@theia/core/lib/electron-main/theia-electron-window';
|
import { TheiaElectronWindow as DefaultTheiaElectronWindow } from '@theia/core/lib/electron-main/theia-electron-window';
|
||||||
import { ContainerModule } from '@theia/core/shared/inversify';
|
import { ContainerModule } from '@theia/core/shared/inversify';
|
||||||
@@ -36,15 +36,12 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => {
|
|||||||
bind(ElectronConnectionHandler)
|
bind(ElectronConnectionHandler)
|
||||||
.toDynamicValue(
|
.toDynamicValue(
|
||||||
(context) =>
|
(context) =>
|
||||||
new JsonRpcConnectionHandler<IDEUpdaterClient>(
|
new RpcConnectionHandler<IDEUpdaterClient>(IDEUpdaterPath, (client) => {
|
||||||
IDEUpdaterPath,
|
const server = context.container.get<IDEUpdater>(IDEUpdater);
|
||||||
(client) => {
|
server.setClient(client);
|
||||||
const server = context.container.get<IDEUpdater>(IDEUpdater);
|
client.onDidCloseConnection(() => server.disconnectClient(client));
|
||||||
server.setClient(client);
|
return server;
|
||||||
client.onDidCloseConnection(() => server.disconnectClient(client));
|
})
|
||||||
return server;
|
|
||||||
}
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
.inSingletonScope();
|
.inSingletonScope();
|
||||||
|
|
||||||
|
|||||||
@@ -11,16 +11,16 @@ import {
|
|||||||
Disposable,
|
Disposable,
|
||||||
DisposableCollection,
|
DisposableCollection,
|
||||||
} from '@theia/core/lib/common/disposable';
|
} from '@theia/core/lib/common/disposable';
|
||||||
|
import { FileUri } from '@theia/core/lib/common/file-uri';
|
||||||
import { isOSX } from '@theia/core/lib/common/os';
|
import { isOSX } from '@theia/core/lib/common/os';
|
||||||
import { Deferred } from '@theia/core/lib/common/promise-util';
|
import { Deferred } from '@theia/core/lib/common/promise-util';
|
||||||
import { isObject, MaybePromise, Mutable } from '@theia/core/lib/common/types';
|
import { isObject, MaybePromise, Mutable } from '@theia/core/lib/common/types';
|
||||||
import { ElectronSecurityToken } from '@theia/core/lib/electron-common/electron-token';
|
import { ElectronSecurityToken } from '@theia/core/lib/electron-common/electron-token';
|
||||||
import {
|
import {
|
||||||
ElectronMainExecutionParams,
|
ElectronMainCommandOptions,
|
||||||
ElectronMainApplication as TheiaElectronMainApplication,
|
ElectronMainApplication as TheiaElectronMainApplication,
|
||||||
} from '@theia/core/lib/electron-main/electron-main-application';
|
} from '@theia/core/lib/electron-main/electron-main-application';
|
||||||
import type { TheiaBrowserWindowOptions } from '@theia/core/lib/electron-main/theia-electron-window';
|
import type { TheiaBrowserWindowOptions } from '@theia/core/lib/electron-main/theia-electron-window';
|
||||||
import { FileUri } from '@theia/core/lib/node/file-uri';
|
|
||||||
import { inject, injectable } from '@theia/core/shared/inversify';
|
import { inject, injectable } from '@theia/core/shared/inversify';
|
||||||
import { URI } from '@theia/core/shared/vscode-uri';
|
import { URI } from '@theia/core/shared/vscode-uri';
|
||||||
import { log as logToFile, setup as setupFileLog } from 'node-log-rotate';
|
import { log as logToFile, setup as setupFileLog } from 'node-log-rotate';
|
||||||
@@ -28,7 +28,9 @@ import { fork } from 'node:child_process';
|
|||||||
import { promises as fs, readFileSync, rm, rmSync } from 'node:fs';
|
import { promises as fs, readFileSync, rm, rmSync } from 'node:fs';
|
||||||
import type { AddressInfo } from 'node:net';
|
import type { AddressInfo } from 'node:net';
|
||||||
import { isAbsolute, join, resolve } from 'node:path';
|
import { isAbsolute, join, resolve } from 'node:path';
|
||||||
|
import type { Argv } from 'yargs';
|
||||||
import { Sketch } from '../../common/protocol';
|
import { Sketch } from '../../common/protocol';
|
||||||
|
import { poolWhile } from '../../common/utils';
|
||||||
import {
|
import {
|
||||||
AppInfo,
|
AppInfo,
|
||||||
appInfoPropertyLiterals,
|
appInfoPropertyLiterals,
|
||||||
@@ -129,6 +131,11 @@ const APP_STARTED_WITH_CONTENT_TRACE =
|
|||||||
typeof process !== 'undefined' &&
|
typeof process !== 'undefined' &&
|
||||||
process.argv.indexOf('--content-trace') !== -1;
|
process.argv.indexOf('--content-trace') !== -1;
|
||||||
|
|
||||||
|
const createYargs: (
|
||||||
|
argv?: string[],
|
||||||
|
cwd?: string
|
||||||
|
) => Argv = require('yargs/yargs');
|
||||||
|
|
||||||
@injectable()
|
@injectable()
|
||||||
export class ElectronMainApplication extends TheiaElectronMainApplication {
|
export class ElectronMainApplication extends TheiaElectronMainApplication {
|
||||||
@inject(IsTempSketch)
|
@inject(IsTempSketch)
|
||||||
@@ -171,29 +178,59 @@ export class ElectronMainApplication extends TheiaElectronMainApplication {
|
|||||||
private readonly scheduledDeletions: Disposable[] = [];
|
private readonly scheduledDeletions: Disposable[] = [];
|
||||||
|
|
||||||
override async start(config: FrontendApplicationConfig): Promise<void> {
|
override async start(config: FrontendApplicationConfig): Promise<void> {
|
||||||
// Explicitly set the app name to have better menu items on macOS. ("About", "Hide", and "Quit")
|
createYargs(this.argv, process.cwd())
|
||||||
// See: https://github.com/electron-userland/electron-builder/issues/2468
|
.command(
|
||||||
// Regression in Theia: https://github.com/eclipse-theia/theia/issues/8701
|
'$0 [file]',
|
||||||
console.log(`${config.applicationName} ${app.getVersion()}`);
|
false,
|
||||||
app.on('ready', () => app.setName(config.applicationName));
|
(cmd) =>
|
||||||
const cwd = process.cwd();
|
cmd
|
||||||
this.attachFileAssociations(cwd);
|
.option('electronUserData', {
|
||||||
this.useNativeWindowFrame = this.getTitleBarStyle(config) === 'native';
|
type: 'string',
|
||||||
this._config = await updateFrontendApplicationConfigFromPackageJson(config);
|
describe:
|
||||||
this._appInfo = updateAppInfo(this._appInfo, this._config);
|
'The area where the electron main process puts its data',
|
||||||
this.hookApplicationEvents();
|
})
|
||||||
const [port] = await Promise.all([this.startBackend(), app.whenReady()]);
|
.positional('file', { type: 'string' }),
|
||||||
this.startContentTracing();
|
async (args) => {
|
||||||
this._backendPort.resolve(port);
|
if (args.electronUserData) {
|
||||||
await Promise.all([
|
console.info(
|
||||||
this.attachElectronSecurityToken(port),
|
`using electron user data area : '${args.electronUserData}'`
|
||||||
this.startContributions(),
|
);
|
||||||
]);
|
await fs.mkdir(args.electronUserData, { recursive: true });
|
||||||
return this.launch({
|
app.setPath('userData', args.electronUserData);
|
||||||
secondInstance: false,
|
}
|
||||||
argv: this.processArgv.getProcessArgvWithoutBin(process.argv),
|
// Explicitly set the app name to have better menu items on macOS. ("About", "Hide", and "Quit")
|
||||||
cwd,
|
// See: https://github.com/electron-userland/electron-builder/issues/2468
|
||||||
});
|
// Regression in Theia: https://github.com/eclipse-theia/theia/issues/8701
|
||||||
|
console.log(`${config.applicationName} ${app.getVersion()}`);
|
||||||
|
app.on('ready', () => app.setName(config.applicationName));
|
||||||
|
const cwd = process.cwd();
|
||||||
|
this.attachFileAssociations(cwd);
|
||||||
|
this.useNativeWindowFrame =
|
||||||
|
this.getTitleBarStyle(config) === 'native';
|
||||||
|
this._config = await updateFrontendApplicationConfigFromPackageJson(
|
||||||
|
config
|
||||||
|
);
|
||||||
|
this._appInfo = updateAppInfo(this._appInfo, this._config);
|
||||||
|
this.hookApplicationEvents();
|
||||||
|
this.showInitialWindow(undefined);
|
||||||
|
const [port] = await Promise.all([
|
||||||
|
this.startBackend(),
|
||||||
|
app.whenReady(),
|
||||||
|
]);
|
||||||
|
this.startContentTracing();
|
||||||
|
this._backendPort.resolve(port);
|
||||||
|
await Promise.all([
|
||||||
|
this.attachElectronSecurityToken(port),
|
||||||
|
this.startContributions(),
|
||||||
|
]);
|
||||||
|
this.handleMainCommand({
|
||||||
|
file: args.file,
|
||||||
|
cwd,
|
||||||
|
secondInstance: false,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.parse();
|
||||||
}
|
}
|
||||||
|
|
||||||
private startContentTracing(): void {
|
private startContentTracing(): void {
|
||||||
@@ -256,6 +293,16 @@ export class ElectronMainApplication extends TheiaElectronMainApplication {
|
|||||||
);
|
);
|
||||||
if (sketchFolderPath) {
|
if (sketchFolderPath) {
|
||||||
this.openFilePromise.reject(new InterruptWorkspaceRestoreError());
|
this.openFilePromise.reject(new InterruptWorkspaceRestoreError());
|
||||||
|
|
||||||
|
// open-file event is triggered before the app is ready and initialWindow is created.
|
||||||
|
// Wait for initialWindow to be set before opening the sketch on the first instance.
|
||||||
|
// See https://github.com/arduino/arduino-ide/pull/2693
|
||||||
|
try {
|
||||||
|
await app.whenReady();
|
||||||
|
if (!this.firstWindowId) {
|
||||||
|
await poolWhile(() => !this.initialWindow, 100, 3000);
|
||||||
|
}
|
||||||
|
} catch {}
|
||||||
await this.openSketch(sketchFolderPath);
|
await this.openSketch(sketchFolderPath);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -284,8 +331,8 @@ export class ElectronMainApplication extends TheiaElectronMainApplication {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override async launch(
|
protected override async handleMainCommand(
|
||||||
params: ElectronMainExecutionParams
|
options: ElectronMainCommandOptions
|
||||||
): Promise<void> {
|
): Promise<void> {
|
||||||
try {
|
try {
|
||||||
// When running on MacOS, we either have to wait until
|
// When running on MacOS, we either have to wait until
|
||||||
@@ -300,7 +347,7 @@ export class ElectronMainApplication extends TheiaElectronMainApplication {
|
|||||||
throw err;
|
throw err;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (await this.launchFromArgs(params)) {
|
if (await this.launchFromArgs(options)) {
|
||||||
// Application has received a file in its arguments and will skip the default application launch
|
// Application has received a file in its arguments and will skip the default application launch
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -314,7 +361,10 @@ export class ElectronMainApplication extends TheiaElectronMainApplication {
|
|||||||
`Restoring workspace roots: ${workspaces.map(({ file }) => file)}`
|
`Restoring workspace roots: ${workspaces.map(({ file }) => file)}`
|
||||||
);
|
);
|
||||||
for (const workspace of workspaces) {
|
for (const workspace of workspaces) {
|
||||||
const resolvedPath = await this.resolvePath(workspace.file, params.cwd);
|
const resolvedPath = await this.resolvePath(
|
||||||
|
workspace.file,
|
||||||
|
options.cwd
|
||||||
|
);
|
||||||
if (!resolvedPath) {
|
if (!resolvedPath) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -337,15 +387,20 @@ export class ElectronMainApplication extends TheiaElectronMainApplication {
|
|||||||
}
|
}
|
||||||
this.startup = false;
|
this.startup = false;
|
||||||
if (useDefault) {
|
if (useDefault) {
|
||||||
super.launch(params);
|
super.handleMainCommand(options);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private get argv(): string[] {
|
||||||
|
return this.processArgv.getProcessArgvWithoutBin(process.argv).slice();
|
||||||
|
}
|
||||||
|
|
||||||
private async launchFromArgs(
|
private async launchFromArgs(
|
||||||
params: ElectronMainExecutionParams
|
params: ElectronMainCommandOptions,
|
||||||
|
argv?: string[]
|
||||||
): Promise<boolean> {
|
): Promise<boolean> {
|
||||||
// Copy to prevent manipulation of original array
|
// Copy to prevent manipulation of original array
|
||||||
const argCopy = [...params.argv];
|
const argCopy = [...(argv || this.argv)];
|
||||||
let path: string | undefined;
|
let path: string | undefined;
|
||||||
for (const maybePath of argCopy) {
|
for (const maybePath of argCopy) {
|
||||||
const resolvedPath = await this.resolvePath(maybePath, params.cwd);
|
const resolvedPath = await this.resolvePath(maybePath, params.cwd);
|
||||||
@@ -383,7 +438,7 @@ export class ElectronMainApplication extends TheiaElectronMainApplication {
|
|||||||
}
|
}
|
||||||
const [uri, electronWindow] = await Promise.all([
|
const [uri, electronWindow] = await Promise.all([
|
||||||
this.createWindowUri(),
|
this.createWindowUri(),
|
||||||
this.createWindow(options),
|
this.reuseOrCreateWindow(options),
|
||||||
]);
|
]);
|
||||||
electronWindow.loadURL(uri.withFragment(encodeURI(file)).toString(true));
|
electronWindow.loadURL(uri.withFragment(encodeURI(file)).toString(true));
|
||||||
return electronWindow;
|
return electronWindow;
|
||||||
@@ -483,7 +538,7 @@ export class ElectronMainApplication extends TheiaElectronMainApplication {
|
|||||||
argv: string[],
|
argv: string[],
|
||||||
cwd: string
|
cwd: string
|
||||||
): Promise<void> {
|
): Promise<void> {
|
||||||
if (await this.launchFromArgs({ cwd, argv, secondInstance: true })) {
|
if (await this.launchFromArgs({ cwd, secondInstance: true }, argv)) {
|
||||||
// Application has received a file in its arguments
|
// Application has received a file in its arguments
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -779,7 +834,7 @@ class InterruptWorkspaceRestoreError extends Error {
|
|||||||
// but it's the `package.json` inside the `resources/app/` folder if it's the final bundled app.
|
// but it's the `package.json` inside the `resources/app/` folder if it's the final bundled app.
|
||||||
// See https://github.com/arduino/arduino-ide/pull/2144#pullrequestreview-1556343430.
|
// See https://github.com/arduino/arduino-ide/pull/2144#pullrequestreview-1556343430.
|
||||||
async function updateFrontendApplicationConfigFromPackageJson(
|
async function updateFrontendApplicationConfigFromPackageJson(
|
||||||
config: FrontendApplicationConfig
|
config: Mutable<FrontendApplicationConfig>
|
||||||
): Promise<FrontendApplicationConfig> {
|
): Promise<FrontendApplicationConfig> {
|
||||||
if (!isProductionMode) {
|
if (!isProductionMode) {
|
||||||
console.debug(
|
console.debug(
|
||||||
@@ -846,7 +901,11 @@ const fallbackFrontendAppConfig: FrontendApplicationConfig = {
|
|||||||
defaultIconTheme: 'none',
|
defaultIconTheme: 'none',
|
||||||
validatePreferencesSchema: false,
|
validatePreferencesSchema: false,
|
||||||
defaultLocale: '',
|
defaultLocale: '',
|
||||||
electron: {},
|
electron: {
|
||||||
|
showWindowEarly: true,
|
||||||
|
uriScheme: 'arduino-ide',
|
||||||
|
},
|
||||||
|
reloadOnReconnect: true,
|
||||||
};
|
};
|
||||||
|
|
||||||
// When the package.json must go from `./lib/backend/electron-main.js` to `./package.json` when the app is webpacked.
|
// When the package.json must go from `./lib/backend/electron-main.js` to `./package.json` when the app is webpacked.
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import { ElectronArduinoRenderer } from '../electron-arduino';
|
|||||||
@injectable()
|
@injectable()
|
||||||
export class TheiaElectronWindow extends DefaultTheiaElectronWindow {
|
export class TheiaElectronWindow extends DefaultTheiaElectronWindow {
|
||||||
protected override reload(args?: unknown): void {
|
protected override reload(args?: unknown): void {
|
||||||
this.handleStopRequest(() => {
|
this.handleStopRequest(async () => {
|
||||||
this.applicationState = 'init';
|
this.applicationState = 'init';
|
||||||
if (hasStartupTasks(args)) {
|
if (hasStartupTasks(args)) {
|
||||||
const { webContents } = this._window;
|
const { webContents } = this._window;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { join } from 'node:path';
|
import { join } from 'node:path';
|
||||||
import { inject, injectable, named } from '@theia/core/shared/inversify';
|
import { inject, injectable, named } from '@theia/core/shared/inversify';
|
||||||
import { spawn, ChildProcess } from 'node:child_process';
|
import { spawn, ChildProcess } from 'node:child_process';
|
||||||
import { FileUri } from '@theia/core/lib/node/file-uri';
|
import { FileUri } from '@theia/core/lib/common/file-uri';
|
||||||
import { ILogger } from '@theia/core/lib/common/logger';
|
import { ILogger } from '@theia/core/lib/common/logger';
|
||||||
import { Deferred, retry } from '@theia/core/lib/common/promise-util';
|
import { Deferred, retry } from '@theia/core/lib/common/promise-util';
|
||||||
import {
|
import {
|
||||||
|
|||||||
@@ -105,14 +105,8 @@ import { ClangFormatter } from './clang-formatter';
|
|||||||
import { FormatterPath } from '../common/protocol/formatter';
|
import { FormatterPath } from '../common/protocol/formatter';
|
||||||
import { HostedPluginLocalizationService } from './theia/plugin-ext/hosted-plugin-localization-service';
|
import { HostedPluginLocalizationService } from './theia/plugin-ext/hosted-plugin-localization-service';
|
||||||
import { HostedPluginLocalizationService as TheiaHostedPluginLocalizationService } from '@theia/plugin-ext/lib/hosted/node/hosted-plugin-localization-service';
|
import { HostedPluginLocalizationService as TheiaHostedPluginLocalizationService } from '@theia/plugin-ext/lib/hosted/node/hosted-plugin-localization-service';
|
||||||
import { SurveyNotificationServiceImpl } from './survey-service-impl';
|
|
||||||
import {
|
|
||||||
SurveyNotificationService,
|
|
||||||
SurveyNotificationServicePath,
|
|
||||||
} from '../common/protocol/survey-service';
|
|
||||||
import { IsTempSketch } from './is-temp-sketch';
|
import { IsTempSketch } from './is-temp-sketch';
|
||||||
import { rebindNsfwFileSystemWatcher } from './theia/filesystem/nsfw-bindings';
|
import { WebsocketEndpoint } from './theia/core/websocket-endpoint';
|
||||||
import { MessagingContribution } from './theia/core/messaging-contribution';
|
|
||||||
import { MessagingService } from '@theia/core/lib/node/messaging/messaging-service';
|
import { MessagingService } from '@theia/core/lib/node/messaging/messaging-service';
|
||||||
import { HostedPluginReader } from './theia/plugin-ext/plugin-reader';
|
import { HostedPluginReader } from './theia/plugin-ext/plugin-reader';
|
||||||
import { HostedPluginReader as TheiaHostedPluginReader } from '@theia/plugin-ext/lib/hosted/node/plugin-reader';
|
import { HostedPluginReader as TheiaHostedPluginReader } from '@theia/plugin-ext/lib/hosted/node/plugin-reader';
|
||||||
@@ -126,6 +120,7 @@ import {
|
|||||||
} from './theia/plugin-ext/plugin-deployer';
|
} from './theia/plugin-ext/plugin-deployer';
|
||||||
import { SettingsReader } from './settings-reader';
|
import { SettingsReader } from './settings-reader';
|
||||||
import { VsCodePluginScanner } from './theia/plugin-ext-vscode/scanner-vscode';
|
import { VsCodePluginScanner } from './theia/plugin-ext-vscode/scanner-vscode';
|
||||||
|
import { rebindParcelFileSystemWatcher } from './theia/filesystem/parcel-bindings';
|
||||||
|
|
||||||
export default new ContainerModule((bind, unbind, isBound, rebind) => {
|
export default new ContainerModule((bind, unbind, isBound, rebind) => {
|
||||||
bind(BackendApplication).toSelf().inSingletonScope();
|
bind(BackendApplication).toSelf().inSingletonScope();
|
||||||
@@ -305,7 +300,7 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => {
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
.inSingletonScope();
|
.inSingletonScope();
|
||||||
rebindNsfwFileSystemWatcher(rebind);
|
rebindParcelFileSystemWatcher(rebind);
|
||||||
|
|
||||||
// Output service per connection.
|
// Output service per connection.
|
||||||
bind(ConnectionContainerModule).toConstantValue(
|
bind(ConnectionContainerModule).toConstantValue(
|
||||||
@@ -383,23 +378,8 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => {
|
|||||||
HostedPluginLocalizationService
|
HostedPluginLocalizationService
|
||||||
);
|
);
|
||||||
|
|
||||||
// Survey notification bindings
|
|
||||||
// It's currently unused. https://github.com/arduino/arduino-ide/pull/1150
|
|
||||||
bind(SurveyNotificationServiceImpl).toSelf().inSingletonScope();
|
|
||||||
bind(SurveyNotificationService).toService(SurveyNotificationServiceImpl);
|
|
||||||
bind(ConnectionHandler)
|
|
||||||
.toDynamicValue(
|
|
||||||
({ container }) =>
|
|
||||||
new JsonRpcConnectionHandler(SurveyNotificationServicePath, () =>
|
|
||||||
container.get<SurveyNotificationService>(SurveyNotificationService)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
.inSingletonScope();
|
|
||||||
|
|
||||||
bind(IsTempSketch).toSelf().inSingletonScope();
|
bind(IsTempSketch).toSelf().inSingletonScope();
|
||||||
rebind(MessagingService.Identifier)
|
rebind(MessagingService.Identifier).to(WebsocketEndpoint).inSingletonScope();
|
||||||
.to(MessagingContribution)
|
|
||||||
.inSingletonScope();
|
|
||||||
|
|
||||||
// Removed undesired contributions from VS Code extensions
|
// Removed undesired contributions from VS Code extensions
|
||||||
// Such as the RTOS view from the `cortex-debug` extension
|
// Such as the RTOS view from the `cortex-debug` extension
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { EnvVariablesServer } from '@theia/core/lib/common/env-variables';
|
import { EnvVariablesServer } from '@theia/core/lib/common/env-variables';
|
||||||
import { MaybePromise } from '@theia/core/lib/common/types';
|
import { MaybePromise } from '@theia/core/lib/common/types';
|
||||||
import { FileUri } from '@theia/core/lib/node/file-uri';
|
import { FileUri } from '@theia/core/lib/common/file-uri';
|
||||||
import { inject, injectable } from '@theia/core/shared/inversify';
|
import { inject, injectable } from '@theia/core/shared/inversify';
|
||||||
import { constants, promises as fs } from 'node:fs';
|
import { constants, promises as fs } from 'node:fs';
|
||||||
import { join } from 'node:path';
|
import { join } from 'node:path';
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { notEmpty } from '@theia/core/lib/common/objects';
|
import { notEmpty } from '@theia/core/lib/common/objects';
|
||||||
import { nls } from '@theia/core/lib/common/nls';
|
import { nls } from '@theia/core/lib/common/nls';
|
||||||
import { FileUri } from '@theia/core/lib/node/file-uri';
|
import { FileUri } from '@theia/core/lib/common/file-uri';
|
||||||
import {
|
import {
|
||||||
Range,
|
Range,
|
||||||
Position,
|
Position,
|
||||||
|
|||||||
@@ -360,6 +360,8 @@ export class BoardListRequest extends jspb.Message {
|
|||||||
setTimeout(value: number): BoardListRequest;
|
setTimeout(value: number): BoardListRequest;
|
||||||
getFqbn(): string;
|
getFqbn(): string;
|
||||||
setFqbn(value: string): BoardListRequest;
|
setFqbn(value: string): BoardListRequest;
|
||||||
|
getSkipCloudApiForBoardDetection(): boolean;
|
||||||
|
setSkipCloudApiForBoardDetection(value: boolean): BoardListRequest;
|
||||||
|
|
||||||
serializeBinary(): Uint8Array;
|
serializeBinary(): Uint8Array;
|
||||||
toObject(includeInstance?: boolean): BoardListRequest.AsObject;
|
toObject(includeInstance?: boolean): BoardListRequest.AsObject;
|
||||||
@@ -376,6 +378,7 @@ export namespace BoardListRequest {
|
|||||||
instance?: cc_arduino_cli_commands_v1_common_pb.Instance.AsObject,
|
instance?: cc_arduino_cli_commands_v1_common_pb.Instance.AsObject,
|
||||||
timeout: number,
|
timeout: number,
|
||||||
fqbn: string,
|
fqbn: string,
|
||||||
|
skipCloudApiForBoardDetection: boolean,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -493,6 +496,8 @@ export class BoardListWatchRequest extends jspb.Message {
|
|||||||
clearInstance(): void;
|
clearInstance(): void;
|
||||||
getInstance(): cc_arduino_cli_commands_v1_common_pb.Instance | undefined;
|
getInstance(): cc_arduino_cli_commands_v1_common_pb.Instance | undefined;
|
||||||
setInstance(value?: cc_arduino_cli_commands_v1_common_pb.Instance): BoardListWatchRequest;
|
setInstance(value?: cc_arduino_cli_commands_v1_common_pb.Instance): BoardListWatchRequest;
|
||||||
|
getSkipCloudApiForBoardDetection(): boolean;
|
||||||
|
setSkipCloudApiForBoardDetection(value: boolean): BoardListWatchRequest;
|
||||||
|
|
||||||
serializeBinary(): Uint8Array;
|
serializeBinary(): Uint8Array;
|
||||||
toObject(includeInstance?: boolean): BoardListWatchRequest.AsObject;
|
toObject(includeInstance?: boolean): BoardListWatchRequest.AsObject;
|
||||||
@@ -507,6 +512,7 @@ export class BoardListWatchRequest extends jspb.Message {
|
|||||||
export namespace BoardListWatchRequest {
|
export namespace BoardListWatchRequest {
|
||||||
export type AsObject = {
|
export type AsObject = {
|
||||||
instance?: cc_arduino_cli_commands_v1_common_pb.Instance.AsObject,
|
instance?: cc_arduino_cli_commands_v1_common_pb.Instance.AsObject,
|
||||||
|
skipCloudApiForBoardDetection: boolean,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -621,3 +627,56 @@ export namespace BoardSearchResponse {
|
|||||||
boardsList: Array<BoardListItem.AsObject>,
|
boardsList: Array<BoardListItem.AsObject>,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export class BoardIdentifyRequest extends jspb.Message {
|
||||||
|
|
||||||
|
hasInstance(): boolean;
|
||||||
|
clearInstance(): void;
|
||||||
|
getInstance(): cc_arduino_cli_commands_v1_common_pb.Instance | undefined;
|
||||||
|
setInstance(value?: cc_arduino_cli_commands_v1_common_pb.Instance): BoardIdentifyRequest;
|
||||||
|
|
||||||
|
getPropertiesMap(): jspb.Map<string, string>;
|
||||||
|
clearPropertiesMap(): void;
|
||||||
|
getUseCloudApiForUnknownBoardDetection(): boolean;
|
||||||
|
setUseCloudApiForUnknownBoardDetection(value: boolean): BoardIdentifyRequest;
|
||||||
|
|
||||||
|
serializeBinary(): Uint8Array;
|
||||||
|
toObject(includeInstance?: boolean): BoardIdentifyRequest.AsObject;
|
||||||
|
static toObject(includeInstance: boolean, msg: BoardIdentifyRequest): BoardIdentifyRequest.AsObject;
|
||||||
|
static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>};
|
||||||
|
static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>};
|
||||||
|
static serializeBinaryToWriter(message: BoardIdentifyRequest, writer: jspb.BinaryWriter): void;
|
||||||
|
static deserializeBinary(bytes: Uint8Array): BoardIdentifyRequest;
|
||||||
|
static deserializeBinaryFromReader(message: BoardIdentifyRequest, reader: jspb.BinaryReader): BoardIdentifyRequest;
|
||||||
|
}
|
||||||
|
|
||||||
|
export namespace BoardIdentifyRequest {
|
||||||
|
export type AsObject = {
|
||||||
|
instance?: cc_arduino_cli_commands_v1_common_pb.Instance.AsObject,
|
||||||
|
|
||||||
|
propertiesMap: Array<[string, string]>,
|
||||||
|
useCloudApiForUnknownBoardDetection: boolean,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export class BoardIdentifyResponse extends jspb.Message {
|
||||||
|
clearBoardsList(): void;
|
||||||
|
getBoardsList(): Array<BoardListItem>;
|
||||||
|
setBoardsList(value: Array<BoardListItem>): BoardIdentifyResponse;
|
||||||
|
addBoards(value?: BoardListItem, index?: number): BoardListItem;
|
||||||
|
|
||||||
|
serializeBinary(): Uint8Array;
|
||||||
|
toObject(includeInstance?: boolean): BoardIdentifyResponse.AsObject;
|
||||||
|
static toObject(includeInstance: boolean, msg: BoardIdentifyResponse): BoardIdentifyResponse.AsObject;
|
||||||
|
static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>};
|
||||||
|
static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>};
|
||||||
|
static serializeBinaryToWriter(message: BoardIdentifyResponse, writer: jspb.BinaryWriter): void;
|
||||||
|
static deserializeBinary(bytes: Uint8Array): BoardIdentifyResponse;
|
||||||
|
static deserializeBinaryFromReader(message: BoardIdentifyResponse, reader: jspb.BinaryReader): BoardIdentifyResponse;
|
||||||
|
}
|
||||||
|
|
||||||
|
export namespace BoardIdentifyResponse {
|
||||||
|
export type AsObject = {
|
||||||
|
boardsList: Array<BoardListItem.AsObject>,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -28,6 +28,8 @@ goog.object.extend(proto, cc_arduino_cli_commands_v1_port_pb);
|
|||||||
goog.exportSymbol('proto.cc.arduino.cli.commands.v1.BoardDetailsRequest', null, global);
|
goog.exportSymbol('proto.cc.arduino.cli.commands.v1.BoardDetailsRequest', null, global);
|
||||||
goog.exportSymbol('proto.cc.arduino.cli.commands.v1.BoardDetailsResponse', null, global);
|
goog.exportSymbol('proto.cc.arduino.cli.commands.v1.BoardDetailsResponse', null, global);
|
||||||
goog.exportSymbol('proto.cc.arduino.cli.commands.v1.BoardIdentificationProperties', null, global);
|
goog.exportSymbol('proto.cc.arduino.cli.commands.v1.BoardIdentificationProperties', null, global);
|
||||||
|
goog.exportSymbol('proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest', null, global);
|
||||||
|
goog.exportSymbol('proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse', null, global);
|
||||||
goog.exportSymbol('proto.cc.arduino.cli.commands.v1.BoardListAllRequest', null, global);
|
goog.exportSymbol('proto.cc.arduino.cli.commands.v1.BoardListAllRequest', null, global);
|
||||||
goog.exportSymbol('proto.cc.arduino.cli.commands.v1.BoardListAllResponse', null, global);
|
goog.exportSymbol('proto.cc.arduino.cli.commands.v1.BoardListAllResponse', null, global);
|
||||||
goog.exportSymbol('proto.cc.arduino.cli.commands.v1.BoardListItem', null, global);
|
goog.exportSymbol('proto.cc.arduino.cli.commands.v1.BoardListItem', null, global);
|
||||||
@@ -465,6 +467,48 @@ if (goog.DEBUG && !COMPILED) {
|
|||||||
*/
|
*/
|
||||||
proto.cc.arduino.cli.commands.v1.BoardSearchResponse.displayName = 'proto.cc.arduino.cli.commands.v1.BoardSearchResponse';
|
proto.cc.arduino.cli.commands.v1.BoardSearchResponse.displayName = 'proto.cc.arduino.cli.commands.v1.BoardSearchResponse';
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* Generated by JsPbCodeGenerator.
|
||||||
|
* @param {Array=} opt_data Optional initial data array, typically from a
|
||||||
|
* server response, or constructed directly in Javascript. The array is used
|
||||||
|
* in place and becomes part of the constructed object. It is not cloned.
|
||||||
|
* If no data is provided, the constructed object will be empty, but still
|
||||||
|
* valid.
|
||||||
|
* @extends {jspb.Message}
|
||||||
|
* @constructor
|
||||||
|
*/
|
||||||
|
proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest = function(opt_data) {
|
||||||
|
jspb.Message.initialize(this, opt_data, 0, -1, null, null);
|
||||||
|
};
|
||||||
|
goog.inherits(proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest, jspb.Message);
|
||||||
|
if (goog.DEBUG && !COMPILED) {
|
||||||
|
/**
|
||||||
|
* @public
|
||||||
|
* @override
|
||||||
|
*/
|
||||||
|
proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest.displayName = 'proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest';
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Generated by JsPbCodeGenerator.
|
||||||
|
* @param {Array=} opt_data Optional initial data array, typically from a
|
||||||
|
* server response, or constructed directly in Javascript. The array is used
|
||||||
|
* in place and becomes part of the constructed object. It is not cloned.
|
||||||
|
* If no data is provided, the constructed object will be empty, but still
|
||||||
|
* valid.
|
||||||
|
* @extends {jspb.Message}
|
||||||
|
* @constructor
|
||||||
|
*/
|
||||||
|
proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse = function(opt_data) {
|
||||||
|
jspb.Message.initialize(this, opt_data, 0, -1, proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse.repeatedFields_, null);
|
||||||
|
};
|
||||||
|
goog.inherits(proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse, jspb.Message);
|
||||||
|
if (goog.DEBUG && !COMPILED) {
|
||||||
|
/**
|
||||||
|
* @public
|
||||||
|
* @override
|
||||||
|
*/
|
||||||
|
proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse.displayName = 'proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse';
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -3204,7 +3248,8 @@ proto.cc.arduino.cli.commands.v1.BoardListRequest.toObject = function(includeIns
|
|||||||
var f, obj = {
|
var f, obj = {
|
||||||
instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f),
|
instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f),
|
||||||
timeout: jspb.Message.getFieldWithDefault(msg, 2, 0),
|
timeout: jspb.Message.getFieldWithDefault(msg, 2, 0),
|
||||||
fqbn: jspb.Message.getFieldWithDefault(msg, 3, "")
|
fqbn: jspb.Message.getFieldWithDefault(msg, 3, ""),
|
||||||
|
skipCloudApiForBoardDetection: jspb.Message.getBooleanFieldWithDefault(msg, 4, false)
|
||||||
};
|
};
|
||||||
|
|
||||||
if (includeInstance) {
|
if (includeInstance) {
|
||||||
@@ -3254,6 +3299,10 @@ proto.cc.arduino.cli.commands.v1.BoardListRequest.deserializeBinaryFromReader =
|
|||||||
var value = /** @type {string} */ (reader.readString());
|
var value = /** @type {string} */ (reader.readString());
|
||||||
msg.setFqbn(value);
|
msg.setFqbn(value);
|
||||||
break;
|
break;
|
||||||
|
case 4:
|
||||||
|
var value = /** @type {boolean} */ (reader.readBool());
|
||||||
|
msg.setSkipCloudApiForBoardDetection(value);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
reader.skipField();
|
reader.skipField();
|
||||||
break;
|
break;
|
||||||
@@ -3305,6 +3354,13 @@ proto.cc.arduino.cli.commands.v1.BoardListRequest.serializeBinaryToWriter = func
|
|||||||
f
|
f
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
f = message.getSkipCloudApiForBoardDetection();
|
||||||
|
if (f) {
|
||||||
|
writer.writeBool(
|
||||||
|
4,
|
||||||
|
f
|
||||||
|
);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -3381,6 +3437,24 @@ proto.cc.arduino.cli.commands.v1.BoardListRequest.prototype.setFqbn = function(v
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* optional bool skip_cloud_api_for_board_detection = 4;
|
||||||
|
* @return {boolean}
|
||||||
|
*/
|
||||||
|
proto.cc.arduino.cli.commands.v1.BoardListRequest.prototype.getSkipCloudApiForBoardDetection = function() {
|
||||||
|
return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 4, false));
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {boolean} value
|
||||||
|
* @return {!proto.cc.arduino.cli.commands.v1.BoardListRequest} returns this
|
||||||
|
*/
|
||||||
|
proto.cc.arduino.cli.commands.v1.BoardListRequest.prototype.setSkipCloudApiForBoardDetection = function(value) {
|
||||||
|
return jspb.Message.setProto3BooleanField(this, 4, value);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* List of repeated fields within this message type.
|
* List of repeated fields within this message type.
|
||||||
@@ -4230,7 +4304,8 @@ proto.cc.arduino.cli.commands.v1.BoardListWatchRequest.prototype.toObject = func
|
|||||||
*/
|
*/
|
||||||
proto.cc.arduino.cli.commands.v1.BoardListWatchRequest.toObject = function(includeInstance, msg) {
|
proto.cc.arduino.cli.commands.v1.BoardListWatchRequest.toObject = function(includeInstance, msg) {
|
||||||
var f, obj = {
|
var f, obj = {
|
||||||
instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f)
|
instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f),
|
||||||
|
skipCloudApiForBoardDetection: jspb.Message.getBooleanFieldWithDefault(msg, 2, false)
|
||||||
};
|
};
|
||||||
|
|
||||||
if (includeInstance) {
|
if (includeInstance) {
|
||||||
@@ -4272,6 +4347,10 @@ proto.cc.arduino.cli.commands.v1.BoardListWatchRequest.deserializeBinaryFromRead
|
|||||||
reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.Instance.deserializeBinaryFromReader);
|
reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.Instance.deserializeBinaryFromReader);
|
||||||
msg.setInstance(value);
|
msg.setInstance(value);
|
||||||
break;
|
break;
|
||||||
|
case 2:
|
||||||
|
var value = /** @type {boolean} */ (reader.readBool());
|
||||||
|
msg.setSkipCloudApiForBoardDetection(value);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
reader.skipField();
|
reader.skipField();
|
||||||
break;
|
break;
|
||||||
@@ -4309,6 +4388,13 @@ proto.cc.arduino.cli.commands.v1.BoardListWatchRequest.serializeBinaryToWriter =
|
|||||||
cc_arduino_cli_commands_v1_common_pb.Instance.serializeBinaryToWriter
|
cc_arduino_cli_commands_v1_common_pb.Instance.serializeBinaryToWriter
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
f = message.getSkipCloudApiForBoardDetection();
|
||||||
|
if (f) {
|
||||||
|
writer.writeBool(
|
||||||
|
2,
|
||||||
|
f
|
||||||
|
);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -4349,6 +4435,24 @@ proto.cc.arduino.cli.commands.v1.BoardListWatchRequest.prototype.hasInstance = f
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* optional bool skip_cloud_api_for_board_detection = 2;
|
||||||
|
* @return {boolean}
|
||||||
|
*/
|
||||||
|
proto.cc.arduino.cli.commands.v1.BoardListWatchRequest.prototype.getSkipCloudApiForBoardDetection = function() {
|
||||||
|
return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false));
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {boolean} value
|
||||||
|
* @return {!proto.cc.arduino.cli.commands.v1.BoardListWatchRequest} returns this
|
||||||
|
*/
|
||||||
|
proto.cc.arduino.cli.commands.v1.BoardListWatchRequest.prototype.setSkipCloudApiForBoardDetection = function(value) {
|
||||||
|
return jspb.Message.setProto3BooleanField(this, 2, value);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -5172,4 +5276,378 @@ proto.cc.arduino.cli.commands.v1.BoardSearchResponse.prototype.clearBoardsList =
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if (jspb.Message.GENERATE_TO_OBJECT) {
|
||||||
|
/**
|
||||||
|
* Creates an object representation of this proto.
|
||||||
|
* Field names that are reserved in JavaScript and will be renamed to pb_name.
|
||||||
|
* Optional fields that are not set will be set to undefined.
|
||||||
|
* To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
|
||||||
|
* For the list of reserved names please see:
|
||||||
|
* net/proto2/compiler/js/internal/generator.cc#kKeyword.
|
||||||
|
* @param {boolean=} opt_includeInstance Deprecated. whether to include the
|
||||||
|
* JSPB instance for transitional soy proto support:
|
||||||
|
* http://goto/soy-param-migration
|
||||||
|
* @return {!Object}
|
||||||
|
*/
|
||||||
|
proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest.prototype.toObject = function(opt_includeInstance) {
|
||||||
|
return proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest.toObject(opt_includeInstance, this);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Static version of the {@see toObject} method.
|
||||||
|
* @param {boolean|undefined} includeInstance Deprecated. Whether to include
|
||||||
|
* the JSPB instance for transitional soy proto support:
|
||||||
|
* http://goto/soy-param-migration
|
||||||
|
* @param {!proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest} msg The msg instance to transform.
|
||||||
|
* @return {!Object}
|
||||||
|
* @suppress {unusedLocalVariables} f is only used for nested messages
|
||||||
|
*/
|
||||||
|
proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest.toObject = function(includeInstance, msg) {
|
||||||
|
var f, obj = {
|
||||||
|
instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f),
|
||||||
|
propertiesMap: (f = msg.getPropertiesMap()) ? f.toObject(includeInstance, undefined) : [],
|
||||||
|
useCloudApiForUnknownBoardDetection: jspb.Message.getBooleanFieldWithDefault(msg, 3, false)
|
||||||
|
};
|
||||||
|
|
||||||
|
if (includeInstance) {
|
||||||
|
obj.$jspbMessageInstance = msg;
|
||||||
|
}
|
||||||
|
return obj;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deserializes binary data (in protobuf wire format).
|
||||||
|
* @param {jspb.ByteSource} bytes The bytes to deserialize.
|
||||||
|
* @return {!proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest}
|
||||||
|
*/
|
||||||
|
proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest.deserializeBinary = function(bytes) {
|
||||||
|
var reader = new jspb.BinaryReader(bytes);
|
||||||
|
var msg = new proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest;
|
||||||
|
return proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest.deserializeBinaryFromReader(msg, reader);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deserializes binary data (in protobuf wire format) from the
|
||||||
|
* given reader into the given message object.
|
||||||
|
* @param {!proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest} msg The message object to deserialize into.
|
||||||
|
* @param {!jspb.BinaryReader} reader The BinaryReader to use.
|
||||||
|
* @return {!proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest}
|
||||||
|
*/
|
||||||
|
proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest.deserializeBinaryFromReader = function(msg, reader) {
|
||||||
|
while (reader.nextField()) {
|
||||||
|
if (reader.isEndGroup()) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
var field = reader.getFieldNumber();
|
||||||
|
switch (field) {
|
||||||
|
case 1:
|
||||||
|
var value = new cc_arduino_cli_commands_v1_common_pb.Instance;
|
||||||
|
reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.Instance.deserializeBinaryFromReader);
|
||||||
|
msg.setInstance(value);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
var value = msg.getPropertiesMap();
|
||||||
|
reader.readMessage(value, function(message, reader) {
|
||||||
|
jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readString, jspb.BinaryReader.prototype.readString, null, "", "");
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
var value = /** @type {boolean} */ (reader.readBool());
|
||||||
|
msg.setUseCloudApiForUnknownBoardDetection(value);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
reader.skipField();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return msg;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Serializes the message to binary data (in protobuf wire format).
|
||||||
|
* @return {!Uint8Array}
|
||||||
|
*/
|
||||||
|
proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest.prototype.serializeBinary = function() {
|
||||||
|
var writer = new jspb.BinaryWriter();
|
||||||
|
proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest.serializeBinaryToWriter(this, writer);
|
||||||
|
return writer.getResultBuffer();
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Serializes the given message to binary data (in protobuf wire
|
||||||
|
* format), writing to the given BinaryWriter.
|
||||||
|
* @param {!proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest} message
|
||||||
|
* @param {!jspb.BinaryWriter} writer
|
||||||
|
* @suppress {unusedLocalVariables} f is only used for nested messages
|
||||||
|
*/
|
||||||
|
proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest.serializeBinaryToWriter = function(message, writer) {
|
||||||
|
var f = undefined;
|
||||||
|
f = message.getInstance();
|
||||||
|
if (f != null) {
|
||||||
|
writer.writeMessage(
|
||||||
|
1,
|
||||||
|
f,
|
||||||
|
cc_arduino_cli_commands_v1_common_pb.Instance.serializeBinaryToWriter
|
||||||
|
);
|
||||||
|
}
|
||||||
|
f = message.getPropertiesMap(true);
|
||||||
|
if (f && f.getLength() > 0) {
|
||||||
|
f.serializeBinary(2, writer, jspb.BinaryWriter.prototype.writeString, jspb.BinaryWriter.prototype.writeString);
|
||||||
|
}
|
||||||
|
f = message.getUseCloudApiForUnknownBoardDetection();
|
||||||
|
if (f) {
|
||||||
|
writer.writeBool(
|
||||||
|
3,
|
||||||
|
f
|
||||||
|
);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* optional Instance instance = 1;
|
||||||
|
* @return {?proto.cc.arduino.cli.commands.v1.Instance}
|
||||||
|
*/
|
||||||
|
proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest.prototype.getInstance = function() {
|
||||||
|
return /** @type{?proto.cc.arduino.cli.commands.v1.Instance} */ (
|
||||||
|
jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.Instance, 1));
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {?proto.cc.arduino.cli.commands.v1.Instance|undefined} value
|
||||||
|
* @return {!proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest} returns this
|
||||||
|
*/
|
||||||
|
proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest.prototype.setInstance = function(value) {
|
||||||
|
return jspb.Message.setWrapperField(this, 1, value);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clears the message field making it undefined.
|
||||||
|
* @return {!proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest} returns this
|
||||||
|
*/
|
||||||
|
proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest.prototype.clearInstance = function() {
|
||||||
|
return this.setInstance(undefined);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns whether this field is set.
|
||||||
|
* @return {boolean}
|
||||||
|
*/
|
||||||
|
proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest.prototype.hasInstance = function() {
|
||||||
|
return jspb.Message.getField(this, 1) != null;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* map<string, string> properties = 2;
|
||||||
|
* @param {boolean=} opt_noLazyCreate Do not create the map if
|
||||||
|
* empty, instead returning `undefined`
|
||||||
|
* @return {!jspb.Map<string,string>}
|
||||||
|
*/
|
||||||
|
proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest.prototype.getPropertiesMap = function(opt_noLazyCreate) {
|
||||||
|
return /** @type {!jspb.Map<string,string>} */ (
|
||||||
|
jspb.Message.getMapField(this, 2, opt_noLazyCreate,
|
||||||
|
null));
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clears values from the map. The map will be non-null.
|
||||||
|
* @return {!proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest} returns this
|
||||||
|
*/
|
||||||
|
proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest.prototype.clearPropertiesMap = function() {
|
||||||
|
this.getPropertiesMap().clear();
|
||||||
|
return this;};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* optional bool use_cloud_api_for_unknown_board_detection = 3;
|
||||||
|
* @return {boolean}
|
||||||
|
*/
|
||||||
|
proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest.prototype.getUseCloudApiForUnknownBoardDetection = function() {
|
||||||
|
return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false));
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {boolean} value
|
||||||
|
* @return {!proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest} returns this
|
||||||
|
*/
|
||||||
|
proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest.prototype.setUseCloudApiForUnknownBoardDetection = function(value) {
|
||||||
|
return jspb.Message.setProto3BooleanField(this, 3, value);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* List of repeated fields within this message type.
|
||||||
|
* @private {!Array<number>}
|
||||||
|
* @const
|
||||||
|
*/
|
||||||
|
proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse.repeatedFields_ = [1];
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if (jspb.Message.GENERATE_TO_OBJECT) {
|
||||||
|
/**
|
||||||
|
* Creates an object representation of this proto.
|
||||||
|
* Field names that are reserved in JavaScript and will be renamed to pb_name.
|
||||||
|
* Optional fields that are not set will be set to undefined.
|
||||||
|
* To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
|
||||||
|
* For the list of reserved names please see:
|
||||||
|
* net/proto2/compiler/js/internal/generator.cc#kKeyword.
|
||||||
|
* @param {boolean=} opt_includeInstance Deprecated. whether to include the
|
||||||
|
* JSPB instance for transitional soy proto support:
|
||||||
|
* http://goto/soy-param-migration
|
||||||
|
* @return {!Object}
|
||||||
|
*/
|
||||||
|
proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse.prototype.toObject = function(opt_includeInstance) {
|
||||||
|
return proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse.toObject(opt_includeInstance, this);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Static version of the {@see toObject} method.
|
||||||
|
* @param {boolean|undefined} includeInstance Deprecated. Whether to include
|
||||||
|
* the JSPB instance for transitional soy proto support:
|
||||||
|
* http://goto/soy-param-migration
|
||||||
|
* @param {!proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse} msg The msg instance to transform.
|
||||||
|
* @return {!Object}
|
||||||
|
* @suppress {unusedLocalVariables} f is only used for nested messages
|
||||||
|
*/
|
||||||
|
proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse.toObject = function(includeInstance, msg) {
|
||||||
|
var f, obj = {
|
||||||
|
boardsList: jspb.Message.toObjectList(msg.getBoardsList(),
|
||||||
|
proto.cc.arduino.cli.commands.v1.BoardListItem.toObject, includeInstance)
|
||||||
|
};
|
||||||
|
|
||||||
|
if (includeInstance) {
|
||||||
|
obj.$jspbMessageInstance = msg;
|
||||||
|
}
|
||||||
|
return obj;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deserializes binary data (in protobuf wire format).
|
||||||
|
* @param {jspb.ByteSource} bytes The bytes to deserialize.
|
||||||
|
* @return {!proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse}
|
||||||
|
*/
|
||||||
|
proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse.deserializeBinary = function(bytes) {
|
||||||
|
var reader = new jspb.BinaryReader(bytes);
|
||||||
|
var msg = new proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse;
|
||||||
|
return proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse.deserializeBinaryFromReader(msg, reader);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deserializes binary data (in protobuf wire format) from the
|
||||||
|
* given reader into the given message object.
|
||||||
|
* @param {!proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse} msg The message object to deserialize into.
|
||||||
|
* @param {!jspb.BinaryReader} reader The BinaryReader to use.
|
||||||
|
* @return {!proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse}
|
||||||
|
*/
|
||||||
|
proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse.deserializeBinaryFromReader = function(msg, reader) {
|
||||||
|
while (reader.nextField()) {
|
||||||
|
if (reader.isEndGroup()) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
var field = reader.getFieldNumber();
|
||||||
|
switch (field) {
|
||||||
|
case 1:
|
||||||
|
var value = new proto.cc.arduino.cli.commands.v1.BoardListItem;
|
||||||
|
reader.readMessage(value,proto.cc.arduino.cli.commands.v1.BoardListItem.deserializeBinaryFromReader);
|
||||||
|
msg.addBoards(value);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
reader.skipField();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return msg;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Serializes the message to binary data (in protobuf wire format).
|
||||||
|
* @return {!Uint8Array}
|
||||||
|
*/
|
||||||
|
proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse.prototype.serializeBinary = function() {
|
||||||
|
var writer = new jspb.BinaryWriter();
|
||||||
|
proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse.serializeBinaryToWriter(this, writer);
|
||||||
|
return writer.getResultBuffer();
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Serializes the given message to binary data (in protobuf wire
|
||||||
|
* format), writing to the given BinaryWriter.
|
||||||
|
* @param {!proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse} message
|
||||||
|
* @param {!jspb.BinaryWriter} writer
|
||||||
|
* @suppress {unusedLocalVariables} f is only used for nested messages
|
||||||
|
*/
|
||||||
|
proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse.serializeBinaryToWriter = function(message, writer) {
|
||||||
|
var f = undefined;
|
||||||
|
f = message.getBoardsList();
|
||||||
|
if (f.length > 0) {
|
||||||
|
writer.writeRepeatedMessage(
|
||||||
|
1,
|
||||||
|
f,
|
||||||
|
proto.cc.arduino.cli.commands.v1.BoardListItem.serializeBinaryToWriter
|
||||||
|
);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* repeated BoardListItem boards = 1;
|
||||||
|
* @return {!Array<!proto.cc.arduino.cli.commands.v1.BoardListItem>}
|
||||||
|
*/
|
||||||
|
proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse.prototype.getBoardsList = function() {
|
||||||
|
return /** @type{!Array<!proto.cc.arduino.cli.commands.v1.BoardListItem>} */ (
|
||||||
|
jspb.Message.getRepeatedWrapperField(this, proto.cc.arduino.cli.commands.v1.BoardListItem, 1));
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {!Array<!proto.cc.arduino.cli.commands.v1.BoardListItem>} value
|
||||||
|
* @return {!proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse} returns this
|
||||||
|
*/
|
||||||
|
proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse.prototype.setBoardsList = function(value) {
|
||||||
|
return jspb.Message.setRepeatedWrapperField(this, 1, value);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {!proto.cc.arduino.cli.commands.v1.BoardListItem=} opt_value
|
||||||
|
* @param {number=} opt_index
|
||||||
|
* @return {!proto.cc.arduino.cli.commands.v1.BoardListItem}
|
||||||
|
*/
|
||||||
|
proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse.prototype.addBoards = function(opt_value, opt_index) {
|
||||||
|
return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.cc.arduino.cli.commands.v1.BoardListItem, opt_index);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clears the list making it empty but non-null.
|
||||||
|
* @return {!proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse} returns this
|
||||||
|
*/
|
||||||
|
proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse.prototype.clearBoardsList = function() {
|
||||||
|
return this.setBoardsList([]);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
goog.object.extend(exports, proto.cc.arduino.cli.commands.v1);
|
goog.object.extend(exports, proto.cc.arduino.cli.commands.v1);
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ interface IArduinoCoreServiceService extends grpc.ServiceDefinition<grpc.Untyped
|
|||||||
boardList: IArduinoCoreServiceService_IBoardList;
|
boardList: IArduinoCoreServiceService_IBoardList;
|
||||||
boardListAll: IArduinoCoreServiceService_IBoardListAll;
|
boardListAll: IArduinoCoreServiceService_IBoardListAll;
|
||||||
boardSearch: IArduinoCoreServiceService_IBoardSearch;
|
boardSearch: IArduinoCoreServiceService_IBoardSearch;
|
||||||
|
boardIdentify: IArduinoCoreServiceService_IBoardIdentify;
|
||||||
boardListWatch: IArduinoCoreServiceService_IBoardListWatch;
|
boardListWatch: IArduinoCoreServiceService_IBoardListWatch;
|
||||||
compile: IArduinoCoreServiceService_ICompile;
|
compile: IArduinoCoreServiceService_ICompile;
|
||||||
platformInstall: IArduinoCoreServiceService_IPlatformInstall;
|
platformInstall: IArduinoCoreServiceService_IPlatformInstall;
|
||||||
@@ -195,6 +196,15 @@ interface IArduinoCoreServiceService_IBoardSearch extends grpc.MethodDefinition<
|
|||||||
responseSerialize: grpc.serialize<cc_arduino_cli_commands_v1_board_pb.BoardSearchResponse>;
|
responseSerialize: grpc.serialize<cc_arduino_cli_commands_v1_board_pb.BoardSearchResponse>;
|
||||||
responseDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_board_pb.BoardSearchResponse>;
|
responseDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_board_pb.BoardSearchResponse>;
|
||||||
}
|
}
|
||||||
|
interface IArduinoCoreServiceService_IBoardIdentify extends grpc.MethodDefinition<cc_arduino_cli_commands_v1_board_pb.BoardIdentifyRequest, cc_arduino_cli_commands_v1_board_pb.BoardIdentifyResponse> {
|
||||||
|
path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/BoardIdentify";
|
||||||
|
requestStream: false;
|
||||||
|
responseStream: false;
|
||||||
|
requestSerialize: grpc.serialize<cc_arduino_cli_commands_v1_board_pb.BoardIdentifyRequest>;
|
||||||
|
requestDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_board_pb.BoardIdentifyRequest>;
|
||||||
|
responseSerialize: grpc.serialize<cc_arduino_cli_commands_v1_board_pb.BoardIdentifyResponse>;
|
||||||
|
responseDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_board_pb.BoardIdentifyResponse>;
|
||||||
|
}
|
||||||
interface IArduinoCoreServiceService_IBoardListWatch extends grpc.MethodDefinition<cc_arduino_cli_commands_v1_board_pb.BoardListWatchRequest, cc_arduino_cli_commands_v1_board_pb.BoardListWatchResponse> {
|
interface IArduinoCoreServiceService_IBoardListWatch extends grpc.MethodDefinition<cc_arduino_cli_commands_v1_board_pb.BoardListWatchRequest, cc_arduino_cli_commands_v1_board_pb.BoardListWatchResponse> {
|
||||||
path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/BoardListWatch";
|
path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/BoardListWatch";
|
||||||
requestStream: false;
|
requestStream: false;
|
||||||
@@ -528,6 +538,7 @@ export interface IArduinoCoreServiceServer extends grpc.UntypedServiceImplementa
|
|||||||
boardList: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_board_pb.BoardListRequest, cc_arduino_cli_commands_v1_board_pb.BoardListResponse>;
|
boardList: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_board_pb.BoardListRequest, cc_arduino_cli_commands_v1_board_pb.BoardListResponse>;
|
||||||
boardListAll: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_board_pb.BoardListAllRequest, cc_arduino_cli_commands_v1_board_pb.BoardListAllResponse>;
|
boardListAll: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_board_pb.BoardListAllRequest, cc_arduino_cli_commands_v1_board_pb.BoardListAllResponse>;
|
||||||
boardSearch: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_board_pb.BoardSearchRequest, cc_arduino_cli_commands_v1_board_pb.BoardSearchResponse>;
|
boardSearch: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_board_pb.BoardSearchRequest, cc_arduino_cli_commands_v1_board_pb.BoardSearchResponse>;
|
||||||
|
boardIdentify: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_board_pb.BoardIdentifyRequest, cc_arduino_cli_commands_v1_board_pb.BoardIdentifyResponse>;
|
||||||
boardListWatch: grpc.handleServerStreamingCall<cc_arduino_cli_commands_v1_board_pb.BoardListWatchRequest, cc_arduino_cli_commands_v1_board_pb.BoardListWatchResponse>;
|
boardListWatch: grpc.handleServerStreamingCall<cc_arduino_cli_commands_v1_board_pb.BoardListWatchRequest, cc_arduino_cli_commands_v1_board_pb.BoardListWatchResponse>;
|
||||||
compile: grpc.handleServerStreamingCall<cc_arduino_cli_commands_v1_compile_pb.CompileRequest, cc_arduino_cli_commands_v1_compile_pb.CompileResponse>;
|
compile: grpc.handleServerStreamingCall<cc_arduino_cli_commands_v1_compile_pb.CompileRequest, cc_arduino_cli_commands_v1_compile_pb.CompileResponse>;
|
||||||
platformInstall: grpc.handleServerStreamingCall<cc_arduino_cli_commands_v1_core_pb.PlatformInstallRequest, cc_arduino_cli_commands_v1_core_pb.PlatformInstallResponse>;
|
platformInstall: grpc.handleServerStreamingCall<cc_arduino_cli_commands_v1_core_pb.PlatformInstallRequest, cc_arduino_cli_commands_v1_core_pb.PlatformInstallResponse>;
|
||||||
@@ -605,6 +616,9 @@ export interface IArduinoCoreServiceClient {
|
|||||||
boardSearch(request: cc_arduino_cli_commands_v1_board_pb.BoardSearchRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_board_pb.BoardSearchResponse) => void): grpc.ClientUnaryCall;
|
boardSearch(request: cc_arduino_cli_commands_v1_board_pb.BoardSearchRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_board_pb.BoardSearchResponse) => void): grpc.ClientUnaryCall;
|
||||||
boardSearch(request: cc_arduino_cli_commands_v1_board_pb.BoardSearchRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_board_pb.BoardSearchResponse) => void): grpc.ClientUnaryCall;
|
boardSearch(request: cc_arduino_cli_commands_v1_board_pb.BoardSearchRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_board_pb.BoardSearchResponse) => void): grpc.ClientUnaryCall;
|
||||||
boardSearch(request: cc_arduino_cli_commands_v1_board_pb.BoardSearchRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_board_pb.BoardSearchResponse) => void): grpc.ClientUnaryCall;
|
boardSearch(request: cc_arduino_cli_commands_v1_board_pb.BoardSearchRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_board_pb.BoardSearchResponse) => void): grpc.ClientUnaryCall;
|
||||||
|
boardIdentify(request: cc_arduino_cli_commands_v1_board_pb.BoardIdentifyRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_board_pb.BoardIdentifyResponse) => void): grpc.ClientUnaryCall;
|
||||||
|
boardIdentify(request: cc_arduino_cli_commands_v1_board_pb.BoardIdentifyRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_board_pb.BoardIdentifyResponse) => void): grpc.ClientUnaryCall;
|
||||||
|
boardIdentify(request: cc_arduino_cli_commands_v1_board_pb.BoardIdentifyRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_board_pb.BoardIdentifyResponse) => void): grpc.ClientUnaryCall;
|
||||||
boardListWatch(request: cc_arduino_cli_commands_v1_board_pb.BoardListWatchRequest, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_board_pb.BoardListWatchResponse>;
|
boardListWatch(request: cc_arduino_cli_commands_v1_board_pb.BoardListWatchRequest, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_board_pb.BoardListWatchResponse>;
|
||||||
boardListWatch(request: cc_arduino_cli_commands_v1_board_pb.BoardListWatchRequest, metadata?: grpc.Metadata, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_board_pb.BoardListWatchResponse>;
|
boardListWatch(request: cc_arduino_cli_commands_v1_board_pb.BoardListWatchRequest, metadata?: grpc.Metadata, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_board_pb.BoardListWatchResponse>;
|
||||||
compile(request: cc_arduino_cli_commands_v1_compile_pb.CompileRequest, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_compile_pb.CompileResponse>;
|
compile(request: cc_arduino_cli_commands_v1_compile_pb.CompileRequest, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_compile_pb.CompileResponse>;
|
||||||
@@ -737,6 +751,9 @@ export class ArduinoCoreServiceClient extends grpc.Client implements IArduinoCor
|
|||||||
public boardSearch(request: cc_arduino_cli_commands_v1_board_pb.BoardSearchRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_board_pb.BoardSearchResponse) => void): grpc.ClientUnaryCall;
|
public boardSearch(request: cc_arduino_cli_commands_v1_board_pb.BoardSearchRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_board_pb.BoardSearchResponse) => void): grpc.ClientUnaryCall;
|
||||||
public boardSearch(request: cc_arduino_cli_commands_v1_board_pb.BoardSearchRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_board_pb.BoardSearchResponse) => void): grpc.ClientUnaryCall;
|
public boardSearch(request: cc_arduino_cli_commands_v1_board_pb.BoardSearchRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_board_pb.BoardSearchResponse) => void): grpc.ClientUnaryCall;
|
||||||
public boardSearch(request: cc_arduino_cli_commands_v1_board_pb.BoardSearchRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_board_pb.BoardSearchResponse) => void): grpc.ClientUnaryCall;
|
public boardSearch(request: cc_arduino_cli_commands_v1_board_pb.BoardSearchRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_board_pb.BoardSearchResponse) => void): grpc.ClientUnaryCall;
|
||||||
|
public boardIdentify(request: cc_arduino_cli_commands_v1_board_pb.BoardIdentifyRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_board_pb.BoardIdentifyResponse) => void): grpc.ClientUnaryCall;
|
||||||
|
public boardIdentify(request: cc_arduino_cli_commands_v1_board_pb.BoardIdentifyRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_board_pb.BoardIdentifyResponse) => void): grpc.ClientUnaryCall;
|
||||||
|
public boardIdentify(request: cc_arduino_cli_commands_v1_board_pb.BoardIdentifyRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_board_pb.BoardIdentifyResponse) => void): grpc.ClientUnaryCall;
|
||||||
public boardListWatch(request: cc_arduino_cli_commands_v1_board_pb.BoardListWatchRequest, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_board_pb.BoardListWatchResponse>;
|
public boardListWatch(request: cc_arduino_cli_commands_v1_board_pb.BoardListWatchRequest, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_board_pb.BoardListWatchResponse>;
|
||||||
public boardListWatch(request: cc_arduino_cli_commands_v1_board_pb.BoardListWatchRequest, metadata?: grpc.Metadata, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_board_pb.BoardListWatchResponse>;
|
public boardListWatch(request: cc_arduino_cli_commands_v1_board_pb.BoardListWatchRequest, metadata?: grpc.Metadata, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_board_pb.BoardListWatchResponse>;
|
||||||
public compile(request: cc_arduino_cli_commands_v1_compile_pb.CompileRequest, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_compile_pb.CompileResponse>;
|
public compile(request: cc_arduino_cli_commands_v1_compile_pb.CompileRequest, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_compile_pb.CompileResponse>;
|
||||||
|
|||||||
@@ -74,6 +74,28 @@ function deserialize_cc_arduino_cli_commands_v1_BoardDetailsResponse(buffer_arg)
|
|||||||
return cc_arduino_cli_commands_v1_board_pb.BoardDetailsResponse.deserializeBinary(new Uint8Array(buffer_arg));
|
return cc_arduino_cli_commands_v1_board_pb.BoardDetailsResponse.deserializeBinary(new Uint8Array(buffer_arg));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function serialize_cc_arduino_cli_commands_v1_BoardIdentifyRequest(arg) {
|
||||||
|
if (!(arg instanceof cc_arduino_cli_commands_v1_board_pb.BoardIdentifyRequest)) {
|
||||||
|
throw new Error('Expected argument of type cc.arduino.cli.commands.v1.BoardIdentifyRequest');
|
||||||
|
}
|
||||||
|
return Buffer.from(arg.serializeBinary());
|
||||||
|
}
|
||||||
|
|
||||||
|
function deserialize_cc_arduino_cli_commands_v1_BoardIdentifyRequest(buffer_arg) {
|
||||||
|
return cc_arduino_cli_commands_v1_board_pb.BoardIdentifyRequest.deserializeBinary(new Uint8Array(buffer_arg));
|
||||||
|
}
|
||||||
|
|
||||||
|
function serialize_cc_arduino_cli_commands_v1_BoardIdentifyResponse(arg) {
|
||||||
|
if (!(arg instanceof cc_arduino_cli_commands_v1_board_pb.BoardIdentifyResponse)) {
|
||||||
|
throw new Error('Expected argument of type cc.arduino.cli.commands.v1.BoardIdentifyResponse');
|
||||||
|
}
|
||||||
|
return Buffer.from(arg.serializeBinary());
|
||||||
|
}
|
||||||
|
|
||||||
|
function deserialize_cc_arduino_cli_commands_v1_BoardIdentifyResponse(buffer_arg) {
|
||||||
|
return cc_arduino_cli_commands_v1_board_pb.BoardIdentifyResponse.deserializeBinary(new Uint8Array(buffer_arg));
|
||||||
|
}
|
||||||
|
|
||||||
function serialize_cc_arduino_cli_commands_v1_BoardListAllRequest(arg) {
|
function serialize_cc_arduino_cli_commands_v1_BoardListAllRequest(arg) {
|
||||||
if (!(arg instanceof cc_arduino_cli_commands_v1_board_pb.BoardListAllRequest)) {
|
if (!(arg instanceof cc_arduino_cli_commands_v1_board_pb.BoardListAllRequest)) {
|
||||||
throw new Error('Expected argument of type cc.arduino.cli.commands.v1.BoardListAllRequest');
|
throw new Error('Expected argument of type cc.arduino.cli.commands.v1.BoardListAllRequest');
|
||||||
@@ -1282,6 +1304,18 @@ boardSearch: {
|
|||||||
responseSerialize: serialize_cc_arduino_cli_commands_v1_BoardSearchResponse,
|
responseSerialize: serialize_cc_arduino_cli_commands_v1_BoardSearchResponse,
|
||||||
responseDeserialize: deserialize_cc_arduino_cli_commands_v1_BoardSearchResponse,
|
responseDeserialize: deserialize_cc_arduino_cli_commands_v1_BoardSearchResponse,
|
||||||
},
|
},
|
||||||
|
// Identify a board using the given properties.
|
||||||
|
boardIdentify: {
|
||||||
|
path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/BoardIdentify',
|
||||||
|
requestStream: false,
|
||||||
|
responseStream: false,
|
||||||
|
requestType: cc_arduino_cli_commands_v1_board_pb.BoardIdentifyRequest,
|
||||||
|
responseType: cc_arduino_cli_commands_v1_board_pb.BoardIdentifyResponse,
|
||||||
|
requestSerialize: serialize_cc_arduino_cli_commands_v1_BoardIdentifyRequest,
|
||||||
|
requestDeserialize: deserialize_cc_arduino_cli_commands_v1_BoardIdentifyRequest,
|
||||||
|
responseSerialize: serialize_cc_arduino_cli_commands_v1_BoardIdentifyResponse,
|
||||||
|
responseDeserialize: deserialize_cc_arduino_cli_commands_v1_BoardIdentifyResponse,
|
||||||
|
},
|
||||||
// List boards connection and disconnected events.
|
// List boards connection and disconnected events.
|
||||||
boardListWatch: {
|
boardListWatch: {
|
||||||
path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/BoardListWatch',
|
path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/BoardListWatch',
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import yaml from 'js-yaml';
|
|||||||
import { injectable, inject, named } from '@theia/core/shared/inversify';
|
import { injectable, inject, named } from '@theia/core/shared/inversify';
|
||||||
import URI from '@theia/core/lib/common/uri';
|
import URI from '@theia/core/lib/common/uri';
|
||||||
import { ILogger } from '@theia/core/lib/common/logger';
|
import { ILogger } from '@theia/core/lib/common/logger';
|
||||||
import { FileUri } from '@theia/core/lib/node/file-uri';
|
import { FileUri } from '@theia/core/lib/common/file-uri';
|
||||||
import { Event, Emitter } from '@theia/core/lib/common/event';
|
import { Event, Emitter } from '@theia/core/lib/common/event';
|
||||||
import { BackendApplicationContribution } from '@theia/core/lib/node/backend-application';
|
import { BackendApplicationContribution } from '@theia/core/lib/node/backend-application';
|
||||||
import {
|
import {
|
||||||
|
|||||||
@@ -1,17 +1,17 @@
|
|||||||
import { type ClientReadableStream } from '@grpc/grpc-js';
|
import { type ClientReadableStream } from '@grpc/grpc-js';
|
||||||
import { ApplicationError } from '@theia/core/lib/common/application-error';
|
import { ApplicationError } from '@theia/core/lib/common/application-error';
|
||||||
import type { CancellationToken } from '@theia/core/lib/common/cancellation';
|
import type { CancellationToken } from '@theia/core/lib/common/cancellation';
|
||||||
import { CommandService } from '@theia/core/lib/common/command';
|
|
||||||
import {
|
import {
|
||||||
Disposable,
|
Disposable,
|
||||||
DisposableCollection,
|
DisposableCollection,
|
||||||
} from '@theia/core/lib/common/disposable';
|
} from '@theia/core/lib/common/disposable';
|
||||||
|
import { FileUri } from '@theia/core/lib/common/file-uri';
|
||||||
import { nls } from '@theia/core/lib/common/nls';
|
import { nls } from '@theia/core/lib/common/nls';
|
||||||
import type { Mutable } from '@theia/core/lib/common/types';
|
import type { Mutable } from '@theia/core/lib/common/types';
|
||||||
import { FileUri } from '@theia/core/lib/node/file-uri';
|
|
||||||
import { inject, injectable } from '@theia/core/shared/inversify';
|
import { inject, injectable } from '@theia/core/shared/inversify';
|
||||||
import * as jspb from 'google-protobuf';
|
import * as jspb from 'google-protobuf';
|
||||||
import path from 'node:path';
|
import path from 'node:path';
|
||||||
|
import { userAbort } from '../common/nls';
|
||||||
import {
|
import {
|
||||||
UploadResponse as ApiUploadResponse,
|
UploadResponse as ApiUploadResponse,
|
||||||
OutputMessage,
|
OutputMessage,
|
||||||
@@ -27,6 +27,7 @@ import {
|
|||||||
isCompileSummary,
|
isCompileSummary,
|
||||||
isUploadResponse,
|
isUploadResponse,
|
||||||
} from '../common/protocol/core-service';
|
} from '../common/protocol/core-service';
|
||||||
|
import { UserAbortApplicationError } from '../common/protocol/progressible';
|
||||||
import { ResponseService } from '../common/protocol/response-service';
|
import { ResponseService } from '../common/protocol/response-service';
|
||||||
import { firstToUpperCase, notEmpty } from '../common/utils';
|
import { firstToUpperCase, notEmpty } from '../common/utils';
|
||||||
import { BoardDiscovery, createApiPort } from './board-discovery';
|
import { BoardDiscovery, createApiPort } from './board-discovery';
|
||||||
@@ -53,8 +54,6 @@ import { ExecuteWithProgress, ProgressResponse } from './grpc-progressible';
|
|||||||
import { MonitorManager } from './monitor-manager';
|
import { MonitorManager } from './monitor-manager';
|
||||||
import { ServiceError } from './service-error';
|
import { ServiceError } from './service-error';
|
||||||
import { AutoFlushingBuffer } from './utils/buffers';
|
import { AutoFlushingBuffer } from './utils/buffers';
|
||||||
import { userAbort } from '../common/nls';
|
|
||||||
import { UserAbortApplicationError } from '../common/protocol/progressible';
|
|
||||||
|
|
||||||
namespace Uploadable {
|
namespace Uploadable {
|
||||||
export type Request = UploadRequest | UploadUsingProgrammerRequest;
|
export type Request = UploadRequest | UploadUsingProgrammerRequest;
|
||||||
@@ -69,15 +68,13 @@ export class CoreServiceImpl extends CoreClientAware implements CoreService {
|
|||||||
private readonly responseService: ResponseService;
|
private readonly responseService: ResponseService;
|
||||||
@inject(MonitorManager)
|
@inject(MonitorManager)
|
||||||
private readonly monitorManager: MonitorManager;
|
private readonly monitorManager: MonitorManager;
|
||||||
@inject(CommandService)
|
|
||||||
private readonly commandService: CommandService;
|
|
||||||
@inject(BoardDiscovery)
|
@inject(BoardDiscovery)
|
||||||
private readonly boardDiscovery: BoardDiscovery;
|
private readonly boardDiscovery: BoardDiscovery;
|
||||||
|
|
||||||
async compile(
|
async compile(
|
||||||
options: CoreService.Options.Compile,
|
options: CoreService.Options.Compile,
|
||||||
cancellationToken?: CancellationToken
|
cancellationToken?: CancellationToken
|
||||||
): Promise<void> {
|
): Promise<CompileSummary | undefined> {
|
||||||
const coreClient = await this.coreClient;
|
const coreClient = await this.coreClient;
|
||||||
const { client, instance } = coreClient;
|
const { client, instance } = coreClient;
|
||||||
const request = this.compileRequest(options, instance);
|
const request = this.compileRequest(options, instance);
|
||||||
@@ -91,7 +88,7 @@ export class CoreServiceImpl extends CoreClientAware implements CoreService {
|
|||||||
);
|
);
|
||||||
const toDisposeOnFinally = new DisposableCollection(handler);
|
const toDisposeOnFinally = new DisposableCollection(handler);
|
||||||
|
|
||||||
return new Promise<void>((resolve, reject) => {
|
return new Promise<CompileSummary | undefined>((resolve, reject) => {
|
||||||
let hasRetried = false;
|
let hasRetried = false;
|
||||||
|
|
||||||
const handleUnexpectedError = (error: Error) => {
|
const handleUnexpectedError = (error: Error) => {
|
||||||
@@ -164,50 +161,26 @@ export class CoreServiceImpl extends CoreClientAware implements CoreService {
|
|||||||
call
|
call
|
||||||
.on('data', handler.onData)
|
.on('data', handler.onData)
|
||||||
.on('error', handleError)
|
.on('error', handleError)
|
||||||
.on('end', resolve);
|
.on('end', () => {
|
||||||
|
if (isCompileSummary(compileSummary)) {
|
||||||
|
resolve(compileSummary);
|
||||||
|
} else {
|
||||||
|
console.error(
|
||||||
|
`Have not received the full compile summary from the CLI while running the compilation. ${JSON.stringify(
|
||||||
|
compileSummary
|
||||||
|
)}`
|
||||||
|
);
|
||||||
|
resolve(undefined);
|
||||||
|
}
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
startCompileStream();
|
startCompileStream();
|
||||||
}).finally(() => {
|
}).finally(() => {
|
||||||
toDisposeOnFinally.dispose();
|
toDisposeOnFinally.dispose();
|
||||||
if (!isCompileSummary(compileSummary)) {
|
|
||||||
if (cancellationToken && cancellationToken.isCancellationRequested) {
|
|
||||||
// NOOP
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
console.error(
|
|
||||||
`Have not received the full compile summary from the CLI while running the compilation. ${JSON.stringify(
|
|
||||||
compileSummary
|
|
||||||
)}`
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
this.fireBuildDidComplete(compileSummary);
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// This executes on the frontend, the VS Code extension receives it, and sends an `ino/buildDidComplete` notification to the language server.
|
|
||||||
private fireBuildDidComplete(compileSummary: CompileSummary): void {
|
|
||||||
const params = {
|
|
||||||
...compileSummary,
|
|
||||||
};
|
|
||||||
console.info(
|
|
||||||
`Executing 'arduino.languageserver.notifyBuildDidComplete' with ${JSON.stringify(
|
|
||||||
params.buildOutputUri
|
|
||||||
)}`
|
|
||||||
);
|
|
||||||
this.commandService
|
|
||||||
.executeCommand('arduino.languageserver.notifyBuildDidComplete', params)
|
|
||||||
.catch((err) =>
|
|
||||||
console.error(
|
|
||||||
`Unexpected error when firing event on build did complete. ${JSON.stringify(
|
|
||||||
params.buildOutputUri
|
|
||||||
)}`,
|
|
||||||
err
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
private compileRequest(
|
private compileRequest(
|
||||||
options: CoreService.Options.Compile & {
|
options: CoreService.Options.Compile & {
|
||||||
exportBinaries?: boolean;
|
exportBinaries?: boolean;
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import {
|
|||||||
} from '@theia/core/shared/inversify';
|
} from '@theia/core/shared/inversify';
|
||||||
import { join } from 'node:path';
|
import { join } from 'node:path';
|
||||||
import fs from 'node:fs';
|
import fs from 'node:fs';
|
||||||
import { FileUri } from '@theia/core/lib/node/file-uri';
|
import { FileUri } from '@theia/core/lib/common/file-uri';
|
||||||
import {
|
import {
|
||||||
SketchRef,
|
SketchRef,
|
||||||
SketchContainer,
|
SketchContainer,
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { FileUri } from '@theia/core/lib/node/file-uri';
|
import { FileUri } from '@theia/core/lib/common/file-uri';
|
||||||
import { injectable } from '@theia/core/shared/inversify';
|
import { injectable } from '@theia/core/shared/inversify';
|
||||||
import { ExecutableService } from '../common/protocol/executable-service';
|
import { ExecutableService } from '../common/protocol/executable-service';
|
||||||
import {
|
import {
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import {
|
|||||||
postConstruct,
|
postConstruct,
|
||||||
} from '@theia/core/shared/inversify';
|
} from '@theia/core/shared/inversify';
|
||||||
import { EnvVariablesServer } from '@theia/core/lib/common/env-variables';
|
import { EnvVariablesServer } from '@theia/core/lib/common/env-variables';
|
||||||
import { FileUri } from '@theia/core/lib/node/file-uri';
|
import { FileUri } from '@theia/core/lib/common/file-uri';
|
||||||
import { promisify } from 'util';
|
import { promisify } from 'util';
|
||||||
import { MonitorSettingsProvider } from './monitor-settings-provider';
|
import { MonitorSettingsProvider } from './monitor-settings-provider';
|
||||||
import { Deferred } from '@theia/core/lib/common/promise-util';
|
import { Deferred } from '@theia/core/lib/common/promise-util';
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { injectable } from '@theia/core/shared/inversify';
|
import { injectable } from '@theia/core/shared/inversify';
|
||||||
import { FileUri } from '@theia/core/lib/node/file-uri';
|
import { FileUri } from '@theia/core/lib/common/file-uri';
|
||||||
import { FileSystemExt } from '../common/protocol/filesystem-ext';
|
import { FileSystemExt } from '../common/protocol/filesystem-ext';
|
||||||
|
|
||||||
@injectable()
|
@injectable()
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { EnvVariablesServer } from '@theia/core/lib/common/env-variables';
|
import { EnvVariablesServer } from '@theia/core/lib/common/env-variables';
|
||||||
import { FileUri } from '@theia/core/lib/node/file-uri';
|
import { FileUri } from '@theia/core/lib/common/file-uri';
|
||||||
import { inject, injectable } from '@theia/core/shared/inversify';
|
import { inject, injectable } from '@theia/core/shared/inversify';
|
||||||
import { promises as fs } from 'node:fs';
|
import { promises as fs } from 'node:fs';
|
||||||
import {
|
import {
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import { Deferred } from '@theia/core/lib/common/promise-util';
|
|||||||
import { escapeRegExpCharacters } from '@theia/core/lib/common/strings';
|
import { escapeRegExpCharacters } from '@theia/core/lib/common/strings';
|
||||||
import type { Mutable } from '@theia/core/lib/common/types';
|
import type { Mutable } from '@theia/core/lib/common/types';
|
||||||
import URI from '@theia/core/lib/common/uri';
|
import URI from '@theia/core/lib/common/uri';
|
||||||
import { FileUri } from '@theia/core/lib/node/file-uri';
|
import { FileUri } from '@theia/core/lib/common/file-uri';
|
||||||
import { inject, injectable, named } from '@theia/core/shared/inversify';
|
import { inject, injectable, named } from '@theia/core/shared/inversify';
|
||||||
import { glob } from 'glob';
|
import { glob } from 'glob';
|
||||||
import crypto from 'node:crypto';
|
import crypto from 'node:crypto';
|
||||||
|
|||||||
@@ -1,20 +0,0 @@
|
|||||||
import { injectable } from '@theia/core/shared/inversify';
|
|
||||||
import { SurveyNotificationService } from '../common/protocol/survey-service';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Service for checking if it is the first instance of the IDE, in this case it sets a flag to true.
|
|
||||||
* This flag is used to prevent the survey notification from being visible in every open window. It must only be shown on one window.
|
|
||||||
*/
|
|
||||||
@injectable()
|
|
||||||
export class SurveyNotificationServiceImpl
|
|
||||||
implements SurveyNotificationService
|
|
||||||
{
|
|
||||||
private surveyDidShow = false;
|
|
||||||
async isFirstInstance(): Promise<boolean> {
|
|
||||||
if (this.surveyDidShow) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
this.surveyDidShow = true;
|
|
||||||
return this.surveyDidShow;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,7 +1,8 @@
|
|||||||
import { MessagingContribution as TheiaMessagingContribution } from '@theia/core/lib/node/messaging/messaging-contribution';
|
import { WebsocketEndpoint as TheiaWebsocketEndpoint } from '@theia/core/lib/node/messaging/websocket-endpoint';
|
||||||
import { injectable } from '@theia/core/shared/inversify';
|
import { injectable } from '@theia/core/shared/inversify';
|
||||||
|
|
||||||
@injectable()
|
@injectable()
|
||||||
export class MessagingContribution extends TheiaMessagingContribution {
|
export class WebsocketEndpoint extends TheiaWebsocketEndpoint {
|
||||||
// https://github.com/eclipse-theia/theia/discussions/11543
|
// https://github.com/eclipse-theia/theia/discussions/11543
|
||||||
protected override checkAliveTimeout = process.argv.includes(
|
protected override checkAliveTimeout = process.argv.includes(
|
||||||
'--no-ping-timeout'
|
'--no-ping-timeout'
|
||||||
@@ -5,7 +5,7 @@ import {
|
|||||||
import { isWindows } from '@theia/core/lib/common/os';
|
import { isWindows } from '@theia/core/lib/common/os';
|
||||||
import URI from '@theia/core/lib/common/uri';
|
import URI from '@theia/core/lib/common/uri';
|
||||||
import { BackendApplicationConfigProvider } from '@theia/core/lib/node/backend-application-config-provider';
|
import { BackendApplicationConfigProvider } from '@theia/core/lib/node/backend-application-config-provider';
|
||||||
import { FileUri } from '@theia/core/lib/node/file-uri';
|
import { FileUri } from '@theia/core/lib/common/file-uri';
|
||||||
import {
|
import {
|
||||||
inject,
|
inject,
|
||||||
injectable,
|
injectable,
|
||||||
|
|||||||
@@ -1,42 +0,0 @@
|
|||||||
import { join } from 'node:path';
|
|
||||||
import { interfaces } from '@theia/core/shared/inversify';
|
|
||||||
import {
|
|
||||||
NsfwFileSystemWatcherServiceProcessOptions,
|
|
||||||
NSFW_SINGLE_THREADED,
|
|
||||||
spawnNsfwFileSystemWatcherServiceProcess,
|
|
||||||
} from '@theia/filesystem/lib/node/filesystem-backend-module';
|
|
||||||
import { FileSystemWatcherService } from '@theia/filesystem/lib/common/filesystem-watcher-protocol';
|
|
||||||
import { NsfwFileSystemWatcherServerOptions } from '@theia/filesystem/lib/node/nsfw-watcher/nsfw-filesystem-service';
|
|
||||||
import { FileSystemWatcherServiceDispatcher } from '@theia/filesystem/lib/node/filesystem-watcher-dispatcher';
|
|
||||||
import { NoDelayDisposalTimeoutNsfwFileSystemWatcherService } from './nsfw-watcher/nsfw-filesystem-service';
|
|
||||||
|
|
||||||
export function rebindNsfwFileSystemWatcher(rebind: interfaces.Rebind): void {
|
|
||||||
rebind<NsfwFileSystemWatcherServiceProcessOptions>(
|
|
||||||
NsfwFileSystemWatcherServiceProcessOptions
|
|
||||||
).toConstantValue({
|
|
||||||
entryPoint: join(__dirname, 'nsfw-watcher'),
|
|
||||||
});
|
|
||||||
rebind<FileSystemWatcherService>(FileSystemWatcherService)
|
|
||||||
.toDynamicValue((context) =>
|
|
||||||
NSFW_SINGLE_THREADED
|
|
||||||
? createNsfwFileSystemWatcherService(context)
|
|
||||||
: spawnNsfwFileSystemWatcherServiceProcess(context)
|
|
||||||
)
|
|
||||||
.inSingletonScope();
|
|
||||||
}
|
|
||||||
|
|
||||||
function createNsfwFileSystemWatcherService({
|
|
||||||
container,
|
|
||||||
}: interfaces.Context): FileSystemWatcherService {
|
|
||||||
const options = container.get<NsfwFileSystemWatcherServerOptions>(
|
|
||||||
NsfwFileSystemWatcherServerOptions
|
|
||||||
);
|
|
||||||
const dispatcher = container.get<FileSystemWatcherServiceDispatcher>(
|
|
||||||
FileSystemWatcherServiceDispatcher
|
|
||||||
);
|
|
||||||
const server = new NoDelayDisposalTimeoutNsfwFileSystemWatcherService(
|
|
||||||
options
|
|
||||||
);
|
|
||||||
server.setClient(dispatcher);
|
|
||||||
return server;
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
import { join } from 'node:path';
|
||||||
|
import { interfaces } from '@theia/core/shared/inversify';
|
||||||
|
import {
|
||||||
|
FileSystemWatcherServiceProcessOptions,
|
||||||
|
WATCHER_SINGLE_THREADED,
|
||||||
|
spawnParcelFileSystemWatcherServiceProcess,
|
||||||
|
} from '@theia/filesystem/lib/node/filesystem-backend-module';
|
||||||
|
import { FileSystemWatcherService } from '@theia/filesystem/lib/common/filesystem-watcher-protocol';
|
||||||
|
import { ParcelFileSystemWatcherServerOptions } from '@theia/filesystem/lib/node/parcel-watcher/parcel-filesystem-service';
|
||||||
|
import { FileSystemWatcherServiceDispatcher } from '@theia/filesystem/lib/node/filesystem-watcher-dispatcher';
|
||||||
|
import { NoDelayDisposalTimeoutParcelFileSystemWatcherService } from './parcel-watcher/parcel-filesystem-service';
|
||||||
|
|
||||||
|
export function rebindParcelFileSystemWatcher(rebind: interfaces.Rebind): void {
|
||||||
|
rebind<FileSystemWatcherServiceProcessOptions>(
|
||||||
|
FileSystemWatcherServiceProcessOptions
|
||||||
|
).toConstantValue({
|
||||||
|
entryPoint: join(__dirname, 'parcel-watcher'),
|
||||||
|
});
|
||||||
|
rebind<FileSystemWatcherService>(FileSystemWatcherService)
|
||||||
|
.toDynamicValue((context) =>
|
||||||
|
WATCHER_SINGLE_THREADED
|
||||||
|
? createParcelFileSystemWatcherService(context)
|
||||||
|
: spawnParcelFileSystemWatcherServiceProcess(context)
|
||||||
|
)
|
||||||
|
.inSingletonScope();
|
||||||
|
}
|
||||||
|
|
||||||
|
function createParcelFileSystemWatcherService({
|
||||||
|
container,
|
||||||
|
}: interfaces.Context): FileSystemWatcherService {
|
||||||
|
const options = container.get<ParcelFileSystemWatcherServerOptions>(
|
||||||
|
ParcelFileSystemWatcherServerOptions
|
||||||
|
);
|
||||||
|
const dispatcher = container.get<FileSystemWatcherServiceDispatcher>(
|
||||||
|
FileSystemWatcherServiceDispatcher
|
||||||
|
);
|
||||||
|
const server = new NoDelayDisposalTimeoutParcelFileSystemWatcherService(
|
||||||
|
options
|
||||||
|
);
|
||||||
|
server.setClient(dispatcher);
|
||||||
|
return server;
|
||||||
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
import * as yargs from '@theia/core/shared/yargs';
|
import * as yargs from '@theia/core/shared/yargs';
|
||||||
import { JsonRpcProxyFactory } from '@theia/core/lib/common/messaging/proxy-factory';
|
import { JsonRpcProxyFactory } from '@theia/core/lib/common/messaging/proxy-factory';
|
||||||
import { NoDelayDisposalTimeoutNsfwFileSystemWatcherService } from './nsfw-filesystem-service';
|
import { NoDelayDisposalTimeoutParcelFileSystemWatcherService } from './parcel-filesystem-service';
|
||||||
import type { IPCEntryPoint } from '@theia/core/lib/node/messaging/ipc-protocol';
|
import type { IPCEntryPoint } from '@theia/core/lib/node/messaging/ipc-protocol';
|
||||||
import type { FileSystemWatcherServiceClient } from '@theia/filesystem/lib/common/filesystem-watcher-protocol';
|
import type { FileSystemWatcherServiceClient } from '@theia/filesystem/lib/common/filesystem-watcher-protocol';
|
||||||
|
|
||||||
@@ -20,7 +20,7 @@ const options: {
|
|||||||
}).argv as any;
|
}).argv as any;
|
||||||
|
|
||||||
export default <IPCEntryPoint>((connection) => {
|
export default <IPCEntryPoint>((connection) => {
|
||||||
const server = new NoDelayDisposalTimeoutNsfwFileSystemWatcherService(
|
const server = new NoDelayDisposalTimeoutParcelFileSystemWatcherService(
|
||||||
options
|
options
|
||||||
);
|
);
|
||||||
const factory = new JsonRpcProxyFactory<FileSystemWatcherServiceClient>(
|
const factory = new JsonRpcProxyFactory<FileSystemWatcherServiceClient>(
|
||||||
@@ -1,26 +1,26 @@
|
|||||||
import { Minimatch } from 'minimatch';
|
import { Minimatch } from 'minimatch';
|
||||||
import type { WatchOptions } from '@theia/filesystem/lib/common/filesystem-watcher-protocol';
|
import type { WatchOptions } from '@theia/filesystem/lib/common/filesystem-watcher-protocol';
|
||||||
import {
|
import {
|
||||||
NsfwFileSystemWatcherService,
|
ParcelFileSystemWatcherService,
|
||||||
NsfwWatcher,
|
ParcelWatcher,
|
||||||
} from '@theia/filesystem/lib/node/nsfw-watcher/nsfw-filesystem-service';
|
} from '@theia/filesystem/lib/node/parcel-watcher/parcel-filesystem-service';
|
||||||
|
|
||||||
// Dispose the watcher immediately when the last reference is removed. By default, Theia waits 10 sec.
|
// Dispose the watcher immediately when the last reference is removed. By default, Theia waits 10 sec.
|
||||||
// https://github.com/eclipse-theia/theia/issues/11639#issuecomment-1238980708
|
// https://github.com/eclipse-theia/theia/issues/11639#issuecomment-1238980708
|
||||||
const NoDelay = 0;
|
const NoDelay = 0;
|
||||||
|
|
||||||
export class NoDelayDisposalTimeoutNsfwFileSystemWatcherService extends NsfwFileSystemWatcherService {
|
export class NoDelayDisposalTimeoutParcelFileSystemWatcherService extends ParcelFileSystemWatcherService {
|
||||||
protected override createWatcher(
|
protected override createWatcher(
|
||||||
clientId: number,
|
clientId: number,
|
||||||
fsPath: string,
|
fsPath: string,
|
||||||
options: WatchOptions
|
options: WatchOptions
|
||||||
): NsfwWatcher {
|
): ParcelWatcher {
|
||||||
const watcherOptions = {
|
const watcherOptions = {
|
||||||
ignored: options.ignored.map(
|
ignored: options.ignored.map(
|
||||||
(pattern) => new Minimatch(pattern, { dot: true })
|
(pattern) => new Minimatch(pattern, { dot: true })
|
||||||
),
|
),
|
||||||
};
|
};
|
||||||
return new NsfwWatcher(
|
return new ParcelWatcher(
|
||||||
clientId,
|
clientId,
|
||||||
fsPath,
|
fsPath,
|
||||||
watcherOptions,
|
watcherOptions,
|
||||||
@@ -83,7 +83,9 @@ const cortexDebugMapper: PluginContributionMapper = (
|
|||||||
}
|
}
|
||||||
for (const _debugger of contribution.debuggers ?? []) {
|
for (const _debugger of contribution.debuggers ?? []) {
|
||||||
if (_debugger.type === 'cortex-debug') {
|
if (_debugger.type === 'cortex-debug') {
|
||||||
for (const attributes of _debugger.configurationAttributes ?? []) {
|
for (const attributes of Object.values(
|
||||||
|
_debugger.configurationAttributes ?? {}
|
||||||
|
)) {
|
||||||
if (attributes.properties) {
|
if (attributes.properties) {
|
||||||
// Patch the cortex-debug debug config schema to allow the in-house `configId`.
|
// Patch the cortex-debug debug config schema to allow the in-house `configId`.
|
||||||
attributes.properties['configId'] = {
|
attributes.properties['configId'] = {
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ import {
|
|||||||
UpdateArduinoState,
|
UpdateArduinoState,
|
||||||
UpdateStateParams,
|
UpdateStateParams,
|
||||||
} from '../../browser/contributions/update-arduino-state';
|
} from '../../browser/contributions/update-arduino-state';
|
||||||
|
import { CompileSummaryProvider } from '../../browser/contributions/verify-sketch';
|
||||||
import { NotificationCenter } from '../../browser/notification-center';
|
import { NotificationCenter } from '../../browser/notification-center';
|
||||||
import {
|
import {
|
||||||
CurrentSketch,
|
CurrentSketch,
|
||||||
@@ -61,10 +62,12 @@ describe('update-arduino-state', function () {
|
|||||||
let currentSketchMock: CurrentSketch | undefined;
|
let currentSketchMock: CurrentSketch | undefined;
|
||||||
let sketchDirUriMock: URI | undefined;
|
let sketchDirUriMock: URI | undefined;
|
||||||
let dataDirUriMock: URI | undefined;
|
let dataDirUriMock: URI | undefined;
|
||||||
|
let compileSummaryMock: CompileSummary | undefined;
|
||||||
let onCurrentSketchDidChangeEmitter: Emitter<CurrentSketch>;
|
let onCurrentSketchDidChangeEmitter: Emitter<CurrentSketch>;
|
||||||
let onDataDirDidChangeEmitter: Emitter<URI | undefined>;
|
let onDataDirDidChangeEmitter: Emitter<URI | undefined>;
|
||||||
let onSketchDirDidChangeEmitter: Emitter<URI | undefined>;
|
let onSketchDirDidChangeEmitter: Emitter<URI | undefined>;
|
||||||
let onDataStoreDidChangeEmitter: Emitter<BoardsDataStoreChangeEvent>;
|
let onDataStoreDidChangeEmitter: Emitter<BoardsDataStoreChangeEvent>;
|
||||||
|
let compileSummaryDidChangeEmitter: Emitter<CompileSummary | undefined>;
|
||||||
|
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
toDisposeAfterEach = new DisposableCollection();
|
toDisposeAfterEach = new DisposableCollection();
|
||||||
@@ -76,15 +79,18 @@ describe('update-arduino-state', function () {
|
|||||||
currentSketchMock = undefined;
|
currentSketchMock = undefined;
|
||||||
sketchDirUriMock = undefined;
|
sketchDirUriMock = undefined;
|
||||||
dataDirUriMock = undefined;
|
dataDirUriMock = undefined;
|
||||||
|
compileSummaryMock = undefined;
|
||||||
onCurrentSketchDidChangeEmitter = new Emitter();
|
onCurrentSketchDidChangeEmitter = new Emitter();
|
||||||
onDataDirDidChangeEmitter = new Emitter();
|
onDataDirDidChangeEmitter = new Emitter();
|
||||||
onSketchDirDidChangeEmitter = new Emitter();
|
onSketchDirDidChangeEmitter = new Emitter();
|
||||||
onDataStoreDidChangeEmitter = new Emitter();
|
onDataStoreDidChangeEmitter = new Emitter();
|
||||||
|
compileSummaryDidChangeEmitter = new Emitter();
|
||||||
toDisposeAfterEach.pushAll([
|
toDisposeAfterEach.pushAll([
|
||||||
onCurrentSketchDidChangeEmitter,
|
onCurrentSketchDidChangeEmitter,
|
||||||
onDataDirDidChangeEmitter,
|
onDataDirDidChangeEmitter,
|
||||||
onSketchDirDidChangeEmitter,
|
onSketchDirDidChangeEmitter,
|
||||||
onDataStoreDidChangeEmitter,
|
onDataStoreDidChangeEmitter,
|
||||||
|
compileSummaryDidChangeEmitter,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
const container = createContainer();
|
const container = createContainer();
|
||||||
@@ -418,10 +424,8 @@ describe('update-arduino-state', function () {
|
|||||||
buildPlatform: undefined,
|
buildPlatform: undefined,
|
||||||
buildOutputUri: 'file:///path/to/build',
|
buildOutputUri: 'file:///path/to/build',
|
||||||
};
|
};
|
||||||
await commandRegistry.executeCommand(
|
compileSummaryMock = summary;
|
||||||
'arduino.languageserver.notifyBuildDidComplete',
|
compileSummaryDidChangeEmitter.fire(compileSummaryMock);
|
||||||
summary
|
|
||||||
);
|
|
||||||
await wait(50);
|
await wait(50);
|
||||||
|
|
||||||
const params = stateUpdateParams.filter(
|
const params = stateUpdateParams.filter(
|
||||||
@@ -585,6 +589,12 @@ describe('update-arduino-state', function () {
|
|||||||
new ContainerModule((bind, unbind, isBound, rebind) => {
|
new ContainerModule((bind, unbind, isBound, rebind) => {
|
||||||
bindSketchesContribution(bind, unbind, isBound, rebind);
|
bindSketchesContribution(bind, unbind, isBound, rebind);
|
||||||
bind(UpdateArduinoState).toSelf().inSingletonScope();
|
bind(UpdateArduinoState).toSelf().inSingletonScope();
|
||||||
|
bind(CompileSummaryProvider).toConstantValue(<CompileSummaryProvider>{
|
||||||
|
get compileSummary(): CompileSummary | undefined {
|
||||||
|
return compileSummaryMock;
|
||||||
|
},
|
||||||
|
onDidChangeCompileSummary: compileSummaryDidChangeEmitter.event,
|
||||||
|
});
|
||||||
rebind(BoardsService).toConstantValue(<BoardsService>{
|
rebind(BoardsService).toConstantValue(<BoardsService>{
|
||||||
getDetectedPorts() {
|
getDetectedPorts() {
|
||||||
return {};
|
return {};
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import {
|
|||||||
Disposable,
|
Disposable,
|
||||||
DisposableCollection,
|
DisposableCollection,
|
||||||
} from '@theia/core/lib/common/disposable';
|
} from '@theia/core/lib/common/disposable';
|
||||||
import { FileUri } from '@theia/core/lib/node/file-uri';
|
import { FileUri } from '@theia/core/lib/common/file-uri';
|
||||||
import { expect } from 'chai';
|
import { expect } from 'chai';
|
||||||
import { promises as fs } from 'node:fs';
|
import { promises as fs } from 'node:fs';
|
||||||
import path from 'node:path';
|
import path from 'node:path';
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
import { DisposableCollection } from '@theia/core/lib/common/disposable';
|
import { DisposableCollection } from '@theia/core/lib/common/disposable';
|
||||||
import type { MaybePromise } from '@theia/core/lib/common/types';
|
import type { MaybePromise } from '@theia/core/lib/common/types';
|
||||||
import { FileUri } from '@theia/core/lib/node/file-uri';
|
import { FileUri } from '@theia/core/lib/common/file-uri';
|
||||||
import { Container } from '@theia/core/shared/inversify';
|
import { Container } from '@theia/core/shared/inversify';
|
||||||
import { expect } from 'chai';
|
import { expect } from 'chai';
|
||||||
import { dump, load } from 'js-yaml';
|
import { dump, load } from 'js-yaml';
|
||||||
import { promises as fs } from 'node:fs';
|
import { promises as fs } from 'node:fs';
|
||||||
import { join } from 'node:path';
|
import { join } from 'node:path';
|
||||||
import { sync as deleteSync } from 'rimraf';
|
import { rimrafSync } from 'rimraf';
|
||||||
import {
|
import {
|
||||||
BoardsService,
|
BoardsService,
|
||||||
CoreService,
|
CoreService,
|
||||||
@@ -65,7 +65,7 @@ describe('core-client-provider', () => {
|
|||||||
it("should recover when the 'directories.data' folder is missing", async function () {
|
it("should recover when the 'directories.data' folder is missing", async function () {
|
||||||
this.timeout(timeout);
|
this.timeout(timeout);
|
||||||
const configDirPath = await prepareTestConfigDir();
|
const configDirPath = await prepareTestConfigDir();
|
||||||
deleteSync(join(configDirPath, 'data'));
|
rimrafSync(join(configDirPath, 'data'));
|
||||||
|
|
||||||
const container = await startCli(configDirPath, toDispose);
|
const container = await startCli(configDirPath, toDispose);
|
||||||
await assertFunctionalCli(container, ({ coreClientProvider }) => {
|
await assertFunctionalCli(container, ({ coreClientProvider }) => {
|
||||||
@@ -84,7 +84,7 @@ describe('core-client-provider', () => {
|
|||||||
'Arduino15',
|
'Arduino15',
|
||||||
'package_index.json'
|
'package_index.json'
|
||||||
);
|
);
|
||||||
deleteSync(primaryPackageIndexPath);
|
rimrafSync(primaryPackageIndexPath);
|
||||||
|
|
||||||
const container = await startCli(configDirPath, toDispose);
|
const container = await startCli(configDirPath, toDispose);
|
||||||
await assertFunctionalCli(container, ({ coreClientProvider }) => {
|
await assertFunctionalCli(container, ({ coreClientProvider }) => {
|
||||||
@@ -118,7 +118,7 @@ describe('core-client-provider', () => {
|
|||||||
'tools',
|
'tools',
|
||||||
tool
|
tool
|
||||||
);
|
);
|
||||||
deleteSync(builtinToolsPath);
|
rimrafSync(builtinToolsPath);
|
||||||
|
|
||||||
const container = await startCli(configDirPath, toDispose);
|
const container = await startCli(configDirPath, toDispose);
|
||||||
await assertFunctionalCli(container, ({ coreClientProvider }) => {
|
await assertFunctionalCli(container, ({ coreClientProvider }) => {
|
||||||
@@ -140,7 +140,7 @@ describe('core-client-provider', () => {
|
|||||||
'Arduino15',
|
'Arduino15',
|
||||||
'library_index.json'
|
'library_index.json'
|
||||||
);
|
);
|
||||||
deleteSync(libraryPackageIndexPath);
|
rimrafSync(libraryPackageIndexPath);
|
||||||
|
|
||||||
const container = await startCli(configDirPath, toDispose);
|
const container = await startCli(configDirPath, toDispose);
|
||||||
await assertFunctionalCli(container, ({ coreClientProvider }) => {
|
await assertFunctionalCli(container, ({ coreClientProvider }) => {
|
||||||
@@ -176,7 +176,7 @@ describe('core-client-provider', () => {
|
|||||||
'Arduino15',
|
'Arduino15',
|
||||||
'package_teensy_index.json'
|
'package_teensy_index.json'
|
||||||
);
|
);
|
||||||
deleteSync(thirdPartyPackageIndexPath);
|
rimrafSync(thirdPartyPackageIndexPath);
|
||||||
|
|
||||||
const container = await startCli(configDirPath, toDispose);
|
const container = await startCli(configDirPath, toDispose);
|
||||||
await assertFunctionalCli(
|
await assertFunctionalCli(
|
||||||
@@ -193,7 +193,7 @@ describe('core-client-provider', () => {
|
|||||||
it("should recover when invalid 3rd package URL is defined in the CLI config and the 'directories.data' folder is missing", async function () {
|
it("should recover when invalid 3rd package URL is defined in the CLI config and the 'directories.data' folder is missing", async function () {
|
||||||
this.timeout(timeout);
|
this.timeout(timeout);
|
||||||
const configDirPath = await prepareTestConfigDir();
|
const configDirPath = await prepareTestConfigDir();
|
||||||
deleteSync(join(configDirPath, 'data'));
|
rimrafSync(join(configDirPath, 'data'));
|
||||||
|
|
||||||
// set an invalid URL so the CLI will try to download it
|
// set an invalid URL so the CLI will try to download it
|
||||||
const cliConfigPath = join(configDirPath, 'arduino-cli.yaml');
|
const cliConfigPath = join(configDirPath, 'arduino-cli.yaml');
|
||||||
|
|||||||
@@ -1,12 +1,11 @@
|
|||||||
import { CancellationTokenSource } from '@theia/core/lib/common/cancellation';
|
|
||||||
import { CommandRegistry } from '@theia/core/lib/common/command';
|
|
||||||
import { DisposableCollection } from '@theia/core/lib/common/disposable';
|
import { DisposableCollection } from '@theia/core/lib/common/disposable';
|
||||||
import { isWindows } from '@theia/core/lib/common/os';
|
import { isWindows } from '@theia/core/lib/common/os';
|
||||||
import { FileUri } from '@theia/core/lib/node/file-uri';
|
import { FileUri } from '@theia/core/lib/common/file-uri';
|
||||||
import { Container, injectable } from '@theia/core/shared/inversify';
|
import { Container } from '@theia/core/shared/inversify';
|
||||||
import { expect } from 'chai';
|
import { expect } from 'chai';
|
||||||
import {
|
import {
|
||||||
BoardsService,
|
BoardsService,
|
||||||
|
CompileSummary,
|
||||||
CoreService,
|
CoreService,
|
||||||
SketchesService,
|
SketchesService,
|
||||||
isCompileSummary,
|
isCompileSummary,
|
||||||
@@ -36,11 +35,9 @@ describe('core-service-impl', () => {
|
|||||||
this.timeout(testTimeout);
|
this.timeout(testTimeout);
|
||||||
const coreService = container.get<CoreService>(CoreService);
|
const coreService = container.get<CoreService>(CoreService);
|
||||||
const sketchesService = container.get<SketchesService>(SketchesService);
|
const sketchesService = container.get<SketchesService>(SketchesService);
|
||||||
const commandService =
|
|
||||||
container.get<TestCommandRegistry>(TestCommandRegistry);
|
|
||||||
const sketch = await sketchesService.createNewSketch();
|
const sketch = await sketchesService.createNewSketch();
|
||||||
|
|
||||||
await coreService.compile({
|
const compileSummary = await coreService.compile({
|
||||||
fqbn: uno,
|
fqbn: uno,
|
||||||
sketch,
|
sketch,
|
||||||
optimizeForDebug: false,
|
optimizeForDebug: false,
|
||||||
@@ -48,18 +45,9 @@ describe('core-service-impl', () => {
|
|||||||
verbose: true,
|
verbose: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
const executedBuildDidCompleteCommands =
|
expect(isCompileSummary(compileSummary)).to.be.true;
|
||||||
commandService.executedCommands.filter(
|
expect((<CompileSummary>compileSummary).buildOutputUri).to.be.not
|
||||||
([command]) =>
|
.undefined;
|
||||||
command === 'arduino.languageserver.notifyBuildDidComplete'
|
|
||||||
);
|
|
||||||
expect(executedBuildDidCompleteCommands.length).to.be.equal(1);
|
|
||||||
const [, args] = executedBuildDidCompleteCommands[0];
|
|
||||||
expect(args.length).to.be.equal(1);
|
|
||||||
const arg = args[0];
|
|
||||||
expect(isCompileSummary(arg)).to.be.true;
|
|
||||||
expect('buildOutputUri' in arg).to.be.true;
|
|
||||||
expect(arg.buildOutputUri).to.be.not.undefined;
|
|
||||||
|
|
||||||
const tempBuildPaths = await sketchesService.getBuildPath(sketch);
|
const tempBuildPaths = await sketchesService.getBuildPath(sketch);
|
||||||
if (isWindows) {
|
if (isWindows) {
|
||||||
@@ -68,7 +56,7 @@ describe('core-service-impl', () => {
|
|||||||
expect(tempBuildPaths.length).to.be.equal(1);
|
expect(tempBuildPaths.length).to.be.equal(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
const { buildOutputUri } = arg;
|
const { buildOutputUri } = <CompileSummary>compileSummary;
|
||||||
const buildOutputPath = FileUri.fsPath(buildOutputUri).toString();
|
const buildOutputPath = FileUri.fsPath(buildOutputUri).toString();
|
||||||
expect(tempBuildPaths.includes(buildOutputPath)).to.be.true;
|
expect(tempBuildPaths.includes(buildOutputPath)).to.be.true;
|
||||||
});
|
});
|
||||||
@@ -91,35 +79,5 @@ async function start(
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function createContainer(): Promise<Container> {
|
async function createContainer(): Promise<Container> {
|
||||||
return createBaseContainer({
|
return createBaseContainer();
|
||||||
additionalBindings: (bind, rebind) => {
|
|
||||||
bind(TestCommandRegistry).toSelf().inSingletonScope();
|
|
||||||
rebind(CommandRegistry).toService(TestCommandRegistry);
|
|
||||||
},
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@injectable()
|
|
||||||
class TestCommandRegistry extends CommandRegistry {
|
|
||||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
||||||
readonly executedCommands: [string, any[]][] = [];
|
|
||||||
|
|
||||||
override async executeCommand<T>(
|
|
||||||
commandId: string,
|
|
||||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
||||||
...args: any[]
|
|
||||||
): Promise<T | undefined> {
|
|
||||||
const { token } = new CancellationTokenSource();
|
|
||||||
this.onWillExecuteCommandEmitter.fire({
|
|
||||||
commandId,
|
|
||||||
args,
|
|
||||||
token,
|
|
||||||
waitUntil: () => {
|
|
||||||
// NOOP
|
|
||||||
},
|
|
||||||
});
|
|
||||||
this.executedCommands.push([commandId, args]);
|
|
||||||
this.onDidExecuteCommandEmitter.fire({ commandId, args });
|
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import {
|
|||||||
import { EnvVariablesServer as TheiaEnvVariablesServer } from '@theia/core/lib/common/env-variables';
|
import { EnvVariablesServer as TheiaEnvVariablesServer } from '@theia/core/lib/common/env-variables';
|
||||||
import { waitForEvent } from '@theia/core/lib/common/promise-util';
|
import { waitForEvent } from '@theia/core/lib/common/promise-util';
|
||||||
import URI from '@theia/core/lib/common/uri';
|
import URI from '@theia/core/lib/common/uri';
|
||||||
import { FileUri } from '@theia/core/lib/node/file-uri';
|
import { FileUri } from '@theia/core/lib/common/file-uri';
|
||||||
import { ProcessUtils } from '@theia/core/lib/node/process-utils';
|
import { ProcessUtils } from '@theia/core/lib/node/process-utils';
|
||||||
import {
|
import {
|
||||||
Container,
|
Container,
|
||||||
|
|||||||
@@ -2,15 +2,15 @@ import {
|
|||||||
Disposable,
|
Disposable,
|
||||||
DisposableCollection,
|
DisposableCollection,
|
||||||
} from '@theia/core/lib/common/disposable';
|
} from '@theia/core/lib/common/disposable';
|
||||||
|
import { FileUri } from '@theia/core/lib/common/file-uri';
|
||||||
import { isWindows } from '@theia/core/lib/common/os';
|
import { isWindows } from '@theia/core/lib/common/os';
|
||||||
import { URI } from '@theia/core/lib/common/uri';
|
import { URI } from '@theia/core/lib/common/uri';
|
||||||
import { FileUri } from '@theia/core/lib/node/file-uri';
|
|
||||||
import { Container } from '@theia/core/shared/inversify';
|
import { Container } from '@theia/core/shared/inversify';
|
||||||
import { expect } from 'chai';
|
import { expect } from 'chai';
|
||||||
import { rejects } from 'node:assert/strict';
|
import { rejects } from 'node:assert/strict';
|
||||||
import { promises as fs } from 'node:fs';
|
import { promises as fs } from 'node:fs';
|
||||||
import path, { basename, join } from 'node:path';
|
import path, { basename, join } from 'node:path';
|
||||||
import { sync as rimrafSync } from 'rimraf';
|
import { rimrafSync } from 'rimraf';
|
||||||
import temp from 'temp';
|
import temp from 'temp';
|
||||||
import { Sketch, SketchesError, SketchesService } from '../../common/protocol';
|
import { Sketch, SketchesError, SketchesService } from '../../common/protocol';
|
||||||
import {
|
import {
|
||||||
@@ -574,7 +574,7 @@ function disposeSketch(...sketch: Sketch[]): Disposable {
|
|||||||
function disposeFolder(...paths: string[]): Disposable {
|
function disposeFolder(...paths: string[]): Disposable {
|
||||||
return new DisposableCollection(
|
return new DisposableCollection(
|
||||||
...paths.map((path) =>
|
...paths.map((path) =>
|
||||||
Disposable.create(() => rimrafSync(path, { maxBusyTries: 5 }))
|
Disposable.create(() => rimrafSync(path, { maxRetries: 5 }))
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import type { Mutable } from '@theia/core/lib/common/types';
|
import type { Mutable } from '@theia/core/lib/common/types';
|
||||||
import { FileUri } from '@theia/core/lib/node/file-uri';
|
import { FileUri } from '@theia/core/lib/common/file-uri';
|
||||||
import stableJsonStringify from 'fast-json-stable-stringify';
|
import stableJsonStringify from 'fast-json-stable-stringify';
|
||||||
import assert from 'node:assert/strict';
|
import assert from 'node:assert/strict';
|
||||||
import { basename, join } from 'node:path';
|
import { basename, join } from 'node:path';
|
||||||
|
|||||||
@@ -20,5 +20,4 @@
|
|||||||
"skipLibCheck": true
|
"skipLibCheck": true
|
||||||
},
|
},
|
||||||
"include": ["src"],
|
"include": ["src"],
|
||||||
"files": ["../node_modules/nsfw/index.d.ts"]
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,13 +1,41 @@
|
|||||||
# Translator Guide
|
# Translator Guide
|
||||||
|
|
||||||
The text of the Arduino IDE interface is translated into several languages. The language can be selected in the dialog opened via **File > Preferences** in the Arduino IDE menus (**Arduino IDE > Preferences** for macOS users).
|
The text of the Arduino IDE user interface is translated into several languages. The language can be selected in the dialog opened via **File > Preferences** in the Arduino IDE menus (**Arduino IDE > Preferences** for macOS users).
|
||||||
|
|
||||||
Translating text and improving on existing translations is a valuable contribution to the project, helping make Arduino accessible to everyone.
|
Translating text and improving on existing translations is a valuable contribution to the project, helping make Arduino accessible to everyone.
|
||||||
|
|
||||||
The translations for the text found in the Arduino IDE come from several sources:
|
The translations for the text found in Arduino IDE come from several sources:
|
||||||
|
|
||||||
## Arduino IDE Text
|
## Arduino IDE Text
|
||||||
|
|
||||||
|
The text of the Arduino IDE application can be translated to the following languages:
|
||||||
|
|
||||||
|
- čeština (Czech)
|
||||||
|
- Deutsch (German)
|
||||||
|
- Dutch
|
||||||
|
- español (Spanish)
|
||||||
|
- français (French)
|
||||||
|
- italiano (Italian)
|
||||||
|
- magyar (Hungarian)
|
||||||
|
- polski (Polish)
|
||||||
|
- português (Portuguese)
|
||||||
|
- Türkçe (Turkish)
|
||||||
|
- български (Bulgarian)
|
||||||
|
- русский (Russian)
|
||||||
|
- українська (Ukrainian)
|
||||||
|
- 한국어 (Korean)
|
||||||
|
- 中文(简体) (Chinese Simplified)
|
||||||
|
- 中文(繁體) (Chinese Traditional)
|
||||||
|
- 日本語 (Japanese)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
⚠ Unfortunately the 3rd party localization system used by the Arduino IDE application imposes a technical limitation to that set of languages. For this reason, we are unable to add support to Arduino IDE for additional languages (see [`arduino/arduino-ide#1447`](https://github.com/arduino/arduino-ide/issues/1447) for details).
|
||||||
|
|
||||||
|
There is no technical limitation on the set of languages to which **Arduino CLI** can be translated. If you would like to contribute translations for a language not on the above list, you are welcome to [contribute to the **Arduino CLI** project](#arduino-cli-text).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
Translations of Arduino IDE's text is done in the "**Arduino IDE 2.0**" project on the **Transifex** localization platform:
|
Translations of Arduino IDE's text is done in the "**Arduino IDE 2.0**" project on the **Transifex** localization platform:
|
||||||
|
|
||||||
https://explore.transifex.com/arduino-1/ide2/
|
https://explore.transifex.com/arduino-1/ide2/
|
||||||
|
|||||||
@@ -1,34 +1,34 @@
|
|||||||
{
|
{
|
||||||
"private": true,
|
"private": true,
|
||||||
"name": "electron-app",
|
"name": "electron-app",
|
||||||
"version": "2.3.4",
|
"version": "2.3.7",
|
||||||
"license": "AGPL-3.0-or-later",
|
"license": "AGPL-3.0-or-later",
|
||||||
"main": "./src-gen/backend/electron-main.js",
|
"main": "./src-gen/backend/electron-main.js",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@theia/core": "1.41.0",
|
"@theia/core": "1.57.0",
|
||||||
"@theia/debug": "1.41.0",
|
"@theia/debug": "1.57.0",
|
||||||
"@theia/editor": "1.41.0",
|
"@theia/editor": "1.57.0",
|
||||||
"@theia/electron": "1.41.0",
|
"@theia/electron": "1.57.0",
|
||||||
"@theia/filesystem": "1.41.0",
|
"@theia/filesystem": "1.57.0",
|
||||||
"@theia/keymaps": "1.41.0",
|
"@theia/keymaps": "1.57.0",
|
||||||
"@theia/messages": "1.41.0",
|
"@theia/messages": "1.57.0",
|
||||||
"@theia/monaco": "1.41.0",
|
"@theia/monaco": "1.57.0",
|
||||||
"@theia/navigator": "1.41.0",
|
"@theia/navigator": "1.57.0",
|
||||||
"@theia/plugin-ext": "1.41.0",
|
"@theia/plugin-ext": "1.57.0",
|
||||||
"@theia/plugin-ext-vscode": "1.41.0",
|
"@theia/plugin-ext-vscode": "1.57.0",
|
||||||
"@theia/preferences": "1.41.0",
|
"@theia/preferences": "1.57.0",
|
||||||
"@theia/terminal": "1.41.0",
|
"@theia/terminal": "1.57.0",
|
||||||
"@theia/workspace": "1.41.0",
|
"@theia/workspace": "1.57.0",
|
||||||
"arduino-ide-extension": "2.3.4"
|
"arduino-ide-extension": "2.3.7"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@theia/cli": "1.41.0",
|
"@theia/cli": "1.57.0",
|
||||||
"7zip-min": "^1.4.4",
|
"7zip-min": "^1.4.4",
|
||||||
"chmodr": "^1.2.0",
|
"chmodr": "^1.2.0",
|
||||||
"compression-webpack-plugin": "^9.0.0",
|
"compression-webpack-plugin": "^9.0.0",
|
||||||
"copy-webpack-plugin": "^8.1.1",
|
"copy-webpack-plugin": "^8.1.1",
|
||||||
"dateformat": "^5.0.3",
|
"dateformat": "^5.0.3",
|
||||||
"electron": "^27.0.3",
|
"electron": "30.1.2",
|
||||||
"electron-builder": "^24.6.4",
|
"electron-builder": "^24.6.4",
|
||||||
"electron-notarize": "^1.1.1",
|
"electron-notarize": "^1.1.1",
|
||||||
"execa": "^7.1.1",
|
"execa": "^7.1.1",
|
||||||
@@ -36,7 +36,7 @@
|
|||||||
"glob": "^10.3.3",
|
"glob": "^10.3.3",
|
||||||
"is-ci": "^2.0.0",
|
"is-ci": "^2.0.0",
|
||||||
"resolve-package-path": "^4.0.3",
|
"resolve-package-path": "^4.0.3",
|
||||||
"rimraf": "^2.6.1",
|
"rimraf": "^5.0.0",
|
||||||
"semver": "^7.3.2",
|
"semver": "^7.3.2",
|
||||||
"temp": "^0.9.1",
|
"temp": "^0.9.1",
|
||||||
"yaml": "^1.10.2"
|
"yaml": "^1.10.2"
|
||||||
@@ -53,7 +53,7 @@
|
|||||||
"prepackage": "rimraf dist",
|
"prepackage": "rimraf dist",
|
||||||
"package": "node ./scripts/package.js",
|
"package": "node ./scripts/package.js",
|
||||||
"postpackage": "node ./scripts/post-package.js",
|
"postpackage": "node ./scripts/post-package.js",
|
||||||
"rebuild": "theia rebuild:browser --cacheRoot ../.. && theia rebuild:electron --cacheRoot ../.."
|
"rebuild": "theia rebuild:browser --cacheRoot .. && theia rebuild:electron --cacheRoot .."
|
||||||
},
|
},
|
||||||
"theia": {
|
"theia": {
|
||||||
"target": "electron",
|
"target": "electron",
|
||||||
@@ -66,6 +66,11 @@
|
|||||||
},
|
},
|
||||||
"defaultIconTheme": "none",
|
"defaultIconTheme": "none",
|
||||||
"validatePreferencesSchema": false,
|
"validatePreferencesSchema": false,
|
||||||
|
"electron": {
|
||||||
|
"showWindowEarly": true,
|
||||||
|
"uriScheme": "arduino-ide"
|
||||||
|
},
|
||||||
|
"reloadOnReconnect": true,
|
||||||
"preferences": {
|
"preferences": {
|
||||||
"window.title": "${rootName}${activeEditorShort}${appName}",
|
"window.title": "${rootName}${activeEditorShort}${appName}",
|
||||||
"files.autoSave": "afterDelay",
|
"files.autoSave": "afterDelay",
|
||||||
@@ -195,29 +200,29 @@
|
|||||||
},
|
},
|
||||||
"theiaPluginsDir": "plugins",
|
"theiaPluginsDir": "plugins",
|
||||||
"theiaPlugins": {
|
"theiaPlugins": {
|
||||||
"vscode-builtin-cpp": "https://open-vsx.org/api/vscode/cpp/1.52.1/file/vscode.cpp-1.52.1.vsix",
|
"vscode-builtin-cpp": "https://open-vsx.org/api/vscode/cpp/1.88.1/file/vscode.cpp-1.88.1.vsix",
|
||||||
"vscode-arduino-api": "https://github.com/dankeboy36/vscode-arduino-api/releases/download/0.1.2/vscode-arduino-api-0.1.2.vsix",
|
"vscode-arduino-api": "https://github.com/dankeboy36/vscode-arduino-api/releases/download/0.1.2/vscode-arduino-api-0.1.2.vsix",
|
||||||
"vscode-arduino-tools": "https://downloads.arduino.cc/vscode-arduino-tools/vscode-arduino-tools-0.1.3.vsix",
|
"vscode-arduino-tools": "https://downloads.arduino.cc/vscode-arduino-tools/vscode-arduino-tools-0.1.3.vsix",
|
||||||
"vscode-builtin-json": "https://open-vsx.org/api/vscode/json/1.46.1/file/vscode.json-1.46.1.vsix",
|
"vscode-builtin-json": "https://open-vsx.org/api/vscode/json/1.88.1/file/vscode.json-1.88.1.vsix",
|
||||||
"vscode-builtin-json-language-features": "https://open-vsx.org/api/vscode/json-language-features/1.46.1/file/vscode.json-language-features-1.46.1.vsix",
|
"vscode-builtin-json-language-features": "https://open-vsx.org/api/vscode/json-language-features/1.88.1/file/vscode.json-language-features-1.88.1.vsix",
|
||||||
"cortex-debug": "https://downloads.arduino.cc/marus25.cortex-debug/marus25.cortex-debug-1.5.1.vsix",
|
"cortex-debug": "https://downloads.arduino.cc/marus25.cortex-debug/marus25.cortex-debug-1.5.1.vsix",
|
||||||
"vscode-language-pack-bg": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-bg/1.48.3/file/MS-CEINTL.vscode-language-pack-bg-1.48.3.vsix",
|
"vscode-language-pack-bg": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-bg/1.48.3/file/MS-CEINTL.vscode-language-pack-bg-1.48.3.vsix",
|
||||||
"vscode-language-pack-cs": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-cs/1.80.0/file/MS-CEINTL.vscode-language-pack-cs-1.80.0.vsix",
|
"vscode-language-pack-cs": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-cs/1.96.0/file/MS-CEINTL.vscode-language-pack-cs-1.96.0.vsix",
|
||||||
"vscode-language-pack-de": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-de/1.80.0/file/MS-CEINTL.vscode-language-pack-de-1.80.0.vsix",
|
"vscode-language-pack-de": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-de/1.96.0/file/MS-CEINTL.vscode-language-pack-de-1.96.0.vsix",
|
||||||
"vscode-language-pack-es": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-es/1.80.0/file/MS-CEINTL.vscode-language-pack-es-1.80.0.vsix",
|
"vscode-language-pack-es": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-es/1.96.0/file/MS-CEINTL.vscode-language-pack-es-1.96.0.vsix",
|
||||||
"vscode-language-pack-fr": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-fr/1.80.0/file/MS-CEINTL.vscode-language-pack-fr-1.80.0.vsix",
|
"vscode-language-pack-fr": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-fr/1.96.0/file/MS-CEINTL.vscode-language-pack-fr-1.96.0.vsix",
|
||||||
"vscode-language-pack-hu": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-hu/1.48.3/file/MS-CEINTL.vscode-language-pack-hu-1.48.3.vsix",
|
"vscode-language-pack-hu": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-hu/1.48.3/file/MS-CEINTL.vscode-language-pack-hu-1.48.3.vsix",
|
||||||
"vscode-language-pack-it": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-it/1.80.0/file/MS-CEINTL.vscode-language-pack-it-1.80.0.vsix",
|
"vscode-language-pack-it": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-it/1.96.0/file/MS-CEINTL.vscode-language-pack-it-1.96.0.vsix",
|
||||||
"vscode-language-pack-ja": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-ja/1.80.0/file/MS-CEINTL.vscode-language-pack-ja-1.80.0.vsix",
|
"vscode-language-pack-ja": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-ja/1.96.0/file/MS-CEINTL.vscode-language-pack-ja-1.96.0.vsix",
|
||||||
"vscode-language-pack-ko": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-ko/1.80.0/file/MS-CEINTL.vscode-language-pack-ko-1.80.0.vsix",
|
"vscode-language-pack-ko": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-ko/1.96.0/file/MS-CEINTL.vscode-language-pack-ko-1.96.0.vsix",
|
||||||
"vscode-language-pack-nl": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-nl/1.48.3/file/MS-CEINTL.vscode-language-pack-nl-1.48.3.vsix",
|
"vscode-language-pack-nl": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-nl/1.48.3/file/MS-CEINTL.vscode-language-pack-nl-1.48.3.vsix",
|
||||||
"vscode-language-pack-pl": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-pl/1.80.0/file/MS-CEINTL.vscode-language-pack-pl-1.80.0.vsix",
|
"vscode-language-pack-pl": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-pl/1.96.0/file/MS-CEINTL.vscode-language-pack-pl-1.96.0.vsix",
|
||||||
"vscode-language-pack-pt-BR": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-pt-BR/1.80.0/file/MS-CEINTL.vscode-language-pack-pt-BR-1.80.0.vsix",
|
"vscode-language-pack-pt-BR": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-pt-BR/1.96.0/file/MS-CEINTL.vscode-language-pack-pt-BR-1.96.0.vsix",
|
||||||
"vscode-language-pack-ru": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-ru/1.80.0/file/MS-CEINTL.vscode-language-pack-ru-1.80.0.vsix",
|
"vscode-language-pack-ru": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-ru/1.96.0/file/MS-CEINTL.vscode-language-pack-ru-1.96.0.vsix",
|
||||||
"vscode-language-pack-tr": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-tr/1.80.0/file/MS-CEINTL.vscode-language-pack-tr-1.80.0.vsix",
|
"vscode-language-pack-tr": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-tr/1.96.0/file/MS-CEINTL.vscode-language-pack-tr-1.96.0.vsix",
|
||||||
"vscode-language-pack-uk": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-uk/1.48.3/file/MS-CEINTL.vscode-language-pack-uk-1.48.3.vsix",
|
"vscode-language-pack-uk": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-uk/1.48.3/file/MS-CEINTL.vscode-language-pack-uk-1.48.3.vsix",
|
||||||
"vscode-language-pack-zh-hans": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-zh-hans/1.80.0/file/MS-CEINTL.vscode-language-pack-zh-hans-1.80.0.vsix",
|
"vscode-language-pack-zh-hans": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-zh-hans/1.96.0/file/MS-CEINTL.vscode-language-pack-zh-hans-1.96.0.vsix",
|
||||||
"vscode-language-pack-zh-hant": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-zh-hant/1.80.0/file/MS-CEINTL.vscode-language-pack-zh-hant-1.80.0.vsix"
|
"vscode-language-pack-zh-hant": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-zh-hant/1.96.0/file/MS-CEINTL.vscode-language-pack-zh-hant-1.96.0.vsix"
|
||||||
},
|
},
|
||||||
"mocha": {
|
"mocha": {
|
||||||
"reporter": "spec",
|
"reporter": "spec",
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user