diff --git a/.eslintrc.js b/.eslintrc.js index 6be699cf7..4bb67da9e 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,65 +1,66 @@ module.exports = { - parser: '@typescript-eslint/parser', // Specifies the ESLint parser - parserOptions: { - ecmaVersion: 2020, // Allows for the parsing of modern ECMAScript features - sourceType: 'module', // Allows for the use of imports - ecmaFeatures: { - jsx: true, // Allows for the parsing of JSX - }, + parser: '@typescript-eslint/parser', // Specifies the ESLint parser + parserOptions: { + ecmaVersion: 2020, // Allows for the parsing of modern ECMAScript features + sourceType: 'module', // Allows for the use of imports + ecmaFeatures: { + jsx: true, // Allows for the parsing of JSX }, - ignorePatterns: [ - 'node_modules/*', - '**/node_modules/*', - '.node_modules/*', - '.github/*', - '.browser_modules/*', - 'docs/*', - 'scripts/*', - 'electron/*', - 'electron-app/*', - 'browser-app/*', - 'plugins/*', - 'arduino-ide-extension/src/node/cli-protocol', - ], - settings: { - react: { - version: 'detect', // Tells eslint-plugin-react to automatically detect the version of React to use - }, + }, + ignorePatterns: [ + 'node_modules/*', + '**/node_modules/*', + '.github/*', + '.browser_modules/*', + 'docs/*', + 'scripts/*', + 'electron-app/lib/*', + 'electron-app/src-gen/*', + 'electron-app/gen-webpack*.js', + '!electron-app/webpack.config.js', + 'electron-app/plugins/*', + 'arduino-ide-extension/src/node/cli-protocol', + '**/lib/*', + ], + settings: { + react: { + version: 'detect', // Tells eslint-plugin-react to automatically detect the version of React to use }, - extends: [ - 'plugin:@typescript-eslint/recommended', // Uses the recommended rules from the @typescript-eslint/eslint-plugin - 'plugin:react/recommended', // Uses the recommended rules from @eslint-plugin-react - 'plugin:react-hooks/recommended', // Uses recommended rules from react hooks - 'plugin:prettier/recommended', - 'prettier', // Uses eslint-config-prettier to disable ESLint rules from @typescript-eslint/eslint-plugin that would conflict with prettier + }, + extends: [ + 'plugin:@typescript-eslint/recommended', // Uses the recommended rules from the @typescript-eslint/eslint-plugin + 'plugin:react/recommended', // Uses the recommended rules from @eslint-plugin-react + 'plugin:react-hooks/recommended', // Uses recommended rules from react hooks + 'plugin:prettier/recommended', + 'prettier', // Uses eslint-config-prettier to disable ESLint rules from @typescript-eslint/eslint-plugin that would conflict with prettier + ], + plugins: ['prettier', 'unused-imports'], + rules: { + '@typescript-eslint/no-unused-expressions': 'off', + '@typescript-eslint/no-namespace': 'off', + '@typescript-eslint/no-var-requires': 'off', + '@typescript-eslint/no-empty-function': 'warn', + '@typescript-eslint/no-empty-interface': 'warn', + 'no-unused-vars': 'off', + 'unused-imports/no-unused-imports': 'error', + 'unused-imports/no-unused-vars': [ + 'warn', + { + vars: 'all', + varsIgnorePattern: '^_', + args: 'after-used', + argsIgnorePattern: '^_', + }, ], - plugins: ['prettier', 'unused-imports'], - rules: { - '@typescript-eslint/no-unused-expressions': 'off', - '@typescript-eslint/no-namespace': 'off', - '@typescript-eslint/no-var-requires': 'off', - '@typescript-eslint/no-empty-function': 'warn', - '@typescript-eslint/no-empty-interface': 'warn', - 'no-unused-vars': 'off', - 'unused-imports/no-unused-imports': 'error', - 'unused-imports/no-unused-vars': [ - 'warn', - { - vars: 'all', - varsIgnorePattern: '^_', - args: 'after-used', - argsIgnorePattern: '^_', - }, - ], - 'react/display-name': 'warn', - eqeqeq: ['error', 'smart'], - 'guard-for-in': 'off', - 'id-blacklist': 'off', - 'id-match': 'off', - 'no-underscore-dangle': 'off', - 'no-unused-expressions': 'off', - 'no-var': 'error', - radix: 'error', - 'prettier/prettier': 'warn', - }, + 'react/display-name': 'warn', + eqeqeq: ['error', 'smart'], + 'guard-for-in': 'off', + 'id-blacklist': 'off', + 'id-match': 'off', + 'no-underscore-dangle': 'off', + 'no-unused-expressions': 'off', + 'no-var': 'error', + radix: 'error', + 'prettier/prettier': 'warn', + }, }; diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml index a493028d0..4e647d8da 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.yml +++ b/.github/ISSUE_TEMPLATE/bug-report.yml @@ -1,7 +1,7 @@ name: Bug report description: Report a problem with the code or documentation in this repository. labels: - - "type: imperfection" + - 'type: imperfection' body: - type: textarea id: description @@ -30,7 +30,7 @@ body: description: | Which version of the Arduino IDE are you using? See **Help > About Arduino IDE** in the Arduino IDE menus (**Arduino IDE > About Arduino IDE** on macOS). - This should be the latest [nightly build](https://github.com/arduino/arduino-ide#nightly-builds). + This should be the latest [nightly build](https://www.arduino.cc/en/software#nightly-builds). validations: required: true - type: dropdown @@ -68,7 +68,7 @@ body: options: - label: I searched for previous reports in [the issue tracker](https://github.com/arduino/arduino-ide/issues?q=) required: true - - label: I verified the problem still occurs when using the latest [nightly build](https://github.com/arduino/arduino-ide#nightly-builds) + - label: I verified the problem still occurs when using the latest [nightly build](https://www.arduino.cc/en/software#nightly-builds) required: true - label: My report contains all necessary details required: true diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 00769ec0d..7c038ddf4 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -8,6 +8,12 @@ contact_links: - name: Support request url: https://forum.arduino.cc/ about: We can help you out on the Arduino Forum! + - name: Issue report guide + url: https://github.com/arduino/arduino-ide/blob/main/docs/contributor-guide/issues.md#issue-report-guide + about: Learn about submitting issue reports to this repository. + - name: Contributor guide + url: https://github.com/arduino/arduino-ide/blob/main/docs/CONTRIBUTING.md#contributor-guide + about: Learn about contributing to this project. - name: Discuss development work on the project url: https://groups.google.com/a/arduino.cc/g/developers about: Arduino Developers Mailing List diff --git a/.github/ISSUE_TEMPLATE/feature-request.yml b/.github/ISSUE_TEMPLATE/feature-request.yml index cdc54c3b6..955315a05 100644 --- a/.github/ISSUE_TEMPLATE/feature-request.yml +++ b/.github/ISSUE_TEMPLATE/feature-request.yml @@ -1,7 +1,7 @@ name: Feature request description: Suggest an enhancement to this project. labels: - - "type: enhancement" + - 'type: enhancement' body: - type: textarea id: description @@ -25,7 +25,7 @@ body: description: | Which version of the Arduino IDE are you using? See **Help > About Arduino IDE** in the Arduino IDE menus (**Arduino IDE > About Arduino IDE** on macOS). - This should be the latest [nightly build](https://github.com/arduino/arduino-ide#nightly-builds). + This should be the latest [nightly build](https://www.arduino.cc/en/software#nightly-builds). validations: required: true - type: dropdown @@ -63,7 +63,7 @@ body: options: - label: I searched for previous requests in [the issue tracker](https://github.com/arduino/arduino-ide/issues?q=) required: true - - label: I verified the feature was still missing when using the latest [nightly build](https://github.com/arduino/arduino-ide#nightly-builds) + - label: I verified the feature was still missing when using the latest [nightly build](https://www.arduino.cc/en/software#nightly-builds) required: true - label: My request contains all necessary details required: true diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 43749222b..b9e9f9102 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,15 +1,18 @@ ### Motivation + ### Change description + ### Other information + ### Reviewer checklist -* [ ] PR addresses a single concern. -* [ ] The PR has no duplicates (please search among the [Pull Requests](https://github.com/arduino/arduino-ide/pulls) before creating one) -* [ ] PR title and description are properly filled. -* [ ] Docs have been added / updated (for bug fixes / features) \ No newline at end of file +- [ ] PR addresses a single concern. +- [ ] The PR has no duplicates (please search among the [Pull Requests](https://github.com/arduino/arduino-ide/pulls) before creating one) +- [ ] PR title and description are properly filled. +- [ ] Docs have been added / updated (for bug fixes / features) diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 000000000..06f3449ea --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,15 @@ +# See: https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file#about-the-dependabotyml-file +version: 2 + +updates: + # Configure check for outdated GitHub Actions actions in workflows. + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/dependabot/README.md + # See: https://docs.github.com/code-security/dependabot/working-with-dependabot/keeping-your-actions-up-to-date-with-dependabot + - package-ecosystem: github-actions + directory: / # Check the repository's workflows under /.github/workflows/ + assignees: + - per1234 + schedule: + interval: daily + labels: + - 'topic: infrastructure' diff --git a/.github/label-configuration-files/labels.yml b/.github/label-configuration-files/labels.yml index a938431b2..3b3e27853 100644 --- a/.github/label-configuration-files/labels.yml +++ b/.github/label-configuration-files/labels.yml @@ -1,24 +1,27 @@ # Used by the "Sync Labels" workflow # See: https://github.com/Financial-Times/github-label-sync#label-config-file -- name: "topic: accessibility" - color: "00ffff" +- name: 'topic: accessibility' + color: '00ffff' description: Enabling the use of the software by everyone -- name: "topic: CLI" - color: "00ffff" +- name: 'topic: CLI' + color: '00ffff' description: Related to Arduino CLI -- name: "topic: debugger" - color: "00ffff" +- name: 'topic: cloud' + color: '00ffff' + description: Related to Arduino Cloud and cloud sketches +- name: 'topic: debugger' + color: '00ffff' description: Related to the integrated debugger -- name: "topic: language server" - color: "00ffff" +- name: 'topic: language server' + color: '00ffff' description: Related to the Arduino Language Server -- name: "topic: serial monitor" - color: "00ffff" +- name: 'topic: serial monitor' + color: '00ffff' description: Related to the Serial Monitor -- name: "topic: theia" - color: "00ffff" +- name: 'topic: theia' + color: '00ffff' description: Related to the Theia IDE framework -- name: "topic: theme" - color: "00ffff" +- name: 'topic: theme' + color: '00ffff' description: Related to GUI theming diff --git a/.github/tools/fetch_athena_stats.py b/.github/tools/fetch_athena_stats.py deleted file mode 100644 index 1f3140359..000000000 --- a/.github/tools/fetch_athena_stats.py +++ /dev/null @@ -1,131 +0,0 @@ -import boto3 -import semver -import os -import logging -import uuid -import time - - -# logging.basicConfig(stream=sys.stdout, level=logging.DEBUG) -log = logging.getLogger() -logging.getLogger("boto3").setLevel(logging.CRITICAL) -logging.getLogger("botocore").setLevel(logging.CRITICAL) -logging.getLogger("urllib3").setLevel(logging.CRITICAL) - - -def execute(client, statement, dest_s3_output_location): - log.info("execute query: {} dumping in {}".format(statement, dest_s3_output_location)) - result = client.start_query_execution( - QueryString=statement, - ClientRequestToken=str(uuid.uuid4()), - ResultConfiguration={ - "OutputLocation": dest_s3_output_location, - }, - ) - execution_id = result["QueryExecutionId"] - log.info("wait for query {} completion".format(execution_id)) - wait_for_query_execution_completion(client, execution_id) - log.info("operation successful") - return execution_id - - -def wait_for_query_execution_completion(client, query_execution_id): - query_ended = False - while not query_ended: - query_execution = client.get_query_execution(QueryExecutionId=query_execution_id) - state = query_execution["QueryExecution"]["Status"]["State"] - if state == "SUCCEEDED": - query_ended = True - elif state in ["FAILED", "CANCELLED"]: - raise BaseException( - "query failed or canceled: {}".format(query_execution["QueryExecution"]["Status"]["StateChangeReason"]) - ) - else: - time.sleep(1) - - -def valid(key): - split = key.split("_") - if len(split) < 1: - return False - try: - semver.parse(split[0]) - except ValueError: - return False - return True - - -def get_results(client, execution_id): - results_paginator = client.get_paginator("get_query_results") - results_iter = results_paginator.paginate(QueryExecutionId=execution_id, PaginationConfig={"PageSize": 1000}) - res = {} - for results_page in results_iter: - for row in results_page["ResultSet"]["Rows"][1:]: - # Loop through the JSON objects - key = row["Data"][0]["VarCharValue"] - if valid(key): - res[key] = row["Data"][1]["VarCharValue"] - - return res - - -def convert_data(data): - result = [] - for key, value in data.items(): - # 0.18.0_macOS_64bit.tar.gz - split_key = key.split("_") - if len(split_key) != 3: - continue - (version, os_version, arch) = split_key - arch_split = arch.split(".") - if len(arch_split) < 1: - continue - arch = arch_split[0] - if len(arch) > 10: - # This can't be an architecture really. - # It's an ugly solution but works for now so deal with it. - continue - repo = os.environ["GITHUB_REPOSITORY"].split("/")[1] - result.append( - { - "type": "gauge", - "name": "arduino.downloads.total", - "value": value, - "host": os.environ["GITHUB_REPOSITORY"], - "tags": [ - f"version:{version}", - f"os:{os_version}", - f"arch:{arch}", - "cdn:downloads.arduino.cc", - f"project:{repo}", - ], - } - ) - - return result - - -if __name__ == "__main__": - DEST_S3_OUTPUT = os.environ["AWS_ATHENA_OUTPUT_LOCATION"] - AWS_ATHENA_SOURCE_TABLE = os.environ["AWS_ATHENA_SOURCE_TABLE"] - - session = boto3.session.Session(region_name="us-east-1") - athena_client = session.client("athena") - - # Load all partitions before querying downloads - execute(athena_client, f"MSCK REPAIR TABLE {AWS_ATHENA_SOURCE_TABLE};", DEST_S3_OUTPUT) - - query = f"""SELECT replace(json_extract_scalar(url_decode(url_decode(querystring)), -'$.data.url'), 'https://downloads.arduino.cc/arduino-ide/arduino-ide_', '') -AS flavor, count(json_extract(url_decode(url_decode(querystring)),'$')) AS gauge -FROM {AWS_ATHENA_SOURCE_TABLE} -WHERE json_extract_scalar(url_decode(url_decode(querystring)),'$.data.url') -LIKE 'https://downloads.arduino.cc/arduino-ide/arduino-ide_%' -AND json_extract_scalar(url_decode(url_decode(querystring)),'$.data.url') -NOT LIKE '%latest%' -- exclude latest redirect -group by 1 ;""" - exec_id = execute(athena_client, query, DEST_S3_OUTPUT) - results = get_results(athena_client, exec_id) - result_json = convert_data(results) - - print(f"::set-output name=result::{result_json}") diff --git a/.github/workflows/arduino-stats.yaml b/.github/workflows/arduino-stats.yaml deleted file mode 100644 index 167ab57a2..000000000 --- a/.github/workflows/arduino-stats.yaml +++ /dev/null @@ -1,57 +0,0 @@ -name: arduino-stats - -on: - schedule: - # run every day at 07:00 AM, 03:00 PM and 11:00 PM - - cron: "0 7,15,23 * * *" - workflow_dispatch: - repository_dispatch: - -jobs: - push-stats: - # This workflow is only of value to the arduino/arduino-ide repository and - # would always fail in forks - if: github.repository == 'arduino/arduino-ide' - runs-on: ubuntu-latest - - steps: - - name: Checkout - uses: actions/checkout@v2 - - - uses: actions/setup-python@v2 - with: - python-version: '3.x' - - - name: Fetch downloads count form Arduino CDN using AWS Athena - id: fetch - env: - AWS_ACCESS_KEY_ID: ${{ secrets.STATS_AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.STATS_AWS_SECRET_ACCESS_KEY }} - AWS_ATHENA_SOURCE_TABLE: ${{ secrets.STATS_AWS_ATHENA_SOURCE_TABLE }} - AWS_ATHENA_OUTPUT_LOCATION: ${{ secrets.STATS_AWS_ATHENA_OUTPUT_LOCATION }} - GITHUB_REPOSITORY: ${{ github.repository }} - run: | - pip install boto3 semver - python .github/tools/fetch_athena_stats.py - - - name: Send metrics - uses: masci/datadog@v1 - with: - api-key: ${{ secrets.DD_API_KEY }} - # Metrics input expects YAML but JSON will work just right. - metrics: ${{steps.fetch.outputs.result}} - - - name: Report failure - if: failure() - uses: masci/datadog@v1 - with: - api-key: ${{ secrets.DD_API_KEY }} - events: | - - title: "Arduino IDE stats failing" - text: "Stats collection failed" - alert_type: "error" - host: ${{ github.repository }} - tags: - - "project:arduino-ide" - - "cdn:downloads.arduino.cc" - - "workflow:${{ github.workflow }}" diff --git a/.github/workflows/assets/linux.Dockerfile b/.github/workflows/assets/linux.Dockerfile new file mode 100644 index 000000000..9124f0365 --- /dev/null +++ b/.github/workflows/assets/linux.Dockerfile @@ -0,0 +1,63 @@ +# The Arduino IDE Linux build workflow job runs in this container. +# syntax=docker/dockerfile:1 + +# See: https://hub.docker.com/_/ubuntu/tags +FROM ubuntu:18.10 + +# This is required in order to use the Ubuntu package repositories for EOL Ubuntu versions: +# https://help.ubuntu.com/community/EOLUpgrades#Update_sources.list +RUN \ + sed \ + --in-place \ + --regexp-extended \ + --expression='s/([a-z]{2}\.)?archive.ubuntu.com|security.ubuntu.com/old-releases.ubuntu.com/g' \ + "/etc/apt/sources.list" + +RUN \ + apt-get \ + --yes \ + update + +RUN \ + apt-get \ + --yes \ + install \ + "git" + +# The repository path must be added to safe.directory, otherwise any Git operations on it would fail with a +# "dubious ownership" error. actions/checkout configures this, but it is not applied to containers. +RUN \ + git config \ + --add \ + --global \ + "safe.directory" "/__w/arduino-ide/arduino-ide" +ENV \ + GIT_CONFIG_GLOBAL="/root/.gitconfig" + +# Install Python +# The Python installed by actions/setup-python has dependency on a higher version of glibc than available in the +# container. +RUN \ + apt-get \ + --yes \ + install \ + "python3.7-minimal=3.7.3-2~18.10" + +# Install Theia's package dependencies +# These are pre-installed in the GitHub Actions hosted runner machines. +RUN \ + apt-get \ + --yes \ + install \ + "libsecret-1-dev=0.18.6-3" \ + "libx11-dev=2:1.6.7-1" \ + "libxkbfile-dev=1:1.0.9-2" + +# Target python3 symlink to Python 3.7 installation. It would otherwise target version 3.6 due to the installation of +# the `python3` package as a transitive dependency. +RUN \ + ln \ + --symbolic \ + --force \ + "$(which python3.7)" \ + "/usr/bin/python3" diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e88645443..8d8fb2557 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,20 +1,28 @@ name: Arduino IDE on: + create: push: branches: - main + - '[0-9]+.[0-9]+.x' paths-ignore: - '.github/**' - '!.github/workflows/build.yml' - '.vscode/**' - 'docs/**' - 'scripts/**' + - '!scripts/merge-channel-files.js' - 'static/**' - '*.md' tags: - '[0-9]+.[0-9]+.[0-9]+*' workflow_dispatch: + inputs: + paid-runners: + description: Include builds on non-free runners + type: boolean + default: false pull_request: paths-ignore: - '.github/**' @@ -22,150 +30,517 @@ on: - '.vscode/**' - 'docs/**' - 'scripts/**' + - '!scripts/merge-channel-files.js' - 'static/**' - '*.md' schedule: - cron: '0 3 * * *' # run every day at 3AM (https://docs.github.com/en/actions/reference/events-that-trigger-workflows#scheduled-events-schedule) + workflow_run: + workflows: + - Push Container Images + branches: + - main + types: + - completed env: # See vars.GO_VERSION field of https://github.com/arduino/arduino-cli/blob/master/DistTasks.yml - GO_VERSION: "1.17" - JOB_TRANSFER_ARTIFACT: build-artifacts + GO_VERSION: '1.21' + # See: https://github.com/actions/setup-node/#readme + NODE_VERSION: '18.17' + YARN_VERSION: '1.22' + JOB_TRANSFER_ARTIFACT_PREFIX: build-artifacts- CHANGELOG_ARTIFACTS: changelog + STAGED_CHANNEL_FILE_ARTIFACT_PREFIX: staged-channel-file- + BASE_BUILD_DATA: | + - config: + # Human identifier for the job. + name: Windows + runs-on: [self-hosted, windows-sign-pc] + # The value is a string representing a JSON document. + # Setting this to null causes the job to run directly in the runner machine instead of in a container. + container: | + null + # Name of the secret that contains the certificate. + certificate-secret: INSTALLER_CERT_WINDOWS_CER + # Name of the secret that contains the certificate password. + certificate-password-secret: INSTALLER_CERT_WINDOWS_PASSWORD + # File extension for the certificate. + certificate-extension: pfx + # Container for windows cert signing + certificate-container: INSTALLER_CERT_WINDOWS_CONTAINER + # Arbitrary identifier used to give the workflow artifact uploaded by each "build" matrix job a unique name. + job-transfer-artifact-suffix: Windows_64bit + # Quoting on the value is required here to allow the same comparison expression syntax to be used for this + # and the companion needs.select-targets.outputs.merge-channel-files property (output values always have string + # type). + mergeable-channel-file: 'false' + # as this runs on a self hosted runner, we need to avoid building with the default working directory path, + # otherwise paths in the build job will be too long for `light.exe` + # we use the below as a Symbolic link (just changing the wd will break the checkout action) + # this is a work around (see: https://github.com/actions/checkout/issues/197). + working-directory: 'C:\a' + artifacts: + - path: '*Windows_64bit.exe' + name: Windows_X86-64_interactive_installer + - path: '*Windows_64bit.msi' + name: Windows_X86-64_MSI + - path: '*Windows_64bit.zip' + name: Windows_X86-64_zip + - config: + name: Linux + runs-on: ubuntu-latest + container: | + { + \"image\": \"ghcr.io/arduino/arduino-ide/linux:main\" + } + job-transfer-artifact-suffix: Linux_64bit + mergeable-channel-file: 'false' + artifacts: + - path: '*Linux_64bit.zip' + name: Linux_X86-64_zip + - path: '*Linux_64bit.AppImage' + name: Linux_X86-64_app_image + - config: + name: macOS x86 + runs-on: macos-13 + container: | + null + # APPLE_SIGNING_CERTIFICATE_P12 secret was produced by following the procedure from: + # https://www.kencochrane.com/2020/08/01/build-and-sign-golang-binaries-for-macos-with-github-actions/#exporting-the-developer-certificate + certificate-secret: APPLE_SIGNING_CERTIFICATE_P12 + certificate-password-secret: KEYCHAIN_PASSWORD + certificate-extension: p12 + job-transfer-artifact-suffix: macOS_64bit + mergeable-channel-file: 'true' + artifacts: + - path: '*macOS_64bit.dmg' + name: macOS_X86-64_dmg + - path: '*macOS_64bit.zip' + name: macOS_X86-64_zip + - config: + name: macOS ARM + runs-on: macos-latest + container: | + null + certificate-secret: APPLE_SIGNING_CERTIFICATE_P12 + certificate-password-secret: KEYCHAIN_PASSWORD + certificate-extension: p12 + job-transfer-artifact-suffix: macOS_arm64 + mergeable-channel-file: 'true' + artifacts: + - path: '*macOS_arm64.dmg' + name: macOS_arm64_dmg + - path: '*macOS_arm64.zip' + name: macOS_arm64_zip + PAID_RUNNER_BUILD_DATA: | + # This system was implemented to allow selective use of paid GitHub-hosted runners, due to the Apple Silicon runner + # incurring a charge at that time. Free Apple Silicon runners are now available so the configuration was moved to + # `BASE_BUILD_DATA`, but the system was left in place for future use. jobs: + run-determination: + runs-on: ubuntu-latest + outputs: + result: ${{ steps.determination.outputs.result }} + permissions: {} + steps: + - name: Determine if the rest of the workflow should run + id: determination + run: | + RELEASE_BRANCH_REGEX="refs/heads/[0-9]+.[0-9]+.x" + # The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead. + if [[ + "${{ github.event_name }}" != "create" || + "${{ github.ref }}" =~ $RELEASE_BRANCH_REGEX + ]]; then + # Run the other jobs. + RESULT="true" + else + # There is no need to run the other jobs. + RESULT="false" + fi + + echo "result=$RESULT" >> $GITHUB_OUTPUT + + build-type-determination: + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + runs-on: ubuntu-latest + outputs: + is-release: ${{ steps.determination.outputs.is-release }} + is-nightly: ${{ steps.determination.outputs.is-nightly }} + channel-name: ${{ steps.determination.outputs.channel-name }} + publish-to-s3: ${{ steps.determination.outputs.publish-to-s3 }} + environment: production + permissions: {} + steps: + - name: Determine the type of build + id: determination + run: | + if [[ + "${{ startsWith(github.ref, 'refs/tags/') }}" == "true" + ]]; then + is_release="true" + is_nightly="false" + channel_name="stable" + elif [[ + "${{ github.event_name }}" == "schedule" || + ( + "${{ github.event_name }}" == "workflow_dispatch" && + "${{ github.ref }}" == "refs/heads/main" + ) + ]]; then + is_release="false" + is_nightly="true" + channel_name="nightly" + else + is_release="false" + is_nightly="false" + channel_name="nightly" + fi + + echo "is-release=$is_release" >> $GITHUB_OUTPUT + echo "is-nightly=$is_nightly" >> $GITHUB_OUTPUT + echo "channel-name=$channel_name" >> $GITHUB_OUTPUT + # Only attempt upload to Amazon S3 if the credentials are available. + echo "publish-to-s3=${{ secrets.AWS_ROLE_ARN != '' }}" >> $GITHUB_OUTPUT + + select-targets: + needs: build-type-determination + runs-on: ubuntu-latest + outputs: + artifact-matrix: ${{ steps.assemble.outputs.artifact-matrix }} + build-matrix: ${{ steps.assemble.outputs.build-matrix }} + merge-channel-files: ${{ steps.assemble.outputs.merge-channel-files }} + permissions: {} + steps: + - name: Assemble target data + id: assemble + run: | + # Only run the builds that incur runner charges on release or select manually triggered runs. + if [[ + "${{ needs.build-type-determination.outputs.is-release }}" == "true" || + "${{ github.event.inputs.paid-runners }}" == "true" + ]]; then + build_matrix="$( + ( + echo "${{ env.BASE_BUILD_DATA }}"; + echo "${{ env.PAID_RUNNER_BUILD_DATA }}" + ) | \ + yq \ + --output-format json \ + '[.[].config]' + )" + + artifact_matrix="$( + ( + echo "${{ env.BASE_BUILD_DATA }}"; + echo "${{ env.PAID_RUNNER_BUILD_DATA }}" + ) | \ + yq \ + --output-format json \ + 'map(.artifacts[] + (.config | pick(["job-transfer-artifact-suffix"])))' + )" + + # The build matrix produces two macOS jobs (x86 and ARM) so the "channel update info files" + # generated by each must be merged. + merge_channel_files="true" + + else + build_matrix="$( + echo "${{ env.BASE_BUILD_DATA }}" | \ + yq \ + --output-format json \ + '[.[].config]' + )" + + artifact_matrix="$( + echo "${{ env.BASE_BUILD_DATA }}" | \ + yq \ + --output-format json \ + 'map(.artifacts[] + (.config | pick(["job-transfer-artifact-suffix"])))' + )" + + merge_channel_files="false" + fi + + # Set workflow step outputs. + # See: https://docs.github.com/actions/using-workflows/workflow-commands-for-github-actions#multiline-strings + delimiter="$RANDOM" + echo "build-matrix<<$delimiter" >> $GITHUB_OUTPUT + echo "$build_matrix" >> $GITHUB_OUTPUT + echo "$delimiter" >> $GITHUB_OUTPUT + + delimiter="$RANDOM" + echo "artifact-matrix<<$delimiter" >> $GITHUB_OUTPUT + echo "$artifact_matrix" >> $GITHUB_OUTPUT + echo "$delimiter" >> $GITHUB_OUTPUT + + echo "merge-channel-files=$merge_channel_files" >> $GITHUB_OUTPUT + build: - name: build (${{ matrix.config.os }}) + name: build (${{ matrix.config.name }}) + needs: + - build-type-determination + - select-targets + env: + # Location of artifacts generated by build. + BUILD_ARTIFACTS_PATH: electron-app/dist/build-artifacts + # to skip passing signing credentials to electron-builder + IS_WINDOWS_CONFIG: ${{ matrix.config.name == 'Windows' }} + INSTALLER_CERT_WINDOWS_CER: "/tmp/cert.cer" + # We are hardcoding the path for signtool because is not present on the windows PATH env var by default. + # Keep in mind that this path could change when upgrading to a new runner version + 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_CONTAINER_NAME: ${{ secrets[matrix.config.certificate-container] }} + PUPPETEER_SKIP_DOWNLOAD: true + strategy: matrix: - config: - - os: windows-2019 - certificate-secret: WINDOWS_SIGNING_CERTIFICATE_PFX # Name of the secret that contains the certificate. - certificate-password-secret: WINDOWS_SIGNING_CERTIFICATE_PASSWORD # Name of the secret that contains the certificate password. - certificate-extension: pfx # File extension for the certificate. - - os: ubuntu-18.04 # https://github.com/arduino/arduino-ide/issues/259 - - os: macos-latest - # APPLE_SIGNING_CERTIFICATE_P12 secret was produced by following the procedure from: - # https://www.kencochrane.com/2020/08/01/build-and-sign-golang-binaries-for-macos-with-github-actions/#exporting-the-developer-certificate - certificate-secret: APPLE_SIGNING_CERTIFICATE_P12 - certificate-password-secret: KEYCHAIN_PASSWORD - certificate-extension: p12 - runs-on: ${{ matrix.config.os }} + config: ${{ fromJson(needs.select-targets.outputs.build-matrix) }} + runs-on: ${{ matrix.config.runs-on }} + container: ${{ fromJSON(matrix.config.container) }} + defaults: + run: + # Avoid problems caused by different default shell for container jobs (sh) vs non-container jobs (bash). + shell: bash + timeout-minutes: 90 steps: + - name: Symlink custom working directory + shell: cmd + if: runner.os == 'Windows' && matrix.config.working-directory + run: | + if not exist "${{ matrix.config.working-directory }}" mklink /d "${{ matrix.config.working-directory }}" "C:\actions-runner\_work\arduino-ide\arduino-ide" + - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v4 + - - name: Install Node.js 14.x - uses: actions/setup-node@v1 + - name: Install Node.js + if: runner.name != 'WINDOWS-SIGN-PC' + uses: actions/setup-node@v4 with: - node-version: '14.x' + node-version: ${{ env.NODE_VERSION }} registry-url: 'https://registry.npmjs.org' + # Yarn is a prerequisite for the action's cache feature, so caching should be disabled when running in the + # container where Yarn is not pre-installed. + cache: ${{ fromJSON(matrix.config.container) == null && 'yarn' || null }} + + - name: Install Yarn + if: runner.name != 'WINDOWS-SIGN-PC' + run: | + npm \ + install \ + --global \ + "yarn@${{ env.YARN_VERSION }}" - name: Install Python 3.x - uses: actions/setup-python@v2 + if: fromJSON(matrix.config.container) == null && runner.name != 'WINDOWS-SIGN-PC' + uses: actions/setup-python@v5 with: - python-version: '3.x' + python-version: '3.11.x' - name: Install Go - uses: actions/setup-go@v3 + if: runner.name != 'WINDOWS-SIGN-PC' + uses: actions/setup-go@v5 with: go-version: ${{ env.GO_VERSION }} - name: Install Taskfile - uses: arduino/setup-task@v1 + if: runner.name != 'WINDOWS-SIGN-PC' + uses: arduino/setup-task@v2 with: repo-token: ${{ secrets.GITHUB_TOKEN }} version: 3.x - name: Package - shell: bash env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} AC_USERNAME: ${{ secrets.AC_USERNAME }} AC_PASSWORD: ${{ secrets.AC_PASSWORD }} 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: ${{ github.event_name == 'schedule' || (github.event_name == 'workflow_dispatch' && github.ref == 'refs/heads/main') }} - IS_RELEASE: ${{ startsWith(github.ref, 'refs/tags/') }} + IS_NIGHTLY: ${{ needs.build-type-determination.outputs.is-nightly }} + IS_RELEASE: ${{ needs.build-type-determination.outputs.is-release }} CAN_SIGN: ${{ secrets[matrix.config.certificate-secret] != '' }} + working-directory: ${{ matrix.config.working-directory || './' }} run: | # See: https://www.electron.build/code-signing - if [ $CAN_SIGN = false ]; then + if [ $CAN_SIGN = false ] || [ $IS_WINDOWS_CONFIG = true ]; then echo "Skipping the app signing: certificate not provided." else export CSC_LINK="${{ runner.temp }}/signing_certificate.${{ matrix.config.certificate-extension }}" echo "${{ secrets[matrix.config.certificate-secret] }}" | base64 --decode > "$CSC_LINK" export CSC_KEY_PASSWORD="${{ secrets[matrix.config.certificate-password-secret] }}" + export CSC_FOR_PULL_REQUEST=true fi - if [ "${{ runner.OS }}" = "Windows" ]; then - npm config set msvs_version 2017 --global - fi npx node-gyp install - yarn --cwd ./electron/packager/ - yarn --cwd ./electron/packager/ package + yarn install + + yarn --cwd arduino-ide-extension build + yarn --cwd electron-app rebuild + yarn --cwd electron-app build + yarn --cwd electron-app package + + # Both macOS jobs generate a "channel update info file" with same path and name. The second job to complete would + # overwrite the file generated by the first in the workflow artifact. + - name: Stage channel file for merge + if: > + needs.select-targets.outputs.merge-channel-files == 'true' && + matrix.config.mergeable-channel-file == 'true' + working-directory: ${{ matrix.config.working-directory || './' }} + run: | + staged_channel_files_path="${{ runner.temp }}/staged-channel-files" + mkdir "$staged_channel_files_path" + mv \ + "${{ env.BUILD_ARTIFACTS_PATH }}/${{ needs.build-type-determination.outputs.channel-name }}-mac.yml" \ + "${staged_channel_files_path}/${{ needs.build-type-determination.outputs.channel-name }}-mac-${{ runner.arch }}.yml" + + # Set workflow environment variable for use in other steps. + # See: https://docs.github.com/actions/using-workflows/workflow-commands-for-github-actions#setting-an-environment-variable + echo "STAGED_CHANNEL_FILES_PATH=$staged_channel_files_path" >> "$GITHUB_ENV" - - name: Upload [GitHub Actions] - uses: actions/upload-artifact@v2 + - name: Upload staged-for-merge channel file artifact + uses: actions/upload-artifact@v4 + if: > + needs.select-targets.outputs.merge-channel-files == 'true' && + matrix.config.mergeable-channel-file == 'true' with: - name: ${{ env.JOB_TRANSFER_ARTIFACT }} - path: electron/build/dist/build-artifacts/ + if-no-files-found: error + name: ${{ env.STAGED_CHANNEL_FILE_ARTIFACT_PREFIX }}${{ matrix.config.job-transfer-artifact-suffix }} + path: ${{ matrix.config.working-directory && format('{0}/{1}', matrix.config.working-directory, env.STAGED_CHANNEL_FILES_PATH) || env.STAGED_CHANNEL_FILES_PATH }} + + - name: Upload builds to job transfer artifact + uses: actions/upload-artifact@v4 + with: + name: ${{ env.JOB_TRANSFER_ARTIFACT_PREFIX }}${{ matrix.config.job-transfer-artifact-suffix }} + path: ${{ matrix.config.working-directory && format('{0}/{1}', matrix.config.working-directory, env.BUILD_ARTIFACTS_PATH) || env.BUILD_ARTIFACTS_PATH }} + + - name: Manual Clean up for self-hosted runners + if: runner.os == 'Windows' && matrix.config.working-directory + shell: cmd + run: | + rmdir /s /q "${{ matrix.config.working-directory }}\${{ env.BUILD_ARTIFACTS_PATH }}" + + merge-channel-files: + needs: + - build-type-determination + - select-targets + - build + if: needs.select-targets.outputs.merge-channel-files == 'true' + runs-on: ubuntu-latest + permissions: {} + steps: + - name: Set environment variables + run: | + # See: https://docs.github.com/actions/using-workflows/workflow-commands-for-github-actions#setting-an-environment-variable + echo "CHANNEL_FILES_PATH=${{ runner.temp }}/channel-files" >> "$GITHUB_ENV" + + - name: Checkout + uses: actions/checkout@v4 + + - name: Download staged-for-merge channel file artifacts + uses: actions/download-artifact@v4 + with: + merge-multiple: true + path: ${{ env.CHANNEL_FILES_PATH }} + pattern: ${{ env.STAGED_CHANNEL_FILE_ARTIFACT_PREFIX }}* + + - name: Remove no longer needed artifacts + uses: geekyeggo/delete-artifact@v5 + with: + name: ${{ env.STAGED_CHANNEL_FILE_ARTIFACT_PREFIX }}* + + - name: Install Node.js + uses: actions/setup-node@v4 + with: + node-version: ${{ env.NODE_VERSION }} + registry-url: 'https://registry.npmjs.org' + cache: 'yarn' + + - name: Install Go + uses: actions/setup-go@v5 + with: + go-version: ${{ env.GO_VERSION }} + + - name: Install Task + uses: arduino/setup-task@v2 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + 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 + run: yarn + + - name: Merge "channel update info files" + run: | + node \ + ./scripts/merge-channel-files.js \ + --channel "${{ needs.build-type-determination.outputs.channel-name }}" \ + --input "${{ env.CHANNEL_FILES_PATH }}" + + - name: Upload merged channel files job transfer artifact + uses: actions/upload-artifact@v4 + with: + if-no-files-found: error + name: ${{ env.JOB_TRANSFER_ARTIFACT_PREFIX }}channel-files + path: ${{ env.CHANNEL_FILES_PATH }} artifacts: name: ${{ matrix.artifact.name }} artifact - needs: build + needs: + - select-targets + - build if: always() && needs.build.result != 'skipped' runs-on: ubuntu-latest + env: + BUILD_ARTIFACTS_FOLDER: build-artifacts + strategy: matrix: - artifact: - - path: '*Linux_64bit.zip' - name: Linux_X86-64_zip - - path: '*Linux_64bit.AppImage' - name: Linux_X86-64_app_image - - path: '*macOS_64bit.dmg' - name: macOS_dmg - - path: '*macOS_64bit.zip' - name: macOS_zip - - path: '*Windows_64bit.exe' - name: Windows_X86-64_interactive_installer - - path: '*Windows_64bit.msi' - name: Windows_X86-64_MSI - - path: '*Windows_64bit.zip' - name: Windows_X86-64_zip + artifact: ${{ fromJson(needs.select-targets.outputs.artifact-matrix) }} steps: - - name: Download job transfer artifact - uses: actions/download-artifact@v2 + - name: Download job transfer artifact that contains ${{ matrix.artifact.name }} tester build + uses: actions/download-artifact@v4 with: - name: ${{ env.JOB_TRANSFER_ARTIFACT }} - path: ${{ env.JOB_TRANSFER_ARTIFACT }} + name: ${{ env.JOB_TRANSFER_ARTIFACT_PREFIX }}${{ matrix.artifact.job-transfer-artifact-suffix }} + path: ${{ env.BUILD_ARTIFACTS_FOLDER }} - name: Upload tester build artifact - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: ${{ matrix.artifact.name }} - path: ${{ env.JOB_TRANSFER_ARTIFACT }}/${{ matrix.artifact.path }} + path: ${{ env.BUILD_ARTIFACTS_FOLDER }}/${{ matrix.artifact.path }} changelog: - needs: build + needs: + - build-type-determination + - build runs-on: ubuntu-latest outputs: BODY: ${{ steps.changelog.outputs.BODY }} steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v4 with: fetch-depth: 0 # To fetch all history for all branches and tags. - name: Generate Changelog id: changelog env: - IS_RELEASE: ${{ startsWith(github.ref, 'refs/tags/') }} + IS_RELEASE: ${{ needs.build-type-determination.outputs.is-release }} run: | export LATEST_TAG=$(git describe --abbrev=0) export GIT_LOG=$(git log --pretty=" - %s [%h]" $LATEST_TAG..HEAD | sed 's/ *$//g') @@ -180,81 +555,132 @@ jobs: fi fi echo -e "$BODY" - OUTPUT_SAFE_BODY="${BODY//'%'/'%25'}" - OUTPUT_SAFE_BODY="${OUTPUT_SAFE_BODY//$'\n'/'%0A'}" - OUTPUT_SAFE_BODY="${OUTPUT_SAFE_BODY//$'\r'/'%0D'}" - echo "::set-output name=BODY::$OUTPUT_SAFE_BODY" + + # Set workflow step output + # See: https://docs.github.com/actions/using-workflows/workflow-commands-for-github-actions#multiline-strings + DELIMITER="$RANDOM" + echo "BODY<<$DELIMITER" >> $GITHUB_OUTPUT + echo "$BODY" >> $GITHUB_OUTPUT + echo "$DELIMITER" >> $GITHUB_OUTPUT + echo "$BODY" > CHANGELOG.txt - - name: Upload Changelog [GitHub Actions] - if: github.event_name == 'schedule' || (github.event_name == 'workflow_dispatch' && github.ref == 'refs/heads/main') - uses: actions/upload-artifact@v2 + - name: Upload changelog job transfer artifact + if: needs.build-type-determination.outputs.is-nightly == 'true' + uses: actions/upload-artifact@v4 with: - name: ${{ env.JOB_TRANSFER_ARTIFACT }} + name: ${{ env.JOB_TRANSFER_ARTIFACT_PREFIX }}changelog path: CHANGELOG.txt publish: - needs: changelog - if: github.repository == 'arduino/arduino-ide' && (github.event_name == 'schedule' || (github.event_name == 'workflow_dispatch' && github.ref == 'refs/heads/main')) + needs: + - build-type-determination + - merge-channel-files + - changelog + if: > + always() && + needs.build-type-determination.result == 'success' && + ( + needs.merge-channel-files.result == 'skipped' || + needs.merge-channel-files.result == 'success' + ) && + needs.changelog.result == 'success' && + needs.build-type-determination.outputs.publish-to-s3 == 'true' && + needs.build-type-determination.outputs.is-nightly == 'true' runs-on: ubuntu-latest + + env: + ARTIFACTS_FOLDER: build-artifacts + + environment: production + + permissions: + id-token: write + contents: read + steps: - - name: Download [GitHub Actions] - uses: actions/download-artifact@v2 + - name: Download all job transfer artifacts + uses: actions/download-artifact@v4 with: - name: ${{ env.JOB_TRANSFER_ARTIFACT }} - path: ${{ env.JOB_TRANSFER_ARTIFACT }} + merge-multiple: true + path: ${{ env.ARTIFACTS_FOLDER }} + 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] - uses: docker://plugins/s3 - env: - PLUGIN_SOURCE: '${{ env.JOB_TRANSFER_ARTIFACT }}/*' - PLUGIN_STRIP_PREFIX: '${{ env.JOB_TRANSFER_ARTIFACT }}/' - 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 }} + run: | + aws s3 sync ${{ env.ARTIFACTS_FOLDER }} s3://${{ secrets.DOWNLOADS_BUCKET }}/arduino-ide/nightly release: - needs: changelog - if: startsWith(github.ref, 'refs/tags/') + needs: + - build-type-determination + - merge-channel-files + - changelog + if: > + always() && + needs.build-type-determination.result == 'success' && + ( + needs.merge-channel-files.result == 'skipped' || + needs.merge-channel-files.result == 'success' + ) && + needs.changelog.result == 'success' && + needs.build-type-determination.outputs.is-release == 'true' runs-on: ubuntu-latest + + env: + ARTIFACTS_FOLDER: build-artifacts + + environment: production + + permissions: + id-token: write + contents: write + steps: - - name: Download [GitHub Actions] - uses: actions/download-artifact@v2 + - name: Download all job transfer artifacts + uses: actions/download-artifact@v4 with: - name: ${{ env.JOB_TRANSFER_ARTIFACT }} - path: ${{ env.JOB_TRANSFER_ARTIFACT }} + merge-multiple: true + path: ${{ env.ARTIFACTS_FOLDER }} + pattern: ${{ env.JOB_TRANSFER_ARTIFACT_PREFIX }}* - name: Get Tag id: tag_name run: | - echo ::set-output name=TAG_NAME::${GITHUB_REF#refs/tags/} + echo "TAG_NAME=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT - name: Publish Release [GitHub] - uses: svenstaro/upload-release-action@2.2.0 + uses: svenstaro/upload-release-action@2.9.0 with: repo_token: ${{ secrets.GITHUB_TOKEN }} release_name: ${{ steps.tag_name.outputs.TAG_NAME }} - file: ${{ env.JOB_TRANSFER_ARTIFACT }}/* + file: ${{ env.ARTIFACTS_FOLDER }}/* tag: ${{ github.ref }} file_glob: true 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] - if: github.repository == 'arduino/arduino-ide' - uses: docker://plugins/s3 - env: - PLUGIN_SOURCE: '${{ env.JOB_TRANSFER_ARTIFACT }}/*' - PLUGIN_STRIP_PREFIX: '${{ env.JOB_TRANSFER_ARTIFACT }}/' - 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 }} + if: needs.build-type-determination.outputs.publish-to-s3 == 'true' + run: | + aws s3 sync ${{ env.ARTIFACTS_FOLDER }} s3://${{ secrets.DOWNLOADS_BUCKET }}/arduino-ide clean: # This job must run after all jobs that use the transfer artifact. needs: - build + - merge-channel-files - publish - release - artifacts @@ -262,7 +688,7 @@ jobs: runs-on: ubuntu-latest steps: - - name: Remove unneeded job transfer artifact - uses: geekyeggo/delete-artifact@v1 + - name: Remove unneeded job transfer artifacts + uses: geekyeggo/delete-artifact@v5 with: - name: ${{ env.JOB_TRANSFER_ARTIFACT }} + name: ${{ env.JOB_TRANSFER_ARTIFACT_PREFIX }}* diff --git a/.github/workflows/check-certificates.yml b/.github/workflows/check-certificates.yml index 27e922764..adf4052be 100644 --- a/.github/workflows/check-certificates.yml +++ b/.github/workflows/check-certificates.yml @@ -3,6 +3,7 @@ name: Check Certificates # See: https://docs.github.com/en/actions/reference/events-that-trigger-workflows on: + create: push: paths: - '.github/workflows/check-certificates.ya?ml' @@ -20,12 +21,49 @@ env: EXPIRATION_WARNING_PERIOD: 30 jobs: + run-determination: + runs-on: ubuntu-latest + outputs: + result: ${{ steps.determination.outputs.result }} + steps: + - name: Determine if the rest of the workflow should run + id: determination + run: | + RELEASE_BRANCH_REGEX="refs/heads/[0-9]+.[0-9]+.x" + REPO_SLUG="arduino/arduino-ide" + if [[ + ( + # Only run on branch creation when it is a release branch. + # The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead. + "${{ github.event_name }}" != "create" || + "${{ github.ref }}" =~ $RELEASE_BRANCH_REGEX + ) && + ( + # Only run when the workflow will have access to the certificate secrets. + # This could be done via a GitHub Actions workflow conditional, but makes more sense to do it here as well. + ( + "${{ github.event_name }}" != "pull_request" && + "${{ github.repository }}" == "$REPO_SLUG" + ) || + ( + "${{ github.event_name }}" == "pull_request" && + "${{ github.event.pull_request.head.repo.full_name }}" == "$REPO_SLUG" + ) + ) + ]]; then + # Run the other jobs. + RESULT="true" + else + # There is no need to run the other jobs. + RESULT="false" + fi + + echo "result=$RESULT" >> $GITHUB_OUTPUT + check-certificates: name: ${{ matrix.certificate.identifier }} - # Only run when the workflow will have access to the certificate secrets. - if: > - (github.event_name != 'pull_request' && github.repository == 'arduino/arduino-ide') || - (github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == 'arduino/arduino-ide') + needs: run-determination + if: needs.run-determination.outputs.result == 'true' runs-on: ubuntu-latest strategy: fail-fast: false @@ -36,9 +74,11 @@ jobs: - identifier: macOS signing certificate # Text used to identify certificate in notifications. certificate-secret: APPLE_SIGNING_CERTIFICATE_P12 # Name of the secret that contains the certificate. password-secret: KEYCHAIN_PASSWORD # Name of the secret that contains the certificate password. + type: pkcs12 - identifier: Windows signing certificate - certificate-secret: WINDOWS_SIGNING_CERTIFICATE_PFX - password-secret: WINDOWS_SIGNING_CERTIFICATE_PASSWORD + certificate-secret: INSTALLER_CERT_WINDOWS_CER + # The password for the Windows certificate is not needed, because its not a container, but a single certificate. + type: x509 steps: - name: Set certificate path environment variable @@ -57,9 +97,11 @@ jobs: CERTIFICATE_PASSWORD: ${{ secrets[matrix.certificate.password-secret] }} run: | ( - openssl pkcs12 \ + openssl ${{ matrix.certificate.type }} \ -in "${{ env.CERTIFICATE_PATH }}" \ - -noout -passin env:CERTIFICATE_PASSWORD + -legacy \ + -noout \ + -passin env:CERTIFICATE_PASSWORD ) || ( echo "::error::Verification of ${{ matrix.certificate.identifier }} failed!!!" exit 1 @@ -82,25 +124,43 @@ jobs: CERTIFICATE_PASSWORD: ${{ secrets[matrix.certificate.password-secret] }} id: get-days-before-expiration run: | - EXPIRATION_DATE="$( - ( - openssl pkcs12 \ - -in "${{ env.CERTIFICATE_PATH }}" \ - -clcerts \ - -nodes \ - -passin env:CERTIFICATE_PASSWORD - ) | ( - openssl x509 \ - -noout \ - -enddate - ) | ( - grep \ - --max-count=1 \ - --only-matching \ - --perl-regexp \ - 'notAfter=(\K.*)' - ) - )" + if [[ ${{ matrix.certificate.type }} == "pkcs12" ]]; then + EXPIRATION_DATE="$( + ( + openssl pkcs12 \ + -in "${{ env.CERTIFICATE_PATH }}" \ + -clcerts \ + -legacy \ + -nodes \ + -passin env:CERTIFICATE_PASSWORD + ) | ( + openssl x509 \ + -noout \ + -enddate + ) | ( + grep \ + --max-count=1 \ + --only-matching \ + --perl-regexp \ + 'notAfter=(\K.*)' + ) + )" + elif [[ ${{ matrix.certificate.type }} == "x509" ]]; then + EXPIRATION_DATE="$( + ( + openssl x509 \ + -in ${{ env.CERTIFICATE_PATH }} \ + -noout \ + -enddate + ) | ( + grep \ + --max-count=1 \ + --only-matching \ + --perl-regexp \ + 'notAfter=(\K.*)' + ) + )" + fi DAYS_BEFORE_EXPIRATION="$((($(date --utc --date="$EXPIRATION_DATE" +%s) - $(date --utc +%s)) / 60 / 60 / 24))" @@ -108,7 +168,7 @@ jobs: echo "Certificate expiration date: $EXPIRATION_DATE" echo "Days remaining before expiration: $DAYS_BEFORE_EXPIRATION" - echo "::set-output name=days::$DAYS_BEFORE_EXPIRATION" + echo "days=$DAYS_BEFORE_EXPIRATION" >> $GITHUB_OUTPUT - name: Check if expiration notification period has been reached id: check-expiration diff --git a/.github/workflows/check-containers.yml b/.github/workflows/check-containers.yml new file mode 100644 index 000000000..964867cdd --- /dev/null +++ b/.github/workflows/check-containers.yml @@ -0,0 +1,58 @@ +name: Check Containers + +on: + pull_request: + paths: + - ".github/workflows/check-containers.ya?ml" + - "**.Dockerfile" + - "**/Dockerfile" + push: + paths: + - ".github/workflows/check-containers.ya?ml" + - "**.Dockerfile" + - "**/Dockerfile" + repository_dispatch: + schedule: + # Run periodically to catch breakage caused by external changes. + - cron: "0 7 * * MON" + workflow_dispatch: + +jobs: + run: + name: Run (${{ matrix.image.path }}) + runs-on: ubuntu-latest + permissions: {} + services: + registry: + image: registry:2 + ports: + - 5000:5000 + + env: + IMAGE_NAME: name/app:latest + REGISTRY: localhost:5000 + + strategy: + fail-fast: false + matrix: + image: + - path: .github/workflows/assets/linux.Dockerfile + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Build and push to local registry + uses: docker/build-push-action@v6 + with: + context: . + file: ${{ matrix.image.path }} + push: true + tags: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + + - name: Run container + run: | + docker \ + run \ + --rm \ + ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} diff --git a/.github/workflows/check-i18n-task.yml b/.github/workflows/check-i18n-task.yml index 36a290ed9..3064dc602 100644 --- a/.github/workflows/check-i18n-task.yml +++ b/.github/workflows/check-i18n-task.yml @@ -2,10 +2,11 @@ name: Check Internationalization env: # See vars.GO_VERSION field of https://github.com/arduino/arduino-cli/blob/master/DistTasks.yml - GO_VERSION: "1.17" + GO_VERSION: '1.21' # See: https://docs.github.com/en/actions/reference/events-that-trigger-workflows on: + create: push: paths: - '.github/workflows/check-i18n-task.ya?ml' @@ -22,32 +23,69 @@ on: repository_dispatch: jobs: + run-determination: + runs-on: ubuntu-latest + outputs: + result: ${{ steps.determination.outputs.result }} + permissions: {} + steps: + - name: Determine if the rest of the workflow should run + id: determination + run: | + RELEASE_BRANCH_REGEX="refs/heads/[0-9]+.[0-9]+.x" + TAG_REGEX="refs/tags/.*" + # The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead. + if [[ + ("${{ github.event_name }}" != "create" || + "${{ github.ref }}" =~ $RELEASE_BRANCH_REGEX) && + ! "${{ github.ref }}" =~ $TAG_REGEX + ]]; then + # Run the other jobs. + RESULT="true" + else + # There is no need to run the other jobs. + RESULT="false" + fi + + echo "result=$RESULT" >> $GITHUB_OUTPUT + check: + needs: run-determination + if: needs.run-determination.outputs.result == 'true' runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v2 + uses: actions/checkout@v4 - - name: Install Node.js 14.x - uses: actions/setup-node@v2 + - name: Install Node.js 18.17 + uses: actions/setup-node@v4 with: - node-version: '14.x' + node-version: '18.17' registry-url: 'https://registry.npmjs.org' + cache: 'yarn' - name: Install Go - uses: actions/setup-go@v3 + uses: actions/setup-go@v5 with: go-version: ${{ env.GO_VERSION }} - name: Install Taskfile - uses: arduino/setup-task@v1 + uses: arduino/setup-task@v2 with: repo-token: ${{ secrets.GITHUB_TOKEN }} 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 - run: yarn + run: yarn install --immutable + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Check for errors run: yarn i18n:check diff --git a/.github/workflows/check-javascript.yml b/.github/workflows/check-javascript.yml new file mode 100644 index 000000000..26720d48b --- /dev/null +++ b/.github/workflows/check-javascript.yml @@ -0,0 +1,94 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/check-javascript-task.md +name: Check JavaScript + +env: + # See: https://github.com/actions/setup-node/#readme + NODE_VERSION: 18.17 + +# See: https://docs.github.com/actions/writing-workflows/choosing-when-your-workflow-runs/events-that-trigger-workflows +on: + create: + push: + paths: + - '.github/workflows/check-javascript.ya?ml' + - '**/.eslintignore' + - '**/.eslintrc*' + - '**/.npmrc' + - '**/package.json' + - '**/package-lock.json' + - '**/yarn.lock' + - '**.jsx?' + pull_request: + paths: + - '.github/workflows/check-javascript.ya?ml' + - '**/.eslintignore' + - '**/.eslintrc*' + - '**/.npmrc' + - '**/package.json' + - '**/package-lock.json' + - '**/yarn.lock' + - '**.jsx?' + workflow_dispatch: + repository_dispatch: + +jobs: + run-determination: + runs-on: ubuntu-latest + permissions: {} + outputs: + result: ${{ steps.determination.outputs.result }} + steps: + - name: Determine if the rest of the workflow should run + id: determination + run: | + RELEASE_BRANCH_REGEX="refs/heads/[0-9]+.[0-9]+.x" + # The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead. + if [[ + "${{ github.event_name }}" != "create" || + "${{ github.ref }}" =~ $RELEASE_BRANCH_REGEX + ]]; then + # Run the other jobs. + RESULT="true" + else + # There is no need to run the other jobs. + RESULT="false" + fi + + echo "result=$RESULT" >> $GITHUB_OUTPUT + + check: + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + runs-on: ubuntu-latest + permissions: + contents: read + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + cache: yarn + 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 + env: + # Avoid failure of @vscode/ripgrep installation due to GitHub API rate limiting: + # https://github.com/microsoft/vscode-ripgrep#github-api-limit-note + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + yarn install + + - name: Lint + run: | + yarn \ + --cwd arduino-ide-extension \ + lint diff --git a/.github/workflows/check-yarn.yml b/.github/workflows/check-yarn.yml new file mode 100644 index 000000000..019cfec88 --- /dev/null +++ b/.github/workflows/check-yarn.yml @@ -0,0 +1,97 @@ +name: Check Yarn + +# See: https://docs.github.com/en/actions/reference/events-that-trigger-workflows +on: + create: + push: + paths: + - ".github/workflows/check-yarn.ya?ml" + - "**/.yarnrc" + - "**/package.json" + - "**/package-lock.json" + - "**/yarn.lock" + pull_request: + paths: + - ".github/workflows/check-yarn.ya?ml" + - "**/.yarnrc" + - "**/package.json" + - "**/package-lock.json" + - "**/yarn.lock" + schedule: + # Run every Tuesday at 8 AM UTC to catch breakage resulting from changes to the JSON schema. + - cron: "0 8 * * TUE" + workflow_dispatch: + repository_dispatch: + +jobs: + run-determination: + runs-on: ubuntu-latest + permissions: {} + outputs: + result: ${{ steps.determination.outputs.result }} + steps: + - name: Determine if the rest of the workflow should run + id: determination + run: | + RELEASE_BRANCH_REGEX="refs/heads/[0-9]+.[0-9]+.x" + # The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead. + if [[ + "${{ github.event_name }}" != "create" || + "${{ github.ref }}" =~ $RELEASE_BRANCH_REGEX + ]]; then + # Run the other jobs. + RESULT="true" + else + # There is no need to run the other jobs. + RESULT="false" + fi + + echo "result=$RESULT" >> $GITHUB_OUTPUT + + check-sync: + name: check-sync (${{ matrix.project.path }}) + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + runs-on: ubuntu-latest + permissions: + contents: read + + strategy: + fail-fast: false + matrix: + project: + - path: . + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + cache: yarn + 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 + env: + # Avoid failure of @vscode/ripgrep installation due to GitHub API rate limiting: + # https://github.com/microsoft/vscode-ripgrep#github-api-limit-note + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + yarn \ + install \ + --ignore-scripts + + - name: Check yarn.lock + run: | + git \ + diff \ + --color \ + --exit-code \ + "${{ matrix.project.path }}/yarn.lock" diff --git a/.github/workflows/compose-full-changelog.yaml b/.github/workflows/compose-full-changelog.yml similarity index 57% rename from .github/workflows/compose-full-changelog.yaml rename to .github/workflows/compose-full-changelog.yml index b3a4ecda0..0e669cf8f 100644 --- a/.github/workflows/compose-full-changelog.yaml +++ b/.github/workflows/compose-full-changelog.yml @@ -8,31 +8,42 @@ on: env: CHANGELOG_ARTIFACTS: changelog # See: https://github.com/actions/setup-node/#readme - NODE_VERSION: 14.x + NODE_VERSION: '18.17' jobs: create-changelog: if: github.repository == 'arduino/arduino-ide' runs-on: ubuntu-latest + permissions: + id-token: write + contents: read + environment: production + steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Install Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: ${{ env.NODE_VERSION }} 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 id: tag_name run: | - echo ::set-output name=TAG_NAME::${GITHUB_REF#refs/tags/} + echo "TAG_NAME=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT - name: Create full changelog id: full-changelog run: | - yarn add @octokit/rest --ignore-workspace-root-check + yarn add @octokit/rest@19.0.13 --ignore-workspace-root-check mkdir "${{ github.workspace }}/${{ env.CHANGELOG_ARTIFACTS }}" # Get the changelog file name to build @@ -44,12 +55,12 @@ jobs: # Compose changelog 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] - uses: docker://plugins/s3 - env: - 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 }} + run: | + aws s3 sync ${{ env.CHANGELOG_ARTIFACTS }} s3://${{ secrets.DOWNLOADS_BUCKET }}/arduino-ide/changelog \ No newline at end of file diff --git a/.github/workflows/github-stats.yaml b/.github/workflows/github-stats.yaml deleted file mode 100644 index c7c8a98af..000000000 --- a/.github/workflows/github-stats.yaml +++ /dev/null @@ -1,96 +0,0 @@ -name: github-stats - -on: - schedule: - # run every 30 minutes - - cron: "*/30 * * * *" - workflow_dispatch: - repository_dispatch: - -jobs: - push-stats: - # This workflow is only of value to the arduino/arduino-ide repository and - # would always fail in forks - if: github.repository == 'arduino/arduino-ide' - runs-on: ubuntu-latest - - steps: - - name: Fetch downloads count - id: fetch - uses: actions/github-script@v4 - with: - github-token: ${{github.token}} - script: | - let metrics = [] - - // Get a list of releases - const opts = github.repos.listReleases.endpoint.merge({ - ...context.repo - }) - const releases = await github.paginate(opts) - - // Get download stats for every release - for (const rel of releases) { - // Names for assets are like `arduino-ide_2.0.0-beta.12_Linux_64bit.zip`, - // we'll use this later to split the asset file name more easily - const baseName = `arduino-ide_${rel.name}_` - - // Get a list of assets for this release - const opts = github.repos.listReleaseAssets.endpoint.merge({ - ...context.repo, - release_id: rel.id - }) - const assets = await github.paginate(opts) - - for (const asset of assets) { - // Ignore files that are not arduino-ide packages - if (!asset.name.startsWith(baseName)) { - continue - } - - // Strip the base and remove file extension to get `Linux_32bit` - systemArch = asset.name.replace(baseName, "").split(".")[0].split("_") - - // Add a metric object to the list of gathered metrics - metrics.push({ - "type": "gauge", - "name": "arduino.downloads.total", - "value": asset.download_count, - "host": "${{ github.repository }}", - "tags": [ - `version:${rel.name}`, - `os:${systemArch[0]}`, - `arch:${systemArch[1]}`, - "cdn:github.com", - "project:arduino-ide" - ] - }) - } - } - - // The action will put whatever we return from this function in - // `outputs.result`, JSON encoded. So we just return the array - // of objects and GitHub will do the rest. - return metrics - - - name: Send metrics - uses: masci/datadog@v1 - with: - api-key: ${{ secrets.DD_API_KEY }} - # Metrics input expects YAML but JSON will work just right. - metrics: ${{steps.fetch.outputs.result}} - - - name: Report failure - if: failure() - uses: masci/datadog@v1 - with: - api-key: ${{ secrets.DD_API_KEY }} - events: | - - title: "Arduino IDE stats failing" - text: "Stats collection failed" - alert_type: "error" - host: ${{ github.repository }} - tags: - - "project:arduino-ide" - - "cdn:github.com" - - "workflow:${{ github.workflow }}" diff --git a/.github/workflows/i18n-nightly-push.yml b/.github/workflows/i18n-nightly-push.yml index 53e552674..7b3ba2efc 100644 --- a/.github/workflows/i18n-nightly-push.yml +++ b/.github/workflows/i18n-nightly-push.yml @@ -2,7 +2,7 @@ name: i18n-nightly-push env: # See vars.GO_VERSION field of https://github.com/arduino/arduino-cli/blob/master/DistTasks.yml - GO_VERSION: "1.17" + GO_VERSION: '1.21' on: schedule: @@ -14,27 +14,34 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v4 - - name: Install Node.js 14.x - uses: actions/setup-node@v2 + - name: Install Node.js 18.17 + uses: actions/setup-node@v4 with: - node-version: '14.x' + node-version: '18.17' registry-url: 'https://registry.npmjs.org' + cache: 'yarn' - name: Install Go - uses: actions/setup-go@v3 + uses: actions/setup-go@v5 with: go-version: ${{ env.GO_VERSION }} - name: Install Task - uses: arduino/setup-task@v1 + uses: arduino/setup-task@v2 with: repo-token: ${{ secrets.GITHUB_TOKEN }} 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 - run: yarn + run: yarn install --immutable - name: Run i18n:push script run: yarn run i18n:push diff --git a/.github/workflows/i18n-weekly-pull.yml b/.github/workflows/i18n-weekly-pull.yml index b91bc2bca..6d75556d3 100644 --- a/.github/workflows/i18n-weekly-pull.yml +++ b/.github/workflows/i18n-weekly-pull.yml @@ -2,7 +2,7 @@ name: i18n-weekly-pull env: # See vars.GO_VERSION field of https://github.com/arduino/arduino-cli/blob/master/DistTasks.yml - GO_VERSION: "1.17" + GO_VERSION: '1.21' on: schedule: @@ -14,27 +14,34 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v4 - - name: Install Node.js 14.x - uses: actions/setup-node@v2 + - name: Install Node.js 18.17 + uses: actions/setup-node@v4 with: - node-version: '14.x' + node-version: '18.17' registry-url: 'https://registry.npmjs.org' + cache: 'yarn' - name: Install Go - uses: actions/setup-go@v3 + uses: actions/setup-go@v5 with: go-version: ${{ env.GO_VERSION }} - name: Install Task - uses: arduino/setup-task@v1 + uses: arduino/setup-task@v2 with: repo-token: ${{ secrets.GITHUB_TOKEN }} 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 - run: yarn + run: yarn install --immutable - name: Run i18n:pull script run: yarn run i18n:pull @@ -45,7 +52,7 @@ jobs: TRANSIFEX_API_KEY: ${{ secrets.TRANSIFEX_API_KEY }} - name: Create Pull Request - uses: peter-evans/create-pull-request@v3 + uses: peter-evans/create-pull-request@v7 with: commit-message: Updated translation files title: Update translation files diff --git a/.github/workflows/push-container-images.yml b/.github/workflows/push-container-images.yml new file mode 100644 index 000000000..f6a2c9a5b --- /dev/null +++ b/.github/workflows/push-container-images.yml @@ -0,0 +1,70 @@ +name: Push Container Images + +on: + pull_request: + paths: + - ".github/workflows/push-container-images.ya?ml" + push: + paths: + - ".github/workflows/push-container-images.ya?ml" + - "**.Dockerfile" + - "**/Dockerfile" + repository_dispatch: + schedule: + # Run periodically to catch breakage caused by external changes. + - cron: "0 8 * * MON" + workflow_dispatch: + +jobs: + push: + name: Push (${{ matrix.image.name }}) + # Only run the job when GITHUB_TOKEN has the privileges required for Container registry login. + if: > + ( + github.event_name != 'pull_request' && + github.repository == 'arduino/arduino-ide' + ) || + ( + github.event_name == 'pull_request' && + github.event.pull_request.head.repo.full_name == 'arduino/arduino-ide' + ) + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + + strategy: + fail-fast: false + matrix: + image: + - path: .github/workflows/assets/linux.Dockerfile + name: ${{ github.repository }}/linux + registry: ghcr.io + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Log in to the Container registry + uses: docker/login-action@v3 + with: + password: ${{ secrets.GITHUB_TOKEN }} + registry: ${{ matrix.image.registry }} + username: ${{ github.repository_owner }} + + - name: Extract metadata for image + id: metadata + uses: docker/metadata-action@v5 + with: + images: ${{ matrix.image.registry }}/${{ matrix.image.name }} + + - name: Build and push image + uses: docker/build-push-action@v6 + with: + context: . + file: ${{ matrix.image.path }} + labels: ${{ steps.metadata.outputs.labels }} + # Workflow is triggered on relevant events for the sake of a "dry run" validation but image is only pushed to + # registry on commit to the main branch. + push: ${{ github.ref == 'refs/heads/main' }} + tags: ${{ steps.metadata.outputs.tags }} diff --git a/.github/workflows/sync-labels.yml b/.github/workflows/sync-labels.yml index 0273232ae..22fa0d0e9 100644 --- a/.github/workflows/sync-labels.yml +++ b/.github/workflows/sync-labels.yml @@ -5,21 +5,21 @@ name: Sync Labels on: push: paths: - - ".github/workflows/sync-labels.ya?ml" - - ".github/label-configuration-files/*.ya?ml" + - '.github/workflows/sync-labels.ya?ml' + - '.github/label-configuration-files/*.ya?ml' pull_request: paths: - - ".github/workflows/sync-labels.ya?ml" - - ".github/label-configuration-files/*.ya?ml" + - '.github/workflows/sync-labels.ya?ml' + - '.github/label-configuration-files/*.ya?ml' schedule: # Run daily at 8 AM UTC to sync with changes to shared label configurations. - - cron: "0 8 * * *" + - cron: '0 8 * * *' workflow_dispatch: repository_dispatch: env: CONFIGURATIONS_FOLDER: .github/label-configuration-files - CONFIGURATIONS_ARTIFACT: label-configuration-files + CONFIGURATIONS_ARTIFACT_PREFIX: label-configuration-file- jobs: check: @@ -27,11 +27,11 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Download JSON schema for labels configuration file id: download-schema - uses: carlosperate/download-file-action@v1 + uses: carlosperate/download-file-action@v2 with: file-url: https://raw.githubusercontent.com/arduino/tooling-project-assets/main/workflow-templates/assets/sync-labels/arduino-tooling-gh-label-configuration-schema.json location: ${{ runner.temp }}/label-configuration-schema @@ -66,18 +66,18 @@ jobs: steps: - name: Download - uses: carlosperate/download-file-action@v1 + uses: carlosperate/download-file-action@v2 with: file-url: https://raw.githubusercontent.com/arduino/tooling-project-assets/main/workflow-templates/assets/sync-labels/${{ matrix.filename }} - name: Pass configuration files to next job via workflow artifact - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: path: | *.yaml *.yml if-no-files-found: error - name: ${{ env.CONFIGURATIONS_ARTIFACT }} + name: ${{ env.CONFIGURATIONS_ARTIFACT_PREFIX }}${{ matrix.filename }} sync: needs: download @@ -103,21 +103,22 @@ jobs: run: | # Use of this flag in the github-label-sync command will cause it to only check the validity of the # configuration. - echo "::set-output name=flag::--dry-run" + echo "flag=--dry-run" >> $GITHUB_OUTPUT - name: Checkout repository - uses: actions/checkout@v2 + uses: actions/checkout@v4 - - name: Download configuration files artifact - uses: actions/download-artifact@v2 + - name: Download configuration file artifacts + uses: actions/download-artifact@v4 with: - name: ${{ env.CONFIGURATIONS_ARTIFACT }} + merge-multiple: true + pattern: ${{ env.CONFIGURATIONS_ARTIFACT_PREFIX }}* path: ${{ env.CONFIGURATIONS_FOLDER }} - - name: Remove unneeded artifact - uses: geekyeggo/delete-artifact@v1 + - name: Remove unneeded artifacts + uses: geekyeggo/delete-artifact@v5 with: - name: ${{ env.CONFIGURATIONS_ARTIFACT }} + name: ${{ env.CONFIGURATIONS_ARTIFACT_PREFIX }}* - name: Merge label configuration files run: | diff --git a/.github/workflows/test-javascript.yml b/.github/workflows/test-javascript.yml new file mode 100644 index 000000000..a1665f4f5 --- /dev/null +++ b/.github/workflows/test-javascript.yml @@ -0,0 +1,140 @@ +name: Test JavaScript + +env: + # See vars.GO_VERSION field of https://github.com/arduino/arduino-cli/blob/master/DistTasks.yml + GO_VERSION: '1.21' + # See: https://github.com/actions/setup-node/#readme + NODE_VERSION: 18.17 + +on: + push: + paths: + - ".github/workflows/test-javascript.ya?ml" + - "**/.mocharc.js" + - "**/.mocharc.jsonc?" + - "**/.mocharc.ya?ml" + - "**/package.json" + - "**/package-lock.json" + - "**/yarn.lock" + - "tests/testdata/**" + - "**/tsconfig.json" + - "**.[jt]sx?" + pull_request: + paths: + - ".github/workflows/test-javascript.ya?ml" + - "**/.mocharc.js" + - "**/.mocharc.jsonc?" + - "**/.mocharc.ya?ml" + - "**/package.json" + - "**/package-lock.json" + - "**/yarn.lock" + - "tests/testdata/**" + - "**/tsconfig.json" + - "**.[jt]sx?" + workflow_dispatch: + repository_dispatch: + +jobs: + run-determination: + runs-on: ubuntu-latest + permissions: {} + outputs: + result: ${{ steps.determination.outputs.result }} + steps: + - name: Determine if the rest of the workflow should run + id: determination + run: | + RELEASE_BRANCH_REGEX="refs/heads/[0-9]+.[0-9]+.x" + # The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead. + if [[ + "${{ github.event_name }}" != "create" || + "${{ github.ref }}" =~ $RELEASE_BRANCH_REGEX + ]]; then + # Run the other jobs. + RESULT="true" + else + # There is no need to run the other jobs. + RESULT="false" + fi + + echo "result=$RESULT" >> $GITHUB_OUTPUT + + test: + name: test (${{ matrix.project.path }}, ${{ matrix.operating-system }}) + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + runs-on: ${{ matrix.operating-system }} + defaults: + run: + shell: bash + permissions: + contents: read + + strategy: + fail-fast: false + matrix: + project: + - path: . + operating-system: + - macos-latest + - ubuntu-latest + - windows-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + cache: yarn + node-version: ${{ env.NODE_VERSION }} + + # See: https://github.com/eclipse-theia/theia/blob/master/doc/Developing.md#prerequisites + - name: Install Python + uses: actions/setup-python@v5 + with: + python-version: '3.11.x' + + - name: Install Go + uses: actions/setup-go@v5 + with: + go-version: ${{ env.GO_VERSION }} + + - name: Install Taskfile + uses: arduino/setup-task@v2 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + 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 + env: + # Avoid failure of @vscode/ripgrep installation due to GitHub API rate limiting: + # https://github.com/microsoft/vscode-ripgrep#github-api-limit-note + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + yarn install + + - name: Compile TypeScript + run: | + yarn \ + --cwd arduino-ide-extension \ + build + + - name: Run tests + env: + # These secrets are optional. Dependent tests will be skipped if not available. + CREATE_USERNAME: ${{ secrets.CREATE_USERNAME }} + CREATE_PASSWORD: ${{ secrets.CREATE_PASSWORD }} + CREATE_CLIENT_SECRET: ${{ secrets.CREATE_CLIENT_SECRET }} + run: | + yarn test + yarn \ + --cwd arduino-ide-extension \ + test:slow diff --git a/.github/workflows/themes-weekly-pull.yml b/.github/workflows/themes-weekly-pull.yml index 41c159ea7..4daa767ba 100644 --- a/.github/workflows/themes-weekly-pull.yml +++ b/.github/workflows/themes-weekly-pull.yml @@ -8,35 +8,42 @@ on: env: # See vars.GO_VERSION field of https://github.com/arduino/arduino-cli/blob/master/DistTasks.yml - GO_VERSION: "1.17" - NODE_VERSION: 14.x + GO_VERSION: '1.21' + NODE_VERSION: '18.17' jobs: pull-from-jsonbin: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Install Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: ${{ env.NODE_VERSION }} registry-url: 'https://registry.npmjs.org' + cache: 'yarn' - name: Install Go - uses: actions/setup-go@v3 + uses: actions/setup-go@v5 with: go-version: ${{ env.GO_VERSION }} - name: Install Task - uses: arduino/setup-task@v1 + uses: arduino/setup-task@v2 with: repo-token: ${{ secrets.GITHUB_TOKEN }} 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 - run: yarn + run: yarn install --immutable - name: Run themes:pull script run: yarn run themes:pull @@ -54,7 +61,7 @@ jobs: run: yarn run themes:generate - name: Create Pull Request - uses: peter-evans/create-pull-request@v4 + uses: peter-evans/create-pull-request@v7 with: commit-message: Updated themes title: Update themes diff --git a/.gitignore b/.gitignore index 4380cce54..570b7df39 100644 --- a/.gitignore +++ b/.gitignore @@ -1,25 +1,22 @@ node_modules/ -# .node_modules is a hack for the electron builder. -.node_modules/ lib/ downloads/ -build/ -Examples/ -!electron/build/ +arduino-ide-extension/src/node/resources +arduino-ide-extension/Examples/ src-gen/ -!webpack.config.js gen-webpack.config.js +gen-webpack.node.config.js .DS_Store # switching from `electron` to `browser` in dev mode. .browser_modules yarn*.log # For the VS Code extensions used by Theia. -plugins -# the config files for the CLI -arduino-ide-extension/data/cli/config +electron-app/plugins # the tokens folder for the themes scripts/themes/tokens -# environment variables -.env # content trace files for electron electron-app/traces +# any Arduino LS generated log files +inols*.log +# The electron-builder output. +electron-app/dist diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 000000000..0f7b8aa47 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,11 @@ +lib +dist +plugins +src-gen +i18n +gen-webpack* +.browser_modules +arduino-ide-extension/src/node/resources +cli-protocol +*color-theme.json +arduino-icons.json diff --git a/.prettierrc b/.prettierrc deleted file mode 100644 index 47e5c04d7..000000000 --- a/.prettierrc +++ /dev/null @@ -1,7 +0,0 @@ -{ - "singleQuote": true, - "tabWidth": 2, - "useTabs": false, - "printWidth": 80, - "endOfLine": "auto" -} diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 000000000..686348c10 --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,28 @@ +{ + "singleQuote": true, + "tabWidth": 2, + "useTabs": false, + "printWidth": 80, + "endOfLine": "auto", + "overrides": [ + { + "files": "*.json", + "options": { + "tabWidth": 2 + } + }, + { + "files": "*.css", + "options": { + "tabWidth": 4, + "singleQuote": false + } + }, + { + "files": "*.html", + "options": { + "tabWidth": 4 + } + } + ] +} diff --git a/.vscode/launch.json b/.vscode/launch.json index 820ba07b8..2a8081fb8 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -4,35 +4,33 @@ { "type": "node", "request": "launch", - "name": "App (Electron) [Dev]", - "runtimeExecutable": "${workspaceRoot}/node_modules/.bin/electron", + "name": "App", + "runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron", "windows": { - "runtimeExecutable": "${workspaceRoot}/node_modules/.bin/electron.cmd", + "runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron.cmd" }, "cwd": "${workspaceFolder}/electron-app", "args": [ ".", "--log-level=debug", "--hostname=localhost", - "--no-cluster", - "--app-project-path=${workspaceRoot}/electron-app", + "--app-project-path=${workspaceFolder}/electron-app", "--remote-debugging-port=9222", "--no-app-auto-install", - "--plugins=local-dir:../plugins", + "--plugins=local-dir:./plugins", "--hosted-plugin-inspect=9339", - "--content-trace", - "--open-devtools" + "--no-ping-timeout" ], "env": { "NODE_ENV": "development" }, "sourceMaps": true, "outFiles": [ - "${workspaceRoot}/electron-app/src-gen/backend/*.js", - "${workspaceRoot}/electron-app/src-gen/frontend/*.js", - "${workspaceRoot}/electron-app/lib/**/*.js", - "${workspaceRoot}/arduino-ide-extension/lib/**/*.js", - "${workspaceRoot}/node_modules/@theia/**/*.js" + "${workspaceFolder}/electron-app/lib/backend/electron-main.js", + "${workspaceFolder}/electron-app/lib/backend/main.js", + "${workspaceFolder}/electron-app/lib/**/*.js", + "${workspaceFolder}/arduino-ide-extension/lib/**/*.js", + "${workspaceFolder}/node_modules/@theia/**/*.js" ], "smartStep": true, "internalConsoleOptions": "openOnSessionStart", @@ -41,33 +39,35 @@ { "type": "node", "request": "launch", - "name": "App (Electron)", - "runtimeExecutable": "${workspaceRoot}/node_modules/.bin/electron", + "name": "App [Dev]", + "runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron", "windows": { - "runtimeExecutable": "${workspaceRoot}/node_modules/.bin/electron.cmd", + "runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron.cmd" }, "cwd": "${workspaceFolder}/electron-app", "args": [ ".", "--log-level=debug", "--hostname=localhost", - "--no-cluster", - "--app-project-path=${workspaceRoot}/electron-app", + "--app-project-path=${workspaceFolder}/electron-app", "--remote-debugging-port=9222", "--no-app-auto-install", - "--plugins=local-dir:../plugins", - "--hosted-plugin-inspect=9339" + "--plugins=local-dir:./plugins", + "--hosted-plugin-inspect=9339", + "--content-trace", + "--open-devtools", + "--no-ping-timeout" ], "env": { "NODE_ENV": "development" }, "sourceMaps": true, "outFiles": [ - "${workspaceRoot}/electron-app/src-gen/backend/*.js", - "${workspaceRoot}/electron-app/src-gen/frontend/*.js", - "${workspaceRoot}/electron-app/lib/**/*.js", - "${workspaceRoot}/arduino-ide-extension/lib/**/*.js", - "${workspaceRoot}/node_modules/@theia/**/*.js" + "${workspaceFolder}/electron-app/lib/backend/electron-main.js", + "${workspaceFolder}/electron-app/lib/backend/main.js", + "${workspaceFolder}/electron-app/lib/**/*.js", + "${workspaceFolder}/arduino-ide-extension/lib/**/*.js", + "${workspaceFolder}/node_modules/@theia/**/*.js" ], "smartStep": true, "internalConsoleOptions": "openOnSessionStart", @@ -80,42 +80,11 @@ "port": 9222, "webRoot": "${workspaceFolder}/electron-app" }, - { - "type": "node", - "request": "launch", - "name": "App (Browser)", - "program": "${workspaceRoot}/browser-app/src-gen/backend/main.js", - "args": [ - "--hostname=0.0.0.0", - "--port=3000", - "--no-cluster", - "--no-app-auto-install", - "--plugins=local-dir:plugins" - ], - "windows": { - "env": { - "NODE_ENV": "development", - "NODE_PRESERVE_SYMLINKS": "1" - } - }, - "env": { - "NODE_ENV": "development" - }, - "sourceMaps": true, - "outFiles": [ - "${workspaceRoot}/browser-app/src-gen/backend/*.js", - "${workspaceRoot}/browser-app/lib/**/*.js", - "${workspaceRoot}/arduino-ide-extension/lib/**/*.js" - ], - "smartStep": true, - "internalConsoleOptions": "openOnSessionStart", - "outputCapture": "std" - }, { "type": "node", "request": "launch", "name": "Run Test [current]", - "program": "${workspaceRoot}/node_modules/mocha/bin/_mocha", + "program": "${workspaceFolder}/node_modules/mocha/bin/_mocha", "args": [ "--require", "reflect-metadata/Reflect", @@ -125,8 +94,16 @@ "--colors", "**/${fileBasenameNoExtension}.js" ], + "outFiles": [ + "${workspaceRoot}/electron-app/src-gen/backend/*.js", + "${workspaceRoot}/electron-app/src-gen/frontend/*.js", + "${workspaceRoot}/electron-app/lib/**/*.js", + "${workspaceRoot}/arduino-ide-extension/lib/**/*.js", + "${workspaceRoot}/node_modules/@theia/**/*.js" + ], "env": { - "TS_NODE_PROJECT": "${workspaceRoot}/tsconfig.json" + "TS_NODE_PROJECT": "${workspaceFolder}/tsconfig.json", + "IDE2_TEST": "true" }, "sourceMaps": true, "smartStep": true, @@ -138,22 +115,12 @@ "request": "attach", "name": "Attach by Process ID", "processId": "${command:PickProcess}" - }, - { - "type": "node", - "request": "launch", - "name": "Electron Packager", - "program": "${workspaceRoot}/electron/packager/index.js", - "cwd": "${workspaceFolder}/electron/packager" } ], "compounds": [ { "name": "Launch Electron Backend & Frontend", - "configurations": [ - "App (Electron)", - "Attach to Electron Frontend" - ] + "configurations": ["App", "Attach to Electron Frontend"] } ] } diff --git a/.vscode/settings.json b/.vscode/settings.json index 72b858435..e69e89f6d 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -2,8 +2,11 @@ "files.exclude": { "**/lib": false }, + "search.exclude": { + "arduino-ide-extension/src/test/node/__test_sketchbook__": true + }, "typescript.tsdk": "node_modules/typescript/lib", "editor.codeActionsOnSave": { - "source.fixAll.eslint": true - }, + "source.fixAll.eslint": "explicit" + } } diff --git a/.vscode/tasks.json b/.vscode/tasks.json index de5ee90fc..b53773f8b 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -2,10 +2,13 @@ "version": "2.0.0", "tasks": [ { - "label": "Arduino IDE - Rebuild Electron App", + "label": "Rebuild App", "type": "shell", - "command": "yarn rebuild:browser && yarn rebuild:electron", + "command": "yarn rebuild", "group": "build", + "options": { + "cwd": "${workspaceFolder}/electron-app" + }, "presentation": { "reveal": "always", "panel": "new", @@ -13,18 +16,7 @@ } }, { - "label": "Arduino IDE - Start Browser App", - "type": "shell", - "command": "yarn --cwd ./browser-app start", - "group": "build", - "presentation": { - "reveal": "always", - "panel": "new", - "clear": true - } - }, - { - "label": "Arduino IDE - Watch IDE Extension", + "label": "Watch Extension", "type": "shell", "command": "yarn --cwd ./arduino-ide-extension watch", "group": "build", @@ -35,18 +27,7 @@ } }, { - "label": "Arduino IDE - Watch Browser App", - "type": "shell", - "command": "yarn --cwd ./browser-app watch", - "group": "build", - "presentation": { - "reveal": "always", - "panel": "new", - "clear": false - } - }, - { - "label": "Arduino IDE - Watch Electron App", + "label": "Watch App", "type": "shell", "command": "yarn --cwd ./electron-app watch", "group": "build", @@ -57,20 +38,9 @@ } }, { - "label": "Arduino IDE - Watch All [Browser]", - "type": "shell", - "dependsOn": [ - "Arduino IDE - Watch IDE Extension", - "Arduino IDE - Watch Browser App" - ] - }, - { - "label": "Arduino IDE - Watch All [Electron]", + "label": "Watch All", "type": "shell", - "dependsOn": [ - "Arduino IDE - Watch IDE Extension", - "Arduino IDE - Watch Electron App" - ] + "dependsOn": ["Watch Extension", "Watch App"] } ] } diff --git a/BUILDING.md b/BUILDING.md index b70bd0540..95c05f8f6 100644 --- a/BUILDING.md +++ b/BUILDING.md @@ -1,120 +1,3 @@ -# Development - -This page includes technical documentation for developers who want to build the IDE locally and contribute to the project. - -## Architecture overview - -The IDE consists of three major parts: - - the _Electron main_ process, - - the _backend_, and - - the _frontend_. - -The _Electron main_ process is responsible for: - - creating the application, - - managing the application lifecycle via listeners, and - - creating and managing the web pages for the app. - -In Electron, the process that runs the main entry JavaScript file is called the main process. The _Electron main_ process can display a GUI by creating web pages. An Electron app always has exactly one main process. - -By default, whenever the _Electron main_ process creates a web page, it will instantiate a new `BrowserWindow` instance. Since Electron uses Chromium for displaying web pages, Chromium's multi-process architecture is also used. Each web page in Electron runs in its own process, which is called the renderer process. Each `BrowserWindow` instance runs the web page in its own renderer process. When a `BrowserWindow` instance is destroyed, the corresponding renderer process is also terminated. The main process manages all web pages and their corresponding renderer processes. Each renderer process is isolated and only cares about the web page running in it.[[1]] - -In normal browsers, web pages usually run in a sandboxed environment, and accessing native resources are disallowed. However, Electron has the power to use Node.js APIs in the web pages allowing lower-level OS interactions. Due to security reasons, accessing native resources is an undesired behavior in the IDE. So by convention, we do not use Node.js APIs. (Note: the Node.js integration is [not yet disabled](https://github.com/eclipse-theia/theia/issues/2018) although it is not used). In the IDE, only the _backend_ allows OS interaction. - -The _backend_ process is responsible for: - - providing access to the filesystem, - - communicating with the [Arduino CLI](https://github.com/arduino/arduino-cli) via gRPC, - - running your terminal, - - exposing additional RESTful APIs, - - performing the Git commands in the local repositories, - - hosting and running any VS Code extensions, or - - executing VS Code tasks[[2]]. - -The _Electron main_ process spawns the _backend_ process. There is always exactly one _backend_ process. However, due to performance considerations, the _backend_ spawns several sub-processes for the filesystem watching, Git repository discovery, etc. The communication between the _backend_ process and its sub-processes is established via IPC. Besides spawning sub-processes, the _backend_ will start an HTTP server on a random available port, and serves the web application as static content. When the sub-processes are up and running, and the HTTP server is also listening, the _backend_ process sends the HTTP server port to the _Electron main_ process via IPC. The _Electron main_ process will load the _backend_'s endpoint in the `BrowserWindow`. - -The _frontend_ is running as an Electron renderer process and can invoke services implemented on the _backend_. The communication between the _backend_ and the _frontend_ is done via JSON-RPC over a websocket connection. This means, the services running in the _frontend_ are all proxies, and will ask the corresponding service implementation on the _backend_. - -[1]: https://www.electronjs.org/docs/tutorial/application-architecture#differences-between-main-process-and-renderer-process -[2]: https://code.visualstudio.com/Docs/editor/tasks - - -## Build from source - -If you’re familiar with TypeScript, the [Theia IDE](https://theia-ide.org/), and if you want to contribute to the -project, you should be able to build the Arduino IDE locally. -Please refer to the [Theia IDE prerequisites](https://github.com/eclipse-theia/theia/blob/master/doc/Developing.md#prerequisites) documentation for the setup instructions. -> **Note**: Node.js 14 must be used instead of the version 12 recommended at the link above. - -Once you have all the tools installed, you can build the editor following these steps - -1. Install the dependencies and build - ```sh - yarn - ``` - -2. Rebuild the dependencies - ```sh - yarn rebuild:browser - ``` - -3. Rebuild the electron dependencies - ```sh - yarn rebuild:electron - ``` - -4. Start the application - ```sh - yarn start - ``` - -### Notes for Windows contributors -Windows requires the Microsoft Visual C++ (MSVC) compiler toolset to be installed on your development machine. - -In case it's not already present, it can be downloaded from the "**Tools for Visual Studio 20XX**" section of the Visual Studio [downloads page](https://visualstudio.microsoft.com/downloads/#build-tools-for-visual-studio-2022) via the "**Build Tools for Visual Studio 20XX**" (e.g., "**Build Tools for Visual Studio 2022**") download link. - -Select "**Desktop development with C++**" from the "**Workloads**" tab during the installation procedure. - -### CI - -This project is built on [GitHub Actions](https://github.com/arduino/arduino-ide/actions). - - - _Snapshot_ builds run when changes are pushed to the `main` branch, or when a PR is created against the `main` branch. For the sake of the review and verification process, the build artifacts for each operating system can be downloaded from the GitHub Actions page. - - _Nightly_ builds run every day at 03:00 GMT from the `main` branch. - - _Release_ builds run when a new tag is pushed to the remote. The tag must follow the [semver](https://semver.org/). For instance, `1.2.3` is a correct tag, but `v2.3.4` won't work. Steps to trigger a new release build: - - Create a local tag: - ```sh - git tag -a 1.2.3 -m "Creating a new tag for the `1.2.3` release." - ``` - - Push it to the remote: - ```sh - git push origin 1.2.3 - ``` - -## Notes for macOS contributors -Beginning in macOS 10.14.5, the software [must be notarized to run](https://developer.apple.com/documentation/xcode/notarizing_macos_software_before_distribution). The signing and notarization processes for the Arduino IDE are managed by our Continuous Integration (CI) workflows, implemented with GitHub Actions. On every push and pull request, the Arduino IDE is built and saved to a workflow artifact. These artifacts can be used by contributors and beta testers who don't want to set up a build system locally. -For security reasons, signing and notarization are disabled for workflow runs for pull requests from forks of this repository. This means that macOS will block you from running those artifacts. -Due to this limitation, Mac users have two options for testing contributions from forks: - -### The Safe approach (recommended) - -Follow [the instructions above](#build-from-source) to create the build environment locally, then build the code you want to test. - -### The Risky approach - -*Please note that this approach is risky as you are lowering the security on your system, therefore we strongly discourage you from following it.* -1. Use [this guide](https://help.apple.com/xcode/mac/10.2/index.html?localePath=en.lproj#/dev9b7736b0e), in order to disable Gatekeeper (at your own risk!). -1. Download the unsigned artifact provided by the CI workflow run related to the Pull Request at each push. -1. Re-enable Gatekeeper after tests are done, following the guide linked above. - -## FAQ - -* *Can I manually change the version of the [`arduino-cli`](https://github.com/arduino/arduino-cli/) used by the IDE?* - - Yes. It is possible but not recommended. The CLI exposes a set of functionality via [gRPC](https://github.com/arduino/arduino-cli/tree/master/rpc) and the IDE uses this API to communicate with the CLI. Before we build a new version of IDE, we pin a specific version of CLI and use the corresponding `proto` files to generate TypeScript modules for gRPC. This means, a particular version of IDE is compliant only with the pinned version of CLI. Mismatching IDE and CLI versions might not be able to communicate with each other. This could cause unpredictable IDE behavior. - -* *I have understood that not all versions of the CLI are compatible with my version of IDE but how can I manually update the `arduino-cli` inside the IDE?* - - [Get](https://arduino.github.io/arduino-cli/installation) the desired version of `arduino-cli` for your platform and manually replace the one inside the IDE. The CLI can be found inside the IDE at: - - Windows: `C:\path\to\Arduino IDE\resources\app\node_modules\arduino-ide-extension\build\arduino-cli.exe`, - - macOS: `/path/to/Arduino IDE.app/Contents/Resources/app/node_modules/arduino-ide-extension/build/arduino-cli`, and - - Linux: `/path/to/Arduino IDE/resources/app/node_modules/arduino-ide-extension/build/arduino-cli`. +# Development Guide +This documentation has been moved [**here**](docs/development.md#development-guide). diff --git a/README.md b/README.md index 324da2691..a7a88f491 100644 --- a/README.md +++ b/README.md @@ -2,9 +2,11 @@ # Arduino IDE 2.x -[![Arduino IDE](https://github.com/arduino/arduino-ide/workflows/Arduino%20IDE/badge.svg)](https://github.com/arduino/arduino-ide/actions?query=workflow%3A%22Arduino+IDE%22) +[![Build status](https://github.com/arduino/arduino-ide/actions/workflows/build.yml/badge.svg)](https://github.com/arduino/arduino-ide/actions/workflows/build.yml) +[![Check JavaScript status](https://github.com/arduino/arduino-ide/actions/workflows/check-javascript.yml/badge.svg)](https://github.com/arduino/arduino-ide/actions/workflows/check-javascript.yml) +[![Test JavaScript status](https://github.com/arduino/arduino-ide/actions/workflows/test-javascript.yml/badge.svg)](https://github.com/arduino/arduino-ide/actions/workflows/test-javascript.yml) -This repository contains the source code of the Arduino IDE 2.x. If you're looking for the old IDE, go to the repository of the 1.x version at https://github.com/arduino/Arduino. +This repository contains the source code of the Arduino IDE 2.x. If you're looking for the old IDE, go to the [repository of the 1.x version](https://github.com/arduino/Arduino). The Arduino IDE 2.x is a major rewrite, sharing no code with the IDE 1.x. It is based on the [Theia IDE](https://theia-ide.org/) framework and built with [Electron](https://www.electronjs.org/). The backend operations such as compilation and uploading are offloaded to an [arduino-cli](https://github.com/arduino/arduino-cli) instance running in daemon mode. This new IDE was developed with the goal of preserving the same interface and user experience of the previous major version in order to provide a frictionless upgrade. @@ -20,10 +22,9 @@ If you need assistance, see the [Help Center](https://support.arduino.cc/hc/en-u ## Bugs & Issues -If you want to report an issue, you can submit it to the [issue tracker](https://github.com/arduino/arduino-ide/issues) of this repository. A few rules apply: +If you want to report an issue, you can submit it to the [issue tracker](https://github.com/arduino/arduino-ide/issues) of this repository. -- Before posting, please check if the same problem has been already reported by someone else to avoid duplicates. -- Remember to include as much detail as you can about your hardware set-up, code and steps for reproducing the issue. Make sure you're using an original Arduino board. +See [**the issue report guide**](docs/contributor-guide/issues.md#issue-report-guide) for instructions. ### Security @@ -35,16 +36,15 @@ e-mail contact: security@arduino.cc ## Contributions and development -Contributions are very welcome! You can browse the list of open issues to see what's needed and then you can submit your code using a Pull Request. Please provide detailed descriptions. We also appreciate any help in testing issues and patches contributed by other users. +Contributions are very welcome! There are several ways to participate in this project, including: -This repository contains the main code, but two more repositories are included during the build process: +- Fixing bugs +- Beta testing +- Translation -- [vscode-arduino-tools](https://github.com/arduino/vscode-arduino-tools): provides support for the language server and the debugger -- [arduino-language-server](https://github.com/arduino/arduino-language-server): provides the language server that parses Arduino code +See [**the contributor guide**](docs/CONTRIBUTING.md#contributor-guide) for more information. -See the [BUILDING.md](BUILDING.md) for a technical overview of the application and instructions for building the code. - -You can help with the translation of the Arduino IDE to your language here: [Arduino IDE on Transifex](https://www.transifex.com/arduino-1/ide2/dashboard/). +See the [**development guide**](docs/development.md) for a technical overview of the application and instructions for building the code. ## Donations diff --git a/arduino-ide-extension/README.md b/arduino-ide-extension/README.md index db9cff8bc..e6cd0f8bd 100644 --- a/arduino-ide-extension/README.md +++ b/arduino-ide-extension/README.md @@ -55,12 +55,14 @@ The Config Service knows about your system, like for example the default sketch - checking whether a file is in a data or sketch directory ### `"arduino"` configuration in the `package.json`: - - `"cli"`: - - `"version"` type `string` | `{ owner: string, repo: string, commitish?: string }`: if the type is a `string` and is a valid semver, it will get the corresponding [released](https://github.com/arduino/arduino-cli/releases) CLI. If the type is `string` and is a [date in `YYYYMMDD`](https://arduino.github.io/arduino-cli/latest/installation/#nightly-builds) format, it will get a nightly CLI. If the type is an object, a CLI, build from the sources in the `owner/repo` will be used. If `commitish` is not defined, the HEAD of the default branch will be used. In any other cases an error is thrown. + +- `"cli"`: + - `"version"` type `string` | `{ owner: string, repo: string, commitish?: string }`: if the type is a `string` and is a valid semver, it will get the corresponding [released](https://github.com/arduino/arduino-cli/releases) CLI. If the type is `string` and is a [date in `YYYYMMDD`](https://arduino.github.io/arduino-cli/latest/installation/#nightly-builds) format, it will get a nightly CLI. If the type is an object, a CLI, build from the sources in the `owner/repo` will be used. If `commitish` is not defined, the HEAD of the default branch will be used. In any other cases an error is thrown. #### Rebuild gRPC protocol interfaces - - Some CLI updates can bring changes to the gRPC interfaces, as the API might change. gRPC interfaces can be updated running the command - `yarn --cwd arduino-ide-extension generate-protocol` + +- Some CLI updates can bring changes to the gRPC interfaces, as the API might change. gRPC interfaces can be updated running the command + `yarn --cwd arduino-ide-extension generate-protocol` ### Update **clangd** and **ClangFormat** @@ -72,11 +74,13 @@ The [**clangd** C++ language server](https://clangd.llvm.org/) and the [**ClangF 1. Submit a pull request in [the `arduino/tooling-project-assets` repository](https://github.com/arduino/tooling-project-assets) to update the version in the `vars.DEFAULT_CLANG_FORMAT_VERSION` field of [`Taskfile.yml`](https://github.com/arduino/tooling-project-assets/blob/main/Taskfile.yml). ### Customize Icons + ArduinoIde uses a customized version of FontAwesome. In order to update/replace icons follow the following steps: - - import the file `arduino-icons.json` in [Icomoon](https://icomoon.io/app/#/projects) - - load it - - edit the icons as needed - - !! download the **new** `arduino-icons.json` file and put it in this repo - - Click on "Generate Font" in Icomoon, then download - - place the updated fonts in the `src/style/fonts` directory + +- import the file `arduino-icons.json` in [Icomoon](https://icomoon.io/app/#/projects) +- load it +- edit the icons as needed +- !! download the **new** `arduino-icons.json` file and put it in this repo +- Click on "Generate Font" in Icomoon, then download +- place the updated fonts in the `src/style/fonts` directory diff --git a/arduino-ide-extension/arduino-icons.json b/arduino-ide-extension/arduino-icons.json index d109db94f..7c510e9cf 100644 --- a/arduino-ide-extension/arduino-icons.json +++ b/arduino-ide-extension/arduino-icons.json @@ -1 +1 @@ -{"IcoMoonType":"selection","icons":[{"icon":{"paths":["M558.545 1024c-23.818 0-47.637-9.095-65.819-27.276l-465.454-465.453c-36.363-36.363-36.363-95.273 0-131.636s95.273-36.363 131.637 0l399.636 399.636 772.003-772c36.361-36.363 95.269-36.363 131.631 0s36.361 95.273 0 131.637l-837.815 837.815c-18.182 18.181-42 27.276-65.818 27.276z"],"attrs":[{}],"width":1489,"isMulticolor":false,"isMulticolor2":false,"grid":14,"tags":["arduino-verify"]},"attrs":[{}],"properties":{"order":12,"id":192,"name":"arduino-verify","prevSize":28,"code":59659},"setIdx":0,"setId":1,"iconIdx":0},{"icon":{"paths":["M1072.469 526.509l-409.603 409.598c-13.65 12.971-30.717 19.804-48.467 19.804s-34.817-6.833-48.467-19.804c-26.625-26.617-26.625-70.315 0-96.932l293.551-292.866h-791.217c-37.55 0-68.267-30.717-68.267-68.267s30.717-68.267 68.267-68.267h791.217l-293.551-292.866c-26.625-26.616-26.625-70.317 0-96.934 26.616-26.634 70.317-26.634 96.933 0l409.603 409.6c26.624 26.616 26.624 70.317 0 96.934v0z"],"attrs":[{}],"width":1161,"isMulticolor":false,"isMulticolor2":false,"grid":14,"tags":["arduino-upload"]},"attrs":[{}],"properties":{"order":11,"id":191,"name":"arduino-upload","prevSize":28,"code":59660},"setIdx":0,"setId":1,"iconIdx":1},{"icon":{"paths":["M651.891 890.88c-92.835 0-179.095-28.493-250.5-77.197l-129.659 129.658c-22.494 22.496-58.964 22.496-81.458 0s-22.494-58.963 0-81.459l124.954-124.954c-67.75-78.157-108.777-180.090-108.777-291.489 0-245.759 199.68-445.439 445.44-445.439s445.44 199.679 445.44 445.439c0 245.761-199.68 445.441-445.44 445.441zM651.891 153.6c-161.28 0-291.84 130.559-291.84 291.839s130.56 291.841 291.84 291.841c160.512 0 291.84-130.561 291.84-291.841 0-160.511-130.56-291.839-291.84-291.839zM1149.562 478.091c0 35.423 28.717 64.138 64.141 64.138s64.134-28.716 64.134-64.138c0-35.423-28.71-64.139-64.134-64.139s-64.141 28.716-64.141 64.139zM64.064 542.237c-35.382 0-64.064-28.682-64.064-64.063s28.682-64.064 64.064-64.064c35.381 0 64.064 28.682 64.064 64.064s-28.683 64.063-64.064 64.063zM1458.707 542.229c-35.418 0-64.134-28.716-64.134-64.138s28.717-64.139 64.134-64.139c35.424 0 64.141 28.716 64.141 64.139s-28.717 64.138-64.141 64.138zM652.659 526.847c-44.961 0-81.408-36.447-81.408-81.407s36.447-81.408 81.408-81.408c44.96 0 81.408 36.447 81.408 81.408s-36.448 81.407-81.408 81.407z"],"attrs":[{}],"width":1536,"isMulticolor":false,"isMulticolor2":false,"grid":14,"tags":["arduino-monitor"]},"attrs":[{}],"properties":{"order":10,"id":190,"name":"arduino-monitor","prevSize":28,"code":59661},"setIdx":0,"setId":1,"iconIdx":2},{"icon":{"paths":["M511.998 603.432c50.495 0 91.432-40.936 91.432-91.432s-40.936-91.432-91.432-91.432c-50.495 0-91.432 40.936-91.432 91.432s40.936 91.432 91.432 91.432z","M923.433 603.432c50.494 0 91.432-40.936 91.432-91.432s-40.937-91.432-91.432-91.432c-50.494 0-91.432 40.936-91.432 91.432s40.937 91.432 91.432 91.432z","M100.565 603.432c50.495 0 91.432-40.936 91.432-91.432s-40.936-91.432-91.432-91.432c-50.495 0-91.432 40.936-91.432 91.432s40.936 91.432 91.432 91.432z"],"attrs":[{},{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":14,"tags":["arduino-sketch-tabs-menu"]},"attrs":[{},{},{}],"properties":{"order":9,"id":189,"name":"arduino-sketch-tabs-menu","prevSize":28,"code":59662},"setIdx":0,"setId":1,"iconIdx":3},{"icon":{"paths":["M323.368 970.208c-20.263 0-39-11.42-48.21-29.788l-146.789-293.581h-74.474c-29.789 0-53.895-24.107-53.895-53.895s24.105-53.895 53.895-53.895h107.789c20.421 0 39.053 11.528 48.21 29.788l96.527 193.056 180.263-720.949c5.842-23.579 26.737-40.263 51-40.842 23.947-1.579 45.893 15.158 52.894 38.421l150.162 500.526h67.681c29.788 0 53.895 24.107 53.895 53.895s-24.107 53.895-53.895 53.895h-107.789c-23.789 0-44.787-15.629-51.631-38.422l-105.316-351.104-168.052 672.053c-5.474 21.897-23.948 38.055-46.368 40.529-2 0.21-3.947 0.313-5.895 0.313h-0.001z"],"attrs":[{}],"width":862,"isMulticolor":false,"isMulticolor2":false,"grid":14,"tags":["arduino-plotter"]},"attrs":[{}],"properties":{"order":8,"id":188,"name":"arduino-plotter","prevSize":28,"code":59663},"setIdx":0,"setId":1,"iconIdx":4},{"icon":{"paths":["M416.006 800c-4.211 0.026-8.386-0.787-12.285-2.374-3.899-1.594-7.445-3.942-10.435-6.906l-224-224.002c-6.026-6.026-9.411-14.198-9.411-22.72s3.385-16.694 9.411-22.72c6.026-6.026 14.198-9.411 22.72-9.411s16.694 3.386 22.72 9.411l201.28 201.602 425.281-425.602c6.022-6.026 14.195-9.411 22.72-9.411 8.518 0 16.691 3.386 22.72 9.411 6.022 6.026 9.408 14.198 9.408 22.72s-3.386 16.694-9.408 22.72l-448.001 448.002c-2.99 2.963-6.536 5.312-10.435 6.906-3.899 1.587-8.074 2.4-12.285 2.374z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["fa-check"],"grid":14},"attrs":[{}],"properties":{"order":722,"id":0,"name":"fa-check","prevSize":28,"code":59658},"setIdx":0,"setId":1,"iconIdx":5},{"icon":{"paths":["M864 128h-576c-8.484 0.062-16.618 3.385-22.72 9.28l-128 128c-5.969 6.052-9.305 14.219-9.28 22.72v576c0.024 8.48 3.404 16.602 9.4 22.598s14.121 9.376 22.6 9.402h576c8.486-0.038 16.634-3.36 22.72-9.28l128-128c5.894-6.099 9.216-14.234 9.28-22.72v-576c-0.026-8.479-3.405-16.605-9.402-22.6s-14.118-9.375-22.598-9.4zM704 832h-512v-512h512v512zM722.56 256h-485.12l63.68-64h485.44l-64 64zM832 722.88l-64 63.68v-485.12l64-64v485.44z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["technology-3dimensionscube"],"grid":14},"attrs":[{}],"properties":{"order":717,"id":1,"name":"arduino-technology-3dimensionscube","prevSize":28,"code":59654},"setIdx":0,"setId":1,"iconIdx":6},{"icon":{"paths":["M848 224v96c0 8.487-3.373 16.627-9.37 22.627-6.003 6.001-14.144 9.373-22.63 9.373h-16v96c-0.019 5.909-1.67 11.699-4.781 16.725-3.104 5.027-7.539 9.096-12.819 11.755l-238.4 119.36v242.88c16.845 7.354 30.644 20.282 39.079 36.608 8.435 16.333 10.989 35.066 7.233 53.056s-13.59 34.144-27.852 45.734c-14.262 11.597-32.081 17.92-50.46 17.92s-36.198-6.323-50.46-17.92c-14.262-11.59-24.097-27.744-27.852-45.734s-1.201-36.723 7.233-53.056c8.435-16.326 22.234-29.254 39.079-36.608v-82.88l-238.4-119.36c-5.277-2.659-9.715-6.728-12.822-11.755s-4.76-10.816-4.778-16.725v-102.72c-16.845-7.352-30.644-20.279-39.079-36.609s-10.988-35.066-7.233-53.057c3.755-17.992 13.59-34.141 27.852-45.734s32.081-17.921 50.46-17.921c18.38 0 36.198 6.328 50.46 17.921s24.097 27.743 27.852 45.734c3.756 17.992 1.201 36.727-7.233 53.057s-22.234 29.257-39.079 36.609v82.88l192 96v-524.16h-32c-6.372 0.032-12.609-1.839-17.91-5.374s-9.428-8.572-11.85-14.466c-2.41-5.858-3.028-12.3-1.775-18.509s4.321-11.907 8.815-16.371l64-64c2.975-2.999 6.514-5.38 10.413-7.005s8.083-2.461 12.307-2.461c4.225 0 8.407 0.836 12.307 2.461s7.439 4.005 10.413 7.005l64 64c4.44 4.5 7.448 10.214 8.644 16.422s0.526 12.63-1.924 18.458c-2.401 5.844-6.477 10.846-11.716 14.377s-11.406 5.432-17.724 5.463h-32v364.16l192-96v-76.16h-16c-8.486 0-16.627-3.372-22.63-9.373-5.997-6.001-9.37-14.14-9.37-22.627v-96c0-8.487 3.373-16.627 9.37-22.627 6.003-6.001 14.144-9.373 22.63-9.373h96c8.486 0 16.627 3.372 22.63 9.373 5.997 6.001 9.37 14.14 9.37 22.627z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["technology-usb"],"grid":14},"attrs":[{}],"properties":{"order":715,"id":2,"name":"arduino-technology-usb","prevSize":28,"code":59655},"setIdx":0,"setId":1,"iconIdx":7},{"icon":{"paths":["M512 832c35.346 0 64-28.653 64-64s-28.654-64-64-64c-35.346 0-64 28.653-64 64s28.654 64 64 64z","M647.699 664.32c-8.442-0.122-16.493-3.571-22.401-9.6-14.863-14.9-32.519-26.721-51.957-34.787s-40.277-12.218-61.323-12.218c-21.046 0-41.884 4.152-61.323 12.218s-37.094 19.887-51.957 34.787c-5.996 5.958-14.106 9.306-22.56 9.306s-16.564-3.347-22.56-9.306c-5.96-5.997-9.306-14.106-9.306-22.559s3.345-16.564 9.306-22.56c20.801-20.803 45.495-37.304 72.673-48.563s56.308-17.053 85.727-17.053c29.418 0 58.548 5.795 85.726 17.053s51.875 27.761 72.675 48.563c4.512 4.476 7.59 10.194 8.838 16.426 1.254 6.232 0.614 12.695-1.818 18.562-2.438 5.875-6.573 10.886-11.866 14.4-5.299 3.514-11.52 5.37-17.875 5.331z","M919.373 392.639c-4.269 0.195-8.538-0.47-12.55-1.954s-7.686-3.757-10.81-6.686c-101.965-101.613-240.045-158.669-383.997-158.669-143.951 0-282.035 57.056-384 158.669-6.026 5.983-14.181 9.328-22.673 9.298s-16.623-3.432-22.607-9.458c-5.983-6.026-9.327-14.181-9.298-22.673s3.432-16.623 9.458-22.607c114.009-113.924 268.588-177.918 429.76-177.918 161.175 0 315.754 63.994 429.757 177.918 3.002 2.975 5.382 6.514 7.008 10.413s2.458 8.083 2.458 12.307c0 4.225-0.832 8.407-2.458 12.307s-4.006 7.439-7.008 10.413c-3.078 2.89-6.701 5.14-10.656 6.623-3.949 1.483-8.16 2.168-12.384 2.017z","M783.706 528.316c-4.211 0.024-8.384-0.783-12.288-2.375-3.898-1.592-7.443-3.939-10.432-6.905-32.691-32.703-71.501-58.646-114.221-76.346-42.715-17.7-88.501-26.81-134.74-26.81s-92.025 9.11-134.742 26.81c-42.717 17.7-81.529 43.643-114.218 76.346-6.122 5.242-13.996 7.982-22.049 7.671s-15.693-3.65-21.393-9.349c-5.699-5.699-9.037-13.338-9.348-21.392s2.428-15.928 7.67-22.050c78.009-77.968 183.788-121.767 294.080-121.767s216.072 43.799 294.081 121.767c5.958 5.996 9.306 14.106 9.306 22.56s-3.347 16.564-9.306 22.56c-5.958 5.912-14.003 9.245-22.4 9.28z"],"attrs":[{},{},{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["technology-connection"],"grid":14},"attrs":[{},{},{},{}],"properties":{"order":714,"id":3,"name":"arduino-technology-connection","prevSize":28,"code":59656},"setIdx":0,"setId":1,"iconIdx":8},{"icon":{"paths":["M512.006 991.994c-4.198 0.109-8.362-0.768-12.16-2.56-5.844-2.4-10.846-6.477-14.377-11.712-3.53-5.242-5.431-11.405-5.463-17.728v-370.877l-169.28 169.597c-2.984 2.989-6.525 5.35-10.424 6.97-3.898 1.613-8.077 2.445-12.296 2.445s-8.397-0.832-12.296-2.445c-3.898-1.619-7.441-3.981-10.424-6.97-2.984-2.982-5.35-6.522-6.965-10.419s-2.445-8.077-2.445-12.301c0-4.218 0.831-8.397 2.445-12.294s3.981-7.437 6.965-10.426l201.6-201.277-201.6-201.28c-6.026-6.026-9.411-14.198-9.411-22.72s3.385-16.694 9.411-22.72c6.026-6.026 14.198-9.411 22.72-9.411s16.694 3.386 22.72 9.411l169.28 169.6v-370.88c0.032-6.318 1.933-12.485 5.463-17.724s8.533-9.316 14.377-11.716c5.828-2.451 12.25-3.12 18.458-1.924s11.922 4.204 16.422 8.644l224.001 224c3.002 2.975 5.382 6.514 7.002 10.413 1.626 3.9 2.464 8.082 2.464 12.307s-0.838 8.407-2.464 12.307c-1.619 3.9-4 7.439-7.002 10.413l-201.601 201.28 201.601 201.277c3.002 2.976 5.382 6.515 7.002 10.419 1.626 3.898 2.464 8.077 2.464 12.301 0 4.23-0.838 8.41-2.464 12.307-1.619 3.904-4 7.443-7.002 10.413l-224.001 224c-2.99 2.97-6.536 5.318-10.435 6.906-3.899 1.594-8.074 2.4-12.285 2.374zM544.006 589.117v293.757l146.881-146.88-146.881-146.877zM544.006 141.117v293.76l146.881-146.88-146.881-146.88z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["technology-bluetooth"],"grid":14},"attrs":[{}],"properties":{"order":713,"id":4,"name":"arduino-technology-bluetooth","prevSize":28,"code":59657},"setIdx":0,"setId":1,"iconIdx":9},{"icon":{"paths":["M613.86 663.104c-8.983 0.005-17.72-2.956-24.841-8.429-7.126-5.474-12.241-13.144-14.55-21.825s-1.685-17.883 1.778-26.173c3.463-8.29 9.57-15.202 17.366-19.661l304.621-173.965-488.052-278.887v296.386c0 10.801-4.291 21.16-11.929 28.799-7.638 7.636-17.997 11.927-28.799 11.927s-21.16-4.291-28.799-11.927c-7.638-7.638-11.929-17.997-11.929-28.799v-366.545c-0.004-7.135 1.867-14.146 5.426-20.33s8.681-11.324 14.852-14.905c6.171-3.581 13.175-5.477 20.31-5.499s14.15 1.832 20.343 5.376l610.91 349.045c6.232 3.561 11.413 8.707 15.020 14.917 3.603 6.21 5.502 13.261 5.502 20.441s-1.899 14.232-5.502 20.441c-3.607 6.21-8.788 11.356-15.020 14.917l-366.545 209.324c-6.135 3.528-13.089 5.381-20.163 5.371z","M491.636 797.094c10.803 0 21.16-4.291 28.798-11.93s11.93-17.994 11.93-28.798c0-10.803-4.291-21.16-11.93-28.798s-17.994-11.93-28.798-11.93h-43.173c-1.991-17.389-5.534-34.56-10.589-51.316l41.949-41.951c3.798-3.793 6.81-8.304 8.867-13.265 2.053-4.962 3.109-10.277 3.109-15.649s-1.057-10.687-3.109-15.649c-2.057-4.962-5.069-9.467-8.867-13.265s-8.304-6.81-13.265-8.867c-4.961-2.053-10.279-3.114-15.649-3.114s-10.688 1.061-15.649 3.114c-4.961 2.057-9.47 5.069-13.267 8.867l-21.585 21.583c-14.553-22.109-34.216-40.387-57.327-53.285-23.11-12.902-48.988-20.052-75.444-20.838-26.456 0.787-52.334 7.936-75.444 20.838s-42.774 31.181-57.327 53.29l-21.585-21.588c-7.669-7.671-18.070-11.976-28.915-11.976s-21.247 4.305-28.916 11.976c-7.669 7.666-11.978 18.069-11.978 28.914s4.308 21.248 11.977 28.914l41.949 41.951c-5.055 16.756-8.599 33.927-10.589 51.316h-43.171c-10.802 0-21.161 4.291-28.799 11.93s-11.929 17.994-11.929 28.798c0 10.803 4.291 21.16 11.929 28.798s17.997 11.93 28.799 11.93h43.173c1.991 17.389 5.534 34.56 10.589 51.316l-1.222 1.224-40.727 40.727c-7.631 7.685-11.913 18.078-11.913 28.914 0 10.831 4.282 21.225 11.913 28.914 7.72 7.568 18.102 11.813 28.915 11.813s21.194-4.245 28.915-11.813l21.585-21.588c14.553 22.109 34.216 40.387 57.327 53.29s48.989 20.052 75.445 20.838c26.456-0.787 52.334-7.936 75.444-20.838s42.774-31.181 57.327-53.29l21.585 21.588c7.72 7.573 18.102 11.813 28.915 11.813s21.194-4.24 28.916-11.813c7.629-7.689 11.911-18.083 11.911-28.914 0-10.836-4.282-21.229-11.911-28.914l-41.95-41.951c5.055-16.756 8.599-33.927 10.589-51.316h43.174zM267.636 593.458c37.058 0 69.644 32.991 87.564 81.455h-175.127c17.92-48.463 50.506-81.455 87.564-81.455zM267.636 919.276c-55.389 0-101.818-74.533-101.818-162.909h203.636c0 88.376-46.429 162.909-101.818 162.909z"],"attrs":[{},{}],"tags":["arduino-debugger"],"grid":14,"isMulticolor":false,"isMulticolor2":false},"attrs":[{},{}],"properties":{"order":696,"id":5,"name":"arduino-debugger","prevSize":28,"code":59653},"setIdx":0,"setId":1,"iconIdx":10},{"icon":{"paths":["M1011.905 953.837l-286.249-286.249c66.349-81.248 98.942-184.882 91.034-289.478-7.903-104.597-55.702-202.157-133.511-272.506-77.804-70.35-179.671-108.111-284.533-105.473s-204.701 45.47-278.874 119.643c-74.172 74.172-117.006 174.012-119.643 278.874s35.123 206.729 105.473 284.537c70.35 77.804 167.91 125.604 272.506 133.506 104.597 7.907 208.231-24.685 289.479-91.034l286.249 286.249c3.8 3.832 8.323 6.874 13.305 8.95s10.328 3.145 15.727 3.145c5.398 0 10.745-1.071 15.727-3.145 4.986-2.075 9.506-5.117 13.31-8.95 3.832-3.804 6.874-8.323 8.95-13.31 2.075-4.982 3.145-10.328 3.145-15.727s-1.071-10.739-3.145-15.727c-2.075-4.982-5.117-9.506-8.95-13.305v0zM410.372 737.512c-64.702 0-127.952-19.184-181.75-55.132-53.798-35.944-95.728-87.038-120.49-146.816s-31.239-125.554-18.616-189.013c12.623-63.459 43.78-121.751 89.532-167.502s104.043-76.909 167.502-89.532c63.459-12.623 129.235-6.145 189.013 18.616s110.868 66.691 146.816 120.489c35.948 53.798 55.132 117.048 55.132 181.75 0 86.766-34.467 169.972-95.815 231.325-61.353 61.349-144.564 95.815-231.326 95.815v0z"],"attrs":[{}],"tags":["arduino-search"],"grid":14,"isMulticolor":false,"isMulticolor2":false},"attrs":[{}],"properties":{"order":689,"id":6,"name":"arduino-search","prevSize":28,"code":59649},"setIdx":0,"setId":1,"iconIdx":11},{"icon":{"paths":["M997.684 728.889c0 11.506-4.572 22.538-12.707 30.67s-19.165 12.707-30.67 12.707h-433.777c-11.506 0-22.538-4.572-30.673-12.707s-12.705-19.165-12.705-30.67 4.571-22.538 12.705-30.67c8.136-8.134 19.166-12.707 30.673-12.707h433.777c11.506 0 22.538 4.572 30.67 12.707s12.707 19.165 12.707 30.67z","M1201.991 351.068l-74.173-73.742v-199.104c0-11.503-4.572-22.539-12.707-30.673s-19.165-12.705-30.67-12.705h-910.933c-11.503 0-22.539 4.571-30.673 12.705s-12.705 19.168-12.705 30.673v130.133h-86.756c-11.504 0-22.539 4.571-30.673 12.705s-12.705 19.168-12.705 30.673v216.89c0 11.503 4.571 22.539 12.705 30.673s19.168 12.705 30.673 12.705h86.756v433.777c0 11.506 4.571 22.538 12.705 30.67s19.168 12.707 30.673 12.707h910.933c5.71 0.034 11.368-1.062 16.653-3.216 5.285-2.161 10.092-5.342 14.143-9.365l86.756-86.756c4.020-4.052 7.203-8.859 9.365-14.143 2.157-5.285 3.253-10.94 3.216-16.653v-477.156c0.034-5.708-1.062-11.369-3.216-16.654-2.161-5.285-5.342-10.092-9.365-14.145zM86.751 425.243v-130.133h216.89v130.133h-216.89zM1127.818 841.24l-61.159 61.159h-849.774v-390.4h130.133c11.503 0 22.539-4.571 30.673-12.705s12.705-19.168 12.705-30.673v-216.89c0-11.503-4.571-22.539-12.705-30.673s-19.168-12.705-30.673-12.705h-130.133v-86.756h824.177v173.51c-0.034 5.708 1.062 11.369 3.216 16.654 2.161 5.285 5.342 10.092 9.365 14.145l74.173 73.742v441.589z"],"width":1214.5714285714287,"attrs":[{},{}],"tags":["arduino-boards"],"grid":14,"isMulticolor":false,"isMulticolor2":false},"attrs":[{},{}],"properties":{"order":7,"id":7,"name":"arduino-boards","prevSize":28,"code":59650},"setIdx":0,"setId":1,"iconIdx":12},{"icon":{"paths":["M1021.954 918.445l-171.299-652.491c-2.901-9.738-9.491-17.956-18.363-22.903-8.876-4.946-19.333-6.228-29.138-3.571l-141.319 35.427v-230.085c0-10.325-4.102-20.227-11.403-27.529s-17.201-11.403-27.528-11.403h-155.725c-10.327 0-20.226 4.101-27.529 11.403-7.301 7.302-11.403 17.203-11.403 27.529v116.794h-155.725v-77.863c0-10.325-4.101-20.227-11.403-27.529s-17.203-11.403-27.529-11.403h-194.658c-10.325 0-20.227 4.101-27.529 11.403s-11.403 17.203-11.403 27.529v895.424c0 10.327 4.101 20.226 11.403 27.528s17.203 11.403 27.529 11.403h583.972c10.327 0 20.226-4.102 27.528-11.403s11.403-17.201 11.403-27.528v-454.332l119.909 456.668c2.207 8.565 7.265 16.124 14.34 21.433 7.079 5.308 15.751 8.044 24.591 7.764 3.364 0.379 6.758 0.379 10.123 0l164.678-43.212c9.975-2.589 18.518-9.032 23.75-17.908 2.581-4.721 4.156-9.926 4.627-15.288 0.467-5.361-0.178-10.759-1.9-15.857v0zM194.659 940.247h-116.794v-817.56h116.794v817.56zM428.248 940.247h-155.725v-700.766h155.725v700.766zM583.973 940.247h-77.863v-856.491h77.863v856.491zM847.15 923.896l-151.442-576.964 89.543-23.748 151.442 578.132-89.543 22.58z"],"attrs":[{}],"tags":["arduino-library"],"grid":14,"isMulticolor":false,"isMulticolor2":false},"attrs":[{}],"properties":{"order":691,"id":8,"name":"arduino-library","prevSize":28,"code":59651},"setIdx":0,"setId":1,"iconIdx":13},{"icon":{"paths":["M1189.198 204.801h-542.21l-189.437-189.951c-4.784-4.746-10.457-8.499-16.696-11.048s-12.918-3.84-19.656-3.801h-358.398c-13.579 0-26.602 5.394-36.204 14.997s-14.997 22.624-14.997 36.204v921.597c0 13.581 5.394 26.601 14.997 36.203s22.624 14.998 36.204 14.998h1126.397c13.581 0 26.601-5.395 36.203-14.998s14.998-22.621 14.998-36.203v-716.798c0-13.579-5.395-26.602-14.998-36.204s-22.621-14.997-36.203-14.997zM114.001 102.4h286.208l102.4 102.4h-388.606v-102.4zM1137.998 921.598h-1023.998v-614.398h1023.998v614.398z"],"width":1252,"attrs":[{}],"tags":["arduino-folder"],"grid":14,"isMulticolor":false,"isMulticolor2":false},"attrs":[{}],"properties":{"order":692,"id":9,"name":"arduino-folder","prevSize":28,"code":59652},"setIdx":0,"setId":1,"iconIdx":14},{"icon":{"paths":["M512.083 959.936c118.817 0 232.769-47.2 316.781-131.213 84.019-84.019 131.219-197.969 131.219-316.785 0-8.487-3.373-16.627-9.376-22.628-5.997-6.001-14.138-9.373-22.624-9.373s-16.627 3.372-22.63 9.373c-5.997 6.001-9.37 14.141-9.37 22.627-0.019 87.81-30.131 172.959-85.318 241.26s-132.115 115.622-217.962 134.086c-85.848 18.458-175.428 6.931-253.811-32.646-78.383-39.584-140.833-104.832-176.941-184.87-36.108-80.045-43.693-170.045-21.49-255.001s72.852-159.737 143.505-211.878c70.653-52.141 157.042-78.492 244.768-74.662s171.487 37.612 237.33 95.712h-158.081c-8.487 0-16.626 3.372-22.627 9.373s-9.373 14.141-9.373 22.627c0 8.487 3.372 16.627 9.373 22.628s14.14 9.372 22.627 9.372h224.001c8.486 0 16.627-3.371 22.624-9.372 6.003-6.001 9.376-14.141 9.376-22.628v-224c0-8.487-3.373-16.626-9.376-22.627-5.997-6.001-14.138-9.373-22.624-9.373s-16.627 3.371-22.63 9.373c-5.997 6.001-9.37 14.14-9.37 22.627v136.96c-55.162-46.332-120.678-78.68-191.002-94.301s-143.375-14.052-212.963 4.571c-69.588 18.623-133.659 53.753-186.78 102.41s-93.725 109.405-118.369 177.096c-24.644 67.69-32.602 140.324-23.199 211.745 9.404 71.419 35.891 139.521 77.216 198.523 41.325 59.008 96.27 107.174 160.174 140.422s134.885 50.598 206.922 50.573v0z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[{}]},"tags":["reload"],"grid":14},"attrs":[{}],"properties":{"order":681,"id":10,"name":"reload","prevSize":28,"code":59648},"setIdx":0,"setId":1,"iconIdx":15},{"icon":{"paths":["M846.857 600c34.857 20 46.857 65.143 26.857 100l-36.571 62.857c-20 34.857-65.143 46.857-100 26.857l-152-87.429v175.429c0 40-33.143 73.143-73.143 73.143h-73.143c-40 0-73.143-33.143-73.143-73.143v-175.429l-152 87.429c-34.857 20-80 8-100-26.857l-36.571-62.857c-20-34.857-8-80 26.857-100l152-88-152-88c-34.857-20-46.857-65.143-26.857-100l36.571-62.857c20-34.857 65.143-46.857 100-26.857l152 87.429v-175.429c0-40 33.143-73.143 73.143-73.143h73.143c40 0 73.143 33.143 73.143 73.143v175.429l152-87.429c34.857-20 80-8 100 26.857l36.571 62.857c20 34.857 8 80-26.857 100l-152 88z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["asterisk"],"defaultCode":61545,"grid":14},"attrs":[],"properties":{"name":"asterisk","id":11,"order":679,"prevSize":28,"code":61545},"setIdx":0,"setId":1,"iconIdx":16},{"icon":{"paths":["M804.571 420.571v109.714c0 30.286-24.571 54.857-54.857 54.857h-237.714v237.714c0 30.286-24.571 54.857-54.857 54.857h-109.714c-30.286 0-54.857-24.571-54.857-54.857v-237.714h-237.714c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h237.714v-237.714c0-30.286 24.571-54.857 54.857-54.857h109.714c30.286 0 54.857 24.571 54.857 54.857v237.714h237.714c30.286 0 54.857 24.571 54.857 54.857z"],"width":804.5714285714286,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["plus"],"defaultCode":61543,"grid":14},"attrs":[],"properties":{"name":"plus","id":12,"order":3,"prevSize":28,"code":61543},"setIdx":0,"setId":1,"iconIdx":17},{"icon":{"paths":["M402.286 717.714v137.143c0 12.571-10.286 22.857-22.857 22.857h-137.143c-12.571 0-22.857-10.286-22.857-22.857v-137.143c0-12.571 10.286-22.857 22.857-22.857h137.143c12.571 0 22.857 10.286 22.857 22.857zM582.857 374.857c0 108.571-73.714 150.286-128 180.571-33.714 19.429-54.857 58.857-54.857 75.429v0c0 12.571-9.714 27.429-22.857 27.429h-137.143c-12.571 0-20.571-19.429-20.571-32v-25.714c0-69.143 68.571-128.571 118.857-151.429 44-20 62.286-38.857 62.286-75.429 0-32-41.714-60.571-88-60.571-25.714 0-49.143 8-61.714 16.571-13.714 9.714-27.429 23.429-61.143 65.714-4.571 5.714-11.429 9.143-17.714 9.143-5.143 0-9.714-1.714-14.286-4.571l-93.714-71.429c-9.714-7.429-12-20-5.714-30.286 61.714-102.286 148.571-152 265.143-152 122.286 0 259.429 97.714 259.429 228.571z"],"width":634.88,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["question"],"defaultCode":61736,"grid":14},"attrs":[],"properties":{"name":"question","id":13,"order":4,"prevSize":28,"code":61736},"setIdx":0,"setId":1,"iconIdx":18},{"icon":{"paths":["M804.571 420.571v109.714c0 30.286-24.571 54.857-54.857 54.857h-694.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h694.857c30.286 0 54.857 24.571 54.857 54.857z"],"width":804.5714285714286,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["minus"],"defaultCode":61544,"grid":14},"attrs":[],"properties":{"name":"minus","id":14,"order":5,"prevSize":28,"code":61544},"setIdx":0,"setId":1,"iconIdx":19},{"icon":{"paths":["M877.714 128v640c0 80.571-120.571 109.714-182.857 109.714s-182.857-29.143-182.857-109.714 120.571-109.714 182.857-109.714c37.714 0 75.429 6.857 109.714 22.286v-306.857l-438.857 135.429v405.143c0 80.571-120.571 109.714-182.857 109.714s-182.857-29.143-182.857-109.714 120.571-109.714 182.857-109.714c37.714 0 75.429 6.857 109.714 22.286v-552.571c0-24 16-45.143 38.857-52.571l475.429-146.286c5.143-1.714 10.286-2.286 16-2.286 30.286 0 54.857 24.571 54.857 54.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["music"],"defaultCode":61441,"grid":14},"attrs":[],"properties":{"name":"music","id":15,"order":7,"prevSize":28,"code":61441},"setIdx":0,"setId":1,"iconIdx":20},{"icon":{"paths":["M658.286 475.429c0-141.143-114.857-256-256-256s-256 114.857-256 256 114.857 256 256 256 256-114.857 256-256zM950.857 950.857c0 40-33.143 73.143-73.143 73.143-19.429 0-38.286-8-51.429-21.714l-196-195.429c-66.857 46.286-146.857 70.857-228 70.857-222.286 0-402.286-180-402.286-402.286s180-402.286 402.286-402.286 402.286 180 402.286 402.286c0 81.143-24.571 161.143-70.857 228l196 196c13.143 13.143 21.143 32 21.143 51.429z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["search"],"defaultCode":61442,"grid":14},"attrs":[],"properties":{"name":"search","id":16,"order":8,"prevSize":28,"code":61442},"setIdx":0,"setId":1,"iconIdx":21},{"icon":{"paths":["M950.857 859.429v-438.857c-12 13.714-25.143 26.286-39.429 37.714-81.714 62.857-164 126.857-243.429 193.143-42.857 36-96 80-155.429 80h-1.143c-59.429 0-112.571-44-155.429-80-79.429-66.286-161.714-130.286-243.429-193.143-14.286-11.429-27.429-24-39.429-37.714v438.857c0 9.714 8.571 18.286 18.286 18.286h841.143c9.714 0 18.286-8.571 18.286-18.286zM950.857 258.857c0-14.286 3.429-39.429-18.286-39.429h-841.143c-9.714 0-18.286 8.571-18.286 18.286 0 65.143 32.571 121.714 84 162.286 76.571 60 153.143 120.571 229.143 181.143 30.286 24.571 85.143 77.143 125.143 77.143h1.143c40 0 94.857-52.571 125.143-77.143 76-60.571 152.571-121.143 229.143-181.143 37.143-29.143 84-92.571 84-141.143zM1024 237.714v621.714c0 50.286-41.143 91.429-91.429 91.429h-841.143c-50.286 0-91.429-41.143-91.429-91.429v-621.714c0-50.286 41.143-91.429 91.429-91.429h841.143c50.286 0 91.429 41.143 91.429 91.429z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["envelope-o"],"defaultCode":61443,"grid":14},"attrs":[],"properties":{"name":"envelope-o","id":17,"order":9,"prevSize":28,"code":61443},"setIdx":0,"setId":1,"iconIdx":22},{"icon":{"paths":["M512 950.857c-9.143 0-18.286-3.429-25.143-10.286l-356.571-344c-4.571-4-130.286-118.857-130.286-256 0-167.429 102.286-267.429 273.143-267.429 100 0 193.714 78.857 238.857 123.429 45.143-44.571 138.857-123.429 238.857-123.429 170.857 0 273.143 100 273.143 267.429 0 137.143-125.714 252-130.857 257.143l-356 342.857c-6.857 6.857-16 10.286-25.143 10.286z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["heart"],"defaultCode":61444,"grid":14},"attrs":[],"properties":{"name":"heart","id":18,"order":10,"prevSize":28,"code":61444},"setIdx":0,"setId":1,"iconIdx":23},{"icon":{"paths":["M950.857 369.714c0 10.286-7.429 20-14.857 27.429l-207.429 202.286 49.143 285.714c0.571 4 0.571 7.429 0.571 11.429 0 14.857-6.857 28.571-23.429 28.571-8 0-16-2.857-22.857-6.857l-256.571-134.857-256.571 134.857c-7.429 4-14.857 6.857-22.857 6.857-16.571 0-24-13.714-24-28.571 0-4 0.571-7.429 1.143-11.429l49.143-285.714-208-202.286c-6.857-7.429-14.286-17.143-14.286-27.429 0-17.143 17.714-24 32-26.286l286.857-41.714 128.571-260c5.143-10.857 14.857-23.429 28-23.429s22.857 12.571 28 23.429l128.571 260 286.857 41.714c13.714 2.286 32 9.143 32 26.286z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["star"],"defaultCode":61445,"grid":14},"attrs":[],"properties":{"name":"star","id":19,"order":11,"prevSize":28,"code":61445},"setIdx":0,"setId":1,"iconIdx":24},{"icon":{"paths":["M649.714 573.714l174.857-169.714-241.143-35.429-108-218.286-108 218.286-241.143 35.429 174.857 169.714-41.714 240.571 216-113.714 215.429 113.714zM950.857 369.714c0 10.286-7.429 20-14.857 27.429l-207.429 202.286 49.143 285.714c0.571 4 0.571 7.429 0.571 11.429 0 15.429-6.857 28.571-23.429 28.571-8 0-16-2.857-22.857-6.857l-256.571-134.857-256.571 134.857c-7.429 4-14.857 6.857-22.857 6.857-16.571 0-24-13.714-24-28.571 0-4 0.571-7.429 1.143-11.429l49.143-285.714-208-202.286c-6.857-7.429-14.286-17.143-14.286-27.429 0-17.143 17.714-24 32-26.286l286.857-41.714 128.571-260c5.143-10.857 14.857-23.429 28-23.429s22.857 12.571 28 23.429l128.571 260 286.857 41.714c13.714 2.286 32 9.143 32 26.286z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["star-o"],"defaultCode":61446,"grid":14},"attrs":[],"properties":{"name":"star-o","id":20,"order":12,"prevSize":28,"code":61446},"setIdx":0,"setId":1,"iconIdx":25},{"icon":{"paths":["M731.429 799.429c0 83.429-54.857 151.429-121.714 151.429h-488c-66.857 0-121.714-68-121.714-151.429 0-150.286 37.143-324 186.857-324 46.286 45.143 109.143 73.143 178.857 73.143s132.571-28 178.857-73.143c149.714 0 186.857 173.714 186.857 324zM585.143 292.571c0 121.143-98.286 219.429-219.429 219.429s-219.429-98.286-219.429-219.429 98.286-219.429 219.429-219.429 219.429 98.286 219.429 219.429z"],"width":731.4285714285713,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["user"],"defaultCode":61447,"grid":14},"attrs":[],"properties":{"name":"user","id":21,"order":13,"prevSize":28,"code":61447},"setIdx":0,"setId":1,"iconIdx":26},{"icon":{"paths":["M219.429 914.286v-73.143c0-20-16.571-36.571-36.571-36.571h-73.143c-20 0-36.571 16.571-36.571 36.571v73.143c0 20 16.571 36.571 36.571 36.571h73.143c20 0 36.571-16.571 36.571-36.571zM219.429 694.857v-73.143c0-20-16.571-36.571-36.571-36.571h-73.143c-20 0-36.571 16.571-36.571 36.571v73.143c0 20 16.571 36.571 36.571 36.571h73.143c20 0 36.571-16.571 36.571-36.571zM219.429 475.429v-73.143c0-20-16.571-36.571-36.571-36.571h-73.143c-20 0-36.571 16.571-36.571 36.571v73.143c0 20 16.571 36.571 36.571 36.571h73.143c20 0 36.571-16.571 36.571-36.571zM804.571 914.286v-292.571c0-20-16.571-36.571-36.571-36.571h-438.857c-20 0-36.571 16.571-36.571 36.571v292.571c0 20 16.571 36.571 36.571 36.571h438.857c20 0 36.571-16.571 36.571-36.571zM219.429 256v-73.143c0-20-16.571-36.571-36.571-36.571h-73.143c-20 0-36.571 16.571-36.571 36.571v73.143c0 20 16.571 36.571 36.571 36.571h73.143c20 0 36.571-16.571 36.571-36.571zM1024 914.286v-73.143c0-20-16.571-36.571-36.571-36.571h-73.143c-20 0-36.571 16.571-36.571 36.571v73.143c0 20 16.571 36.571 36.571 36.571h73.143c20 0 36.571-16.571 36.571-36.571zM804.571 475.429v-292.571c0-20-16.571-36.571-36.571-36.571h-438.857c-20 0-36.571 16.571-36.571 36.571v292.571c0 20 16.571 36.571 36.571 36.571h438.857c20 0 36.571-16.571 36.571-36.571zM1024 694.857v-73.143c0-20-16.571-36.571-36.571-36.571h-73.143c-20 0-36.571 16.571-36.571 36.571v73.143c0 20 16.571 36.571 36.571 36.571h73.143c20 0 36.571-16.571 36.571-36.571zM1024 475.429v-73.143c0-20-16.571-36.571-36.571-36.571h-73.143c-20 0-36.571 16.571-36.571 36.571v73.143c0 20 16.571 36.571 36.571 36.571h73.143c20 0 36.571-16.571 36.571-36.571zM1024 256v-73.143c0-20-16.571-36.571-36.571-36.571h-73.143c-20 0-36.571 16.571-36.571 36.571v73.143c0 20 16.571 36.571 36.571 36.571h73.143c20 0 36.571-16.571 36.571-36.571zM1097.143 164.571v768c0 50.286-41.143 91.429-91.429 91.429h-914.286c-50.286 0-91.429-41.143-91.429-91.429v-768c0-50.286 41.143-91.429 91.429-91.429h914.286c50.286 0 91.429 41.143 91.429 91.429z"],"width":1097.142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["film"],"defaultCode":61448,"grid":14},"attrs":[],"properties":{"name":"film","id":22,"order":14,"prevSize":28,"code":61448},"setIdx":0,"setId":1,"iconIdx":27},{"icon":{"paths":["M438.857 585.143v219.429c0 40-33.143 73.143-73.143 73.143h-292.571c-40 0-73.143-33.143-73.143-73.143v-219.429c0-40 33.143-73.143 73.143-73.143h292.571c40 0 73.143 33.143 73.143 73.143zM438.857 146.286v219.429c0 40-33.143 73.143-73.143 73.143h-292.571c-40 0-73.143-33.143-73.143-73.143v-219.429c0-40 33.143-73.143 73.143-73.143h292.571c40 0 73.143 33.143 73.143 73.143zM950.857 585.143v219.429c0 40-33.143 73.143-73.143 73.143h-292.571c-40 0-73.143-33.143-73.143-73.143v-219.429c0-40 33.143-73.143 73.143-73.143h292.571c40 0 73.143 33.143 73.143 73.143zM950.857 146.286v219.429c0 40-33.143 73.143-73.143 73.143h-292.571c-40 0-73.143-33.143-73.143-73.143v-219.429c0-40 33.143-73.143 73.143-73.143h292.571c40 0 73.143 33.143 73.143 73.143z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["th-large"],"defaultCode":61449,"grid":14},"attrs":[],"properties":{"name":"th-large","id":23,"order":15,"prevSize":28,"code":61449},"setIdx":0,"setId":1,"iconIdx":28},{"icon":{"paths":["M292.571 713.143v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM292.571 420.571v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM658.286 713.143v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM292.571 128v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM658.286 420.571v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM1024 713.143v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM658.286 128v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM1024 420.571v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM1024 128v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["th"],"defaultCode":61450,"grid":14},"attrs":[],"properties":{"name":"th","id":24,"order":16,"prevSize":28,"code":61450},"setIdx":0,"setId":1,"iconIdx":29},{"icon":{"paths":["M292.571 713.143v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM292.571 420.571v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM1024 713.143v109.714c0 30.286-24.571 54.857-54.857 54.857h-548.571c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h548.571c30.286 0 54.857 24.571 54.857 54.857zM292.571 128v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM1024 420.571v109.714c0 30.286-24.571 54.857-54.857 54.857h-548.571c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h548.571c30.286 0 54.857 24.571 54.857 54.857zM1024 128v109.714c0 30.286-24.571 54.857-54.857 54.857h-548.571c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h548.571c30.286 0 54.857 24.571 54.857 54.857z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["th-list"],"defaultCode":61451,"grid":14},"attrs":[],"properties":{"name":"th-list","id":25,"order":17,"prevSize":28,"code":61451},"setIdx":0,"setId":1,"iconIdx":30},{"icon":{"paths":["M725.322 782.343c3.477 3.448 6.237 7.547 8.118 12.069 1.885 4.515 2.853 9.364 2.853 14.259s-0.967 9.744-2.853 14.266c-1.881 4.515-4.641 8.623-8.118 12.069-3.448 3.472-7.547 6.232-12.069 8.118-4.515 1.881-9.364 2.848-14.259 2.848s-9.744-0.967-14.266-2.848c-4.522-1.885-8.623-4.646-12.069-8.118l-270.371-270.375-270.372 270.375c-3.448 3.472-7.549 6.232-12.069 8.118-4.519 1.881-9.366 2.848-14.263 2.848s-9.744-0.967-14.263-2.848c-4.519-1.885-8.622-4.646-12.069-8.118-3.474-3.448-6.235-7.555-8.118-12.069-1.884-4.522-2.853-9.37-2.853-14.266s0.97-9.744 2.853-14.259c1.884-4.522 4.643-8.623 8.118-12.069l270.372-270.375-270.372-270.372c-3.456-3.456-6.201-7.565-8.072-12.082s-2.835-9.36-2.835-14.25c0-4.891 0.964-9.732 2.835-14.25s4.617-8.626 8.072-12.081c3.456-3.456 7.564-6.201 12.081-8.072s9.361-2.835 14.25-2.835c4.891 0 9.732 0.964 14.25 2.835s8.626 4.617 12.081 8.072l270.372 270.372 270.371-270.372c6.984-6.983 16.455-10.909 26.335-10.909 9.875 0 19.347 3.923 26.33 10.909s10.909 16.456 10.909 26.333c0 9.877-3.923 19.348-10.909 26.333l-270.371 270.372 270.371 270.375z"],"width":804.5714285714286,"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[{}]},"tags":["close","remove","times"],"defaultCode":61453,"grid":14},"attrs":[{}],"properties":{"name":"close, remove, times","id":26,"order":19,"prevSize":28,"code":61453},"setIdx":0,"setId":1,"iconIdx":31},{"icon":{"paths":["M585.143 457.143v36.571c0 9.714-8.571 18.286-18.286 18.286h-128v128c0 9.714-8.571 18.286-18.286 18.286h-36.571c-9.714 0-18.286-8.571-18.286-18.286v-128h-128c-9.714 0-18.286-8.571-18.286-18.286v-36.571c0-9.714 8.571-18.286 18.286-18.286h128v-128c0-9.714 8.571-18.286 18.286-18.286h36.571c9.714 0 18.286 8.571 18.286 18.286v128h128c9.714 0 18.286 8.571 18.286 18.286zM658.286 475.429c0-141.143-114.857-256-256-256s-256 114.857-256 256 114.857 256 256 256 256-114.857 256-256zM950.857 950.857c0 40.571-32.571 73.143-73.143 73.143-19.429 0-38.286-8-51.429-21.714l-196-195.429c-66.857 46.286-146.857 70.857-228 70.857-222.286 0-402.286-180-402.286-402.286s180-402.286 402.286-402.286 402.286 180 402.286 402.286c0 81.143-24.571 161.143-70.857 228l196 196c13.143 13.143 21.143 32 21.143 51.429z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["search-plus"],"defaultCode":61454,"grid":14},"attrs":[],"properties":{"name":"search-plus","id":27,"order":20,"prevSize":28,"code":61454},"setIdx":0,"setId":1,"iconIdx":32},{"icon":{"paths":["M585.143 457.143v36.571c0 9.714-8.571 18.286-18.286 18.286h-329.143c-9.714 0-18.286-8.571-18.286-18.286v-36.571c0-9.714 8.571-18.286 18.286-18.286h329.143c9.714 0 18.286 8.571 18.286 18.286zM658.286 475.429c0-141.143-114.857-256-256-256s-256 114.857-256 256 114.857 256 256 256 256-114.857 256-256zM950.857 950.857c0 40.571-32.571 73.143-73.143 73.143-19.429 0-38.286-8-51.429-21.714l-196-195.429c-66.857 46.286-146.857 70.857-228 70.857-222.286 0-402.286-180-402.286-402.286s180-402.286 402.286-402.286 402.286 180 402.286 402.286c0 81.143-24.571 161.143-70.857 228l196 196c13.143 13.143 21.143 32 21.143 51.429z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["search-minus"],"defaultCode":61456,"grid":14},"attrs":[],"properties":{"name":"search-minus","id":28,"order":21,"prevSize":28,"code":61456},"setIdx":0,"setId":1,"iconIdx":33},{"icon":{"paths":["M877.714 512c0 241.714-197.143 438.857-438.857 438.857s-438.857-197.143-438.857-438.857c0-138.857 64-266.857 175.429-350.286 32.571-24.571 78.286-18.286 102.286 14.286 24.571 32 17.714 78.286-14.286 102.286-74.286 56-117.143 141.143-117.143 233.714 0 161.143 131.429 292.571 292.571 292.571s292.571-131.429 292.571-292.571c0-92.571-42.857-177.714-117.143-233.714-32-24-38.857-70.286-14.286-102.286 24-32.571 70.286-38.857 102.286-14.286 111.429 83.429 175.429 211.429 175.429 350.286zM512 73.143v365.714c0 40-33.143 73.143-73.143 73.143s-73.143-33.143-73.143-73.143v-365.714c0-40 33.143-73.143 73.143-73.143s73.143 33.143 73.143 73.143z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["power-off"],"defaultCode":61457,"grid":14},"attrs":[],"properties":{"name":"power-off","id":29,"order":22,"prevSize":28,"code":61457},"setIdx":0,"setId":1,"iconIdx":34},{"icon":{"paths":["M146.286 822.857v109.714c0 10.286-8 18.286-18.286 18.286h-109.714c-10.286 0-18.286-8-18.286-18.286v-109.714c0-10.286 8-18.286 18.286-18.286h109.714c10.286 0 18.286 8 18.286 18.286zM365.714 749.714v182.857c0 10.286-8 18.286-18.286 18.286h-109.714c-10.286 0-18.286-8-18.286-18.286v-182.857c0-10.286 8-18.286 18.286-18.286h109.714c10.286 0 18.286 8 18.286 18.286zM585.143 603.429v329.143c0 10.286-8 18.286-18.286 18.286h-109.714c-10.286 0-18.286-8-18.286-18.286v-329.143c0-10.286 8-18.286 18.286-18.286h109.714c10.286 0 18.286 8 18.286 18.286zM804.571 384v548.571c0 10.286-8 18.286-18.286 18.286h-109.714c-10.286 0-18.286-8-18.286-18.286v-548.571c0-10.286 8-18.286 18.286-18.286h109.714c10.286 0 18.286 8 18.286 18.286zM1024 91.429v841.143c0 10.286-8 18.286-18.286 18.286h-109.714c-10.286 0-18.286-8-18.286-18.286v-841.143c0-10.286 8-18.286 18.286-18.286h109.714c10.286 0 18.286 8 18.286 18.286z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["signal"],"defaultCode":61458,"grid":14},"attrs":[],"properties":{"name":"signal","id":30,"order":23,"prevSize":28,"code":61458},"setIdx":0,"setId":1,"iconIdx":35},{"icon":{"paths":["M585.143 512c0-80.571-65.714-146.286-146.286-146.286s-146.286 65.714-146.286 146.286 65.714 146.286 146.286 146.286 146.286-65.714 146.286-146.286zM877.714 449.714v126.857c0 8.571-6.857 18.857-16 20.571l-105.714 16c-6.286 18.286-13.143 35.429-22.286 52 19.429 28 40 53.143 61.143 78.857 3.429 4 5.714 9.143 5.714 14.286s-1.714 9.143-5.143 13.143c-13.714 18.286-90.857 102.286-110.286 102.286-5.143 0-10.286-2.286-14.857-5.143l-78.857-61.714c-16.571 8.571-34.286 16-52 21.714-4 34.857-7.429 72-16.571 106.286-2.286 9.143-10.286 16-20.571 16h-126.857c-10.286 0-19.429-7.429-20.571-17.143l-16-105.143c-17.714-5.714-34.857-12.571-51.429-21.143l-80.571 61.143c-4 3.429-9.143 5.143-14.286 5.143s-10.286-2.286-14.286-6.286c-30.286-27.429-70.286-62.857-94.286-96-2.857-4-4-8.571-4-13.143 0-5.143 1.714-9.143 4.571-13.143 19.429-26.286 40.571-51.429 60-78.286-9.714-18.286-17.714-37.143-23.429-56.571l-104.571-15.429c-9.714-1.714-16.571-10.857-16.571-20.571v-126.857c0-8.571 6.857-18.857 15.429-20.571l106.286-16c5.714-18.286 13.143-35.429 22.286-52.571-19.429-27.429-40-53.143-61.143-78.857-3.429-4-5.714-8.571-5.714-13.714s2.286-9.143 5.143-13.143c13.714-18.857 90.857-102.286 110.286-102.286 5.143 0 10.286 2.286 14.857 5.714l78.857 61.143c16.571-8.571 34.286-16 52-21.714 4-34.857 7.429-72 16.571-106.286 2.286-9.143 10.286-16 20.571-16h126.857c10.286 0 19.429 7.429 20.571 17.143l16 105.143c17.714 5.714 34.857 12.571 51.429 21.143l81.143-61.143c3.429-3.429 8.571-5.143 13.714-5.143s10.286 2.286 14.286 5.714c30.286 28 70.286 63.429 94.286 97.143 2.857 3.429 4 8 4 12.571 0 5.143-1.714 9.143-4.571 13.143-19.429 26.286-40.571 51.429-60 78.286 9.714 18.286 17.714 37.143 23.429 56l104.571 16c9.714 1.714 16.571 10.857 16.571 20.571z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["cog","gear"],"defaultCode":61459,"grid":14},"attrs":[],"properties":{"name":"cog, gear","id":31,"order":24,"prevSize":28,"code":61459},"setIdx":0,"setId":1,"iconIdx":36},{"icon":{"paths":["M292.571 420.571v329.143c0 10.286-8 18.286-18.286 18.286h-36.571c-10.286 0-18.286-8-18.286-18.286v-329.143c0-10.286 8-18.286 18.286-18.286h36.571c10.286 0 18.286 8 18.286 18.286zM438.857 420.571v329.143c0 10.286-8 18.286-18.286 18.286h-36.571c-10.286 0-18.286-8-18.286-18.286v-329.143c0-10.286 8-18.286 18.286-18.286h36.571c10.286 0 18.286 8 18.286 18.286zM585.143 420.571v329.143c0 10.286-8 18.286-18.286 18.286h-36.571c-10.286 0-18.286-8-18.286-18.286v-329.143c0-10.286 8-18.286 18.286-18.286h36.571c10.286 0 18.286 8 18.286 18.286zM658.286 834.286v-541.714h-512v541.714c0 27.429 15.429 43.429 18.286 43.429h475.429c2.857 0 18.286-16 18.286-43.429zM274.286 219.429h256l-27.429-66.857c-1.714-2.286-6.857-5.714-9.714-6.286h-181.143c-3.429 0.571-8 4-9.714 6.286zM804.571 237.714v36.571c0 10.286-8 18.286-18.286 18.286h-54.857v541.714c0 62.857-41.143 116.571-91.429 116.571h-475.429c-50.286 0-91.429-51.429-91.429-114.286v-544h-54.857c-10.286 0-18.286-8-18.286-18.286v-36.571c0-10.286 8-18.286 18.286-18.286h176.571l40-95.429c11.429-28 45.714-50.857 76-50.857h182.857c30.286 0 64.571 22.857 76 50.857l40 95.429h176.571c10.286 0 18.286 8 18.286 18.286z"],"width":804.5714285714286,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["trash-o"],"defaultCode":61460,"grid":14},"attrs":[],"properties":{"name":"trash-o","id":32,"order":25,"prevSize":28,"code":61460},"setIdx":0,"setId":1,"iconIdx":37},{"icon":{"paths":["M804.571 566.857v274.286c0 20-16.571 36.571-36.571 36.571h-219.429v-219.429h-146.286v219.429h-219.429c-20 0-36.571-16.571-36.571-36.571v-274.286c0-1.143 0.571-2.286 0.571-3.429l328.571-270.857 328.571 270.857c0.571 1.143 0.571 2.286 0.571 3.429zM932 527.429l-35.429 42.286c-2.857 3.429-7.429 5.714-12 6.286h-1.714c-4.571 0-8.571-1.143-12-4l-395.429-329.714-395.429 329.714c-4 2.857-8.571 4.571-13.714 4-4.571-0.571-9.143-2.857-12-6.286l-35.429-42.286c-6.286-7.429-5.143-19.429 2.286-25.714l410.857-342.286c24-20 62.857-20 86.857 0l139.429 116.571v-111.429c0-10.286 8-18.286 18.286-18.286h109.714c10.286 0 18.286 8 18.286 18.286v233.143l125.143 104c7.429 6.286 8.571 18.286 2.286 25.714z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["home"],"defaultCode":61461,"grid":14},"attrs":[],"properties":{"name":"home","id":33,"order":26,"prevSize":28,"code":61461},"setIdx":0,"setId":1,"iconIdx":38},{"icon":{"paths":["M838.857 217.143c21.143 21.143 38.857 63.429 38.857 93.714v658.286c0 30.286-24.571 54.857-54.857 54.857h-768c-30.286 0-54.857-24.571-54.857-54.857v-914.286c0-30.286 24.571-54.857 54.857-54.857h512c30.286 0 72.571 17.714 93.714 38.857zM585.143 77.714v214.857h214.857c-3.429-9.714-8.571-19.429-12.571-23.429l-178.857-178.857c-4-4-13.714-9.143-23.429-12.571zM804.571 950.857v-585.143h-237.714c-30.286 0-54.857-24.571-54.857-54.857v-237.714h-438.857v877.714h731.429z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["file-o"],"defaultCode":61462,"grid":14},"attrs":[],"properties":{"name":"file-o","id":34,"order":27,"prevSize":28,"code":61462},"setIdx":0,"setId":1,"iconIdx":39},{"icon":{"paths":["M512 310.857v256c0 10.286-8 18.286-18.286 18.286h-182.857c-10.286 0-18.286-8-18.286-18.286v-36.571c0-10.286 8-18.286 18.286-18.286h128v-201.143c0-10.286 8-18.286 18.286-18.286h36.571c10.286 0 18.286 8 18.286 18.286zM749.714 512c0-171.429-139.429-310.857-310.857-310.857s-310.857 139.429-310.857 310.857 139.429 310.857 310.857 310.857 310.857-139.429 310.857-310.857zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["clock-o"],"defaultCode":61463,"grid":14},"attrs":[],"properties":{"name":"clock-o","id":35,"order":28,"prevSize":28,"code":61463},"setIdx":0,"setId":1,"iconIdx":40},{"icon":{"paths":["M731.429 768c0-20-16.571-36.571-36.571-36.571s-36.571 16.571-36.571 36.571 16.571 36.571 36.571 36.571 36.571-16.571 36.571-36.571zM877.714 768c0-20-16.571-36.571-36.571-36.571s-36.571 16.571-36.571 36.571 16.571 36.571 36.571 36.571 36.571-16.571 36.571-36.571zM950.857 640v182.857c0 30.286-24.571 54.857-54.857 54.857h-841.143c-30.286 0-54.857-24.571-54.857-54.857v-182.857c0-30.286 24.571-54.857 54.857-54.857h265.714l77.143 77.714c21.143 20.571 48.571 32 77.714 32s56.571-11.429 77.714-32l77.714-77.714h265.143c30.286 0 54.857 24.571 54.857 54.857zM765.143 314.857c5.714 13.714 2.857 29.714-8 40l-256 256c-6.857 7.429-16.571 10.857-25.714 10.857s-18.857-3.429-25.714-10.857l-256-256c-10.857-10.286-13.714-26.286-8-40 5.714-13.143 18.857-22.286 33.714-22.286h146.286v-256c0-20 16.571-36.571 36.571-36.571h146.286c20 0 36.571 16.571 36.571 36.571v256h146.286c14.857 0 28 9.143 33.714 22.286z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["download"],"defaultCode":61465,"grid":14},"attrs":[],"properties":{"name":"download","id":36,"order":30,"prevSize":28,"code":61465},"setIdx":0,"setId":1,"iconIdx":41},{"icon":{"paths":["M640 530.286c0 5.143-2.286 9.714-5.714 13.714l-182.286 182.286c-4 3.429-8.571 5.143-13.143 5.143s-9.143-1.714-13.143-5.143l-182.857-182.857c-5.143-5.714-6.857-13.143-4-20s9.714-11.429 17.143-11.429h109.714v-201.143c0-10.286 8-18.286 18.286-18.286h109.714c10.286 0 18.286 8 18.286 18.286v201.143h109.714c10.286 0 18.286 8 18.286 18.286zM438.857 201.143c-171.429 0-310.857 139.429-310.857 310.857s139.429 310.857 310.857 310.857 310.857-139.429 310.857-310.857-139.429-310.857-310.857-310.857zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857v0c242.286 0 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["arrow-circle-o-down"],"defaultCode":61466,"grid":14},"attrs":[],"properties":{"name":"arrow-circle-o-down","id":37,"order":31,"prevSize":28,"code":61466},"setIdx":0,"setId":1,"iconIdx":42},{"icon":{"paths":["M638.857 500.571c-2.857 6.857-9.714 11.429-17.143 11.429h-109.714v201.143c0 10.286-8 18.286-18.286 18.286h-109.714c-10.286 0-18.286-8-18.286-18.286v-201.143h-109.714c-10.286 0-18.286-8-18.286-18.286 0-5.143 2.286-9.714 5.714-13.714l182.286-182.286c4-3.429 8.571-5.143 13.143-5.143s9.143 1.714 13.143 5.143l182.857 182.857c5.143 5.714 6.857 13.143 4 20zM438.857 201.143c-171.429 0-310.857 139.429-310.857 310.857s139.429 310.857 310.857 310.857 310.857-139.429 310.857-310.857-139.429-310.857-310.857-310.857zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857v0c242.286 0 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["arrow-circle-o-up"],"defaultCode":61467,"grid":14},"attrs":[],"properties":{"name":"arrow-circle-o-up","id":38,"order":32,"prevSize":28,"code":61467},"setIdx":0,"setId":1,"iconIdx":43},{"icon":{"paths":["M584.571 548.571h180.571c-1.143-2.857-1.714-6.286-2.857-9.143l-121.143-283.429h-404.571l-121.143 283.429c-1.143 2.857-1.714 6.286-2.857 9.143h180.571l54.286 109.714h182.857zM877.714 565.714v275.429c0 20-16.571 36.571-36.571 36.571h-804.571c-20 0-36.571-16.571-36.571-36.571v-275.429c0-20.571 6.286-50.857 14.286-70.286l136-315.429c8-18.857 30.857-33.714 50.857-33.714h475.429c20 0 42.857 14.857 50.857 33.714l136 315.429c8 19.429 14.286 49.714 14.286 70.286z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["inbox"],"defaultCode":61468,"grid":14},"attrs":[],"properties":{"name":"inbox","id":39,"order":33,"prevSize":28,"code":61468},"setIdx":0,"setId":1,"iconIdx":44},{"icon":{"paths":["M676.571 512c0 13.143-6.857 25.143-18.286 31.429l-310.857 182.857c-5.714 3.429-12 5.143-18.286 5.143s-12.571-1.714-18.286-4.571c-11.429-6.857-18.286-18.857-18.286-32v-365.714c0-13.143 6.857-25.143 18.286-32 11.429-6.286 25.714-6.286 36.571 0.571l310.857 182.857c11.429 6.286 18.286 18.286 18.286 31.429zM749.714 512c0-171.429-139.429-310.857-310.857-310.857s-310.857 139.429-310.857 310.857 139.429 310.857 310.857 310.857 310.857-139.429 310.857-310.857zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["play-circle-o"],"defaultCode":61469,"grid":14},"attrs":[],"properties":{"name":"play-circle-o","id":40,"order":34,"prevSize":28,"code":61469},"setIdx":0,"setId":1,"iconIdx":45},{"icon":{"paths":["M877.714 146.286v256c0 20-16.571 36.571-36.571 36.571h-256c-14.857 0-28-9.143-33.714-22.857-5.714-13.143-2.857-29.143 8-39.429l78.857-78.857c-53.714-49.714-124.571-78.286-199.429-78.286-161.143 0-292.571 131.429-292.571 292.571s131.429 292.571 292.571 292.571c90.857 0 174.857-41.143 230.857-113.714 2.857-4 8-6.286 13.143-6.857 5.143 0 10.286 1.714 14.286 5.143l78.286 78.857c6.857 6.286 6.857 17.143 1.143 24.571-83.429 100.571-206.857 158.286-337.714 158.286-241.714 0-438.857-197.143-438.857-438.857s197.143-438.857 438.857-438.857c112.571 0 221.714 45.143 302.286 121.143l74.286-73.714c10.286-10.857 26.286-13.714 40-8 13.143 5.714 22.286 18.857 22.286 33.714z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["repeat","rotate-right"],"defaultCode":61470,"grid":14},"attrs":[],"properties":{"name":"repeat, rotate-right","id":41,"order":35,"prevSize":28,"code":61470},"setIdx":0,"setId":1,"iconIdx":46},{"icon":{"paths":["M863.429 603.429c0 1.143 0 2.857-0.571 4-48.571 202.286-215.429 343.429-426.286 343.429-111.429 0-219.429-44-300.571-121.143l-73.714 73.714c-6.857 6.857-16 10.857-25.714 10.857-20 0-36.571-16.571-36.571-36.571v-256c0-20 16.571-36.571 36.571-36.571h256c20 0 36.571 16.571 36.571 36.571 0 9.714-4 18.857-10.857 25.714l-78.286 78.286c53.714 50.286 125.143 78.857 198.857 78.857 101.714 0 196-52.571 249.143-139.429 13.714-22.286 20.571-44 30.286-66.857 2.857-8 8.571-13.143 17.143-13.143h109.714c10.286 0 18.286 8.571 18.286 18.286zM877.714 146.286v256c0 20-16.571 36.571-36.571 36.571h-256c-20 0-36.571-16.571-36.571-36.571 0-9.714 4-18.857 10.857-25.714l78.857-78.857c-54.286-50.286-125.714-78.286-199.429-78.286-101.714 0-196 52.571-249.143 139.429-13.714 22.286-20.571 44-30.286 66.857-2.857 8-8.571 13.143-17.143 13.143h-113.714c-10.286 0-18.286-8.571-18.286-18.286v-4c49.143-202.857 217.714-343.429 428.571-343.429 112 0 221.143 44.571 302.286 121.143l74.286-73.714c6.857-6.857 16-10.857 25.714-10.857 20 0 36.571 16.571 36.571 36.571z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["refresh"],"defaultCode":61473,"grid":14},"attrs":[],"properties":{"name":"refresh","id":42,"order":36,"prevSize":28,"code":61473},"setIdx":0,"setId":1,"iconIdx":47},{"icon":{"paths":["M219.429 676.571v36.571c0 9.714-8.571 18.286-18.286 18.286h-36.571c-9.714 0-18.286-8.571-18.286-18.286v-36.571c0-9.714 8.571-18.286 18.286-18.286h36.571c9.714 0 18.286 8.571 18.286 18.286zM219.429 530.286v36.571c0 9.714-8.571 18.286-18.286 18.286h-36.571c-9.714 0-18.286-8.571-18.286-18.286v-36.571c0-9.714 8.571-18.286 18.286-18.286h36.571c9.714 0 18.286 8.571 18.286 18.286zM219.429 384v36.571c0 9.714-8.571 18.286-18.286 18.286h-36.571c-9.714 0-18.286-8.571-18.286-18.286v-36.571c0-9.714 8.571-18.286 18.286-18.286h36.571c9.714 0 18.286 8.571 18.286 18.286zM877.714 676.571v36.571c0 9.714-8.571 18.286-18.286 18.286h-548.571c-9.714 0-18.286-8.571-18.286-18.286v-36.571c0-9.714 8.571-18.286 18.286-18.286h548.571c9.714 0 18.286 8.571 18.286 18.286zM877.714 530.286v36.571c0 9.714-8.571 18.286-18.286 18.286h-548.571c-9.714 0-18.286-8.571-18.286-18.286v-36.571c0-9.714 8.571-18.286 18.286-18.286h548.571c9.714 0 18.286 8.571 18.286 18.286zM877.714 384v36.571c0 9.714-8.571 18.286-18.286 18.286h-548.571c-9.714 0-18.286-8.571-18.286-18.286v-36.571c0-9.714 8.571-18.286 18.286-18.286h548.571c9.714 0 18.286 8.571 18.286 18.286zM950.857 786.286v-475.429c0-9.714-8.571-18.286-18.286-18.286h-841.143c-9.714 0-18.286 8.571-18.286 18.286v475.429c0 9.714 8.571 18.286 18.286 18.286h841.143c9.714 0 18.286-8.571 18.286-18.286zM1024 164.571v621.714c0 50.286-41.143 91.429-91.429 91.429h-841.143c-50.286 0-91.429-41.143-91.429-91.429v-621.714c0-50.286 41.143-91.429 91.429-91.429h841.143c50.286 0 91.429 41.143 91.429 91.429z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["list-alt"],"defaultCode":61474,"grid":14},"attrs":[],"properties":{"name":"list-alt","id":43,"order":37,"prevSize":28,"code":61474},"setIdx":0,"setId":1,"iconIdx":48},{"icon":{"paths":["M182.857 438.857h292.571v-109.714c0-80.571-65.714-146.286-146.286-146.286s-146.286 65.714-146.286 146.286v109.714zM658.286 493.714v329.143c0 30.286-24.571 54.857-54.857 54.857h-548.571c-30.286 0-54.857-24.571-54.857-54.857v-329.143c0-30.286 24.571-54.857 54.857-54.857h18.286v-109.714c0-140.571 115.429-256 256-256s256 115.429 256 256v109.714h18.286c30.286 0 54.857 24.571 54.857 54.857z"],"width":658.2857142857142,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["lock"],"defaultCode":61475,"grid":14},"attrs":[],"properties":{"name":"lock","id":44,"order":38,"prevSize":28,"code":61475},"setIdx":0,"setId":1,"iconIdx":49},{"icon":{"paths":["M438.857 201.143v621.714c0 20-16.571 36.571-36.571 36.571-9.714 0-18.857-4-25.714-10.857l-190.286-190.286h-149.714c-20 0-36.571-16.571-36.571-36.571v-219.429c0-20 16.571-36.571 36.571-36.571h149.714l190.286-190.286c6.857-6.857 16-10.857 25.714-10.857 20 0 36.571 16.571 36.571 36.571z"],"width":438.85714285714283,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["volume-off"],"defaultCode":61478,"grid":14},"attrs":[],"properties":{"name":"volume-off","id":45,"order":41,"prevSize":28,"code":61478},"setIdx":0,"setId":1,"iconIdx":50},{"icon":{"paths":["M438.857 201.143v621.714c0 20-16.571 36.571-36.571 36.571-9.714 0-18.857-4-25.714-10.857l-190.286-190.286h-149.714c-20 0-36.571-16.571-36.571-36.571v-219.429c0-20 16.571-36.571 36.571-36.571h149.714l190.286-190.286c6.857-6.857 16-10.857 25.714-10.857 20 0 36.571 16.571 36.571 36.571zM658.286 512c0 57.143-34.857 112.571-88.571 134.286-4.571 2.286-9.714 2.857-14.286 2.857-20 0-36.571-16-36.571-36.571 0-43.429 66.286-31.429 66.286-100.571s-66.286-57.143-66.286-100.571c0-20.571 16.571-36.571 36.571-36.571 4.571 0 9.714 0.571 14.286 2.857 53.714 21.143 88.571 77.143 88.571 134.286z"],"width":658.2857142857142,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["volume-down"],"defaultCode":61479,"grid":14},"attrs":[],"properties":{"name":"volume-down","id":46,"order":42,"prevSize":28,"code":61479},"setIdx":0,"setId":1,"iconIdx":51},{"icon":{"paths":["M438.857 201.143v621.714c0 20-16.571 36.571-36.571 36.571-9.714 0-18.857-4-25.714-10.857l-190.286-190.286h-149.714c-20 0-36.571-16.571-36.571-36.571v-219.429c0-20 16.571-36.571 36.571-36.571h149.714l190.286-190.286c6.857-6.857 16-10.857 25.714-10.857 20 0 36.571 16.571 36.571 36.571zM658.286 512c0 57.143-34.857 112.571-88.571 134.286-4.571 2.286-9.714 2.857-14.286 2.857-20 0-36.571-16-36.571-36.571 0-43.429 66.286-31.429 66.286-100.571s-66.286-57.143-66.286-100.571c0-20.571 16.571-36.571 36.571-36.571 4.571 0 9.714 0.571 14.286 2.857 53.714 21.143 88.571 77.143 88.571 134.286zM804.571 512c0 116-69.714 224-177.143 269.143-4.571 1.714-9.714 2.857-14.286 2.857-20.571 0-37.143-16.571-37.143-36.571 0-16 9.143-26.857 22.286-33.714 15.429-8 29.714-14.857 43.429-25.143 56.571-41.143 89.714-106.857 89.714-176.571s-33.143-135.429-89.714-176.571c-13.714-10.286-28-17.143-43.429-25.143-13.143-6.857-22.286-17.714-22.286-33.714 0-20 16.571-36.571 36.571-36.571 5.143 0 10.286 1.143 14.857 2.857 107.429 45.143 177.143 153.143 177.143 269.143zM950.857 512c0 175.429-104.571 334.286-265.714 403.429-4.571 1.714-9.714 2.857-14.857 2.857-20 0-36.571-16.571-36.571-36.571 0-16.571 8.571-25.714 22.286-33.714 8-4.571 17.143-7.429 25.714-12 16-8.571 32-18.286 46.857-29.143 93.714-69.143 149.143-178.286 149.143-294.857s-55.429-225.714-149.143-294.857c-14.857-10.857-30.857-20.571-46.857-29.143-8.571-4.571-17.714-7.429-25.714-12-13.714-8-22.286-17.143-22.286-33.714 0-20 16.571-36.571 36.571-36.571 5.143 0 10.286 1.143 14.857 2.857 161.143 69.143 265.714 228 265.714 403.429z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["volume-up"],"defaultCode":61480,"grid":14},"attrs":[],"properties":{"name":"volume-up","id":47,"order":43,"prevSize":28,"code":61480},"setIdx":0,"setId":1,"iconIdx":52},{"icon":{"paths":["M219.429 658.286v73.143h-73.143v-73.143h73.143zM219.429 219.429v73.143h-73.143v-73.143h73.143zM658.286 219.429v73.143h-73.143v-73.143h73.143zM73.143 804h219.429v-218.857h-219.429v218.857zM73.143 365.714h219.429v-219.429h-219.429v219.429zM512 365.714h219.429v-219.429h-219.429v219.429zM365.714 512v365.714h-365.714v-365.714h365.714zM658.286 804.571v73.143h-73.143v-73.143h73.143zM804.571 804.571v73.143h-73.143v-73.143h73.143zM804.571 512v219.429h-219.429v-73.143h-73.143v219.429h-73.143v-365.714h219.429v73.143h73.143v-73.143h73.143zM365.714 73.143v365.714h-365.714v-365.714h365.714zM804.571 73.143v365.714h-365.714v-365.714h365.714z"],"width":804.5714285714286,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["qrcode"],"defaultCode":61481,"grid":14},"attrs":[],"properties":{"name":"qrcode","id":48,"order":44,"prevSize":28,"code":61481},"setIdx":0,"setId":1,"iconIdx":53},{"icon":{"paths":["M256 256c0-40.571-32.571-73.143-73.143-73.143s-73.143 32.571-73.143 73.143 32.571 73.143 73.143 73.143 73.143-32.571 73.143-73.143zM865.714 585.143c0 19.429-8 38.286-21.143 51.429l-280.571 281.143c-13.714 13.143-32.571 21.143-52 21.143s-38.286-8-51.429-21.143l-408.571-409.143c-29.143-28.571-52-84-52-124.571v-237.714c0-40 33.143-73.143 73.143-73.143h237.714c40.571 0 96 22.857 125.143 52l408.571 408c13.143 13.714 21.143 32.571 21.143 52z"],"width":865.7188571428571,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["tag"],"defaultCode":61483,"grid":14},"attrs":[],"properties":{"name":"tag","id":49,"order":46,"prevSize":28,"code":61483},"setIdx":0,"setId":1,"iconIdx":54},{"icon":{"paths":["M256 256c0-40.571-32.571-73.143-73.143-73.143s-73.143 32.571-73.143 73.143 32.571 73.143 73.143 73.143 73.143-32.571 73.143-73.143zM865.714 585.143c0 19.429-8 38.286-21.143 51.429l-280.571 281.143c-13.714 13.143-32.571 21.143-52 21.143s-38.286-8-51.429-21.143l-408.571-409.143c-29.143-28.571-52-84-52-124.571v-237.714c0-40 33.143-73.143 73.143-73.143h237.714c40.571 0 96 22.857 125.143 52l408.571 408c13.143 13.714 21.143 32.571 21.143 52zM1085.143 585.143c0 19.429-8 38.286-21.143 51.429l-280.571 281.143c-13.714 13.143-32.571 21.143-52 21.143-29.714 0-44.571-13.714-64-33.714l268.571-268.571c13.143-13.143 21.143-32 21.143-51.429s-8-38.286-21.143-52l-408.571-408c-29.143-29.143-84.571-52-125.143-52h128c40.571 0 96 22.857 125.143 52l408.571 408c13.143 13.714 21.143 32.571 21.143 52z"],"width":1085.1474285714285,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["tags"],"defaultCode":61484,"grid":14},"attrs":[],"properties":{"name":"tags","id":50,"order":47,"prevSize":28,"code":61484},"setIdx":0,"setId":1,"iconIdx":55},{"icon":{"paths":["M936.571 273.143c14.286 20.571 18.286 47.429 10.286 73.714l-157.143 517.714c-14.286 48.571-64.571 86.286-113.714 86.286h-527.429c-58.286 0-120.571-46.286-141.714-105.714-9.143-25.714-9.143-50.857-1.143-72.571 1.143-11.429 3.429-22.857 4-36.571 0.571-9.143-4.571-16.571-3.429-23.429 2.286-13.714 14.286-23.429 23.429-38.857 17.143-28.571 36.571-74.857 42.857-104.571 2.857-10.857-2.857-23.429 0-33.143 2.857-10.857 13.714-18.857 19.429-29.143 15.429-26.286 35.429-77.143 38.286-104 1.143-12-4.571-25.143-1.143-34.286 4-13.143 16.571-18.857 25.143-30.286 13.714-18.857 36.571-73.143 40-103.429 1.143-9.714-4.571-19.429-2.857-29.714 2.286-10.857 16-22.286 25.143-35.429 24-35.429 28.571-113.714 101.143-93.143l-0.571 1.714c9.714-2.286 19.429-5.143 29.143-5.143h434.857c26.857 0 50.857 12 65.143 32 14.857 20.571 18.286 47.429 10.286 74.286l-156.571 517.714c-26.857 88-41.714 107.429-114.286 107.429h-496.571c-7.429 0-16.571 1.714-21.714 8.571-4.571 6.857-5.143 12-0.571 24.571 11.429 33.143 50.857 40 82.286 40h527.429c21.143 0 45.714-12 52-32.571l171.429-564c3.429-10.857 3.429-22.286 2.857-32.571 13.143 5.143 25.143 13.143 33.714 24.571zM328.571 274.286c-3.429 10.286 2.286 18.286 12.571 18.286h347.429c9.714 0 20.571-8 24-18.286l12-36.571c3.429-10.286-2.286-18.286-12.571-18.286h-347.429c-9.714 0-20.571 8-24 18.286zM281.143 420.571c-3.429 10.286 2.286 18.286 12.571 18.286h347.429c9.714 0 20.571-8 24-18.286l12-36.571c3.429-10.286-2.286-18.286-12.571-18.286h-347.429c-9.714 0-20.571 8-24 18.286z"],"width":952.5394285714285,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["book"],"defaultCode":61485,"grid":14},"attrs":[],"properties":{"name":"book","id":51,"order":48,"prevSize":28,"code":61485},"setIdx":0,"setId":1,"iconIdx":56},{"icon":{"paths":["M219.429 877.714h512v-146.286h-512v146.286zM219.429 512h512v-219.429h-91.429c-30.286 0-54.857-24.571-54.857-54.857v-91.429h-365.714v365.714zM877.714 548.571c0-20-16.571-36.571-36.571-36.571s-36.571 16.571-36.571 36.571 16.571 36.571 36.571 36.571 36.571-16.571 36.571-36.571zM950.857 548.571v237.714c0 9.714-8.571 18.286-18.286 18.286h-128v91.429c0 30.286-24.571 54.857-54.857 54.857h-548.571c-30.286 0-54.857-24.571-54.857-54.857v-91.429h-128c-9.714 0-18.286-8.571-18.286-18.286v-237.714c0-60 49.714-109.714 109.714-109.714h36.571v-310.857c0-30.286 24.571-54.857 54.857-54.857h384c30.286 0 72 17.143 93.714 38.857l86.857 86.857c21.714 21.714 38.857 63.429 38.857 93.714v146.286h36.571c60 0 109.714 49.714 109.714 109.714z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["print"],"defaultCode":61487,"grid":14},"attrs":[],"properties":{"name":"print","id":52,"order":50,"prevSize":28,"code":61487},"setIdx":0,"setId":1,"iconIdx":57},{"icon":{"paths":["M996.571 804.571c25.143 0 33.143 16 17.714 36l-72 92.571c-15.429 20-40.571 20-56 0l-72-92.571c-15.429-20-7.429-36 17.714-36h45.714v-585.143h-45.714c-25.143 0-33.143-16-17.714-36l72-92.571c15.429-20 40.571-20 56 0l72 92.571c15.429 20 7.429 36-17.714 36h-45.714v585.143h45.714zM46.286 73.714l30.857 15.429c4 1.714 108.571 2.857 120.571 2.857 50.286 0 100.571-2.286 150.857-2.286 41.143 0 81.714 0.571 122.857 0.571h167.429c22.857 0 36 5.143 51.429-16.571l24-0.571c5.143 0 10.857 0.571 16 0.571 1.143 64 1.143 128 1.143 192 0 20 0.571 42.286-2.857 62.286-12.571 4.571-25.714 8.571-38.857 10.286-13.143-22.857-22.286-48-30.857-73.143-4-11.429-17.714-88.571-18.857-89.714-12-14.857-25.143-12-42.857-12-52 0-106.286-2.286-157.714 4-2.857 25.143-5.143 52-4.571 77.714 0.571 160.571 2.286 321.143 2.286 481.714 0 44-6.857 90.286 5.714 132.571 43.429 22.286 94.857 25.714 139.429 45.714 1.143 9.143 2.857 18.857 2.857 28.571 0 5.143-0.571 10.857-1.714 16.571l-19.429 0.571c-81.143 2.286-161.143-10.286-242.857-10.286-57.714 0-115.429 10.286-173.143 10.286-0.571-9.714-1.714-20-1.714-29.714v-5.143c21.714-34.857 100-35.429 136-56.571 12.571-28 10.857-182.857 10.857-218.857 0-115.429-3.429-230.857-3.429-346.286v-66.857c0-10.286 2.286-51.429-4.571-59.429-8-8.571-82.857-6.857-92.571-6.857-21.143 0-82.286 9.714-98.857 21.714-27.429 18.857-27.429 133.143-61.714 135.429-10.286-6.286-24.571-15.429-32-25.143v-218.857z"],"width":1029.7051428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["text-height"],"defaultCode":61492,"grid":14},"attrs":[],"properties":{"name":"text-height","id":53,"order":694,"prevSize":28,"code":61492},"setIdx":0,"setId":1,"iconIdx":58},{"icon":{"paths":["M46.286 73.714l30.857 15.429c4 1.714 108.571 2.857 120.571 2.857 50.286 0 100.571-2.286 150.857-2.286 151.429 0 304.571-3.429 456 1.714 12.571 0.571 24.571-7.429 32-17.714l24-0.571c5.143 0 10.857 0.571 16 0.571 1.143 64 1.143 128 1.143 192 0 20.571 0.571 42.286-2.857 62.286-12.571 4.571-25.714 8.571-38.857 10.286-13.143-22.857-22.286-48-30.857-73.143-4-11.429-18.286-88.571-18.857-89.714-4-5.143-9.143-8.571-15.429-10.857-4.571-1.714-32-1.143-37.714-1.143-70.286 0-151.429-4-220.571 4-2.857 25.143-5.143 52-4.571 77.714l0.571 86.857v-29.714c0.571 93.143 1.714 185.714 1.714 278.286 0 44-6.857 90.286 5.714 132.571 43.429 22.286 94.857 25.714 139.429 45.714 1.143 9.143 2.857 18.857 2.857 28.571 0 5.143-0.571 10.857-1.714 16.571l-19.429 0.571c-81.143 2.286-161.143-10.286-242.857-10.286-57.714 0-115.429 10.286-173.143 10.286-0.571-9.714-1.714-20-1.714-29.714v-5.143c21.714-34.857 100-35.429 136-56.571 14.286-32 10.286-302.286 10.286-352.571 0-8-2.857-16.571-2.857-25.143 0-23.429 4-157.714-4.571-167.429-8-8.571-82.857-6.857-92.571-6.857-24 0-158.286 12.571-172 21.714-26.857 17.714-27.429 132.571-61.714 135.429-10.286-6.286-24.571-15.429-32-25.143v-218.857zM748.571 806.286c20 0 96 68 111.429 80 8.571 6.857 14.857 16.571 14.857 28s-6.286 21.143-14.857 28c-15.429 12-91.429 80-111.429 80-26.286 0-17.143-61.143-17.143-71.429h-585.143c0 10.286 9.143 71.429-17.143 71.429-20 0-96-68-111.429-80-8.571-6.857-14.857-16.571-14.857-28s6.286-21.143 14.857-28c15.429-12 91.429-80 111.429-80 26.286 0 17.143 61.143 17.143 71.429h585.143c0-10.286-9.143-71.429 17.143-71.429z"],"width":878.2994285714285,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["text-width"],"defaultCode":61493,"grid":14},"attrs":[],"properties":{"name":"text-width","id":54,"order":695,"prevSize":28,"code":61493},"setIdx":0,"setId":1,"iconIdx":59},{"icon":{"paths":["M1024 768v73.143c0 20-16.571 36.571-36.571 36.571h-950.857c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h950.857c20 0 36.571 16.571 36.571 36.571zM804.571 548.571v73.143c0 20-16.571 36.571-36.571 36.571h-731.429c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h731.429c20 0 36.571 16.571 36.571 36.571zM950.857 329.143v73.143c0 20-16.571 36.571-36.571 36.571h-877.714c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h877.714c20 0 36.571 16.571 36.571 36.571zM731.429 109.714v73.143c0 20-16.571 36.571-36.571 36.571h-658.286c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h658.286c20 0 36.571 16.571 36.571 36.571z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["align-left"],"defaultCode":61494,"grid":14},"attrs":[],"properties":{"name":"align-left","id":55,"order":57,"prevSize":28,"code":61494},"setIdx":0,"setId":1,"iconIdx":60},{"icon":{"paths":["M1024 768v73.143c0 20-16.571 36.571-36.571 36.571h-950.857c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h950.857c20 0 36.571 16.571 36.571 36.571zM804.571 548.571v73.143c0 20-16.571 36.571-36.571 36.571h-512c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h512c20 0 36.571 16.571 36.571 36.571zM950.857 329.143v73.143c0 20-16.571 36.571-36.571 36.571h-804.571c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h804.571c20 0 36.571 16.571 36.571 36.571zM731.429 109.714v73.143c0 20-16.571 36.571-36.571 36.571h-365.714c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h365.714c20 0 36.571 16.571 36.571 36.571z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["align-center"],"defaultCode":61495,"grid":14},"attrs":[],"properties":{"name":"align-center","id":56,"order":58,"prevSize":28,"code":61495},"setIdx":0,"setId":1,"iconIdx":61},{"icon":{"paths":["M1024 768v73.143c0 20-16.571 36.571-36.571 36.571h-950.857c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h950.857c20 0 36.571 16.571 36.571 36.571zM1024 548.571v73.143c0 20-16.571 36.571-36.571 36.571h-731.429c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h731.429c20 0 36.571 16.571 36.571 36.571zM1024 329.143v73.143c0 20-16.571 36.571-36.571 36.571h-877.714c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h877.714c20 0 36.571 16.571 36.571 36.571zM1024 109.714v73.143c0 20-16.571 36.571-36.571 36.571h-658.286c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h658.286c20 0 36.571 16.571 36.571 36.571z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["align-right"],"defaultCode":61496,"grid":14},"attrs":[],"properties":{"name":"align-right","id":57,"order":59,"prevSize":28,"code":61496},"setIdx":0,"setId":1,"iconIdx":62},{"icon":{"paths":["M1024 768v73.143c0 20-16.571 36.571-36.571 36.571h-950.857c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h950.857c20 0 36.571 16.571 36.571 36.571zM1024 548.571v73.143c0 20-16.571 36.571-36.571 36.571h-950.857c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h950.857c20 0 36.571 16.571 36.571 36.571zM1024 329.143v73.143c0 20-16.571 36.571-36.571 36.571h-950.857c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h950.857c20 0 36.571 16.571 36.571 36.571zM1024 109.714v73.143c0 20-16.571 36.571-36.571 36.571h-950.857c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h950.857c20 0 36.571 16.571 36.571 36.571z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["align-justify"],"defaultCode":61497,"grid":14},"attrs":[],"properties":{"name":"align-justify","id":58,"order":60,"prevSize":28,"code":61497},"setIdx":0,"setId":1,"iconIdx":63},{"icon":{"paths":["M146.286 749.714v109.714c0 9.714-8.571 18.286-18.286 18.286h-109.714c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h109.714c9.714 0 18.286 8.571 18.286 18.286zM146.286 530.286v109.714c0 9.714-8.571 18.286-18.286 18.286h-109.714c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h109.714c9.714 0 18.286 8.571 18.286 18.286zM146.286 310.857v109.714c0 9.714-8.571 18.286-18.286 18.286h-109.714c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h109.714c9.714 0 18.286 8.571 18.286 18.286zM1024 749.714v109.714c0 9.714-8.571 18.286-18.286 18.286h-768c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h768c9.714 0 18.286 8.571 18.286 18.286zM146.286 91.429v109.714c0 9.714-8.571 18.286-18.286 18.286h-109.714c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h109.714c9.714 0 18.286 8.571 18.286 18.286zM1024 530.286v109.714c0 9.714-8.571 18.286-18.286 18.286h-768c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h768c9.714 0 18.286 8.571 18.286 18.286zM1024 310.857v109.714c0 9.714-8.571 18.286-18.286 18.286h-768c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h768c9.714 0 18.286 8.571 18.286 18.286zM1024 91.429v109.714c0 9.714-8.571 18.286-18.286 18.286h-768c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h768c9.714 0 18.286 8.571 18.286 18.286z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["list"],"defaultCode":61498,"grid":14},"attrs":[],"properties":{"name":"list","id":59,"order":61,"prevSize":28,"code":61498},"setIdx":0,"setId":1,"iconIdx":64},{"icon":{"paths":["M219.429 310.857v329.143c0 9.714-8.571 18.286-18.286 18.286-4.571 0-9.714-1.714-13.143-5.143l-164.571-164.571c-3.429-3.429-5.143-8.571-5.143-13.143s1.714-9.714 5.143-13.143l164.571-164.571c3.429-3.429 8.571-5.143 13.143-5.143 9.714 0 18.286 8.571 18.286 18.286zM1024 749.714v109.714c0 9.714-8.571 18.286-18.286 18.286h-987.429c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h987.429c9.714 0 18.286 8.571 18.286 18.286zM1024 530.286v109.714c0 9.714-8.571 18.286-18.286 18.286h-621.714c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h621.714c9.714 0 18.286 8.571 18.286 18.286zM1024 310.857v109.714c0 9.714-8.571 18.286-18.286 18.286h-621.714c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h621.714c9.714 0 18.286 8.571 18.286 18.286zM1024 91.429v109.714c0 9.714-8.571 18.286-18.286 18.286h-987.429c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h987.429c9.714 0 18.286 8.571 18.286 18.286z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["dedent","outdent"],"defaultCode":61499,"grid":14},"attrs":[],"properties":{"name":"dedent, outdent","id":60,"order":62,"prevSize":28,"code":61499},"setIdx":0,"setId":1,"iconIdx":65},{"icon":{"paths":["M201.143 475.429c0 4.571-1.714 9.714-5.143 13.143l-164.571 164.571c-3.429 3.429-8.571 5.143-13.143 5.143-9.714 0-18.286-8.571-18.286-18.286v-329.143c0-9.714 8.571-18.286 18.286-18.286 4.571 0 9.714 1.714 13.143 5.143l164.571 164.571c3.429 3.429 5.143 8.571 5.143 13.143zM1024 749.714v109.714c0 9.714-8.571 18.286-18.286 18.286h-987.429c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h987.429c9.714 0 18.286 8.571 18.286 18.286zM1024 530.286v109.714c0 9.714-8.571 18.286-18.286 18.286h-621.714c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h621.714c9.714 0 18.286 8.571 18.286 18.286zM1024 310.857v109.714c0 9.714-8.571 18.286-18.286 18.286h-621.714c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h621.714c9.714 0 18.286 8.571 18.286 18.286zM1024 91.429v109.714c0 9.714-8.571 18.286-18.286 18.286h-987.429c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h987.429c9.714 0 18.286 8.571 18.286 18.286z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["indent"],"defaultCode":61500,"grid":14},"attrs":[],"properties":{"name":"indent","id":61,"order":63,"prevSize":28,"code":61500},"setIdx":0,"setId":1,"iconIdx":66},{"icon":{"paths":["M207.429 877.714l52-52-134.286-134.286-52 52v61.143h73.143v73.143h61.143zM506.286 347.429c0-7.429-5.143-12.571-12.571-12.571-3.429 0-6.857 1.143-9.714 4l-309.714 309.714c-2.857 2.857-4 6.286-4 9.714 0 7.429 5.143 12.571 12.571 12.571 3.429 0 6.857-1.143 9.714-4l309.714-309.714c2.857-2.857 4-6.286 4-9.714zM475.429 237.714l237.714 237.714-475.429 475.429h-237.714v-237.714zM865.714 292.571c0 19.429-8 38.286-21.143 51.429l-94.857 94.857-237.714-237.714 94.857-94.286c13.143-13.714 32-21.714 51.429-21.714s38.286 8 52 21.714l134.286 133.714c13.143 13.714 21.143 32.571 21.143 52z"],"width":865.7188571428571,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["pencil"],"defaultCode":61504,"grid":14},"attrs":[],"properties":{"name":"pencil","id":62,"order":66,"prevSize":28,"code":61504},"setIdx":0,"setId":1,"iconIdx":67},{"icon":{"paths":["M438.857 822.857v-621.714c-171.429 0-310.857 139.429-310.857 310.857s139.429 310.857 310.857 310.857zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["adjust"],"defaultCode":61506,"grid":14},"attrs":[],"properties":{"name":"adjust","id":63,"order":68,"prevSize":28,"code":61506},"setIdx":0,"setId":1,"iconIdx":68},{"icon":{"paths":["M507.429 676.571l66.286-66.286-86.857-86.857-66.286 66.286v32h54.857v54.857h32zM758.857 265.143c-5.143-5.143-13.714-4.571-18.857 0.571l-200 200c-5.143 5.143-5.714 13.714-0.571 18.857s13.714 4.571 18.857-0.571l200-200c5.143-5.143 5.714-13.714 0.571-18.857zM804.571 604.571v108.571c0 90.857-73.714 164.571-164.571 164.571h-475.429c-90.857 0-164.571-73.714-164.571-164.571v-475.429c0-90.857 73.714-164.571 164.571-164.571h475.429c22.857 0 45.714 4.571 66.857 14.286 5.143 2.286 9.143 7.429 10.286 13.143 1.143 6.286-0.571 12-5.143 16.571l-28 28c-5.143 5.143-12 6.857-18.286 4.571-8.571-2.286-17.143-3.429-25.714-3.429h-475.429c-50.286 0-91.429 41.143-91.429 91.429v475.429c0 50.286 41.143 91.429 91.429 91.429h475.429c50.286 0 91.429-41.143 91.429-91.429v-72c0-4.571 1.714-9.143 5.143-12.571l36.571-36.571c5.714-5.714 13.143-6.857 20-4s11.429 9.143 11.429 16.571zM749.714 182.857l164.571 164.571-384 384h-164.571v-164.571zM1003.429 258.286l-52.571 52.571-164.571-164.571 52.571-52.571c21.143-21.143 56.571-21.143 77.714 0l86.857 86.857c21.143 21.143 21.143 56.571 0 77.714z"],"width":1024.5851428571427,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["edit","pencil-square-o"],"defaultCode":61508,"grid":14},"attrs":[],"properties":{"name":"edit, pencil-square-o","id":64,"order":70,"prevSize":28,"code":61508},"setIdx":0,"setId":1,"iconIdx":69},{"icon":{"paths":["M804.571 565.143v148c0 90.857-73.714 164.571-164.571 164.571h-475.429c-90.857 0-164.571-73.714-164.571-164.571v-475.429c0-90.857 73.714-164.571 164.571-164.571h145.714c9.714 0 18.286 8 18.286 18.286 0 9.143-6.286 16.571-14.857 18.286-28.571 9.714-54.286 21.143-76 34.286-2.857 1.143-5.714 2.286-9.143 2.286h-64c-50.286 0-91.429 41.143-91.429 91.429v475.429c0 50.286 41.143 91.429 91.429 91.429h475.429c50.286 0 91.429-41.143 91.429-91.429v-122.286c0-6.857 4-13.143 10.286-16.571 11.429-5.143 21.714-12.571 30.857-21.143 5.143-5.143 13.143-7.429 20-4.571s12 9.143 12 16.571zM940 281.714l-219.429 219.429c-6.857 7.429-16 10.857-25.714 10.857-4.571 0-9.714-1.143-14.286-2.857-13.143-5.714-22.286-18.857-22.286-33.714v-109.714h-91.429c-125.714 0-205.714 24-250.286 74.857-46.286 53.143-60 138.857-42.286 270.286 1.143 8-4 16-11.429 19.429-2.286 0.571-4.571 1.143-6.857 1.143-5.714 0-11.429-2.857-14.857-7.429-4-5.714-94.857-134.286-94.857-248.571 0-153.143 48-329.143 420.571-329.143h91.429v-109.714c0-14.857 9.143-28 22.286-33.714 4.571-1.714 9.714-2.857 14.286-2.857 9.714 0 18.857 4 25.714 10.857l219.429 219.429c14.286 14.286 14.286 37.143 0 51.429z"],"width":954.2948571428572,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["share-square-o"],"defaultCode":61509,"grid":14},"attrs":[],"properties":{"name":"share-square-o","id":65,"order":71,"prevSize":28,"code":61509},"setIdx":0,"setId":1,"iconIdx":70},{"icon":{"paths":["M804.571 531.429v181.714c0 90.857-73.714 164.571-164.571 164.571h-475.429c-90.857 0-164.571-73.714-164.571-164.571v-475.429c0-90.857 73.714-164.571 164.571-164.571h475.429c22.857 0 45.714 4.571 66.857 14.286 5.143 2.286 9.143 7.429 10.286 13.143 1.143 6.286-0.571 12-5.143 16.571l-28 28c-3.429 3.429-8.571 5.714-13.143 5.714-1.714 0-3.429-0.571-5.143-1.143-8.571-2.286-17.143-3.429-25.714-3.429h-475.429c-50.286 0-91.429 41.143-91.429 91.429v475.429c0 50.286 41.143 91.429 91.429 91.429h475.429c50.286 0 91.429-41.143 91.429-91.429v-145.143c0-4.571 1.714-9.143 5.143-12.571l36.571-36.571c4-4 8.571-5.714 13.143-5.714 2.286 0 4.571 0.571 6.857 1.714 6.857 2.857 11.429 9.143 11.429 16.571zM936.571 252l-465.143 465.143c-18.286 18.286-46.857 18.286-65.143 0l-245.714-245.714c-18.286-18.286-18.286-46.857 0-65.143l62.857-62.857c18.286-18.286 46.857-18.286 65.143 0l150.286 150.286 369.714-369.714c18.286-18.286 46.857-18.286 65.143 0l62.857 62.857c18.286 18.286 18.286 46.857 0 65.143z"],"width":954.8799999999999,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["check-square-o"],"defaultCode":61510,"grid":14},"attrs":[],"properties":{"name":"check-square-o","id":66,"order":719,"prevSize":28,"code":61510},"setIdx":0,"setId":1,"iconIdx":71},{"icon":{"paths":["M1024 512c0 9.714-4 18.857-10.857 25.714l-146.286 146.286c-6.857 6.857-16 10.857-25.714 10.857-20 0-36.571-16.571-36.571-36.571v-73.143h-219.429v219.429h73.143c20 0 36.571 16.571 36.571 36.571 0 9.714-4 18.857-10.857 25.714l-146.286 146.286c-6.857 6.857-16 10.857-25.714 10.857s-18.857-4-25.714-10.857l-146.286-146.286c-6.857-6.857-10.857-16-10.857-25.714 0-20 16.571-36.571 36.571-36.571h73.143v-219.429h-219.429v73.143c0 20-16.571 36.571-36.571 36.571-9.714 0-18.857-4-25.714-10.857l-146.286-146.286c-6.857-6.857-10.857-16-10.857-25.714s4-18.857 10.857-25.714l146.286-146.286c6.857-6.857 16-10.857 25.714-10.857 20 0 36.571 16.571 36.571 36.571v73.143h219.429v-219.429h-73.143c-20 0-36.571-16.571-36.571-36.571 0-9.714 4-18.857 10.857-25.714l146.286-146.286c6.857-6.857 16-10.857 25.714-10.857s18.857 4 25.714 10.857l146.286 146.286c6.857 6.857 10.857 16 10.857 25.714 0 20-16.571 36.571-36.571 36.571h-73.143v219.429h219.429v-73.143c0-20 16.571-36.571 36.571-36.571 9.714 0 18.857 4 25.714 10.857l146.286 146.286c6.857 6.857 10.857 16 10.857 25.714z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["arrows"],"defaultCode":61511,"grid":14},"attrs":[],"properties":{"name":"arrows","id":67,"order":73,"prevSize":28,"code":61511},"setIdx":0,"setId":1,"iconIdx":72},{"icon":{"paths":["M559.429 80.571c14.286-14.286 25.714-9.143 25.714 10.857v841.143c0 20-11.429 25.143-25.714 10.857l-405.714-405.714c-3.429-3.429-5.714-6.857-7.429-10.857v387.429c0 20-16.571 36.571-36.571 36.571h-73.143c-20 0-36.571-16.571-36.571-36.571v-804.571c0-20 16.571-36.571 36.571-36.571h73.143c20 0 36.571 16.571 36.571 36.571v387.429c1.714-4 4-7.429 7.429-10.857z"],"width":585.1428571428571,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["step-backward"],"defaultCode":61512,"grid":14},"attrs":[],"properties":{"name":"step-backward","id":68,"order":74,"prevSize":28,"code":61512},"setIdx":0,"setId":1,"iconIdx":73},{"icon":{"paths":["M998.286 80.571c14.286-14.286 25.714-9.143 25.714 10.857v841.143c0 20-11.429 25.143-25.714 10.857l-405.714-405.714c-3.429-3.429-5.714-6.857-7.429-10.857v405.714c0 20-11.429 25.143-25.714 10.857l-405.714-405.714c-3.429-3.429-5.714-6.857-7.429-10.857v387.429c0 20-16.571 36.571-36.571 36.571h-73.143c-20 0-36.571-16.571-36.571-36.571v-804.571c0-20 16.571-36.571 36.571-36.571h73.143c20 0 36.571 16.571 36.571 36.571v387.429c1.714-4 4-7.429 7.429-10.857l405.714-405.714c14.286-14.286 25.714-9.143 25.714 10.857v405.714c1.714-4 4-7.429 7.429-10.857z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["fast-backward"],"defaultCode":61513,"grid":14},"attrs":[],"properties":{"name":"fast-backward","id":69,"order":75,"prevSize":28,"code":61513},"setIdx":0,"setId":1,"iconIdx":74},{"icon":{"paths":["M925.143 80.571c14.286-14.286 25.714-9.143 25.714 10.857v841.143c0 20-11.429 25.143-25.714 10.857l-405.714-405.714c-3.429-3.429-5.714-6.857-7.429-10.857v405.714c0 20-11.429 25.143-25.714 10.857l-405.714-405.714c-14.286-14.286-14.286-37.143 0-51.429l405.714-405.714c14.286-14.286 25.714-9.143 25.714 10.857v405.714c1.714-4 4-7.429 7.429-10.857z"],"width":1017.1245714285715,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["backward"],"defaultCode":61514,"grid":14},"attrs":[],"properties":{"name":"backward","id":70,"order":76,"prevSize":28,"code":61514},"setIdx":0,"setId":1,"iconIdx":75},{"icon":{"paths":["M790.857 529.714l-758.857 421.714c-17.714 9.714-32 1.143-32-18.857v-841.143c0-20 14.286-28.571 32-18.857l758.857 421.714c17.714 9.714 17.714 25.714 0 35.429z"],"width":808.5942857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["play"],"defaultCode":61515,"grid":14},"attrs":[],"properties":{"name":"play","id":71,"order":77,"prevSize":28,"code":61515},"setIdx":0,"setId":1,"iconIdx":76},{"icon":{"paths":["M877.714 109.714v804.571c0 20-16.571 36.571-36.571 36.571h-292.571c-20 0-36.571-16.571-36.571-36.571v-804.571c0-20 16.571-36.571 36.571-36.571h292.571c20 0 36.571 16.571 36.571 36.571zM365.714 109.714v804.571c0 20-16.571 36.571-36.571 36.571h-292.571c-20 0-36.571-16.571-36.571-36.571v-804.571c0-20 16.571-36.571 36.571-36.571h292.571c20 0 36.571 16.571 36.571 36.571z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["pause"],"defaultCode":61516,"grid":14},"attrs":[],"properties":{"name":"pause","id":72,"order":78,"prevSize":28,"code":61516},"setIdx":0,"setId":1,"iconIdx":77},{"icon":{"paths":["M877.714 109.714v804.571c0 20-16.571 36.571-36.571 36.571h-804.571c-20 0-36.571-16.571-36.571-36.571v-804.571c0-20 16.571-36.571 36.571-36.571h804.571c20 0 36.571 16.571 36.571 36.571z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["stop"],"defaultCode":61517,"grid":14},"attrs":[],"properties":{"name":"stop","id":73,"order":79,"prevSize":28,"code":61517},"setIdx":0,"setId":1,"iconIdx":78},{"icon":{"paths":["M25.714 943.429c-14.286 14.286-25.714 9.143-25.714-10.857v-841.143c0-20 11.429-25.143 25.714-10.857l405.714 405.714c3.429 3.429 5.714 6.857 7.429 10.857v-405.714c0-20 11.429-25.143 25.714-10.857l405.714 405.714c14.286 14.286 14.286 37.143 0 51.429l-405.714 405.714c-14.286 14.286-25.714 9.143-25.714-10.857v-405.714c-1.714 4-4 7.429-7.429 10.857z"],"width":884.5897142857142,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["forward"],"defaultCode":61518,"grid":14},"attrs":[],"properties":{"name":"forward","id":74,"order":80,"prevSize":28,"code":61518},"setIdx":0,"setId":1,"iconIdx":79},{"icon":{"paths":["M25.714 943.429c-14.286 14.286-25.714 9.143-25.714-10.857v-841.143c0-20 11.429-25.143 25.714-10.857l405.714 405.714c3.429 3.429 5.714 6.857 7.429 10.857v-405.714c0-20 11.429-25.143 25.714-10.857l405.714 405.714c3.429 3.429 5.714 6.857 7.429 10.857v-387.429c0-20 16.571-36.571 36.571-36.571h73.143c20 0 36.571 16.571 36.571 36.571v804.571c0 20-16.571 36.571-36.571 36.571h-73.143c-20 0-36.571-16.571-36.571-36.571v-387.429c-1.714 4-4 7.429-7.429 10.857l-405.714 405.714c-14.286 14.286-25.714 9.143-25.714-10.857v-405.714c-1.714 4-4 7.429-7.429 10.857z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["fast-forward"],"defaultCode":61520,"grid":14},"attrs":[],"properties":{"name":"fast-forward","id":75,"order":81,"prevSize":28,"code":61520},"setIdx":0,"setId":1,"iconIdx":80},{"icon":{"paths":["M25.714 943.429c-14.286 14.286-25.714 9.143-25.714-10.857v-841.143c0-20 11.429-25.143 25.714-10.857l405.714 405.714c3.429 3.429 5.714 6.857 7.429 10.857v-387.429c0-20 16.571-36.571 36.571-36.571h73.143c20 0 36.571 16.571 36.571 36.571v804.571c0 20-16.571 36.571-36.571 36.571h-73.143c-20 0-36.571-16.571-36.571-36.571v-387.429c-1.714 4-4 7.429-7.429 10.857z"],"width":585.1428571428571,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["step-forward"],"defaultCode":61521,"grid":14},"attrs":[],"properties":{"name":"step-forward","id":76,"order":82,"prevSize":28,"code":61521},"setIdx":0,"setId":1,"iconIdx":81},{"icon":{"paths":["M8 559.429l405.714-405.714c14.286-14.286 37.143-14.286 51.429 0l405.714 405.714c14.286 14.286 9.143 25.714-10.857 25.714h-841.143c-20 0-25.143-11.429-10.857-25.714zM841.714 877.714h-804.571c-20 0-36.571-16.571-36.571-36.571v-146.286c0-20 16.571-36.571 36.571-36.571h804.571c20 0 36.571 16.571 36.571 36.571v146.286c0 20-16.571 36.571-36.571 36.571z"],"width":878.8845714285713,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["eject"],"defaultCode":61522,"grid":14},"attrs":[],"properties":{"name":"eject","id":77,"order":83,"prevSize":28,"code":61522},"setIdx":0,"setId":1,"iconIdx":82},{"icon":{"paths":["M669.143 172l-303.429 303.429 303.429 303.429c14.286 14.286 14.286 37.143 0 51.429l-94.857 94.857c-14.286 14.286-37.143 14.286-51.429 0l-424-424c-14.286-14.286-14.286-37.143 0-51.429l424-424c14.286-14.286 37.143-14.286 51.429 0l94.857 94.857c14.286 14.286 14.286 37.143 0 51.429z"],"width":768,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["chevron-left"],"defaultCode":61523,"grid":14},"attrs":[],"properties":{"name":"chevron-left","id":78,"order":84,"prevSize":28,"code":61523},"setIdx":0,"setId":1,"iconIdx":83},{"icon":{"paths":["M632.571 501.143l-424 424c-14.286 14.286-37.143 14.286-51.429 0l-94.857-94.857c-14.286-14.286-14.286-37.143 0-51.429l303.429-303.429-303.429-303.429c-14.286-14.286-14.286-37.143 0-51.429l94.857-94.857c14.286-14.286 37.143-14.286 51.429 0l424 424c14.286 14.286 14.286 37.143 0 51.429z"],"width":694.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["chevron-right"],"defaultCode":61524,"grid":14},"attrs":[],"properties":{"name":"chevron-right","id":79,"order":85,"prevSize":28,"code":61524},"setIdx":0,"setId":1,"iconIdx":84},{"icon":{"paths":["M694.857 548.571v-73.143c0-20-16.571-36.571-36.571-36.571h-146.286v-146.286c0-20-16.571-36.571-36.571-36.571h-73.143c-20 0-36.571 16.571-36.571 36.571v146.286h-146.286c-20 0-36.571 16.571-36.571 36.571v73.143c0 20 16.571 36.571 36.571 36.571h146.286v146.286c0 20 16.571 36.571 36.571 36.571h73.143c20 0 36.571-16.571 36.571-36.571v-146.286h146.286c20 0 36.571-16.571 36.571-36.571zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["plus-circle"],"defaultCode":61525,"grid":14},"attrs":[],"properties":{"name":"plus-circle","id":80,"order":86,"prevSize":28,"code":61525},"setIdx":0,"setId":1,"iconIdx":85},{"icon":{"paths":["M694.857 548.571v-73.143c0-20-16.571-36.571-36.571-36.571h-438.857c-20 0-36.571 16.571-36.571 36.571v73.143c0 20 16.571 36.571 36.571 36.571h438.857c20 0 36.571-16.571 36.571-36.571zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["minus-circle"],"defaultCode":61526,"grid":14},"attrs":[],"properties":{"name":"minus-circle","id":81,"order":87,"prevSize":28,"code":61526},"setIdx":0,"setId":1,"iconIdx":86},{"icon":{"paths":["M656.571 641.143c0-9.714-4-18.857-10.857-25.714l-103.429-103.429 103.429-103.429c6.857-6.857 10.857-16 10.857-25.714s-4-19.429-10.857-26.286l-51.429-51.429c-6.857-6.857-16.571-10.857-26.286-10.857s-18.857 4-25.714 10.857l-103.429 103.429-103.429-103.429c-6.857-6.857-16-10.857-25.714-10.857s-19.429 4-26.286 10.857l-51.429 51.429c-6.857 6.857-10.857 16.571-10.857 26.286s4 18.857 10.857 25.714l103.429 103.429-103.429 103.429c-6.857 6.857-10.857 16-10.857 25.714s4 19.429 10.857 26.286l51.429 51.429c6.857 6.857 16.571 10.857 26.286 10.857s18.857-4 25.714-10.857l103.429-103.429 103.429 103.429c6.857 6.857 16 10.857 25.714 10.857s19.429-4 26.286-10.857l51.429-51.429c6.857-6.857 10.857-16.571 10.857-26.286zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["times-circle"],"defaultCode":61527,"grid":14},"attrs":[],"properties":{"name":"times-circle","id":82,"order":88,"prevSize":28,"code":61527},"setIdx":0,"setId":1,"iconIdx":87},{"icon":{"paths":["M733.714 419.429c0-9.714-3.429-19.429-10.286-26.286l-52-51.429c-6.857-6.857-16-10.857-25.714-10.857s-18.857 4-25.714 10.857l-233.143 232.571-129.143-129.143c-6.857-6.857-16-10.857-25.714-10.857s-18.857 4-25.714 10.857l-52 51.429c-6.857 6.857-10.286 16.571-10.286 26.286s3.429 18.857 10.286 25.714l206.857 206.857c6.857 6.857 16.571 10.857 25.714 10.857 9.714 0 19.429-4 26.286-10.857l310.286-310.286c6.857-6.857 10.286-16 10.286-25.714zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["check-circle"],"defaultCode":61528,"grid":14},"attrs":[],"properties":{"name":"check-circle","id":83,"order":89,"prevSize":28,"code":61528},"setIdx":0,"setId":1,"iconIdx":88},{"icon":{"paths":["M512 786.286v-109.714c0-10.286-8-18.286-18.286-18.286h-109.714c-10.286 0-18.286 8-18.286 18.286v109.714c0 10.286 8 18.286 18.286 18.286h109.714c10.286 0 18.286-8 18.286-18.286zM658.286 402.286c0-104.571-109.714-182.857-208-182.857-93.143 0-162.857 40-212 121.714-5.143 8-2.857 18.286 4.571 24l75.429 57.143c2.857 2.286 6.857 3.429 10.857 3.429 5.143 0 10.857-2.286 14.286-6.857 26.857-34.286 38.286-44.571 49.143-52.571 9.714-6.857 28.571-13.714 49.143-13.714 36.571 0 70.286 23.429 70.286 48.571 0 29.714-15.429 44.571-50.286 60.571-40.571 18.286-96 65.714-96 121.143v20.571c0 10.286 8 18.286 18.286 18.286h109.714c10.286 0 18.286-8 18.286-18.286v0c0-13.143 16.571-41.143 43.429-56.571 43.429-24.571 102.857-57.714 102.857-144.571zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["question-circle"],"defaultCode":61529,"grid":14},"attrs":[],"properties":{"name":"question-circle","id":84,"order":90,"prevSize":28,"code":61529},"setIdx":0,"setId":1,"iconIdx":89},{"icon":{"paths":["M585.143 786.286v-91.429c0-10.286-8-18.286-18.286-18.286h-54.857v-292.571c0-10.286-8-18.286-18.286-18.286h-182.857c-10.286 0-18.286 8-18.286 18.286v91.429c0 10.286 8 18.286 18.286 18.286h54.857v182.857h-54.857c-10.286 0-18.286 8-18.286 18.286v91.429c0 10.286 8 18.286 18.286 18.286h256c10.286 0 18.286-8 18.286-18.286zM512 274.286v-91.429c0-10.286-8-18.286-18.286-18.286h-109.714c-10.286 0-18.286 8-18.286 18.286v91.429c0 10.286 8 18.286 18.286 18.286h109.714c10.286 0 18.286-8 18.286-18.286zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["info-circle"],"defaultCode":61530,"grid":14},"attrs":[],"properties":{"name":"info-circle","id":85,"order":91,"prevSize":28,"code":61530},"setIdx":0,"setId":1,"iconIdx":90},{"icon":{"paths":["M684 585.143h-62.286c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h62.286c-24.571-82.286-89.714-147.429-172-172v62.286c0 20-16.571 36.571-36.571 36.571h-73.143c-20 0-36.571-16.571-36.571-36.571v-62.286c-82.286 24.571-147.429 89.714-172 172h62.286c20 0 36.571 16.571 36.571 36.571v73.143c0 20-16.571 36.571-36.571 36.571h-62.286c24.571 82.286 89.714 147.429 172 172v-62.286c0-20 16.571-36.571 36.571-36.571h73.143c20 0 36.571 16.571 36.571 36.571v62.286c82.286-24.571 147.429-89.714 172-172zM877.714 475.429v73.143c0 20-16.571 36.571-36.571 36.571h-81.714c-28 122.857-124.571 219.429-247.429 247.429v81.714c0 20-16.571 36.571-36.571 36.571h-73.143c-20 0-36.571-16.571-36.571-36.571v-81.714c-122.857-28-219.429-124.571-247.429-247.429h-81.714c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h81.714c28-122.857 124.571-219.429 247.429-247.429v-81.714c0-20 16.571-36.571 36.571-36.571h73.143c20 0 36.571 16.571 36.571 36.571v81.714c122.857 28 219.429 124.571 247.429 247.429h81.714c20 0 36.571 16.571 36.571 36.571z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["crosshairs"],"defaultCode":61531,"grid":14},"attrs":[],"properties":{"name":"crosshairs","id":86,"order":92,"prevSize":28,"code":61531},"setIdx":0,"setId":1,"iconIdx":91},{"icon":{"paths":["M626.857 616.571l-83.429 83.429c-7.429 7.429-18.857 7.429-26.286 0l-78.286-78.286-78.286 78.286c-7.429 7.429-18.857 7.429-26.286 0l-83.429-83.429c-7.429-7.429-7.429-18.857 0-26.286l78.286-78.286-78.286-78.286c-7.429-7.429-7.429-18.857 0-26.286l83.429-83.429c7.429-7.429 18.857-7.429 26.286 0l78.286 78.286 78.286-78.286c7.429-7.429 18.857-7.429 26.286 0l83.429 83.429c7.429 7.429 7.429 18.857 0 26.286l-78.286 78.286 78.286 78.286c7.429 7.429 7.429 18.857 0 26.286zM749.714 512c0-171.429-139.429-310.857-310.857-310.857s-310.857 139.429-310.857 310.857 139.429 310.857 310.857 310.857 310.857-139.429 310.857-310.857zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["times-circle-o"],"defaultCode":61532,"grid":14},"attrs":[],"properties":{"name":"times-circle-o","id":87,"order":93,"prevSize":28,"code":61532},"setIdx":0,"setId":1,"iconIdx":92},{"icon":{"paths":["M669.143 464.571l-241.143 241.143c-14.286 14.286-37.143 14.286-51.429 0l-168-168c-14.286-14.286-14.286-37.143 0-51.429l58.286-58.286c14.286-14.286 37.143-14.286 51.429 0l84 84 157.143-157.143c14.286-14.286 37.143-14.286 51.429 0l58.286 58.286c14.286 14.286 14.286 37.143 0 51.429zM749.714 512c0-171.429-139.429-310.857-310.857-310.857s-310.857 139.429-310.857 310.857 139.429 310.857 310.857 310.857 310.857-139.429 310.857-310.857zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["check-circle-o"],"defaultCode":61533,"grid":14},"attrs":[],"properties":{"name":"check-circle-o","id":88,"order":94,"prevSize":28,"code":61533},"setIdx":0,"setId":1,"iconIdx":93},{"icon":{"paths":["M749.714 510.286c0-62.286-18.286-120-49.714-168.571l-430.857 430.286c49.143 32 107.429 50.857 169.714 50.857 171.429 0 310.857-140 310.857-312.571zM178.857 681.143l431.429-430.857c-49.143-33.143-108-52-171.429-52-171.429 0-310.857 140-310.857 312 0 63.429 18.857 121.714 50.857 170.857zM877.714 510.286c0 243.429-196.571 440.571-438.857 440.571s-438.857-197.143-438.857-440.571c0-242.857 196.571-440 438.857-440s438.857 197.143 438.857 440z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["ban"],"defaultCode":61534,"grid":14},"attrs":[],"properties":{"name":"ban","id":89,"order":95,"prevSize":28,"code":61534},"setIdx":0,"setId":1,"iconIdx":94},{"icon":{"paths":["M877.714 512v73.143c0 38.857-25.714 73.143-66.857 73.143h-402.286l167.429 168c13.714 13.143 21.714 32 21.714 51.429s-8 38.286-21.714 51.429l-42.857 43.429c-13.143 13.143-32 21.143-51.429 21.143s-38.286-8-52-21.143l-372-372.571c-13.143-13.143-21.143-32-21.143-51.429s8-38.286 21.143-52l372-371.429c13.714-13.714 32.571-21.714 52-21.714s37.714 8 51.429 21.714l42.857 42.286c13.714 13.714 21.714 32.571 21.714 52s-8 38.286-21.714 52l-167.429 167.429h402.286c41.143 0 66.857 34.286 66.857 73.143z"],"width":914.2857142857142,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["arrow-left"],"defaultCode":61536,"grid":14},"attrs":[],"properties":{"name":"arrow-left","id":90,"order":96,"prevSize":28,"code":61536},"setIdx":0,"setId":1,"iconIdx":95},{"icon":{"paths":["M841.143 548.571c0 19.429-7.429 38.286-21.143 52l-372 372c-13.714 13.143-32.571 21.143-52 21.143s-37.714-8-51.429-21.143l-42.857-42.857c-13.714-13.714-21.714-32.571-21.714-52s8-38.286 21.714-52l167.429-167.429h-402.286c-41.143 0-66.857-34.286-66.857-73.143v-73.143c0-38.857 25.714-73.143 66.857-73.143h402.286l-167.429-168c-13.714-13.143-21.714-32-21.714-51.429s8-38.286 21.714-51.429l42.857-42.857c13.714-13.714 32-21.714 51.429-21.714s38.286 8 52 21.714l372 372c13.714 13.143 21.143 32 21.143 51.429z"],"width":841.1428571428571,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["arrow-right"],"defaultCode":61537,"grid":14},"attrs":[],"properties":{"name":"arrow-right","id":91,"order":97,"prevSize":28,"code":61537},"setIdx":0,"setId":1,"iconIdx":96},{"icon":{"paths":["M920.571 554.857c0 19.429-8 37.714-21.143 51.429l-42.857 42.857c-13.714 13.714-32.571 21.714-52 21.714s-38.286-8-51.429-21.714l-168-167.429v402.286c0 41.143-34.286 66.857-73.143 66.857h-73.143c-38.857 0-73.143-25.714-73.143-66.857v-402.286l-168 167.429c-13.143 13.714-32 21.714-51.429 21.714s-38.286-8-51.429-21.714l-42.857-42.857c-13.714-13.714-21.714-32-21.714-51.429s8-38.286 21.714-52l372-372c13.143-13.714 32-21.143 51.429-21.143s38.286 7.429 52 21.143l372 372c13.143 13.714 21.143 32.571 21.143 52z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["arrow-up"],"defaultCode":61538,"grid":14},"attrs":[],"properties":{"name":"arrow-up","id":92,"order":98,"prevSize":28,"code":61538},"setIdx":0,"setId":1,"iconIdx":97},{"icon":{"paths":["M920.571 475.429c0 19.429-8 38.286-21.143 51.429l-372 372.571c-13.714 13.143-32.571 21.143-52 21.143s-38.286-8-51.429-21.143l-372-372.571c-13.714-13.143-21.714-32-21.714-51.429s8-38.286 21.714-52l42.286-42.857c13.714-13.143 32.571-21.143 52-21.143s38.286 8 51.429 21.143l168 168v-402.286c0-40 33.143-73.143 73.143-73.143h73.143c40 0 73.143 33.143 73.143 73.143v402.286l168-168c13.143-13.143 32-21.143 51.429-21.143s38.286 8 52 21.143l42.857 42.857c13.143 13.714 21.143 32.571 21.143 52z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["arrow-down"],"defaultCode":61539,"grid":14},"attrs":[],"properties":{"name":"arrow-down","id":93,"order":99,"prevSize":28,"code":61539},"setIdx":0,"setId":1,"iconIdx":98},{"icon":{"paths":["M1024 365.714c0 9.714-4 18.857-10.857 25.714l-292.571 292.571c-6.857 6.857-16 10.857-25.714 10.857-20 0-36.571-16.571-36.571-36.571v-146.286h-128c-246.286 0-408 47.429-408 320 0 23.429 1.143 46.857 2.857 70.286 0.571 9.143 2.857 19.429 2.857 28.571 0 10.857-6.857 20-18.286 20-8 0-12-4-16-9.714-8.571-12-14.857-30.286-21.143-43.429-32.571-73.143-72.571-177.714-72.571-257.714 0-64 6.286-129.714 30.286-190.286 79.429-197.143 312.571-230.286 500-230.286h128v-146.286c0-20 16.571-36.571 36.571-36.571 9.714 0 18.857 4 25.714 10.857l292.571 292.571c6.857 6.857 10.857 16 10.857 25.714z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["mail-forward","share"],"defaultCode":61540,"grid":14},"attrs":[],"properties":{"name":"mail-forward, share","id":94,"order":100,"prevSize":28,"code":61540},"setIdx":0,"setId":1,"iconIdx":99},{"icon":{"paths":["M431.429 603.429c0 4.571-2.286 9.714-5.714 13.143l-189.714 189.714 82.286 82.286c6.857 6.857 10.857 16 10.857 25.714 0 20-16.571 36.571-36.571 36.571h-256c-20 0-36.571-16.571-36.571-36.571v-256c0-20 16.571-36.571 36.571-36.571 9.714 0 18.857 4 25.714 10.857l82.286 82.286 189.714-189.714c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l65.143 65.143c3.429 3.429 5.714 8.571 5.714 13.143zM877.714 109.714v256c0 20-16.571 36.571-36.571 36.571-9.714 0-18.857-4-25.714-10.857l-82.286-82.286-189.714 189.714c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-65.143-65.143c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l189.714-189.714-82.286-82.286c-6.857-6.857-10.857-16-10.857-25.714 0-20 16.571-36.571 36.571-36.571h256c20 0 36.571 16.571 36.571 36.571z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["expand"],"defaultCode":61541,"grid":14},"attrs":[],"properties":{"name":"expand","id":95,"order":101,"prevSize":28,"code":61541},"setIdx":0,"setId":1,"iconIdx":100},{"icon":{"paths":["M438.857 548.571v256c0 20-16.571 36.571-36.571 36.571-9.714 0-18.857-4-25.714-10.857l-82.286-82.286-189.714 189.714c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-65.143-65.143c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l189.714-189.714-82.286-82.286c-6.857-6.857-10.857-16-10.857-25.714 0-20 16.571-36.571 36.571-36.571h256c20 0 36.571 16.571 36.571 36.571zM870.286 164.571c0 4.571-2.286 9.714-5.714 13.143l-189.714 189.714 82.286 82.286c6.857 6.857 10.857 16 10.857 25.714 0 20-16.571 36.571-36.571 36.571h-256c-20 0-36.571-16.571-36.571-36.571v-256c0-20 16.571-36.571 36.571-36.571 9.714 0 18.857 4 25.714 10.857l82.286 82.286 189.714-189.714c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l65.143 65.143c3.429 3.429 5.714 8.571 5.714 13.143z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["compress"],"defaultCode":61542,"grid":14},"attrs":[],"properties":{"name":"compress","id":96,"order":102,"prevSize":28,"code":61542},"setIdx":0,"setId":1,"iconIdx":101},{"icon":{"paths":["M438.857 73.143c242.286 0 438.857 196.571 438.857 438.857s-196.571 438.857-438.857 438.857-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857zM512 785.714v-108.571c0-10.286-8-18.857-17.714-18.857h-109.714c-10.286 0-18.857 8.571-18.857 18.857v108.571c0 10.286 8.571 18.857 18.857 18.857h109.714c9.714 0 17.714-8.571 17.714-18.857zM510.857 589.143l10.286-354.857c0-4-1.714-8-5.714-10.286-3.429-2.857-8.571-4.571-13.714-4.571h-125.714c-5.143 0-10.286 1.714-13.714 4.571-4 2.286-5.714 6.286-5.714 10.286l9.714 354.857c0 8 8.571 14.286 19.429 14.286h105.714c10.286 0 18.857-6.286 19.429-14.286z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["exclamation-circle"],"defaultCode":61546,"grid":14},"attrs":[],"properties":{"name":"exclamation-circle","id":97,"order":103,"prevSize":28,"code":61546},"setIdx":0,"setId":1,"iconIdx":102},{"icon":{"paths":["M950.857 548.571c-54.286-84-128.571-156-217.714-201.714 22.857 38.857 34.857 83.429 34.857 128.571 0 141.143-114.857 256-256 256s-256-114.857-256-256c0-45.143 12-89.714 34.857-128.571-89.143 45.714-163.429 117.714-217.714 201.714 97.714 150.857 255.429 256 438.857 256s341.143-105.143 438.857-256zM539.429 329.143c0-14.857-12.571-27.429-27.429-27.429-95.429 0-173.714 78.286-173.714 173.714 0 14.857 12.571 27.429 27.429 27.429s27.429-12.571 27.429-27.429c0-65.143 53.714-118.857 118.857-118.857 14.857 0 27.429-12.571 27.429-27.429zM1024 548.571c0 14.286-4.571 27.429-11.429 39.429-105.143 173.143-297.714 289.714-500.571 289.714s-395.429-117.143-500.571-289.714c-6.857-12-11.429-25.143-11.429-39.429s4.571-27.429 11.429-39.429c105.143-172.571 297.714-289.714 500.571-289.714s395.429 117.143 500.571 289.714c6.857 12 11.429 25.143 11.429 39.429z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["eye"],"defaultCode":61550,"grid":14},"attrs":[],"properties":{"name":"eye","id":98,"order":107,"prevSize":28,"code":61550},"setIdx":0,"setId":1,"iconIdx":103},{"icon":{"paths":["M317.143 762.857l44.571-80.571c-66.286-48-105.714-125.143-105.714-206.857 0-45.143 12-89.714 34.857-128.571-89.143 45.714-163.429 117.714-217.714 201.714 59.429 92 143.429 169.143 244 214.286zM539.429 329.143c0-14.857-12.571-27.429-27.429-27.429-95.429 0-173.714 78.286-173.714 173.714 0 14.857 12.571 27.429 27.429 27.429s27.429-12.571 27.429-27.429c0-65.714 53.714-118.857 118.857-118.857 14.857 0 27.429-12.571 27.429-27.429zM746.857 220c0 1.143 0 4-0.571 5.143-120.571 215.429-240 432-360.571 647.429l-28 50.857c-3.429 5.714-9.714 9.143-16 9.143-10.286 0-64.571-33.143-76.571-40-5.714-3.429-9.143-9.143-9.143-16 0-9.143 19.429-40 25.143-49.714-110.857-50.286-204-136-269.714-238.857-7.429-11.429-11.429-25.143-11.429-39.429 0-13.714 4-28 11.429-39.429 113.143-173.714 289.714-289.714 500.571-289.714 34.286 0 69.143 3.429 102.857 9.714l30.857-55.429c3.429-5.714 9.143-9.143 16-9.143 10.286 0 64 33.143 76 40 5.714 3.429 9.143 9.143 9.143 15.429zM768 475.429c0 106.286-65.714 201.143-164.571 238.857l160-286.857c2.857 16 4.571 32 4.571 48zM1024 548.571c0 14.857-4 26.857-11.429 39.429-17.714 29.143-40 57.143-62.286 82.857-112 128.571-266.286 206.857-438.286 206.857l42.286-75.429c166.286-14.286 307.429-115.429 396.571-253.714-42.286-65.714-96.571-123.429-161.143-168l36-64c70.857 47.429 142.286 118.857 186.857 192.571 7.429 12.571 11.429 24.571 11.429 39.429z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["eye-slash"],"defaultCode":61552,"grid":14},"attrs":[],"properties":{"name":"eye-slash","id":99,"order":108,"prevSize":28,"code":61552},"setIdx":0,"setId":1,"iconIdx":104},{"icon":{"paths":["M585.143 785.714v-108.571c0-10.286-8-18.857-18.286-18.857h-109.714c-10.286 0-18.286 8.571-18.286 18.857v108.571c0 10.286 8 18.857 18.286 18.857h109.714c10.286 0 18.286-8.571 18.286-18.857zM584 572l10.286-262.286c0-3.429-1.714-8-5.714-10.857-3.429-2.857-8.571-6.286-13.714-6.286h-125.714c-5.143 0-10.286 3.429-13.714 6.286-4 2.857-5.714 8.571-5.714 12l9.714 261.143c0 7.429 8.571 13.143 19.429 13.143h105.714c10.286 0 18.857-5.714 19.429-13.143zM576 38.286l438.857 804.571c12.571 22.286 12 49.714-1.143 72s-37.143 36-62.857 36h-877.714c-25.714 0-49.714-13.714-62.857-36s-13.714-49.714-1.143-72l438.857-804.571c12.571-23.429 37.143-38.286 64-38.286s51.429 14.857 64 38.286z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["exclamation-triangle","warning"],"defaultCode":61553,"grid":14},"attrs":[],"properties":{"name":"exclamation-triangle, warning","id":100,"order":109,"prevSize":28,"code":61553},"setIdx":0,"setId":1,"iconIdx":105},{"icon":{"paths":["M73.143 950.857h164.571v-164.571h-164.571v164.571zM274.286 950.857h182.857v-164.571h-182.857v164.571zM73.143 749.714h164.571v-182.857h-164.571v182.857zM274.286 749.714h182.857v-182.857h-182.857v182.857zM73.143 530.286h164.571v-164.571h-164.571v164.571zM493.714 950.857h182.857v-164.571h-182.857v164.571zM274.286 530.286h182.857v-164.571h-182.857v164.571zM713.143 950.857h164.571v-164.571h-164.571v164.571zM493.714 749.714h182.857v-182.857h-182.857v182.857zM292.571 256v-164.571c0-9.714-8.571-18.286-18.286-18.286h-36.571c-9.714 0-18.286 8.571-18.286 18.286v164.571c0 9.714 8.571 18.286 18.286 18.286h36.571c9.714 0 18.286-8.571 18.286-18.286zM713.143 749.714h164.571v-182.857h-164.571v182.857zM493.714 530.286h182.857v-164.571h-182.857v164.571zM713.143 530.286h164.571v-164.571h-164.571v164.571zM731.429 256v-164.571c0-9.714-8.571-18.286-18.286-18.286h-36.571c-9.714 0-18.286 8.571-18.286 18.286v164.571c0 9.714 8.571 18.286 18.286 18.286h36.571c9.714 0 18.286-8.571 18.286-18.286zM950.857 219.429v731.429c0 40-33.143 73.143-73.143 73.143h-804.571c-40 0-73.143-33.143-73.143-73.143v-731.429c0-40 33.143-73.143 73.143-73.143h73.143v-54.857c0-50.286 41.143-91.429 91.429-91.429h36.571c50.286 0 91.429 41.143 91.429 91.429v54.857h219.429v-54.857c0-50.286 41.143-91.429 91.429-91.429h36.571c50.286 0 91.429 41.143 91.429 91.429v54.857h73.143c40 0 73.143 33.143 73.143 73.143z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["calendar"],"defaultCode":61555,"grid":14},"attrs":[],"properties":{"name":"calendar","id":101,"order":111,"prevSize":28,"code":61555},"setIdx":0,"setId":1,"iconIdx":106},{"icon":{"paths":["M380.571 274.857c-32 49.143-55.429 102.286-78.286 156-33.143-69.143-69.714-138.286-156-138.286h-128c-10.286 0-18.286-8-18.286-18.286v-109.714c0-10.286 8-18.286 18.286-18.286h128c101.714 0 176.571 47.429 234.286 128.571zM1024 731.429c0 4.571-1.714 9.714-5.143 13.143l-182.857 182.857c-3.429 3.429-8.571 5.143-13.143 5.143-9.714 0-18.286-8.571-18.286-18.286v-109.714c-169.714 0-274.286 20-380-128.571 31.429-49.143 54.857-102.286 77.714-156 33.143 69.143 69.714 138.286 156 138.286h146.286v-109.714c0-10.286 8-18.286 18.286-18.286 5.143 0 9.714 2.286 13.714 5.714l182.286 182.286c3.429 3.429 5.143 8.571 5.143 13.143zM1024 219.429c0 4.571-1.714 9.714-5.143 13.143l-182.857 182.857c-3.429 3.429-8.571 5.143-13.143 5.143-9.714 0-18.286-8-18.286-18.286v-109.714h-146.286c-76 0-112 52-144 113.714-16.571 32-30.857 65.143-44.571 97.714-63.429 147.429-137.714 300.571-323.429 300.571h-128c-10.286 0-18.286-8-18.286-18.286v-109.714c0-10.286 8-18.286 18.286-18.286h128c76 0 112-52 144-113.714 16.571-32 30.857-65.143 44.571-97.714 63.429-147.429 137.714-300.571 323.429-300.571h146.286v-109.714c0-10.286 8-18.286 18.286-18.286 5.143 0 9.714 2.286 13.714 5.714l182.286 182.286c3.429 3.429 5.143 8.571 5.143 13.143z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["random"],"defaultCode":61556,"grid":14},"attrs":[],"properties":{"name":"random","id":102,"order":112,"prevSize":28,"code":61556},"setIdx":0,"setId":1,"iconIdx":107},{"icon":{"paths":["M1024 512c0 202.286-229.143 365.714-512 365.714-28 0-56-1.714-82.857-4.571-74.857 66.286-164 113.143-262.857 138.286-20.571 5.714-42.857 9.714-65.143 12.571-12.571 1.143-24.571-8-27.429-21.714v-0.571c-2.857-14.286 6.857-22.857 15.429-33.143 36-40.571 77.143-74.857 104-170.286-117.714-66.857-193.143-170.286-193.143-286.286 0-201.714 229.143-365.714 512-365.714s512 163.429 512 365.714z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["comment"],"defaultCode":61557,"grid":14},"attrs":[],"properties":{"name":"comment","id":103,"order":113,"prevSize":28,"code":61557},"setIdx":0,"setId":1,"iconIdx":108},{"icon":{"paths":["M961.714 760.571l-94.857 94.286c-14.286 14.286-37.143 14.286-51.429 0l-303.429-303.429-303.429 303.429c-14.286 14.286-37.143 14.286-51.429 0l-94.857-94.286c-14.286-14.286-14.286-37.714 0-52l424-423.429c14.286-14.286 37.143-14.286 51.429 0l424 423.429c14.286 14.286 14.286 37.714 0 52z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["chevron-up"],"defaultCode":61559,"grid":14},"attrs":[],"properties":{"name":"chevron-up","id":104,"order":115,"prevSize":28,"code":61559},"setIdx":0,"setId":1,"iconIdx":109},{"icon":{"paths":["M961.714 461.714l-424 423.429c-14.286 14.286-37.143 14.286-51.429 0l-424-423.429c-14.286-14.286-14.286-37.714 0-52l94.857-94.286c14.286-14.286 37.143-14.286 51.429 0l303.429 303.429 303.429-303.429c14.286-14.286 37.143-14.286 51.429 0l94.857 94.286c14.286 14.286 14.286 37.714 0 52z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["chevron-down"],"defaultCode":61560,"grid":14},"attrs":[],"properties":{"name":"chevron-down","id":105,"order":116,"prevSize":28,"code":61560},"setIdx":0,"setId":1,"iconIdx":110},{"icon":{"paths":["M731.429 859.429c0 9.714-8.571 18.286-18.286 18.286h-548.571c-21.143 0-18.286-22.286-18.286-36.571v-329.143h-109.714c-20 0-36.571-16.571-36.571-36.571 0-8.571 2.857-17.143 8.571-23.429l182.857-219.429c6.857-8 17.143-12.571 28-12.571s21.143 4.571 28 12.571l182.857 219.429c5.714 6.286 8.571 14.857 8.571 23.429 0 20-16.571 36.571-36.571 36.571h-109.714v219.429h329.143c5.143 0 10.857 2.286 14.286 6.286l91.429 109.714c2.286 3.429 4 8 4 12zM1097.143 621.714c0 8.571-2.857 17.143-8.571 23.429l-182.857 219.429c-6.857 8-17.143 13.143-28 13.143s-21.143-5.143-28-13.143l-182.857-219.429c-5.714-6.286-8.571-14.857-8.571-23.429 0-20 16.571-36.571 36.571-36.571h109.714v-219.429h-329.143c-5.143 0-10.857-2.286-14.286-6.857l-91.429-109.714c-2.286-2.857-4-7.429-4-11.429 0-9.714 8.571-18.286 18.286-18.286h548.571c21.143 0 18.286 22.286 18.286 36.571v329.143h109.714c20 0 36.571 16.571 36.571 36.571z"],"width":1097.142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["retweet"],"defaultCode":61561,"grid":14},"attrs":[],"properties":{"name":"retweet","id":106,"order":117,"prevSize":28,"code":61561},"setIdx":0,"setId":1,"iconIdx":111},{"icon":{"paths":["M950.857 347.429v402.286c0 70.286-57.714 128-128 128h-694.857c-70.286 0-128-57.714-128-128v-548.571c0-70.286 57.714-128 128-128h182.857c70.286 0 128 57.714 128 128v18.286h384c70.286 0 128 57.714 128 128z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["folder"],"defaultCode":61563,"grid":14},"attrs":[],"properties":{"name":"folder","id":107,"order":119,"prevSize":28,"code":61563},"setIdx":0,"setId":1,"iconIdx":112},{"icon":{"paths":["M1073.714 544c0 13.714-8.571 27.429-17.714 37.714l-192 226.286c-33.143 38.857-100.571 69.714-150.857 69.714h-621.714c-20.571 0-49.714-6.286-49.714-32 0-13.714 8.571-27.429 17.714-37.714l192-226.286c33.143-38.857 100.571-69.714 150.857-69.714h621.714c20.571 0 49.714 6.286 49.714 32zM877.714 347.429v91.429h-475.429c-71.429 0-160 40.571-206.286 95.429l-195.429 229.714c0-4.571-0.571-9.714-0.571-14.286v-548.571c0-70.286 57.714-128 128-128h182.857c70.286 0 128 57.714 128 128v18.286h310.857c70.286 0 128 57.714 128 128z"],"width":1073.7371428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["folder-open"],"defaultCode":61564,"grid":14},"attrs":[],"properties":{"name":"folder-open","id":108,"order":120,"prevSize":28,"code":61564},"setIdx":0,"setId":1,"iconIdx":113},{"icon":{"paths":["M402.286 182.857c0 20-16.571 36.571-36.571 36.571h-73.143v585.143h73.143c20 0 36.571 16.571 36.571 36.571 0 9.714-4 18.857-10.857 25.714l-146.286 146.286c-6.857 6.857-16 10.857-25.714 10.857s-18.857-4-25.714-10.857l-146.286-146.286c-6.857-6.857-10.857-16-10.857-25.714 0-20 16.571-36.571 36.571-36.571h73.143v-585.143h-73.143c-20 0-36.571-16.571-36.571-36.571 0-9.714 4-18.857 10.857-25.714l146.286-146.286c6.857-6.857 16-10.857 25.714-10.857s18.857 4 25.714 10.857l146.286 146.286c6.857 6.857 10.857 16 10.857 25.714z"],"width":438.85714285714283,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["arrows-v"],"defaultCode":61565,"grid":14},"attrs":[],"properties":{"name":"arrows-v","id":109,"order":121,"prevSize":28,"code":61565},"setIdx":0,"setId":1,"iconIdx":114},{"icon":{"paths":["M1024 512c0 9.714-4 18.857-10.857 25.714l-146.286 146.286c-6.857 6.857-16 10.857-25.714 10.857-20 0-36.571-16.571-36.571-36.571v-73.143h-585.143v73.143c0 20-16.571 36.571-36.571 36.571-9.714 0-18.857-4-25.714-10.857l-146.286-146.286c-6.857-6.857-10.857-16-10.857-25.714s4-18.857 10.857-25.714l146.286-146.286c6.857-6.857 16-10.857 25.714-10.857 20 0 36.571 16.571 36.571 36.571v73.143h585.143v-73.143c0-20 16.571-36.571 36.571-36.571 9.714 0 18.857 4 25.714 10.857l146.286 146.286c6.857 6.857 10.857 16 10.857 25.714z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["arrows-h"],"defaultCode":61566,"grid":14},"attrs":[],"properties":{"name":"arrows-h","id":110,"order":122,"prevSize":28,"code":61566},"setIdx":0,"setId":1,"iconIdx":115},{"icon":{"paths":["M512 512c0-80.571-65.714-146.286-146.286-146.286s-146.286 65.714-146.286 146.286 65.714 146.286 146.286 146.286 146.286-65.714 146.286-146.286zM950.857 804.571c0-40-33.143-73.143-73.143-73.143s-73.143 33.143-73.143 73.143c0 40.571 33.143 73.143 73.143 73.143 40.571 0 73.143-33.143 73.143-73.143zM950.857 219.429c0-40-33.143-73.143-73.143-73.143s-73.143 33.143-73.143 73.143c0 40.571 33.143 73.143 73.143 73.143 40.571 0 73.143-33.143 73.143-73.143zM731.429 460v105.714c0 7.429-5.714 16-13.143 17.143l-88.571 13.714c-4.571 14.857-10.857 29.143-18.286 43.429 16 22.857 33.143 44 51.429 65.714 2.286 3.429 4 6.857 4 11.429 0 4-1.143 8-4 10.857-11.429 15.429-75.429 85.143-92 85.143-4.571 0-8.571-1.714-12-4l-65.714-51.429c-14.286 7.429-28.571 13.143-44 17.714-2.857 29.143-5.714 60.571-13.143 88.571-2.286 8-9.143 13.714-17.143 13.714h-106.286c-8 0-16-6.286-17.143-14.286l-13.143-87.429c-14.857-4.571-29.143-10.857-42.857-17.714l-67.429 50.857c-2.857 2.857-7.429 4-11.429 4-4.571 0-8.571-1.714-12-4.571-14.857-13.714-82.286-74.857-82.286-91.429 0-4 1.714-7.429 4-10.857 16.571-21.714 33.714-42.857 50.286-65.143-8-15.429-14.857-30.857-20-46.857l-86.857-13.714c-8-1.143-13.714-8.571-13.714-16.571v-105.714c0-7.429 5.714-16 13.143-17.143l88.571-13.714c4.571-14.857 10.857-29.143 18.286-43.429-16-22.857-33.143-44-51.429-65.714-2.286-3.429-4-7.429-4-11.429s1.143-8 4-11.429c11.429-15.429 75.429-84.571 92-84.571 4.571 0 8.571 1.714 12 4l65.714 51.429c14.286-7.429 28.571-13.143 44-18.286 2.857-28.571 5.714-60 13.143-88 2.286-8 9.143-13.714 17.143-13.714h106.286c8 0 16 6.286 17.143 14.286l13.143 87.429c14.857 4.571 29.143 10.857 42.857 17.714l67.429-50.857c3.429-2.857 7.429-4 11.429-4 4.571 0 8.571 1.714 12 4.571 14.857 13.714 82.286 75.429 82.286 91.429 0 4-1.714 7.429-4 10.857-16.571 22.286-33.714 42.857-49.714 65.143 7.429 15.429 14.286 30.857 19.429 46.857l86.857 13.143c8 1.714 13.714 9.143 13.714 17.143zM1097.143 764.571v80c0 8.571-73.714 16.571-85.143 17.714-4.571 10.857-10.286 20.571-17.143 29.714 5.143 11.429 29.143 68.571 29.143 78.857 0 1.714-0.571 2.857-2.286 4-6.857 4-68 40.571-70.857 40.571-7.429 0-50.286-57.143-56-65.714-5.714 0.571-11.429 1.143-17.143 1.143s-11.429-0.571-17.143-1.143c-5.714 8.571-48.571 65.714-56 65.714-2.857 0-64-36.571-70.857-40.571-1.714-1.143-2.286-2.857-2.286-4 0-9.714 24-67.429 29.143-78.857-6.857-9.143-12.571-18.857-17.143-29.714-11.429-1.143-85.143-9.143-85.143-17.714v-80c0-8.571 73.714-16.571 85.143-17.714 4.571-10.286 10.286-20.571 17.143-29.714-5.143-11.429-29.143-69.143-29.143-78.857 0-1.143 0.571-2.857 2.286-4 6.857-3.429 68-40 70.857-40 7.429 0 50.286 56.571 56 65.143 5.714-0.571 11.429-1.143 17.143-1.143s11.429 0.571 17.143 1.143c16-22.286 33.143-44.571 52.571-64l3.429-1.143c2.857 0 64 36 70.857 40 1.714 1.143 2.286 2.857 2.286 4 0 10.286-24 67.429-29.143 78.857 6.857 9.143 12.571 19.429 17.143 29.714 11.429 1.143 85.143 9.143 85.143 17.714zM1097.143 179.429v80c0 8.571-73.714 16.571-85.143 17.714-4.571 10.857-10.286 20.571-17.143 29.714 5.143 11.429 29.143 68.571 29.143 78.857 0 1.714-0.571 2.857-2.286 4-6.857 4-68 40.571-70.857 40.571-7.429 0-50.286-57.143-56-65.714-5.714 0.571-11.429 1.143-17.143 1.143s-11.429-0.571-17.143-1.143c-5.714 8.571-48.571 65.714-56 65.714-2.857 0-64-36.571-70.857-40.571-1.714-1.143-2.286-2.857-2.286-4 0-9.714 24-67.429 29.143-78.857-6.857-9.143-12.571-18.857-17.143-29.714-11.429-1.143-85.143-9.143-85.143-17.714v-80c0-8.571 73.714-16.571 85.143-17.714 4.571-10.286 10.286-20.571 17.143-29.714-5.143-11.429-29.143-69.143-29.143-78.857 0-1.143 0.571-2.857 2.286-4 6.857-3.429 68-40 70.857-40 7.429 0 50.286 56.571 56 65.143 5.714-0.571 11.429-1.143 17.143-1.143s11.429 0.571 17.143 1.143c16-22.286 33.143-44.571 52.571-64l3.429-1.143c2.857 0 64 36 70.857 40 1.714 1.143 2.286 2.857 2.286 4 0 10.286-24 67.429-29.143 78.857 6.857 9.143 12.571 19.429 17.143 29.714 11.429 1.143 85.143 9.143 85.143 17.714z"],"width":1097.142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["cogs","gears"],"defaultCode":61573,"grid":14},"attrs":[],"properties":{"name":"cogs, gears","id":111,"order":128,"prevSize":28,"code":61573},"setIdx":0,"setId":1,"iconIdx":116},{"icon":{"paths":["M475.429 18.286v765.143l-256.571 134.857c-7.429 4-14.857 6.857-22.857 6.857-16.571 0-24-13.714-24-28.571 0-4 0.571-7.429 1.143-11.429l49.143-285.714-208-202.286c-6.857-7.429-14.286-17.143-14.286-27.429 0-17.143 17.714-24 32-26.286l286.857-41.714 128.571-260c5.143-10.857 14.857-23.429 28-23.429v0z"],"width":475.4285714285714,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["star-half"],"defaultCode":61577,"grid":14},"attrs":[],"properties":{"name":"star-half","id":112,"order":132,"prevSize":28,"code":61577},"setIdx":0,"setId":1,"iconIdx":117},{"icon":{"paths":["M950.857 340.571c0-160.571-108.571-194.286-200-194.286-85.143 0-181.143 92-210.857 127.429-13.714 16.571-42.286 16.571-56 0-29.714-35.429-125.714-127.429-210.857-127.429-91.429 0-200 33.714-200 194.286 0 104.571 105.714 201.714 106.857 202.857l332 320 331.429-319.429c1.714-1.714 107.429-98.857 107.429-203.429zM1024 340.571c0 137.143-125.714 252-130.857 257.143l-356 342.857c-6.857 6.857-16 10.286-25.143 10.286s-18.286-3.429-25.143-10.286l-356.571-344c-4.571-4-130.286-118.857-130.286-256 0-167.429 102.286-267.429 273.143-267.429 100 0 193.714 78.857 238.857 123.429 45.143-44.571 138.857-123.429 238.857-123.429 170.857 0 273.143 100 273.143 267.429z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["heart-o"],"defaultCode":61578,"grid":14},"attrs":[],"properties":{"name":"heart-o","id":113,"order":133,"prevSize":28,"code":61578},"setIdx":0,"setId":1,"iconIdx":118},{"icon":{"paths":["M365.714 822.857c0 16 7.429 54.857-18.286 54.857h-182.857c-90.857 0-164.571-73.714-164.571-164.571v-402.286c0-90.857 73.714-164.571 164.571-164.571h182.857c9.714 0 18.286 8.571 18.286 18.286 0 16 7.429 54.857-18.286 54.857h-182.857c-50.286 0-91.429 41.143-91.429 91.429v402.286c0 50.286 41.143 91.429 91.429 91.429h164.571c14.286 0 36.571-2.857 36.571 18.286zM896 512c0 9.714-4 18.857-10.857 25.714l-310.857 310.857c-6.857 6.857-16 10.857-25.714 10.857-20 0-36.571-16.571-36.571-36.571v-164.571h-256c-20 0-36.571-16.571-36.571-36.571v-219.429c0-20 16.571-36.571 36.571-36.571h256v-164.571c0-20 16.571-36.571 36.571-36.571 9.714 0 18.857 4 25.714 10.857l310.857 310.857c6.857 6.857 10.857 16 10.857 25.714z"],"width":896,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["sign-out"],"defaultCode":61579,"grid":14},"attrs":[],"properties":{"name":"sign-out","id":114,"order":134,"prevSize":28,"code":61579},"setIdx":0,"setId":1,"iconIdx":119},{"icon":{"paths":["M274.286 493.714v-256c0-10.286-8-18.286-18.286-18.286s-18.286 8-18.286 18.286v256c0 10.286 8 18.286 18.286 18.286s18.286-8 18.286-18.286zM658.286 694.857c0 20-16.571 36.571-36.571 36.571h-245.143l-29.143 276c-1.143 9.143-8.571 16.571-17.714 16.571h-0.571c-9.143 0-16.571-6.286-18.286-15.429l-43.429-277.143h-230.857c-20 0-36.571-16.571-36.571-36.571 0-93.714 70.857-182.857 146.286-182.857v-292.571c-40 0-73.143-33.143-73.143-73.143s33.143-73.143 73.143-73.143h365.714c40 0 73.143 33.143 73.143 73.143s-33.143 73.143-73.143 73.143v292.571c75.429 0 146.286 89.143 146.286 182.857z"],"width":658.2857142857142,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["thumb-tack"],"defaultCode":61581,"grid":14},"attrs":[],"properties":{"name":"thumb-tack","id":115,"order":136,"prevSize":28,"code":61581},"setIdx":0,"setId":1,"iconIdx":120},{"icon":{"paths":["M804.571 530.286v182.857c0 90.857-73.714 164.571-164.571 164.571h-475.429c-90.857 0-164.571-73.714-164.571-164.571v-475.429c0-90.857 73.714-164.571 164.571-164.571h402.286c10.286 0 18.286 8 18.286 18.286v36.571c0 10.286-8 18.286-18.286 18.286h-402.286c-50.286 0-91.429 41.143-91.429 91.429v475.429c0 50.286 41.143 91.429 91.429 91.429h475.429c50.286 0 91.429-41.143 91.429-91.429v-182.857c0-10.286 8-18.286 18.286-18.286h36.571c10.286 0 18.286 8 18.286 18.286zM1024 36.571v292.571c0 20-16.571 36.571-36.571 36.571-9.714 0-18.857-4-25.714-10.857l-100.571-100.571-372.571 372.571c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-65.143-65.143c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l372.571-372.571-100.571-100.571c-6.857-6.857-10.857-16-10.857-25.714 0-20 16.571-36.571 36.571-36.571h292.571c20 0 36.571 16.571 36.571 36.571z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["external-link"],"defaultCode":61582,"grid":14},"attrs":[],"properties":{"name":"external-link","id":116,"order":137,"prevSize":28,"code":61582},"setIdx":0,"setId":1,"iconIdx":121},{"icon":{"paths":["M676.571 512c0 9.714-4 18.857-10.857 25.714l-310.857 310.857c-6.857 6.857-16 10.857-25.714 10.857-20 0-36.571-16.571-36.571-36.571v-164.571h-256c-20 0-36.571-16.571-36.571-36.571v-219.429c0-20 16.571-36.571 36.571-36.571h256v-164.571c0-20 16.571-36.571 36.571-36.571 9.714 0 18.857 4 25.714 10.857l310.857 310.857c6.857 6.857 10.857 16 10.857 25.714zM877.714 310.857v402.286c0 90.857-73.714 164.571-164.571 164.571h-182.857c-9.714 0-18.286-8.571-18.286-18.286 0-16-7.429-54.857 18.286-54.857h182.857c50.286 0 91.429-41.143 91.429-91.429v-402.286c0-50.286-41.143-91.429-91.429-91.429h-164.571c-14.286 0-36.571 2.857-36.571-18.286 0-16-7.429-54.857 18.286-54.857h182.857c90.857 0 164.571 73.714 164.571 164.571z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["sign-in"],"defaultCode":61584,"grid":14},"attrs":[],"properties":{"name":"sign-in","id":117,"order":138,"prevSize":28,"code":61584},"setIdx":0,"setId":1,"iconIdx":122},{"icon":{"paths":["M731.429 841.143c0-20-16.571-36.571-36.571-36.571s-36.571 16.571-36.571 36.571 16.571 36.571 36.571 36.571 36.571-16.571 36.571-36.571zM877.714 841.143c0-20-16.571-36.571-36.571-36.571s-36.571 16.571-36.571 36.571 16.571 36.571 36.571 36.571 36.571-16.571 36.571-36.571zM950.857 713.143v182.857c0 30.286-24.571 54.857-54.857 54.857h-841.143c-30.286 0-54.857-24.571-54.857-54.857v-182.857c0-30.286 24.571-54.857 54.857-54.857h244c15.429 42.286 56 73.143 103.429 73.143h146.286c47.429 0 88-30.857 103.429-73.143h244c30.286 0 54.857 24.571 54.857 54.857zM765.143 342.857c-5.714 13.714-18.857 22.857-33.714 22.857h-146.286v256c0 20-16.571 36.571-36.571 36.571h-146.286c-20 0-36.571-16.571-36.571-36.571v-256h-146.286c-14.857 0-28-9.143-33.714-22.857-5.714-13.143-2.857-29.143 8-39.429l256-256c6.857-7.429 16.571-10.857 25.714-10.857s18.857 3.429 25.714 10.857l256 256c10.857 10.286 13.714 26.286 8 39.429z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["upload"],"defaultCode":61587,"grid":14},"attrs":[],"properties":{"name":"upload","id":118,"order":141,"prevSize":28,"code":61587},"setIdx":0,"setId":1,"iconIdx":123},{"icon":{"paths":["M640 146.286h-475.429c-50.286 0-91.429 41.143-91.429 91.429v475.429c0 50.286 41.143 91.429 91.429 91.429h475.429c50.286 0 91.429-41.143 91.429-91.429v-475.429c0-50.286-41.143-91.429-91.429-91.429zM804.571 237.714v475.429c0 90.857-73.714 164.571-164.571 164.571h-475.429c-90.857 0-164.571-73.714-164.571-164.571v-475.429c0-90.857 73.714-164.571 164.571-164.571h475.429c90.857 0 164.571 73.714 164.571 164.571z"],"width":804.5714285714286,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["square-o"],"defaultCode":61590,"grid":14},"attrs":[],"properties":{"name":"square-o","id":119,"order":144,"prevSize":28,"code":61590},"setIdx":0,"setId":1,"iconIdx":124},{"icon":{"paths":["M658.286 146.286h-585.143v709.714l292.571-280.571 50.857 48.571 241.714 232v-709.714zM665.143 73.143c8.571 0 17.143 1.714 25.143 5.143 25.143 9.714 41.143 33.143 41.143 58.857v736.571c0 25.714-16 49.143-41.143 58.857-8 3.429-16.571 4.571-25.143 4.571-17.714 0-34.286-6.286-47.429-18.286l-252-242.286-252 242.286c-13.143 12-29.714 18.857-47.429 18.857-8.571 0-17.143-1.714-25.143-5.143-25.143-9.714-41.143-33.143-41.143-58.857v-736.571c0-25.714 16-49.143 41.143-58.857 8-3.429 16.571-5.143 25.143-5.143h598.857z"],"width":731.4285714285713,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["bookmark-o"],"defaultCode":61591,"grid":14},"attrs":[],"properties":{"name":"bookmark-o","id":120,"order":145,"prevSize":28,"code":61591},"setIdx":0,"setId":1,"iconIdx":125},{"icon":{"paths":["M594.286 694.857c0 25.143-20.571 45.714-45.714 45.714s-45.714-20.571-45.714-45.714 20.571-45.714 45.714-45.714 45.714 20.571 45.714 45.714zM740.571 694.857c0 25.143-20.571 45.714-45.714 45.714s-45.714-20.571-45.714-45.714 20.571-45.714 45.714-45.714 45.714 20.571 45.714 45.714zM804.571 786.286v-182.857c0-9.714-8.571-18.286-18.286-18.286h-694.857c-9.714 0-18.286 8.571-18.286 18.286v182.857c0 9.714 8.571 18.286 18.286 18.286h694.857c9.714 0 18.286-8.571 18.286-18.286zM101.714 512h674.286l-89.714-275.429c-2.857-9.714-13.714-17.143-24-17.143h-446.857c-10.286 0-21.143 7.429-24 17.143zM877.714 603.429v182.857c0 50.286-41.143 91.429-91.429 91.429h-694.857c-50.286 0-91.429-41.143-91.429-91.429v-182.857c0-15.429 4.571-28.571 9.143-42.857l112.571-346.286c13.143-40 51.429-68 93.714-68h446.857c42.286 0 80.571 28 93.714 68l112.571 346.286c4.571 14.286 9.143 27.429 9.143 42.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["hdd-o"],"defaultCode":61600,"grid":14},"attrs":[],"properties":{"name":"hdd-o","id":121,"order":153,"prevSize":28,"code":61600},"setIdx":0,"setId":1,"iconIdx":126},{"icon":{"paths":["M521.143 969.143c0-5.143-4-9.143-9.143-9.143-45.143 0-82.286-37.143-82.286-82.286 0-5.143-4-9.143-9.143-9.143s-9.143 4-9.143 9.143c0 55.429 45.143 100.571 100.571 100.571 5.143 0 9.143-4 9.143-9.143zM140.571 804.571h742.857c-102.286-115.429-152-272-152-475.429 0-73.714-69.714-182.857-219.429-182.857s-219.429 109.143-219.429 182.857c0 203.429-49.714 360-152 475.429zM987.429 804.571c0 40-33.143 73.143-73.143 73.143h-256c0 80.571-65.714 146.286-146.286 146.286s-146.286-65.714-146.286-146.286h-256c-40 0-73.143-33.143-73.143-73.143 84.571-71.429 182.857-199.429 182.857-475.429 0-109.714 90.857-229.714 242.286-252-2.857-6.857-4.571-14.286-4.571-22.286 0-30.286 24.571-54.857 54.857-54.857s54.857 24.571 54.857 54.857c0 8-1.714 15.429-4.571 22.286 151.429 22.286 242.286 142.286 242.286 252 0 276 98.286 404 182.857 475.429z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["bell-o"],"defaultCode":61602,"grid":14},"attrs":[],"properties":{"name":"bell-o","id":122,"order":686,"prevSize":28,"code":61602},"setIdx":0,"setId":1,"iconIdx":127},{"icon":{"paths":["M786.286 512l78.857 77.143c10.857 10.286 14.857 25.714 11.429 40-4 14.286-15.429 25.714-29.714 29.143l-107.429 27.429 30.286 106.286c4 14.286 0 29.714-10.857 40-10.286 10.857-25.714 14.857-40 10.857l-106.286-30.286-27.429 107.429c-3.429 14.286-14.857 25.714-29.143 29.714-3.429 0.571-7.429 1.143-10.857 1.143-10.857 0-21.714-4.571-29.143-12.571l-77.143-78.857-77.143 78.857c-10.286 10.857-25.714 14.857-40 11.429-14.857-4-25.714-15.429-29.143-29.714l-27.429-107.429-106.286 30.286c-14.286 4-29.714 0-40-10.857-10.857-10.286-14.857-25.714-10.857-40l30.286-106.286-107.429-27.429c-14.286-3.429-25.714-14.857-29.714-29.143-3.429-14.286 0.571-29.714 11.429-40l78.857-77.143-78.857-77.143c-10.857-10.286-14.857-25.714-11.429-40 4-14.286 15.429-25.714 29.714-29.143l107.429-27.429-30.286-106.286c-4-14.286 0-29.714 10.857-40 10.286-10.857 25.714-14.857 40-10.857l106.286 30.286 27.429-107.429c3.429-14.286 14.857-25.714 29.143-29.143 14.286-4 29.714 0 40 10.857l77.143 79.429 77.143-79.429c10.286-10.857 25.143-14.857 40-10.857 14.286 3.429 25.714 14.857 29.143 29.143l27.429 107.429 106.286-30.286c14.286-4 29.714 0 40 10.857 10.857 10.286 14.857 25.714 10.857 40l-30.286 106.286 107.429 27.429c14.286 3.429 25.714 14.857 29.714 29.143 3.429 14.286-0.571 29.714-11.429 40z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["certificate"],"defaultCode":61603,"grid":14},"attrs":[],"properties":{"name":"certificate","id":123,"order":687,"prevSize":28,"code":61603},"setIdx":0,"setId":1,"iconIdx":128},{"icon":{"paths":["M731.429 548.571v-73.143c0-20-16.571-36.571-36.571-36.571h-286.857l108-108c6.857-6.857 10.857-16 10.857-25.714s-4-18.857-10.857-25.714l-52-52c-6.857-6.857-16-10.286-25.714-10.286s-18.857 3.429-25.714 10.286l-258.857 258.857c-6.857 6.857-10.286 16-10.286 25.714s3.429 18.857 10.286 25.714l258.857 258.857c6.857 6.857 16 10.286 25.714 10.286s18.857-3.429 25.714-10.286l52-52c6.857-6.857 10.286-16 10.286-25.714s-3.429-18.857-10.286-25.714l-108-108h286.857c20 0 36.571-16.571 36.571-36.571zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["arrow-circle-left"],"defaultCode":61608,"grid":14},"attrs":[],"properties":{"name":"arrow-circle-left","id":124,"order":161,"prevSize":28,"code":61608},"setIdx":0,"setId":1,"iconIdx":129},{"icon":{"paths":["M734.286 512c0-9.714-3.429-18.857-10.286-25.714l-258.857-258.857c-6.857-6.857-16-10.286-25.714-10.286s-18.857 3.429-25.714 10.286l-52 52c-6.857 6.857-10.286 16-10.286 25.714s3.429 18.857 10.286 25.714l108 108h-286.857c-20 0-36.571 16.571-36.571 36.571v73.143c0 20 16.571 36.571 36.571 36.571h286.857l-108 108c-6.857 6.857-10.857 16-10.857 25.714s4 18.857 10.857 25.714l52 52c6.857 6.857 16 10.286 25.714 10.286s18.857-3.429 25.714-10.286l258.857-258.857c6.857-6.857 10.286-16 10.286-25.714zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["arrow-circle-right"],"defaultCode":61609,"grid":14},"attrs":[],"properties":{"name":"arrow-circle-right","id":125,"order":162,"prevSize":28,"code":61609},"setIdx":0,"setId":1,"iconIdx":130},{"icon":{"paths":["M733.714 511.429c0-9.714-3.429-18.857-10.286-25.714l-258.857-258.857c-6.857-6.857-16-10.286-25.714-10.286s-18.857 3.429-25.714 10.286l-258.857 258.857c-6.857 6.857-10.286 16-10.286 25.714s3.429 18.857 10.286 25.714l52 52c6.857 6.857 16 10.286 25.714 10.286s18.857-3.429 25.714-10.286l108-108v286.857c0 20 16.571 36.571 36.571 36.571h73.143c20 0 36.571-16.571 36.571-36.571v-286.857l108 108c6.857 6.857 16 10.857 25.714 10.857s18.857-4 25.714-10.857l52-52c6.857-6.857 10.286-16 10.286-25.714zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["arrow-circle-up"],"defaultCode":61610,"grid":14},"attrs":[],"properties":{"name":"arrow-circle-up","id":126,"order":163,"prevSize":28,"code":61610},"setIdx":0,"setId":1,"iconIdx":131},{"icon":{"paths":["M733.714 512.571c0-9.714-3.429-18.857-10.286-25.714l-52-52c-6.857-6.857-16-10.286-25.714-10.286s-18.857 3.429-25.714 10.286l-108 108v-286.857c0-20-16.571-36.571-36.571-36.571h-73.143c-20 0-36.571 16.571-36.571 36.571v286.857l-108-108c-6.857-6.857-16-10.857-25.714-10.857s-18.857 4-25.714 10.857l-52 52c-6.857 6.857-10.286 16-10.286 25.714s3.429 18.857 10.286 25.714l258.857 258.857c6.857 6.857 16 10.286 25.714 10.286s18.857-3.429 25.714-10.286l258.857-258.857c6.857-6.857 10.286-16 10.286-25.714zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["arrow-circle-down"],"defaultCode":61611,"grid":14},"attrs":[],"properties":{"name":"arrow-circle-down","id":127,"order":164,"prevSize":28,"code":61611},"setIdx":0,"setId":1,"iconIdx":132},{"icon":{"paths":["M219.429 841.143c0-20-16.571-36.571-36.571-36.571s-36.571 16.571-36.571 36.571 16.571 36.571 36.571 36.571 36.571-16.571 36.571-36.571zM587.429 601.143l-389.714 389.714c-13.143 13.143-32 21.143-51.429 21.143s-38.286-8-52-21.143l-60.571-61.714c-13.714-13.143-21.714-32-21.714-51.429s8-38.286 21.714-52l389.143-389.143c29.714 74.857 89.714 134.857 164.571 164.571zM949.714 352.571c0 18.857-6.857 42.286-13.143 60.571-36 101.714-133.714 172-241.714 172-141.143 0-256-114.857-256-256s114.857-256 256-256c41.714 0 96 12.571 130.857 36 5.714 4 9.143 9.143 9.143 16 0 6.286-4 12.571-9.143 16l-167.429 96.571v128l110.286 61.143c18.857-10.857 151.429-94.286 162.857-94.286s18.286 8.571 18.286 20z"],"width":961.6822857142856,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["wrench"],"defaultCode":61613,"grid":14},"attrs":[],"properties":{"name":"wrench","id":128,"order":166,"prevSize":28,"code":61613},"setIdx":0,"setId":1,"iconIdx":133},{"icon":{"paths":["M585.143 804.571h365.714v-73.143h-365.714v73.143zM365.714 512h585.143v-73.143h-585.143v73.143zM731.429 219.429h219.429v-73.143h-219.429v73.143zM1024 694.857v146.286c0 20-16.571 36.571-36.571 36.571h-950.857c-20 0-36.571-16.571-36.571-36.571v-146.286c0-20 16.571-36.571 36.571-36.571h950.857c20 0 36.571 16.571 36.571 36.571zM1024 402.286v146.286c0 20-16.571 36.571-36.571 36.571h-950.857c-20 0-36.571-16.571-36.571-36.571v-146.286c0-20 16.571-36.571 36.571-36.571h950.857c20 0 36.571 16.571 36.571 36.571zM1024 109.714v146.286c0 20-16.571 36.571-36.571 36.571h-950.857c-20 0-36.571-16.571-36.571-36.571v-146.286c0-20 16.571-36.571 36.571-36.571h950.857c20 0 36.571 16.571 36.571 36.571z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["tasks"],"defaultCode":61614,"grid":14},"attrs":[],"properties":{"name":"tasks","id":129,"order":167,"prevSize":28,"code":61614},"setIdx":0,"setId":1,"iconIdx":134},{"icon":{"paths":["M801.714 168.571c5.714 13.714 2.857 29.714-8 40l-281.714 281.714v424c0 14.857-9.143 28-22.286 33.714-4.571 1.714-9.714 2.857-14.286 2.857-9.714 0-18.857-3.429-25.714-10.857l-146.286-146.286c-6.857-6.857-10.857-16-10.857-25.714v-277.714l-281.714-281.714c-10.857-10.286-13.714-26.286-8-40 5.714-13.143 18.857-22.286 33.714-22.286h731.429c14.857 0 28 9.143 33.714 22.286z"],"width":804.5714285714286,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["filter"],"defaultCode":61616,"grid":14},"attrs":[],"properties":{"name":"filter","id":130,"order":168,"prevSize":28,"code":61616},"setIdx":0,"setId":1,"iconIdx":135},{"icon":{"paths":["M365.714 146.286h292.571v-73.143h-292.571v73.143zM1024 512v274.286c0 50.286-41.143 91.429-91.429 91.429h-841.143c-50.286 0-91.429-41.143-91.429-91.429v-274.286h384v91.429c0 20 16.571 36.571 36.571 36.571h182.857c20 0 36.571-16.571 36.571-36.571v-91.429h384zM585.143 512v73.143h-146.286v-73.143h146.286zM1024 237.714v219.429h-1024v-219.429c0-50.286 41.143-91.429 91.429-91.429h201.143v-91.429c0-30.286 24.571-54.857 54.857-54.857h329.143c30.286 0 54.857 24.571 54.857 54.857v91.429h201.143c50.286 0 91.429 41.143 91.429 91.429z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["briefcase"],"defaultCode":61617,"grid":14},"attrs":[],"properties":{"name":"briefcase","id":131,"order":169,"prevSize":28,"code":61617},"setIdx":0,"setId":1,"iconIdx":136},{"icon":{"paths":["M733.143 309.143l-202.857 202.857 202.857 202.857 82.286-82.286c10.286-10.857 26.286-13.714 40-8 13.143 5.714 22.286 18.857 22.286 33.714v256c0 20-16.571 36.571-36.571 36.571h-256c-14.857 0-28-9.143-33.714-22.857-5.714-13.143-2.857-29.143 8-39.429l82.286-82.286-202.857-202.857-202.857 202.857 82.286 82.286c10.857 10.286 13.714 26.286 8 39.429-5.714 13.714-18.857 22.857-33.714 22.857h-256c-20 0-36.571-16.571-36.571-36.571v-256c0-14.857 9.143-28 22.857-33.714 13.143-5.714 29.143-2.857 39.429 8l82.286 82.286 202.857-202.857-202.857-202.857-82.286 82.286c-6.857 6.857-16 10.857-25.714 10.857-4.571 0-9.714-1.143-13.714-2.857-13.714-5.714-22.857-18.857-22.857-33.714v-256c0-20 16.571-36.571 36.571-36.571h256c14.857 0 28 9.143 33.714 22.857 5.714 13.143 2.857 29.143-8 39.429l-82.286 82.286 202.857 202.857 202.857-202.857-82.286-82.286c-10.857-10.286-13.714-26.286-8-39.429 5.714-13.714 18.857-22.857 33.714-22.857h256c20 0 36.571 16.571 36.571 36.571v256c0 14.857-9.143 28-22.286 33.714-4.571 1.714-9.714 2.857-14.286 2.857-9.714 0-18.857-4-25.714-10.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["arrows-alt"],"defaultCode":61618,"grid":14},"attrs":[],"properties":{"name":"arrows-alt","id":132,"order":170,"prevSize":28,"code":61618},"setIdx":0,"setId":1,"iconIdx":137},{"icon":{"paths":["M1097.143 658.286c0 121.143-98.286 219.429-219.429 219.429h-621.714c-141.143 0-256-114.857-256-256 0-102.286 60.571-190.857 147.429-231.429-0.571-8-1.143-16.571-1.143-24.571 0-161.714 130.857-292.571 292.571-292.571 122.286 0 226.857 74.857 270.857 181.714 25.143-22.286 58.286-35.429 94.857-35.429 80.571 0 146.286 65.714 146.286 146.286 0 29.143-8.571 56-23.429 78.857 97.143 22.857 169.714 109.714 169.714 213.714z"],"width":1097.142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["cloud"],"defaultCode":61634,"grid":14},"attrs":[],"properties":{"name":"cloud","id":133,"order":173,"prevSize":28,"code":61634},"setIdx":0,"setId":1,"iconIdx":138},{"icon":{"paths":["M969.143 219.429c30.286 0 54.857 24.571 54.857 54.857v694.857c0 30.286-24.571 54.857-54.857 54.857h-548.571c-30.286 0-54.857-24.571-54.857-54.857v-164.571h-310.857c-30.286 0-54.857-24.571-54.857-54.857v-384c0-30.286 17.714-72.571 38.857-93.714l233.143-233.143c21.143-21.143 63.429-38.857 93.714-38.857h237.714c30.286 0 54.857 24.571 54.857 54.857v187.429c22.286-13.143 50.857-22.857 73.143-22.857h237.714zM658.286 341.143l-170.857 170.857h170.857v-170.857zM292.571 121.714l-170.857 170.857h170.857v-170.857zM404.571 491.429l180.571-180.571v-237.714h-219.429v237.714c0 30.286-24.571 54.857-54.857 54.857h-237.714v365.714h292.571v-146.286c0-30.286 17.714-72.571 38.857-93.714zM950.857 950.857v-658.286h-219.429v237.714c0 30.286-24.571 54.857-54.857 54.857h-237.714v365.714h512z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["copy","files-o"],"defaultCode":61637,"grid":14},"attrs":[],"properties":{"name":"copy, files-o","id":134,"order":176,"prevSize":28,"code":61637},"setIdx":0,"setId":1,"iconIdx":139},{"icon":{"paths":["M219.429 877.714h438.857v-219.429h-438.857v219.429zM731.429 877.714h73.143v-512c0-10.857-9.714-34.286-17.143-41.714l-160.571-160.571c-8-8-30.286-17.143-41.714-17.143v237.714c0 30.286-24.571 54.857-54.857 54.857h-329.143c-30.286 0-54.857-24.571-54.857-54.857v-237.714h-73.143v731.429h73.143v-237.714c0-30.286 24.571-54.857 54.857-54.857h475.429c30.286 0 54.857 24.571 54.857 54.857v237.714zM512 347.429v-182.857c0-9.714-8.571-18.286-18.286-18.286h-109.714c-9.714 0-18.286 8.571-18.286 18.286v182.857c0 9.714 8.571 18.286 18.286 18.286h109.714c9.714 0 18.286-8.571 18.286-18.286zM877.714 365.714v530.286c0 30.286-24.571 54.857-54.857 54.857h-768c-30.286 0-54.857-24.571-54.857-54.857v-768c0-30.286 24.571-54.857 54.857-54.857h530.286c30.286 0 72 17.143 93.714 38.857l160 160c21.714 21.714 38.857 63.429 38.857 93.714z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["floppy-o","save"],"defaultCode":61639,"grid":14},"attrs":[],"properties":{"name":"floppy-o, save","id":135,"order":178,"prevSize":28,"code":61639},"setIdx":0,"setId":1,"iconIdx":140},{"icon":{"paths":["M877.714 237.714v548.571c0 90.857-73.714 164.571-164.571 164.571h-548.571c-90.857 0-164.571-73.714-164.571-164.571v-548.571c0-90.857 73.714-164.571 164.571-164.571h548.571c90.857 0 164.571 73.714 164.571 164.571z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["square"],"defaultCode":61640,"grid":14},"attrs":[],"properties":{"name":"square","id":136,"order":179,"prevSize":28,"code":61640},"setIdx":0,"setId":1,"iconIdx":141},{"icon":{"paths":["M877.714 768v73.143c0 20-16.571 36.571-36.571 36.571h-804.571c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h804.571c20 0 36.571 16.571 36.571 36.571zM877.714 475.429v73.143c0 20-16.571 36.571-36.571 36.571h-804.571c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h804.571c20 0 36.571 16.571 36.571 36.571zM877.714 182.857v73.143c0 20-16.571 36.571-36.571 36.571h-804.571c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h804.571c20 0 36.571 16.571 36.571 36.571z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["bars","navicon","reorder"],"defaultCode":61641,"grid":14},"attrs":[],"properties":{"name":"bars, navicon, reorder","id":137,"order":180,"prevSize":28,"code":61641},"setIdx":0,"setId":1,"iconIdx":142},{"icon":{"paths":["M219.429 804.571c0 60.571-49.143 109.714-109.714 109.714s-109.714-49.143-109.714-109.714 49.143-109.714 109.714-109.714 109.714 49.143 109.714 109.714zM219.429 512c0 60.571-49.143 109.714-109.714 109.714s-109.714-49.143-109.714-109.714 49.143-109.714 109.714-109.714 109.714 49.143 109.714 109.714zM1024 749.714v109.714c0 9.714-8.571 18.286-18.286 18.286h-694.857c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h694.857c9.714 0 18.286 8.571 18.286 18.286zM219.429 219.429c0 60.571-49.143 109.714-109.714 109.714s-109.714-49.143-109.714-109.714 49.143-109.714 109.714-109.714 109.714 49.143 109.714 109.714zM1024 457.143v109.714c0 9.714-8.571 18.286-18.286 18.286h-694.857c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h694.857c9.714 0 18.286 8.571 18.286 18.286zM1024 164.571v109.714c0 9.714-8.571 18.286-18.286 18.286h-694.857c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h694.857c9.714 0 18.286 8.571 18.286 18.286z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["list-ul"],"defaultCode":61642,"grid":14},"attrs":[],"properties":{"name":"list-ul","id":138,"order":181,"prevSize":28,"code":61642},"setIdx":0,"setId":1,"iconIdx":143},{"icon":{"paths":["M217.714 925.714c0 62.857-49.143 98.286-108.571 98.286-36 0-72.571-12-98.286-37.714l32.571-50.286c15.429 14.286 38.857 25.714 60.571 25.714 20 0 41.143-9.714 41.143-32.571 0-32-36.571-33.714-60-32l-14.857-32c20.571-26.286 39.429-55.429 64-77.714v-0.571c-18.286 0-37.143 1.143-55.429 1.143v30.286h-60.571v-86.857h190.286v50.286l-54.286 65.714c38.286 9.143 63.429 38.857 63.429 78.286zM218.857 567.429v90.857h-206.857c-1.714-10.286-3.429-20.571-3.429-30.857 0-105.714 129.143-121.714 129.143-169.714 0-19.429-12-29.714-30.857-29.714-20 0-36.571 17.143-46.286 33.143l-48.571-33.714c18.857-39.429 57.714-61.714 101.143-61.714 53.143 0 98.857 31.429 98.857 88 0 84.571-124 103.429-125.714 148h72.571v-34.286h60zM1024 749.714v109.714c0 9.714-8.571 18.286-18.286 18.286h-694.857c-10.286 0-18.286-8.571-18.286-18.286v-109.714c0-10.286 8-18.286 18.286-18.286h694.857c9.714 0 18.286 8 18.286 18.286zM219.429 236v56.571h-191.429v-56.571h61.143c0-46.286 0.571-92.571 0.571-138.857v-6.857h-1.143c-6.286 12.571-17.714 21.143-28.571 30.857l-40.571-43.429 77.714-72.571h60.571v230.857h61.714zM1024 457.143v109.714c0 9.714-8.571 18.286-18.286 18.286h-694.857c-10.286 0-18.286-8.571-18.286-18.286v-109.714c0-10.286 8-18.286 18.286-18.286h694.857c9.714 0 18.286 8 18.286 18.286zM1024 164.571v109.714c0 9.714-8.571 18.286-18.286 18.286h-694.857c-10.286 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8-18.286 18.286-18.286h694.857c9.714 0 18.286 8.571 18.286 18.286z"],"width":1032.5577142857144,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["list-ol"],"defaultCode":61643,"grid":14},"attrs":[],"properties":{"name":"list-ol","id":139,"order":182,"prevSize":28,"code":61643},"setIdx":0,"setId":1,"iconIdx":144},{"icon":{"paths":["M292.571 786.286v-109.714c0-10.286-8-18.286-18.286-18.286h-182.857c-10.286 0-18.286 8-18.286 18.286v109.714c0 10.286 8 18.286 18.286 18.286h182.857c10.286 0 18.286-8 18.286-18.286zM292.571 566.857v-109.714c0-10.286-8-18.286-18.286-18.286h-182.857c-10.286 0-18.286 8-18.286 18.286v109.714c0 10.286 8 18.286 18.286 18.286h182.857c10.286 0 18.286-8 18.286-18.286zM585.143 786.286v-109.714c0-10.286-8-18.286-18.286-18.286h-182.857c-10.286 0-18.286 8-18.286 18.286v109.714c0 10.286 8 18.286 18.286 18.286h182.857c10.286 0 18.286-8 18.286-18.286zM292.571 347.429v-109.714c0-10.286-8-18.286-18.286-18.286h-182.857c-10.286 0-18.286 8-18.286 18.286v109.714c0 10.286 8 18.286 18.286 18.286h182.857c10.286 0 18.286-8 18.286-18.286zM585.143 566.857v-109.714c0-10.286-8-18.286-18.286-18.286h-182.857c-10.286 0-18.286 8-18.286 18.286v109.714c0 10.286 8 18.286 18.286 18.286h182.857c10.286 0 18.286-8 18.286-18.286zM877.714 786.286v-109.714c0-10.286-8-18.286-18.286-18.286h-182.857c-10.286 0-18.286 8-18.286 18.286v109.714c0 10.286 8 18.286 18.286 18.286h182.857c10.286 0 18.286-8 18.286-18.286zM585.143 347.429v-109.714c0-10.286-8-18.286-18.286-18.286h-182.857c-10.286 0-18.286 8-18.286 18.286v109.714c0 10.286 8 18.286 18.286 18.286h182.857c10.286 0 18.286-8 18.286-18.286zM877.714 566.857v-109.714c0-10.286-8-18.286-18.286-18.286h-182.857c-10.286 0-18.286 8-18.286 18.286v109.714c0 10.286 8 18.286 18.286 18.286h182.857c10.286 0 18.286-8 18.286-18.286zM877.714 347.429v-109.714c0-10.286-8-18.286-18.286-18.286h-182.857c-10.286 0-18.286 8-18.286 18.286v109.714c0 10.286 8 18.286 18.286 18.286h182.857c10.286 0 18.286-8 18.286-18.286zM950.857 164.571v621.714c0 50.286-41.143 91.429-91.429 91.429h-768c-50.286 0-91.429-41.143-91.429-91.429v-621.714c0-50.286 41.143-91.429 91.429-91.429h768c50.286 0 91.429 41.143 91.429 91.429z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["table"],"defaultCode":61646,"grid":14},"attrs":[],"properties":{"name":"table","id":140,"order":185,"prevSize":28,"code":61646},"setIdx":0,"setId":1,"iconIdx":145},{"icon":{"paths":["M585.143 402.286c0 9.714-4 18.857-10.857 25.714l-256 256c-6.857 6.857-16 10.857-25.714 10.857s-18.857-4-25.714-10.857l-256-256c-6.857-6.857-10.857-16-10.857-25.714 0-20 16.571-36.571 36.571-36.571h512c20 0 36.571 16.571 36.571 36.571z"],"width":585.1428571428571,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["caret-down"],"defaultCode":61655,"grid":14},"attrs":[],"properties":{"name":"caret-down","id":141,"order":193,"prevSize":28,"code":61655},"setIdx":0,"setId":1,"iconIdx":146},{"icon":{"paths":["M585.143 694.857c0 20-16.571 36.571-36.571 36.571h-512c-20 0-36.571-16.571-36.571-36.571 0-9.714 4-18.857 10.857-25.714l256-256c6.857-6.857 16-10.857 25.714-10.857s18.857 4 25.714 10.857l256 256c6.857 6.857 10.857 16 10.857 25.714z"],"width":585.1428571428571,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["caret-up"],"defaultCode":61656,"grid":14},"attrs":[],"properties":{"name":"caret-up","id":142,"order":194,"prevSize":28,"code":61656},"setIdx":0,"setId":1,"iconIdx":147},{"icon":{"paths":["M365.714 256v512c0 20-16.571 36.571-36.571 36.571-9.714 0-18.857-4-25.714-10.857l-256-256c-6.857-6.857-10.857-16-10.857-25.714s4-18.857 10.857-25.714l256-256c6.857-6.857 16-10.857 25.714-10.857 20 0 36.571 16.571 36.571 36.571z"],"width":402.2857142857143,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["caret-left"],"defaultCode":61657,"grid":14},"attrs":[],"properties":{"name":"caret-left","id":143,"order":195,"prevSize":28,"code":61657},"setIdx":0,"setId":1,"iconIdx":148},{"icon":{"paths":["M329.143 512c0 9.714-4 18.857-10.857 25.714l-256 256c-6.857 6.857-16 10.857-25.714 10.857-20 0-36.571-16.571-36.571-36.571v-512c0-20 16.571-36.571 36.571-36.571 9.714 0 18.857 4 25.714 10.857l256 256c6.857 6.857 10.857 16 10.857 25.714z"],"width":329.1428571428571,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["caret-right"],"defaultCode":61658,"grid":14},"attrs":[],"properties":{"name":"caret-right","id":144,"order":196,"prevSize":28,"code":61658},"setIdx":0,"setId":1,"iconIdx":149},{"icon":{"paths":["M91.429 877.714h347.429v-658.286h-365.714v640c0 9.714 8.571 18.286 18.286 18.286zM877.714 859.429v-640h-365.714v658.286h347.429c9.714 0 18.286-8.571 18.286-18.286zM950.857 164.571v694.857c0 50.286-41.143 91.429-91.429 91.429h-768c-50.286 0-91.429-41.143-91.429-91.429v-694.857c0-50.286 41.143-91.429 91.429-91.429h768c50.286 0 91.429 41.143 91.429 91.429z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["columns"],"defaultCode":61659,"grid":14},"attrs":[],"properties":{"name":"columns","id":145,"order":197,"prevSize":28,"code":61659},"setIdx":0,"setId":1,"iconIdx":150},{"icon":{"paths":["M585.143 621.714c0 9.714-4 18.857-10.857 25.714l-256 256c-6.857 6.857-16 10.857-25.714 10.857s-18.857-4-25.714-10.857l-256-256c-6.857-6.857-10.857-16-10.857-25.714 0-20 16.571-36.571 36.571-36.571h512c20 0 36.571 16.571 36.571 36.571zM585.143 402.286c0 20-16.571 36.571-36.571 36.571h-512c-20 0-36.571-16.571-36.571-36.571 0-9.714 4-18.857 10.857-25.714l256-256c6.857-6.857 16-10.857 25.714-10.857s18.857 4 25.714 10.857l256 256c6.857 6.857 10.857 16 10.857 25.714z"],"width":585.1428571428571,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["sort","unsorted"],"defaultCode":61660,"grid":14},"attrs":[],"properties":{"name":"sort, unsorted","id":146,"order":198,"prevSize":28,"code":61660},"setIdx":0,"setId":1,"iconIdx":151},{"icon":{"paths":["M585.143 621.714c0 9.714-4 18.857-10.857 25.714l-256 256c-6.857 6.857-16 10.857-25.714 10.857s-18.857-4-25.714-10.857l-256-256c-6.857-6.857-10.857-16-10.857-25.714 0-20 16.571-36.571 36.571-36.571h512c20 0 36.571 16.571 36.571 36.571z"],"width":585.1428571428571,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["sort-desc","sort-down"],"defaultCode":61661,"grid":14},"attrs":[],"properties":{"name":"sort-desc, sort-down","id":147,"order":199,"prevSize":28,"code":61661},"setIdx":0,"setId":1,"iconIdx":152},{"icon":{"paths":["M585.143 402.286c0 20-16.571 36.571-36.571 36.571h-512c-20 0-36.571-16.571-36.571-36.571 0-9.714 4-18.857 10.857-25.714l256-256c6.857-6.857 16-10.857 25.714-10.857s18.857 4 25.714 10.857l256 256c6.857 6.857 10.857 16 10.857 25.714z"],"width":585.1428571428571,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["sort-asc","sort-up"],"defaultCode":61662,"grid":14},"attrs":[],"properties":{"name":"sort-asc, sort-up","id":148,"order":200,"prevSize":28,"code":61662},"setIdx":0,"setId":1,"iconIdx":153},{"icon":{"paths":["M877.714 512c0 241.714-197.143 438.857-438.857 438.857-130.857 0-254.286-57.714-337.714-158.286-5.714-7.429-5.143-18.286 1.143-24.571l78.286-78.857c4-3.429 9.143-5.143 14.286-5.143 5.143 0.571 10.286 2.857 13.143 6.857 56 72.571 140 113.714 230.857 113.714 161.143 0 292.571-131.429 292.571-292.571s-131.429-292.571-292.571-292.571c-74.857 0-145.714 28.571-198.857 78.286l78.286 78.857c10.857 10.286 13.714 26.286 8 39.429-5.714 13.714-18.857 22.857-33.714 22.857h-256c-20 0-36.571-16.571-36.571-36.571v-256c0-14.857 9.143-28 22.857-33.714 13.143-5.714 29.143-2.857 39.429 8l74.286 73.714c80.571-76 189.714-121.143 302.286-121.143 241.714 0 438.857 197.143 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["rotate-left","undo"],"defaultCode":61666,"grid":14},"attrs":[],"properties":{"name":"rotate-left, undo","id":149,"order":203,"prevSize":28,"code":61666},"setIdx":0,"setId":1,"iconIdx":154},{"icon":{"paths":["M838.857 217.143c21.143 21.143 38.857 63.429 38.857 93.714v658.286c0 30.286-24.571 54.857-54.857 54.857h-768c-30.286 0-54.857-24.571-54.857-54.857v-914.286c0-30.286 24.571-54.857 54.857-54.857h512c30.286 0 72.571 17.714 93.714 38.857zM585.143 77.714v214.857h214.857c-3.429-9.714-8.571-19.429-12.571-23.429l-178.857-178.857c-4-4-13.714-9.143-23.429-12.571zM804.571 950.857v-585.143h-237.714c-30.286 0-54.857-24.571-54.857-54.857v-237.714h-438.857v877.714h731.429zM219.429 457.143c0-10.286 8-18.286 18.286-18.286h402.286c10.286 0 18.286 8 18.286 18.286v36.571c0 10.286-8 18.286-18.286 18.286h-402.286c-10.286 0-18.286-8-18.286-18.286v-36.571zM640 585.143c10.286 0 18.286 8 18.286 18.286v36.571c0 10.286-8 18.286-18.286 18.286h-402.286c-10.286 0-18.286-8-18.286-18.286v-36.571c0-10.286 8-18.286 18.286-18.286h402.286zM640 731.429c10.286 0 18.286 8 18.286 18.286v36.571c0 10.286-8 18.286-18.286 18.286h-402.286c-10.286 0-18.286-8-18.286-18.286v-36.571c0-10.286 8-18.286 18.286-18.286h402.286z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["file-text-o"],"defaultCode":61686,"grid":14},"attrs":[],"properties":{"name":"file-text-o","id":150,"order":222,"prevSize":28,"code":61686},"setIdx":0,"setId":1,"iconIdx":155},{"icon":{"paths":["M731.429 548.571v-73.143c0-20-16.571-36.571-36.571-36.571h-182.857v-182.857c0-20-16.571-36.571-36.571-36.571h-73.143c-20 0-36.571 16.571-36.571 36.571v182.857h-182.857c-20 0-36.571 16.571-36.571 36.571v73.143c0 20 16.571 36.571 36.571 36.571h182.857v182.857c0 20 16.571 36.571 36.571 36.571h73.143c20 0 36.571-16.571 36.571-36.571v-182.857h182.857c20 0 36.571-16.571 36.571-36.571zM877.714 237.714v548.571c0 90.857-73.714 164.571-164.571 164.571h-548.571c-90.857 0-164.571-73.714-164.571-164.571v-548.571c0-90.857 73.714-164.571 164.571-164.571h548.571c90.857 0 164.571 73.714 164.571 164.571z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["plus-square"],"defaultCode":61694,"grid":14},"attrs":[],"properties":{"name":"plus-square","id":151,"order":230,"prevSize":28,"code":61694},"setIdx":0,"setId":1,"iconIdx":156},{"icon":{"paths":["M358.286 786.286c0 4.571-2.286 9.714-5.714 13.143l-28.571 28.571c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-266.286-266.286c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l266.286-266.286c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l28.571 28.571c3.429 3.429 5.714 8.571 5.714 13.143s-2.286 9.714-5.714 13.143l-224.571 224.571 224.571 224.571c3.429 3.429 5.714 8.571 5.714 13.143zM577.714 786.286c0 4.571-2.286 9.714-5.714 13.143l-28.571 28.571c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-266.286-266.286c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l266.286-266.286c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l28.571 28.571c3.429 3.429 5.714 8.571 5.714 13.143s-2.286 9.714-5.714 13.143l-224.571 224.571 224.571 224.571c3.429 3.429 5.714 8.571 5.714 13.143z"],"width":603.4285714285714,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["angle-double-left"],"defaultCode":61696,"grid":14},"attrs":[],"properties":{"name":"angle-double-left","id":152,"order":231,"prevSize":28,"code":61696},"setIdx":0,"setId":1,"iconIdx":157},{"icon":{"paths":["M340 548.571c0 4.571-2.286 9.714-5.714 13.143l-266.286 266.286c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-28.571-28.571c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l224.571-224.571-224.571-224.571c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l28.571-28.571c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l266.286 266.286c3.429 3.429 5.714 8.571 5.714 13.143zM559.429 548.571c0 4.571-2.286 9.714-5.714 13.143l-266.286 266.286c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-28.571-28.571c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l224.571-224.571-224.571-224.571c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l28.571-28.571c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l266.286 266.286c3.429 3.429 5.714 8.571 5.714 13.143z"],"width":566.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["angle-double-right"],"defaultCode":61697,"grid":14},"attrs":[],"properties":{"name":"angle-double-right","id":153,"order":232,"prevSize":28,"code":61697},"setIdx":0,"setId":1,"iconIdx":158},{"icon":{"paths":["M614.286 749.714c0 4.571-2.286 9.714-5.714 13.143l-28.571 28.571c-3.429 3.429-8 5.714-13.143 5.714-4.571 0-9.714-2.286-13.143-5.714l-224.571-224.571-224.571 224.571c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-28.571-28.571c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l266.286-266.286c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l266.286 266.286c3.429 3.429 5.714 8.571 5.714 13.143zM614.286 530.286c0 4.571-2.286 9.714-5.714 13.143l-28.571 28.571c-3.429 3.429-8 5.714-13.143 5.714-4.571 0-9.714-2.286-13.143-5.714l-224.571-224.571-224.571 224.571c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-28.571-28.571c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l266.286-266.286c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l266.286 266.286c3.429 3.429 5.714 8.571 5.714 13.143z"],"width":658.2857142857142,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["angle-double-up"],"defaultCode":61698,"grid":14},"attrs":[],"properties":{"name":"angle-double-up","id":154,"order":233,"prevSize":28,"code":61698},"setIdx":0,"setId":1,"iconIdx":159},{"icon":{"paths":["M614.286 493.714c0 4.571-2.286 9.714-5.714 13.143l-266.286 266.286c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-266.286-266.286c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l28.571-28.571c3.429-3.429 8-5.714 13.143-5.714 4.571 0 9.714 2.286 13.143 5.714l224.571 224.571 224.571-224.571c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l28.571 28.571c3.429 3.429 5.714 8.571 5.714 13.143zM614.286 274.286c0 4.571-2.286 9.714-5.714 13.143l-266.286 266.286c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-266.286-266.286c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l28.571-28.571c3.429-3.429 8-5.714 13.143-5.714 4.571 0 9.714 2.286 13.143 5.714l224.571 224.571 224.571-224.571c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l28.571 28.571c3.429 3.429 5.714 8.571 5.714 13.143z"],"width":658.2857142857142,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["angle-double-down"],"defaultCode":61699,"grid":14},"attrs":[],"properties":{"name":"angle-double-down","id":155,"order":234,"prevSize":28,"code":61699},"setIdx":0,"setId":1,"iconIdx":160},{"icon":{"paths":["M358.286 310.857c0 4.571-2.286 9.714-5.714 13.143l-224.571 224.571 224.571 224.571c3.429 3.429 5.714 8.571 5.714 13.143s-2.286 9.714-5.714 13.143l-28.571 28.571c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-266.286-266.286c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l266.286-266.286c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l28.571 28.571c3.429 3.429 5.714 8 5.714 13.143z"],"width":384,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["angle-left"],"defaultCode":61700,"grid":14},"attrs":[],"properties":{"name":"angle-left","id":156,"order":235,"prevSize":28,"code":61700},"setIdx":0,"setId":1,"iconIdx":161},{"icon":{"paths":["M340 548.571c0 4.571-2.286 9.714-5.714 13.143l-266.286 266.286c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-28.571-28.571c-3.429-3.429-5.714-8-5.714-13.143 0-4.571 2.286-9.714 5.714-13.143l224.571-224.571-224.571-224.571c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l28.571-28.571c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l266.286 266.286c3.429 3.429 5.714 8.571 5.714 13.143z"],"width":347.4285714285714,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["angle-right"],"defaultCode":61701,"grid":14},"attrs":[],"properties":{"name":"angle-right","id":157,"order":236,"prevSize":28,"code":61701},"setIdx":0,"setId":1,"iconIdx":162},{"icon":{"paths":["M614.286 676.571c0 4.571-2.286 9.714-5.714 13.143l-28.571 28.571c-3.429 3.429-8 5.714-13.143 5.714-4.571 0-9.714-2.286-13.143-5.714l-224.571-224.571-224.571 224.571c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-28.571-28.571c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l266.286-266.286c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l266.286 266.286c3.429 3.429 5.714 8.571 5.714 13.143z"],"width":658.2857142857142,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["angle-up"],"defaultCode":61702,"grid":14},"attrs":[],"properties":{"name":"angle-up","id":158,"order":237,"prevSize":28,"code":61702},"setIdx":0,"setId":1,"iconIdx":163},{"icon":{"paths":["M614.286 420.571c0 4.571-2.286 9.714-5.714 13.143l-266.286 266.286c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-266.286-266.286c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l28.571-28.571c3.429-3.429 8-5.714 13.143-5.714 4.571 0 9.714 2.286 13.143 5.714l224.571 224.571 224.571-224.571c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l28.571 28.571c3.429 3.429 5.714 8.571 5.714 13.143z"],"width":658.2857142857142,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["angle-down"],"defaultCode":61703,"grid":14},"attrs":[],"properties":{"name":"angle-down","id":159,"order":238,"prevSize":28,"code":61703},"setIdx":0,"setId":1,"iconIdx":164},{"icon":{"paths":["M438.857 201.143c-171.429 0-310.857 139.429-310.857 310.857s139.429 310.857 310.857 310.857 310.857-139.429 310.857-310.857-139.429-310.857-310.857-310.857zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857v0c242.286 0 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["circle-o"],"defaultCode":61708,"grid":14},"attrs":[],"properties":{"name":"circle-o","id":160,"order":243,"prevSize":28,"code":61708},"setIdx":0,"setId":1,"iconIdx":165},{"icon":{"paths":["M300.571 796.571c0 40-32.571 73.143-73.143 73.143-40 0-73.143-33.143-73.143-73.143 0-40.571 33.143-73.143 73.143-73.143 40.571 0 73.143 32.571 73.143 73.143zM585.143 914.286c0 40.571-32.571 73.143-73.143 73.143s-73.143-32.571-73.143-73.143 32.571-73.143 73.143-73.143 73.143 32.571 73.143 73.143zM182.857 512c0 40.571-32.571 73.143-73.143 73.143s-73.143-32.571-73.143-73.143 32.571-73.143 73.143-73.143 73.143 32.571 73.143 73.143zM869.714 796.571c0 40-33.143 73.143-73.143 73.143-40.571 0-73.143-33.143-73.143-73.143 0-40.571 32.571-73.143 73.143-73.143 40 0 73.143 32.571 73.143 73.143zM318.857 227.429c0 50.286-41.143 91.429-91.429 91.429s-91.429-41.143-91.429-91.429 41.143-91.429 91.429-91.429 91.429 41.143 91.429 91.429zM987.429 512c0 40.571-32.571 73.143-73.143 73.143s-73.143-32.571-73.143-73.143 32.571-73.143 73.143-73.143 73.143 32.571 73.143 73.143zM621.714 109.714c0 60.571-49.143 109.714-109.714 109.714s-109.714-49.143-109.714-109.714 49.143-109.714 109.714-109.714 109.714 49.143 109.714 109.714zM924.571 227.429c0 70.857-57.714 128-128 128-70.857 0-128-57.143-128-128 0-70.286 57.143-128 128-128 70.286 0 128 57.714 128 128z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["spinner"],"defaultCode":61712,"grid":14},"attrs":[],"properties":{"name":"spinner","id":161,"order":246,"prevSize":28,"code":61712},"setIdx":0,"setId":1,"iconIdx":166},{"icon":{"paths":["M877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["circle"],"defaultCode":61713,"grid":14},"attrs":[],"properties":{"name":"circle","id":162,"order":247,"prevSize":28,"code":61713},"setIdx":0,"setId":1,"iconIdx":167},{"icon":{"paths":["M1024 640c0 80-40 184.571-72.571 257.714-6.286 13.143-12.571 31.429-21.143 43.429-4 5.714-8 9.714-16 9.714-11.429 0-18.286-9.143-18.286-20 0-9.143 2.286-19.429 2.857-28.571 1.714-23.429 2.857-46.857 2.857-70.286 0-272.571-161.714-320-408-320h-128v146.286c0 20-16.571 36.571-36.571 36.571-9.714 0-18.857-4-25.714-10.857l-292.571-292.571c-6.857-6.857-10.857-16-10.857-25.714s4-18.857 10.857-25.714l292.571-292.571c6.857-6.857 16-10.857 25.714-10.857 20 0 36.571 16.571 36.571 36.571v146.286h128c187.429 0 420.571 33.143 500 230.286 24 60.571 30.286 126.286 30.286 190.286z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["mail-reply","reply"],"defaultCode":61714,"grid":14},"attrs":[],"properties":{"name":"mail-reply, reply","id":163,"order":248,"prevSize":28,"code":61714},"setIdx":0,"setId":1,"iconIdx":168},{"icon":{"paths":["M877.714 749.714v-402.286c0-30.286-24.571-54.857-54.857-54.857h-402.286c-30.286 0-54.857-24.571-54.857-54.857v-36.571c0-30.286-24.571-54.857-54.857-54.857h-182.857c-30.286 0-54.857 24.571-54.857 54.857v548.571c0 30.286 24.571 54.857 54.857 54.857h694.857c30.286 0 54.857-24.571 54.857-54.857zM950.857 347.429v402.286c0 70.286-57.714 128-128 128h-694.857c-70.286 0-128-57.714-128-128v-548.571c0-70.286 57.714-128 128-128h182.857c70.286 0 128 57.714 128 128v18.286h384c70.286 0 128 57.714 128 128z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["folder-o"],"defaultCode":61716,"grid":14},"attrs":[],"properties":{"name":"folder-o","id":164,"order":250,"prevSize":28,"code":61716},"setIdx":0,"setId":1,"iconIdx":169},{"icon":{"paths":["M1017.714 532c0-16-17.714-20-30.286-20h-621.714c-30.286 0-70.286 18.857-89.714 42.286l-168 207.429c-5.143 6.857-10.286 14.286-10.286 22.857 0 16 17.714 20 30.286 20h621.714c30.286 0 70.286-18.857 89.714-42.857l168-207.429c5.143-6.286 10.286-13.714 10.286-22.286zM365.714 438.857h438.857v-91.429c0-30.286-24.571-54.857-54.857-54.857h-329.143c-30.286 0-54.857-24.571-54.857-54.857v-36.571c0-30.286-24.571-54.857-54.857-54.857h-182.857c-30.286 0-54.857 24.571-54.857 54.857v487.429l146.286-180c33.143-40.571 94.286-69.714 146.286-69.714zM1090.857 532c0 25.143-10.857 49.143-26.286 68.571l-168.571 207.429c-32.571 40-94.857 69.714-146.286 69.714h-621.714c-70.286 0-128-57.714-128-128v-548.571c0-70.286 57.714-128 128-128h182.857c70.286 0 128 57.714 128 128v18.286h310.857c70.286 0 128 57.714 128 128v91.429h109.714c38.857 0 77.714 17.714 94.857 54.286 5.714 12 8.571 25.143 8.571 38.857z"],"width":1090.8525714285713,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["folder-open-o"],"defaultCode":61717,"grid":14},"attrs":[],"properties":{"name":"folder-open-o","id":165,"order":251,"prevSize":28,"code":61717},"setIdx":0,"setId":1,"iconIdx":170},{"icon":{"paths":["M219.429 667.429v54.857c0 5.143-4 9.143-9.143 9.143h-54.857c-5.143 0-9.143-4-9.143-9.143v-54.857c0-5.143 4-9.143 9.143-9.143h54.857c5.143 0 9.143 4 9.143 9.143zM292.571 521.143v54.857c0 5.143-4 9.143-9.143 9.143h-128c-5.143 0-9.143-4-9.143-9.143v-54.857c0-5.143 4-9.143 9.143-9.143h128c5.143 0 9.143 4 9.143 9.143zM219.429 374.857v54.857c0 5.143-4 9.143-9.143 9.143h-54.857c-5.143 0-9.143-4-9.143-9.143v-54.857c0-5.143 4-9.143 9.143-9.143h54.857c5.143 0 9.143 4 9.143 9.143zM804.571 667.429v54.857c0 5.143-4 9.143-9.143 9.143h-493.714c-5.143 0-9.143-4-9.143-9.143v-54.857c0-5.143 4-9.143 9.143-9.143h493.714c5.143 0 9.143 4 9.143 9.143zM438.857 521.143v54.857c0 5.143-4 9.143-9.143 9.143h-54.857c-5.143 0-9.143-4-9.143-9.143v-54.857c0-5.143 4-9.143 9.143-9.143h54.857c5.143 0 9.143 4 9.143 9.143zM365.714 374.857v54.857c0 5.143-4 9.143-9.143 9.143h-54.857c-5.143 0-9.143-4-9.143-9.143v-54.857c0-5.143 4-9.143 9.143-9.143h54.857c5.143 0 9.143 4 9.143 9.143zM585.143 521.143v54.857c0 5.143-4 9.143-9.143 9.143h-54.857c-5.143 0-9.143-4-9.143-9.143v-54.857c0-5.143 4-9.143 9.143-9.143h54.857c5.143 0 9.143 4 9.143 9.143zM512 374.857v54.857c0 5.143-4 9.143-9.143 9.143h-54.857c-5.143 0-9.143-4-9.143-9.143v-54.857c0-5.143 4-9.143 9.143-9.143h54.857c5.143 0 9.143 4 9.143 9.143zM731.429 521.143v54.857c0 5.143-4 9.143-9.143 9.143h-54.857c-5.143 0-9.143-4-9.143-9.143v-54.857c0-5.143 4-9.143 9.143-9.143h54.857c5.143 0 9.143 4 9.143 9.143zM950.857 667.429v54.857c0 5.143-4 9.143-9.143 9.143h-54.857c-5.143 0-9.143-4-9.143-9.143v-54.857c0-5.143 4-9.143 9.143-9.143h54.857c5.143 0 9.143 4 9.143 9.143zM658.286 374.857v54.857c0 5.143-4 9.143-9.143 9.143h-54.857c-5.143 0-9.143-4-9.143-9.143v-54.857c0-5.143 4-9.143 9.143-9.143h54.857c5.143 0 9.143 4 9.143 9.143zM804.571 374.857v54.857c0 5.143-4 9.143-9.143 9.143h-54.857c-5.143 0-9.143-4-9.143-9.143v-54.857c0-5.143 4-9.143 9.143-9.143h54.857c5.143 0 9.143 4 9.143 9.143zM950.857 374.857v201.143c0 5.143-4 9.143-9.143 9.143h-128c-5.143 0-9.143-4-9.143-9.143v-54.857c0-5.143 4-9.143 9.143-9.143h64v-137.143c0-5.143 4-9.143 9.143-9.143h54.857c5.143 0 9.143 4 9.143 9.143zM1024 804.571v-512h-950.857v512h950.857zM1097.143 292.571v512c0 40.571-32.571 73.143-73.143 73.143h-950.857c-40.571 0-73.143-32.571-73.143-73.143v-512c0-40.571 32.571-73.143 73.143-73.143h950.857c40.571 0 73.143 32.571 73.143 73.143z"],"width":1097.142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["keyboard-o"],"defaultCode":61724,"grid":14},"attrs":[],"properties":{"name":"keyboard-o","id":166,"order":256,"prevSize":28,"code":61724},"setIdx":0,"setId":1,"iconIdx":171},{"icon":{"paths":["M334.286 561.714l-266.286 266.286c-7.429 7.429-18.857 7.429-26.286 0l-28.571-28.571c-7.429-7.429-7.429-18.857 0-26.286l224.571-224.571-224.571-224.571c-7.429-7.429-7.429-18.857 0-26.286l28.571-28.571c7.429-7.429 18.857-7.429 26.286 0l266.286 266.286c7.429 7.429 7.429 18.857 0 26.286zM950.857 822.857v36.571c0 10.286-8 18.286-18.286 18.286h-548.571c-10.286 0-18.286-8-18.286-18.286v-36.571c0-10.286 8-18.286 18.286-18.286h548.571c10.286 0 18.286 8 18.286 18.286z"],"width":956.5622857142856,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["terminal"],"defaultCode":61728,"grid":14},"attrs":[],"properties":{"name":"terminal","id":167,"order":259,"prevSize":28,"code":61728},"setIdx":0,"setId":1,"iconIdx":172},{"icon":{"paths":["M352.571 799.429l-28.571 28.571c-7.429 7.429-18.857 7.429-26.286 0l-266.286-266.286c-7.429-7.429-7.429-18.857 0-26.286l266.286-266.286c7.429-7.429 18.857-7.429 26.286 0l28.571 28.571c7.429 7.429 7.429 18.857 0 26.286l-224.571 224.571 224.571 224.571c7.429 7.429 7.429 18.857 0 26.286zM690.286 189.714l-213.143 737.714c-2.857 9.714-13.143 15.429-22.286 12.571l-35.429-9.714c-9.714-2.857-15.429-13.143-12.571-22.857l213.143-737.714c2.857-9.714 13.143-15.429 22.286-12.571l35.429 9.714c9.714 2.857 15.429 13.143 12.571 22.857zM1065.714 561.714l-266.286 266.286c-7.429 7.429-18.857 7.429-26.286 0l-28.571-28.571c-7.429-7.429-7.429-18.857 0-26.286l224.571-224.571-224.571-224.571c-7.429-7.429-7.429-18.857 0-26.286l28.571-28.571c7.429-7.429 18.857-7.429 26.286 0l266.286 266.286c7.429 7.429 7.429 18.857 0 26.286z"],"width":1097.142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["code"],"defaultCode":61729,"grid":14},"attrs":[],"properties":{"name":"code","id":168,"order":684,"prevSize":28,"code":61729},"setIdx":0,"setId":1,"iconIdx":173},{"icon":{"paths":["M365.714 618.286v40c0 14.857-9.143 28-22.286 33.714-4.571 1.714-9.714 2.857-14.286 2.857-9.714 0-18.857-3.429-25.714-10.857l-292.571-292.571c-14.286-14.286-14.286-37.143 0-51.429l292.571-292.571c10.286-10.857 26.286-13.714 40-8 13.143 5.714 22.286 18.857 22.286 33.714v39.429l-226.857 227.429c-14.286 14.286-14.286 37.143 0 51.429zM1024 640c0 118.857-89.714 293.714-93.714 301.143-2.857 6.286-9.143 9.714-16 9.714-1.714 0-3.429 0-5.143-0.571-8.571-2.857-13.714-10.857-13.143-19.429 16.571-156-2.857-258.857-60.571-322.857-48.571-54.286-127.429-83.429-250.286-93.143v143.429c0 14.857-9.143 28-22.286 33.714-4.571 1.714-9.714 2.857-14.286 2.857-9.714 0-18.857-3.429-25.714-10.857l-292.571-292.571c-14.286-14.286-14.286-37.143 0-51.429l292.571-292.571c10.286-10.857 26.286-13.714 40-8 13.143 5.714 22.286 18.857 22.286 33.714v149.714c157.714 10.857 270.286 52.571 342.286 126.286 86.286 88.571 96.571 208.571 96.571 290.857z"],"width":1020.5622857142856,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["mail-reply-all","reply-all"],"defaultCode":61730,"grid":14},"attrs":[],"properties":{"name":"mail-reply-all, reply-all","id":169,"order":685,"prevSize":28,"code":61730},"setIdx":0,"setId":1,"iconIdx":174},{"icon":{"paths":["M677.714 546.857l146.857-142.857-241.143-35.429-17.143-34.286-90.857-184v550.286l33.714 17.714 181.714 96-34.286-202.857-6.857-37.714zM936 397.143l-207.429 202.286 49.143 285.714c4 25.143-5.143 40-22.857 40-6.286 0-14.286-2.286-22.857-6.857l-256.571-134.857-256.571 134.857c-8.571 4.571-16.571 6.857-22.857 6.857-17.714 0-26.857-14.857-22.857-40l49.143-285.714-208-202.286c-24.571-24.571-16.571-48.571 17.714-53.714l286.857-41.714 128.571-260c7.429-15.429 17.714-23.429 28-23.429v0c10.286 0 20 8 28 23.429l128.571 260 286.857 41.714c34.286 5.143 42.286 29.143 17.143 53.714z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["star-half-empty","star-half-full","star-half-o"],"defaultCode":61731,"grid":14},"attrs":[],"properties":{"name":"star-half-empty, star-half-full, star-half-o","id":170,"order":262,"prevSize":28,"code":61731},"setIdx":0,"setId":1,"iconIdx":175},{"icon":{"paths":["M318.286 731.429h340v-340zM292.571 705.714l340-340h-340v340zM950.857 749.714v109.714c0 10.286-8 18.286-18.286 18.286h-128v128c0 10.286-8 18.286-18.286 18.286h-109.714c-10.286 0-18.286-8-18.286-18.286v-128h-493.714c-10.286 0-18.286-8-18.286-18.286v-493.714h-128c-10.286 0-18.286-8-18.286-18.286v-109.714c0-10.286 8-18.286 18.286-18.286h128v-128c0-10.286 8-18.286 18.286-18.286h109.714c10.286 0 18.286 8 18.286 18.286v128h486.286l140.571-141.143c7.429-6.857 18.857-6.857 26.286 0 6.857 7.429 6.857 18.857 0 26.286l-141.143 140.571v486.286h128c10.286 0 18.286 8 18.286 18.286z"],"width":952.5394285714285,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["crop"],"defaultCode":61733,"grid":14},"attrs":[],"properties":{"name":"crop","id":171,"order":264,"prevSize":28,"code":61733},"setIdx":0,"setId":1,"iconIdx":176},{"icon":{"paths":["M164.571 841.143c0-30.286-24.571-54.857-54.857-54.857s-54.857 24.571-54.857 54.857 24.571 54.857 54.857 54.857 54.857-24.571 54.857-54.857zM164.571 182.857c0-30.286-24.571-54.857-54.857-54.857s-54.857 24.571-54.857 54.857 24.571 54.857 54.857 54.857 54.857-24.571 54.857-54.857zM530.286 256c0-30.286-24.571-54.857-54.857-54.857s-54.857 24.571-54.857 54.857 24.571 54.857 54.857 54.857 54.857-24.571 54.857-54.857zM585.143 256c0 40.571-22.286 76-54.857 94.857-1.714 206.286-148 252-245.143 282.857-90.857 28.571-120.571 42.286-120.571 97.714v14.857c32.571 18.857 54.857 54.286 54.857 94.857 0 60.571-49.143 109.714-109.714 109.714s-109.714-49.143-109.714-109.714c0-40.571 22.286-76 54.857-94.857v-468.571c-32.571-18.857-54.857-54.286-54.857-94.857 0-60.571 49.143-109.714 109.714-109.714s109.714 49.143 109.714 109.714c0 40.571-22.286 76-54.857 94.857v284c29.143-14.286 60-24 88-32.571 106.286-33.714 166.857-58.857 168-178.286-32.571-18.857-54.857-54.286-54.857-94.857 0-60.571 49.143-109.714 109.714-109.714s109.714 49.143 109.714 109.714z"],"width":585.1428571428571,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["code-fork"],"defaultCode":61734,"grid":14},"attrs":[],"properties":{"name":"code-fork","id":172,"order":265,"prevSize":28,"code":61734},"setIdx":0,"setId":1,"iconIdx":177},{"icon":{"paths":["M250.857 726.286l-146.286 146.286c-4 3.429-8.571 5.143-13.143 5.143s-9.143-1.714-13.143-5.143c-6.857-7.429-6.857-18.857 0-26.286l146.286-146.286c7.429-6.857 18.857-6.857 26.286 0 6.857 7.429 6.857 18.857 0 26.286zM347.429 749.714v182.857c0 10.286-8 18.286-18.286 18.286s-18.286-8-18.286-18.286v-182.857c0-10.286 8-18.286 18.286-18.286s18.286 8 18.286 18.286zM219.429 621.714c0 10.286-8 18.286-18.286 18.286h-182.857c-10.286 0-18.286-8-18.286-18.286s8-18.286 18.286-18.286h182.857c10.286 0 18.286 8 18.286 18.286zM941.714 694.857c0 44-17.143 85.143-48.571 116l-84 83.429c-30.857 30.857-72 47.429-116 47.429s-85.714-17.143-116.571-48.571l-190.857-191.429c-9.714-9.714-17.143-20.571-24-32l136.571-10.286 156 156.571c20.571 20.571 57.143 21.143 77.714 0.571l84-83.429c10.286-10.286 16-24 16-38.286 0-14.857-5.714-28.571-16-38.857l-156.571-157.143 10.286-136.571c11.429 6.857 22.286 14.286 32 24l192 192c30.857 31.429 48 72.571 48 116.571zM589.143 281.143l-136.571 10.286-156-156.571c-10.286-10.286-24-16-38.857-16s-28.571 5.714-38.857 15.429l-84 83.429c-10.286 10.286-16 24-16 38.286 0 14.857 5.714 28.571 16 38.857l156.571 156.571-10.286 137.143c-11.429-6.857-22.286-14.286-32-24l-192-192c-30.857-31.429-48-72.571-48-116.571s17.143-85.143 48.571-116l84-83.429c30.857-30.857 72-47.429 116-47.429s85.714 17.143 116.571 48.571l190.857 191.429c9.714 9.714 17.143 20.571 24 32zM950.857 329.143c0 10.286-8 18.286-18.286 18.286h-182.857c-10.286 0-18.286-8-18.286-18.286s8-18.286 18.286-18.286h182.857c10.286 0 18.286 8 18.286 18.286zM640 18.286v182.857c0 10.286-8 18.286-18.286 18.286s-18.286-8-18.286-18.286v-182.857c0-10.286 8-18.286 18.286-18.286s18.286 8 18.286 18.286zM872.571 104.571l-146.286 146.286c-4 3.429-8.571 5.143-13.143 5.143s-9.143-1.714-13.143-5.143c-6.857-7.429-6.857-18.857 0-26.286l146.286-146.286c7.429-6.857 18.857-6.857 26.286 0 6.857 7.429 6.857 18.857 0 26.286z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["chain-broken","unlink"],"defaultCode":61735,"grid":14},"attrs":[],"properties":{"name":"chain-broken, unlink","id":173,"order":266,"prevSize":28,"code":61735},"setIdx":0,"setId":1,"iconIdx":178},{"icon":{"paths":["M511.999 960c-88.606 0-175.222-26.276-248.895-75.5-73.673-49.229-131.095-119.199-165.002-201.057-33.908-81.864-42.78-171.94-25.494-258.844s59.954-166.729 122.608-229.383c62.654-62.654 142.48-105.322 229.383-122.608s176.98-8.414 258.844 25.494c81.859 33.908 151.828 91.329 201.057 165.002 49.224 73.673 75.5 160.29 75.5 248.895 0 118.815-47.201 232.765-131.215 316.785-84.019 84.014-197.97 131.215-316.785 131.215zM511.999 128c-75.948 0-150.19 22.521-213.339 64.716s-112.367 102.167-141.431 172.334c-29.064 70.167-36.668 147.375-21.852 221.866 14.817 74.486 51.389 142.909 105.093 196.613s122.126 90.276 196.615 105.093c74.488 14.817 151.699 7.214 221.863-21.852 70.17-29.066 130.14-78.285 172.334-141.43 42.194-63.15 64.717-137.39 64.717-213.34 0-101.843-40.458-199.515-112.471-271.529s-169.687-112.471-271.529-112.471z","M495.999 352c26.511 0 48-21.49 48-48s-21.489-48-48-48c-26.51 0-48 21.49-48 48s21.49 48 48 48z","M671.999 704c0 8.489-3.369 16.625-9.375 22.625-6.001 6.006-14.136 9.375-22.625 9.375h-256c-8.487 0-16.626-3.369-22.627-9.375-6.001-6.001-9.373-14.136-9.373-22.625s3.372-16.625 9.373-22.625c6.001-6.006 14.14-9.375 22.627-9.375h96v-192h-64c-8.487 0-16.626-3.372-22.627-9.373s-9.373-14.14-9.373-22.627c0-8.487 3.372-16.626 9.373-22.627s14.14-9.373 22.627-9.373h96c8.489 0 16.625 3.372 22.625 9.373 6.006 6.001 9.375 14.14 9.375 22.627v224h96c8.489 0 16.625 3.369 22.625 9.375 6.006 6.001 9.375 14.136 9.375 22.625z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["info"],"defaultCode":61737,"grid":14},"attrs":[],"properties":{"name":"info","id":174,"order":678,"prevSize":28,"code":61737},"setIdx":0,"setId":1,"iconIdx":179},{"icon":{"paths":["M917.119 944.34h-812.798c-5.469-0.020-10.84-1.444-15.602-4.137-4.762-2.688-8.755-6.554-11.598-11.223-2.809-4.864-4.287-10.383-4.287-16s1.479-11.136 4.287-16l406.4-799.999c2.685-5.242 6.765-9.64 11.79-12.712s10.8-4.697 16.688-4.697c5.893 0 11.668 1.625 16.691 4.697 5.028 3.072 9.103 7.471 11.791 12.712l406.4 799.999c2.806 4.864 4.285 10.383 4.285 16s-1.48 11.136-4.285 16c-3.057 5.059-7.46 9.175-12.713 11.884-5.253 2.714-11.151 3.917-17.050 3.476zM156.481 880.34h708.481l-354.243-697.279-354.238 697.279z","M510.709 816.34c26.511 0 48-21.489 48-48s-21.489-48-48-48c-26.51 0-48 21.489-48 48s21.49 48 48 48z","M510.709 656.34c-8.487 0-16.626-3.369-22.627-9.375-6.001-6.001-9.373-14.136-9.373-22.625v-224c0-8.487 3.372-16.626 9.373-22.627s14.14-9.373 22.627-9.373c8.489 0 16.625 3.372 22.625 9.373 6.006 6.001 9.375 14.14 9.375 22.627v224c0 8.489-3.369 16.625-9.375 22.625-6.001 6.006-14.136 9.375-22.625 9.375z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["exclamation"],"defaultCode":61738,"grid":14},"attrs":[],"properties":{"name":"exclamation","id":175,"order":268,"prevSize":28,"code":61738},"setIdx":0,"setId":1,"iconIdx":180},{"icon":{"paths":["M822.857 256c0-30.286-24.571-54.857-54.857-54.857s-54.857 24.571-54.857 54.857 24.571 54.857 54.857 54.857 54.857-24.571 54.857-54.857zM950.857 91.429c0 189.714-52.571 316-188 452-33.143 32.571-70.857 66.286-111.429 100.571l-11.429 216.571c-0.571 5.714-4 11.429-9.143 14.857l-219.429 128c-2.857 1.714-5.714 2.286-9.143 2.286-4.571 0-9.143-1.714-13.143-5.143l-36.571-36.571c-4.571-5.143-6.286-12-4.571-18.286l48.571-157.714-160.571-160.571-157.714 48.571c-1.714 0.571-3.429 0.571-5.143 0.571-4.571 0-9.714-1.714-13.143-5.143l-36.571-36.571c-5.714-6.286-6.857-15.429-2.857-22.286l128-219.429c3.429-5.143 9.143-8.571 14.857-9.143l216.571-11.429c34.286-40.571 68-78.286 100.571-111.429 142.857-142.286 252-188 450.857-188 10.286 0 19.429 8 19.429 18.286z"],"width":967.4605714285714,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["rocket"],"defaultCode":61749,"grid":14},"attrs":[],"properties":{"name":"rocket","id":176,"order":682,"prevSize":28,"code":61749},"setIdx":0,"setId":1,"iconIdx":181},{"icon":{"paths":["M997.143 441.714l-93.714 436h-190.857l101.714-475.429c4.571-20 1.714-38.286-8.571-50.286-9.714-12-26.857-18.857-47.429-18.857h-96.571l-116.571 544.571h-190.857l116.571-544.571h-163.429l-116.571 544.571h-190.857l116.571-544.571-87.429-186.857h729.143c77.143 0 147.429 32 192.571 88 45.714 56 62.286 132 46.286 207.429z"],"width":1013.1748571428571,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["maxcdn"],"defaultCode":61750,"grid":14},"attrs":[],"properties":{"name":"maxcdn","id":177,"order":683,"prevSize":28,"code":61750},"setIdx":0,"setId":1,"iconIdx":182},{"icon":{"paths":["M519.429 797.143l58.286-58.286c14.286-14.286 14.286-37.143 0-51.429l-175.429-175.429 175.429-175.429c14.286-14.286 14.286-37.143 0-51.429l-58.286-58.286c-14.286-14.286-37.143-14.286-51.429 0l-259.429 259.429c-14.286 14.286-14.286 37.143 0 51.429l259.429 259.429c14.286 14.286 37.143 14.286 51.429 0zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["chevron-circle-left"],"defaultCode":61751,"grid":14},"attrs":[],"properties":{"name":"chevron-circle-left","id":178,"order":280,"prevSize":28,"code":61751},"setIdx":0,"setId":1,"iconIdx":183},{"icon":{"paths":["M409.714 797.143l259.429-259.429c14.286-14.286 14.286-37.143 0-51.429l-259.429-259.429c-14.286-14.286-37.143-14.286-51.429 0l-58.286 58.286c-14.286 14.286-14.286 37.143 0 51.429l175.429 175.429-175.429 175.429c-14.286 14.286-14.286 37.143 0 51.429l58.286 58.286c14.286 14.286 37.143 14.286 51.429 0zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["chevron-circle-right"],"defaultCode":61752,"grid":14},"attrs":[],"properties":{"name":"chevron-circle-right","id":179,"order":281,"prevSize":28,"code":61752},"setIdx":0,"setId":1,"iconIdx":184},{"icon":{"paths":["M665.714 650.857l58.286-58.286c14.286-14.286 14.286-37.143 0-51.429l-259.429-259.429c-14.286-14.286-37.143-14.286-51.429 0l-259.429 259.429c-14.286 14.286-14.286 37.143 0 51.429l58.286 58.286c14.286 14.286 37.143 14.286 51.429 0l175.429-175.429 175.429 175.429c14.286 14.286 37.143 14.286 51.429 0zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["chevron-circle-up"],"defaultCode":61753,"grid":14},"attrs":[],"properties":{"name":"chevron-circle-up","id":180,"order":282,"prevSize":28,"code":61753},"setIdx":0,"setId":1,"iconIdx":185},{"icon":{"paths":["M464.571 742.286l259.429-259.429c14.286-14.286 14.286-37.143 0-51.429l-58.286-58.286c-14.286-14.286-37.143-14.286-51.429 0l-175.429 175.429-175.429-175.429c-14.286-14.286-37.143-14.286-51.429 0l-58.286 58.286c-14.286 14.286-14.286 37.143 0 51.429l259.429 259.429c14.286 14.286 37.143 14.286 51.429 0zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["chevron-circle-down"],"defaultCode":61754,"grid":14},"attrs":[],"properties":{"name":"chevron-circle-down","id":181,"order":283,"prevSize":28,"code":61754},"setIdx":0,"setId":1,"iconIdx":186},{"icon":{"paths":["M219.429 420.571v109.714c0 30.286-24.571 54.857-54.857 54.857h-109.714c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h109.714c30.286 0 54.857 24.571 54.857 54.857zM512 420.571v109.714c0 30.286-24.571 54.857-54.857 54.857h-109.714c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h109.714c30.286 0 54.857 24.571 54.857 54.857zM804.571 420.571v109.714c0 30.286-24.571 54.857-54.857 54.857h-109.714c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h109.714c30.286 0 54.857 24.571 54.857 54.857z"],"width":804.5714285714286,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["ellipsis-h"],"defaultCode":61761,"grid":14},"attrs":[],"properties":{"name":"ellipsis-h","id":182,"order":289,"prevSize":28,"code":61761},"setIdx":0,"setId":1,"iconIdx":187},{"icon":{"paths":["M437.143 742.286c2.857 6.857 1.714 14.286-2.857 20l-200 219.429c-3.429 3.429-8 5.714-13.143 5.714v0c-5.143 0-10.286-2.286-13.714-5.714l-202.857-219.429c-4.571-5.714-5.714-13.143-2.857-20 2.857-6.286 9.143-10.857 16.571-10.857h128v-713.143c0-10.286 8-18.286 18.286-18.286h109.714c10.286 0 18.286 8 18.286 18.286v713.143h128c7.429 0 13.714 4 16.571 10.857z"],"width":438.85714285714283,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["long-arrow-down"],"defaultCode":61813,"grid":14},"attrs":[],"properties":{"name":"long-arrow-down","id":183,"order":338,"prevSize":28,"code":61813},"setIdx":0,"setId":1,"iconIdx":188},{"icon":{"paths":["M437.143 281.714c-2.857 6.286-9.143 10.857-16.571 10.857h-128v713.143c0 10.286-8 18.286-18.286 18.286h-109.714c-10.286 0-18.286-8-18.286-18.286v-713.143h-128c-7.429 0-13.714-4-16.571-10.857s-1.714-14.286 2.857-20l200-219.429c3.429-3.429 8-5.714 13.143-5.714v0c5.143 0 10.286 2.286 13.714 5.714l202.857 219.429c4.571 5.714 5.714 13.143 2.857 20z"],"width":438.85714285714283,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["long-arrow-up"],"defaultCode":61814,"grid":14},"attrs":[],"properties":{"name":"long-arrow-up","id":184,"order":339,"prevSize":28,"code":61814},"setIdx":0,"setId":1,"iconIdx":189},{"icon":{"paths":["M1024 457.143v109.714c0 10.286-8 18.286-18.286 18.286h-713.143v128c0 7.429-4 13.714-10.857 16.571s-14.286 1.714-20-2.857l-219.429-200c-3.429-3.429-5.714-8-5.714-13.143v0c0-5.143 2.286-10.286 5.714-13.714l219.429-202.286c5.714-5.143 13.143-6.286 20-3.429 6.286 2.857 10.857 9.143 10.857 16.571v128h713.143c10.286 0 18.286 8 18.286 18.286z"],"width":1060.5714285714284,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["long-arrow-left"],"defaultCode":61815,"grid":14},"attrs":[],"properties":{"name":"long-arrow-left","id":185,"order":340,"prevSize":28,"code":61815},"setIdx":0,"setId":1,"iconIdx":190},{"icon":{"paths":["M987.429 510.286c0 5.143-2.286 10.286-5.714 13.714l-219.429 202.286c-5.714 5.143-13.143 6.286-20 3.429-6.286-2.857-10.857-9.143-10.857-16.571v-128h-713.143c-10.286 0-18.286-8-18.286-18.286v-109.714c0-10.286 8-18.286 18.286-18.286h713.143v-128c0-7.429 4-13.714 10.857-16.571s14.286-1.714 20 2.857l219.429 200c3.429 3.429 5.714 8 5.714 13.143v0z"],"width":987.4285714285713,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["long-arrow-right"],"defaultCode":61816,"grid":14},"attrs":[],"properties":{"name":"long-arrow-right","id":186,"order":341,"prevSize":28,"code":61816},"setIdx":0,"setId":1,"iconIdx":191},{"icon":{"paths":["M109.714 731.429v73.143h-64c-5.143 0-9.143-4-9.143-9.143v-9.143h-27.429c-5.143 0-9.143-4-9.143-9.143v-18.286c0-5.143 4-9.143 9.143-9.143h27.429v-9.143c0-5.143 4-9.143 9.143-9.143h64zM109.714 585.143v73.143h-64c-5.143 0-9.143-4-9.143-9.143v-9.143h-27.429c-5.143 0-9.143-4-9.143-9.143v-18.286c0-5.143 4-9.143 9.143-9.143h27.429v-9.143c0-5.143 4-9.143 9.143-9.143h64zM109.714 438.857v73.143h-64c-5.143 0-9.143-4-9.143-9.143v-9.143h-27.429c-5.143 0-9.143-4-9.143-9.143v-18.286c0-5.143 4-9.143 9.143-9.143h27.429v-9.143c0-5.143 4-9.143 9.143-9.143h64zM109.714 292.571v73.143h-64c-5.143 0-9.143-4-9.143-9.143v-9.143h-27.429c-5.143 0-9.143-4-9.143-9.143v-18.286c0-5.143 4-9.143 9.143-9.143h27.429v-9.143c0-5.143 4-9.143 9.143-9.143h64zM109.714 146.286v73.143h-64c-5.143 0-9.143-4-9.143-9.143v-9.143h-27.429c-5.143 0-9.143-4-9.143-9.143v-18.286c0-5.143 4-9.143 9.143-9.143h27.429v-9.143c0-5.143 4-9.143 9.143-9.143h64zM731.429 54.857v841.143c0 30.286-24.571 54.857-54.857 54.857h-475.429c-30.286 0-54.857-24.571-54.857-54.857v-841.143c0-30.286 24.571-54.857 54.857-54.857h475.429c30.286 0 54.857 24.571 54.857 54.857zM877.714 758.857v18.286c0 5.143-4 9.143-9.143 9.143h-27.429v9.143c0 5.143-4 9.143-9.143 9.143h-64v-73.143h64c5.143 0 9.143 4 9.143 9.143v9.143h27.429c5.143 0 9.143 4 9.143 9.143zM877.714 612.571v18.286c0 5.143-4 9.143-9.143 9.143h-27.429v9.143c0 5.143-4 9.143-9.143 9.143h-64v-73.143h64c5.143 0 9.143 4 9.143 9.143v9.143h27.429c5.143 0 9.143 4 9.143 9.143zM877.714 466.286v18.286c0 5.143-4 9.143-9.143 9.143h-27.429v9.143c0 5.143-4 9.143-9.143 9.143h-64v-73.143h64c5.143 0 9.143 4 9.143 9.143v9.143h27.429c5.143 0 9.143 4 9.143 9.143zM877.714 320v18.286c0 5.143-4 9.143-9.143 9.143h-27.429v9.143c0 5.143-4 9.143-9.143 9.143h-64v-73.143h64c5.143 0 9.143 4 9.143 9.143v9.143h27.429c5.143 0 9.143 4 9.143 9.143zM877.714 173.714v18.286c0 5.143-4 9.143-9.143 9.143h-27.429v9.143c0 5.143-4 9.143-9.143 9.143h-64v-73.143h64c5.143 0 9.143 4 9.143 9.143v9.143h27.429c5.143 0 9.143 4 9.143 9.143z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["microchip"],"defaultCode":62171,"grid":14},"attrs":[],"properties":{"name":"microchip","id":187,"order":693,"prevSize":28,"code":62171},"setIdx":0,"setId":1,"iconIdx":192}],"height":1024,"metadata":{"name":"FontAwesome"},"preferences":{"showGlyphs":true,"showQuickUse":true,"showQuickUse2":true,"showSVGs":true,"fontPref":{"prefix":"fa-","metadata":{"fontFamily":"FontAwesome","majorVersion":1,"minorVersion":0},"metrics":{"emSize":1024,"baseline":6.25,"whitespace":50},"embed":false,"noie8":true,"ie7":false,"showSelector":false,"selector":"i","showMetrics":false,"showMetadata":false,"showVersion":false},"imagePref":{"prefix":"icon-","png":true,"useClassSelector":true,"color":0,"bgColor":16777215,"classSelector":".icon","name":"icomoon"},"historySize":50,"showCodes":true,"gridSize":16}} \ No newline at end of file +{"IcoMoonType":"selection","icons":[{"icon":{"paths":["M684.256 793.966l-146.286 146.286c-6.932 6.802-16.255 10.606-25.964 10.606s-19.032-3.803-25.964-10.606l-146.286-146.286c-3.41-3.41-6.115-7.458-7.96-11.913s-2.796-9.23-2.796-14.052c-0.001-9.738 3.868-19.079 10.754-25.965s16.226-10.756 25.964-10.756c4.822 0 9.597 0.949 14.052 2.795s8.504 4.549 11.914 7.959l83.749 84.107v-423.856c0-9.699 3.853-19.002 10.712-25.86s16.16-10.712 25.86-10.712c9.699 0 19.001 3.853 25.86 10.712s10.712 16.16 10.712 25.86v423.856l83.749-84.107c6.886-6.886 16.227-10.756 25.966-10.756s19.079 3.869 25.966 10.756c6.886 6.886 10.755 16.227 10.755 25.966s-3.869 19.079-10.755 25.966z","M786.286 658.285h-128c-9.699 0-19.001-3.852-25.86-10.711s-10.712-16.161-10.712-25.86c0-9.699 3.853-19.001 10.712-25.86s16.16-10.712 25.86-10.712h128c32.768-0.031 64.285-12.618 88.057-35.172 23.779-22.554 38.005-53.361 39.76-86.085s-9.092-64.877-30.318-89.846c-21.219-24.97-51.207-40.858-83.785-44.396-8.316-0.882-16.084-4.59-21.994-10.505-5.917-5.914-9.626-13.678-10.503-21.996-3.35-31.449-18.235-60.542-41.784-81.652-23.551-21.11-54.092-32.737-85.719-32.634-23.597-0.154-46.754 6.384-66.785 18.857-6.953 4.363-15.168 6.269-23.332 5.414s-15.805-4.42-21.704-10.128c-33.699-32.745-78.905-50.956-125.893-50.714-44.461 0.011-87.395 16.221-120.77 45.598s-54.9 69.908-60.551 114.009c-0.856 6.825-3.618 13.27-7.971 18.595s-10.119 9.315-16.636 11.512c-28.688 9.795-52.969 29.455-68.519 55.477s-21.361 56.718-16.396 86.623c4.964 29.905 20.381 57.078 43.504 76.68s52.454 30.362 82.768 30.363h128c9.699 0 19.002 3.853 25.86 10.712s10.711 16.16 10.711 25.86c0 9.699-3.853 19.002-10.711 25.86s-16.161 10.711-25.86 10.711h-128c-45.726-0.010-90.084-15.596-125.767-44.191s-60.559-68.491-70.532-113.116c-9.973-44.625-4.447-91.317 15.667-132.381s53.618-74.052 94.989-93.527c12.401-57.159 43.982-108.357 89.498-145.089s102.228-56.789 160.717-56.839c56.689-0.21 111.801 18.659 156.464 53.571 26.825-11.769 55.891-17.556 85.178-16.958s58.092 7.565 84.415 20.419c26.323 12.854 49.532 31.284 68.007 54.012 18.483 22.728 31.795 49.208 39.007 77.598 47.587 12.004 89.154 40.98 116.875 81.479 27.728 40.499 39.702 89.732 33.675 138.44-6.034 48.708-29.645 93.536-66.406 126.054s-84.136 50.488-133.215 50.527z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"grid":14,"tags":["arduino-cloud-download"],"colorPermutations":{"12714014111291321":[]}},"attrs":[],"properties":{"order":723,"id":198,"name":"arduino-cloud-download","prevSize":28,"code":59664},"setIdx":0,"setId":1,"iconIdx":0},{"icon":{"paths":["M854.72 246.726l-671.997 672.001c-6.066 5.946-14.223 9.28-22.719 9.28s-16.653-3.334-22.719-9.28c-5.996-6.042-9.361-14.208-9.361-22.72s3.365-16.678 9.361-22.72l107.52-107.52c-37.22-5.818-71.592-23.424-98.059-50.234s-43.632-61.402-48.97-98.694c-5.338-37.292 1.432-75.312 19.315-108.469s45.935-59.7 80.029-75.724c7.995-36.965 25.219-71.304 50.068-99.816s56.512-50.267 92.038-63.237c35.526-12.971 73.758-16.735 111.132-10.941s72.672 20.956 102.604 44.074c23.899-10.368 49.78-15.369 75.821-14.651 26.038 0.718 51.606 7.138 74.896 18.807l105.6-105.596c6.029-6.026 14.202-9.411 22.72-9.411 8.525 0 16.698 3.385 22.72 9.411 6.029 6.026 9.414 14.198 9.414 22.72s-3.386 16.694-9.414 22.72v0z","M928 592.030c-0.083 46.653-18.65 91.375-51.642 124.36-32.986 32.986-77.702 51.558-124.358 51.642h-322.563l361.283-361.282c1.6 4.797 2.88 9.6 4.166 14.398 38.093 9.509 71.904 31.506 96.032 62.48s37.184 69.139 37.082 108.402v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"grid":14,"tags":["arduino-cloud-filled-offline"],"colorPermutations":{"12714014111291321":[]}},"attrs":[],"properties":{"order":724,"id":197,"name":"arduino-cloud-filled-offline","prevSize":28,"code":59665},"setIdx":0,"setId":1,"iconIdx":1},{"icon":{"paths":["M928 591.998c-0.083 46.653-18.65 91.375-51.635 124.36-32.992 32.992-77.709 51.558-124.365 51.642h-479.998c-40.017-0.013-78.836-13.658-110.060-38.688-31.224-25.024-52.989-59.942-61.71-98.999-8.721-39.055-3.876-79.916 13.736-115.849s46.94-64.794 83.151-81.826c7.995-36.965 25.22-71.304 50.068-99.816s56.513-50.266 92.038-63.237c35.526-12.971 73.759-16.735 111.132-10.941s72.672 20.956 102.604 44.074c22.414-9.744 46.599-14.755 71.040-14.72 39.262-0.102 77.425 12.954 108.401 37.083s52.973 57.94 62.483 96.035c38.093 9.508 71.904 31.506 96.032 62.48s37.184 69.14 37.082 108.403z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"grid":14,"tags":["arduino-cloud-filled"],"colorPermutations":{"12714014111291321":[]}},"attrs":[],"properties":{"order":725,"id":196,"name":"arduino-cloud-filled","prevSize":28,"code":59666},"setIdx":0,"setId":1,"iconIdx":2},{"icon":{"paths":["M794.88 421.148c-1.28-4.797-2.56-9.601-4.16-14.398l-53.12 53.125c2.080 5.548 5.67 10.404 10.362 14.022 4.698 3.618 10.304 5.853 16.198 6.454 28.493 3.153 54.701 17.094 73.235 38.963 18.541 21.868 28 50.003 26.445 78.628s-14.016 55.569-34.81 75.3c-20.8 19.725-48.365 30.746-77.030 30.79h-258.563l-64 64h322.563c42.944-0.026 84.403-15.744 116.57-44.198s52.832-67.68 58.099-110.301c5.267-42.621-5.216-85.699-29.491-121.13-24.269-35.43-60.646-60.771-102.298-71.254v0z","M854.72 201.3c-6.042-5.997-14.208-9.363-22.72-9.363s-16.678 3.366-22.714 9.363l-105.606 105.595c-23.29-11.669-48.858-18.089-74.898-18.806s-51.923 4.284-75.821 14.652c-29.932-23.118-65.23-38.28-102.604-44.074s-75.606-2.029-111.132 10.941c-35.526 12.971-67.19 34.726-92.039 63.237s-42.073 62.851-50.068 99.816c-34.093 16.024-62.145 42.566-80.028 75.723s-24.653 71.177-19.315 108.468c5.338 37.292 22.502 71.884 48.968 98.693s60.837 44.416 98.057 50.234l-107.52 107.52c-5.996 6.042-9.361 14.208-9.361 22.72s3.364 16.678 9.361 22.72c6.065 5.946 14.223 9.28 22.719 9.28s16.653-3.334 22.719-9.28l672.001-672.001c5.997-6.040 9.357-14.207 9.363-22.718 0-8.511-3.366-16.678-9.363-22.719v0zM306.564 704.019h-34.563c-26.523 0.013-52.188-9.395-72.423-26.541s-33.725-40.92-38.067-67.085c-4.342-26.165 0.747-53.022 14.36-75.785s34.865-39.954 59.97-48.51c5.716-1.953 10.763-5.483 14.557-10.184s6.18-10.379 6.883-16.379c5.021-38.555 23.892-73.968 53.095-99.638s66.744-39.843 105.625-39.878c41.119-0.243 80.673 15.741 110.078 44.484 5.176 4.951 11.848 8.045 18.97 8.797s14.294-0.88 20.39-4.641c17.553-10.974 37.86-16.744 58.562-16.641 10.271 0.061 20.492 1.458 30.399 4.156l-347.836 347.843z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"grid":14,"tags":["arduino-cloud-offline"],"colorPermutations":{"12714014111291321":[]}},"attrs":[],"properties":{"order":726,"id":195,"name":"arduino-cloud-offline","prevSize":28,"code":59667},"setIdx":0,"setId":1,"iconIdx":3},{"icon":{"paths":["M684.258 537.965c-6.932 6.799-16.255 10.607-25.964 10.607s-19.032-3.809-25.964-10.607l-83.751-84.118v423.867c0 9.699-3.853 19.003-10.711 25.856-6.859 6.861-16.161 10.715-25.86 10.715s-19.001-3.855-25.86-10.715c-6.859-6.853-10.712-16.157-10.712-25.856v-423.867l-83.749 84.118c-6.886 6.886-16.227 10.756-25.966 10.756s-19.079-3.869-25.966-10.756c-6.886-6.886-10.755-16.227-10.755-25.966s3.869-19.079 10.755-25.966l146.286-146.286c6.903-6.854 16.236-10.701 25.964-10.701s19.062 3.847 25.964 10.701l146.286 146.286c6.853 6.904 10.7 16.237 10.701 25.965s-3.845 19.062-10.698 25.966z","M786.286 694.856h-128c-9.699 0-19.001-3.852-25.86-10.711s-10.712-16.161-10.712-25.86c0-9.699 3.853-19.001 10.712-25.86s16.16-10.712 25.86-10.712h128c32.768-0.031 64.285-12.618 88.057-35.172 23.779-22.554 38.005-53.361 39.76-86.085s-9.092-64.877-30.318-89.846c-21.219-24.97-51.207-40.858-83.785-44.396-8.316-0.882-16.084-4.59-21.994-10.505-5.917-5.914-9.626-13.678-10.503-21.996-3.35-31.449-18.235-60.542-41.784-81.652-23.551-21.11-54.092-32.737-85.719-32.634-23.597-0.154-46.754 6.384-66.785 18.857-6.954 4.362-15.168 6.268-23.331 5.413s-15.805-4.419-21.705-10.127c-33.699-32.745-78.905-50.956-125.893-50.714-44.461 0.011-87.395 16.221-120.77 45.598s-54.9 69.908-60.551 114.009c-0.856 6.825-3.618 13.27-7.971 18.595s-10.119 9.315-16.636 11.512c-28.688 9.795-52.969 29.455-68.519 55.477s-21.361 56.718-16.396 86.623c4.964 29.905 20.381 57.078 43.504 76.68s52.454 30.362 82.768 30.363h128c9.699 0 19.002 3.853 25.86 10.712s10.711 16.16 10.711 25.86c0 9.699-3.853 19.002-10.711 25.86s-16.161 10.711-25.86 10.711h-128c-45.726-0.010-90.084-15.596-125.767-44.191s-60.559-68.491-70.532-113.116c-9.973-44.625-4.447-91.317 15.667-132.381s53.618-74.052 94.989-93.527c12.401-57.159 43.982-108.357 89.498-145.089s102.228-56.789 160.717-56.839c56.689-0.21 111.801 18.659 156.464 53.571 26.825-11.769 55.891-17.556 85.178-16.958s58.092 7.565 84.415 20.419c26.323 12.854 49.532 31.284 68.007 54.012 18.483 22.728 31.795 49.208 39.007 77.598 47.587 12.004 89.154 40.98 116.875 81.479 27.728 40.499 39.702 89.732 33.675 138.44-6.034 48.708-29.645 93.536-66.406 126.054s-84.136 50.488-133.215 50.527z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"grid":14,"tags":["arduino-cloud-upload"],"colorPermutations":{"12714014111291321":[]}},"attrs":[],"properties":{"order":727,"id":194,"name":"arduino-cloud-upload","prevSize":28,"code":59668},"setIdx":0,"setId":1,"iconIdx":4},{"icon":{"paths":["M752 768h-480c-40.010-0.006-78.824-13.645-110.046-38.662-31.222-25.024-52.989-59.93-61.716-98.98-8.726-39.047-3.891-79.902 13.709-115.833s46.915-64.796 83.115-81.836c10.851-50.014 38.484-94.812 78.31-126.953s89.45-49.69 140.627-49.734c49.603-0.184 97.826 16.327 136.906 46.875 23.472-10.298 48.904-15.361 74.531-14.838s50.829 6.62 73.862 17.866c23.034 11.247 43.341 27.374 59.507 47.261 16.173 19.887 27.821 43.056 34.131 67.898 41.638 10.504 78.010 35.857 102.266 71.294 24.262 35.437 34.739 78.515 29.466 121.135-5.28 42.623-25.939 81.842-58.106 110.296s-73.619 44.179-116.563 44.211zM416 320.001c-38.904 0.010-76.471 14.193-105.674 39.899s-48.038 61.169-52.982 99.757c-0.749 5.972-3.166 11.611-6.975 16.271s-8.853 8.151-14.556 10.073c-25.102 8.571-46.348 25.773-59.954 48.542s-18.691 49.628-14.347 75.795c4.344 26.167 17.833 49.943 38.066 67.095s45.897 26.566 72.422 26.566h480c28.672-0.026 56.25-11.040 77.050-30.778 20.806-19.731 33.254-46.688 34.79-75.321s-7.955-56.767-26.528-78.616c-18.566-21.848-44.806-35.75-73.312-38.847-7.277-0.772-14.074-4.016-19.245-9.191-5.178-5.176-8.422-11.969-9.19-19.247-2.931-27.518-15.955-52.974-36.563-71.445-20.602-18.471-47.328-28.645-75.002-28.555-20.647-0.135-40.909 5.587-58.437 16.5-6.084 3.816-13.272 5.484-20.415 4.737s-13.83-3.868-18.992-8.861c-29.487-28.652-69.042-44.586-110.156-44.375v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"grid":14,"tags":["arduino-cloud"],"colorPermutations":{"12714014111291321":[]}},"attrs":[],"properties":{"order":728,"id":193,"name":"arduino-cloud","prevSize":28,"code":59669},"setIdx":0,"setId":1,"iconIdx":5},{"icon":{"paths":["M558.545 1024c-23.818 0-47.637-9.095-65.819-27.276l-465.454-465.453c-36.363-36.363-36.363-95.273 0-131.636s95.273-36.363 131.637 0l399.636 399.636 772.003-772c36.361-36.363 95.269-36.363 131.631 0s36.361 95.273 0 131.637l-837.815 837.815c-18.182 18.181-42 27.276-65.818 27.276z"],"attrs":[{}],"width":1489,"isMulticolor":false,"isMulticolor2":false,"grid":14,"tags":["arduino-verify"],"colorPermutations":{"12714014111291321":[{}]}},"attrs":[{}],"properties":{"order":12,"id":192,"name":"arduino-verify","prevSize":28,"code":59659},"setIdx":0,"setId":1,"iconIdx":6},{"icon":{"paths":["M1072.469 526.509l-409.603 409.598c-13.65 12.971-30.717 19.804-48.467 19.804s-34.817-6.833-48.467-19.804c-26.625-26.617-26.625-70.315 0-96.932l293.551-292.866h-791.217c-37.55 0-68.267-30.717-68.267-68.267s30.717-68.267 68.267-68.267h791.217l-293.551-292.866c-26.625-26.616-26.625-70.317 0-96.934 26.616-26.634 70.317-26.634 96.933 0l409.603 409.6c26.624 26.616 26.624 70.317 0 96.934v0z"],"attrs":[{}],"width":1161,"isMulticolor":false,"isMulticolor2":false,"grid":14,"tags":["arduino-upload"],"colorPermutations":{"12714014111291321":[{}]}},"attrs":[{}],"properties":{"order":11,"id":191,"name":"arduino-upload","prevSize":28,"code":59660},"setIdx":0,"setId":1,"iconIdx":7},{"icon":{"paths":["M651.891 890.88c-92.835 0-179.095-28.493-250.5-77.197l-129.659 129.658c-22.494 22.496-58.964 22.496-81.458 0s-22.494-58.963 0-81.459l124.954-124.954c-67.75-78.157-108.777-180.090-108.777-291.489 0-245.759 199.68-445.439 445.44-445.439s445.44 199.679 445.44 445.439c0 245.761-199.68 445.441-445.44 445.441zM651.891 153.6c-161.28 0-291.84 130.559-291.84 291.839s130.56 291.841 291.84 291.841c160.512 0 291.84-130.561 291.84-291.841 0-160.511-130.56-291.839-291.84-291.839zM1149.562 478.091c0 35.423 28.717 64.138 64.141 64.138s64.134-28.716 64.134-64.138c0-35.423-28.71-64.139-64.134-64.139s-64.141 28.716-64.141 64.139zM64.064 542.237c-35.382 0-64.064-28.682-64.064-64.063s28.682-64.064 64.064-64.064c35.381 0 64.064 28.682 64.064 64.064s-28.683 64.063-64.064 64.063zM1458.707 542.229c-35.418 0-64.134-28.716-64.134-64.138s28.717-64.139 64.134-64.139c35.424 0 64.141 28.716 64.141 64.139s-28.717 64.138-64.141 64.138zM652.659 526.847c-44.961 0-81.408-36.447-81.408-81.407s36.447-81.408 81.408-81.408c44.96 0 81.408 36.447 81.408 81.408s-36.448 81.407-81.408 81.407z"],"attrs":[{}],"width":1536,"isMulticolor":false,"isMulticolor2":false,"grid":14,"tags":["arduino-monitor"],"colorPermutations":{"12714014111291321":[{}]}},"attrs":[{}],"properties":{"order":10,"id":190,"name":"arduino-monitor","prevSize":28,"code":59661},"setIdx":0,"setId":1,"iconIdx":8},{"icon":{"paths":["M511.998 603.432c50.495 0 91.432-40.936 91.432-91.432s-40.936-91.432-91.432-91.432c-50.495 0-91.432 40.936-91.432 91.432s40.936 91.432 91.432 91.432z","M923.433 603.432c50.494 0 91.432-40.936 91.432-91.432s-40.937-91.432-91.432-91.432c-50.494 0-91.432 40.936-91.432 91.432s40.937 91.432 91.432 91.432z","M100.565 603.432c50.495 0 91.432-40.936 91.432-91.432s-40.936-91.432-91.432-91.432c-50.495 0-91.432 40.936-91.432 91.432s40.936 91.432 91.432 91.432z"],"attrs":[{},{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":14,"tags":["arduino-sketch-tabs-menu"],"colorPermutations":{"12714014111291321":[{},{},{}]}},"attrs":[{},{},{}],"properties":{"order":9,"id":189,"name":"arduino-sketch-tabs-menu","prevSize":28,"code":59662},"setIdx":0,"setId":1,"iconIdx":9},{"icon":{"paths":["M323.368 970.208c-20.263 0-39-11.42-48.21-29.788l-146.789-293.581h-74.474c-29.789 0-53.895-24.107-53.895-53.895s24.105-53.895 53.895-53.895h107.789c20.421 0 39.053 11.528 48.21 29.788l96.527 193.056 180.263-720.949c5.842-23.579 26.737-40.263 51-40.842 23.947-1.579 45.893 15.158 52.894 38.421l150.162 500.526h67.681c29.788 0 53.895 24.107 53.895 53.895s-24.107 53.895-53.895 53.895h-107.789c-23.789 0-44.787-15.629-51.631-38.422l-105.316-351.104-168.052 672.053c-5.474 21.897-23.948 38.055-46.368 40.529-2 0.21-3.947 0.313-5.895 0.313h-0.001z"],"attrs":[{}],"width":862,"isMulticolor":false,"isMulticolor2":false,"grid":14,"tags":["arduino-plotter"],"colorPermutations":{"12714014111291321":[{}]}},"attrs":[{}],"properties":{"order":8,"id":188,"name":"arduino-plotter","prevSize":28,"code":59663},"setIdx":0,"setId":1,"iconIdx":10},{"icon":{"paths":["M416.006 800c-4.211 0.026-8.386-0.787-12.285-2.374-3.899-1.594-7.445-3.942-10.435-6.906l-224-224.002c-6.026-6.026-9.411-14.198-9.411-22.72s3.385-16.694 9.411-22.72c6.026-6.026 14.198-9.411 22.72-9.411s16.694 3.386 22.72 9.411l201.28 201.602 425.281-425.602c6.022-6.026 14.195-9.411 22.72-9.411 8.518 0 16.691 3.386 22.72 9.411 6.022 6.026 9.408 14.198 9.408 22.72s-3.386 16.694-9.408 22.72l-448.001 448.002c-2.99 2.963-6.536 5.312-10.435 6.906-3.899 1.587-8.074 2.4-12.285 2.374z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["fa-check"],"grid":14,"colorPermutations":{"12714014111291321":[{}]}},"attrs":[{}],"properties":{"order":722,"id":0,"name":"fa-check","prevSize":28,"code":59658},"setIdx":0,"setId":1,"iconIdx":11},{"icon":{"paths":["M864 128h-576c-8.484 0.062-16.618 3.385-22.72 9.28l-128 128c-5.969 6.052-9.305 14.219-9.28 22.72v576c0.024 8.48 3.404 16.602 9.4 22.598s14.121 9.376 22.6 9.402h576c8.486-0.038 16.634-3.36 22.72-9.28l128-128c5.894-6.099 9.216-14.234 9.28-22.72v-576c-0.026-8.479-3.405-16.605-9.402-22.6s-14.118-9.375-22.598-9.4zM704 832h-512v-512h512v512zM722.56 256h-485.12l63.68-64h485.44l-64 64zM832 722.88l-64 63.68v-485.12l64-64v485.44z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["technology-3dimensionscube"],"grid":14,"colorPermutations":{"12714014111291321":[{}]}},"attrs":[{}],"properties":{"order":717,"id":1,"name":"arduino-technology-3dimensionscube","prevSize":28,"code":59654},"setIdx":0,"setId":1,"iconIdx":12},{"icon":{"paths":["M848 224v96c0 8.487-3.373 16.627-9.37 22.627-6.003 6.001-14.144 9.373-22.63 9.373h-16v96c-0.019 5.909-1.67 11.699-4.781 16.725-3.104 5.027-7.539 9.096-12.819 11.755l-238.4 119.36v242.88c16.845 7.354 30.644 20.282 39.079 36.608 8.435 16.333 10.989 35.066 7.233 53.056s-13.59 34.144-27.852 45.734c-14.262 11.597-32.081 17.92-50.46 17.92s-36.198-6.323-50.46-17.92c-14.262-11.59-24.097-27.744-27.852-45.734s-1.201-36.723 7.233-53.056c8.435-16.326 22.234-29.254 39.079-36.608v-82.88l-238.4-119.36c-5.277-2.659-9.715-6.728-12.822-11.755s-4.76-10.816-4.778-16.725v-102.72c-16.845-7.352-30.644-20.279-39.079-36.609s-10.988-35.066-7.233-53.057c3.755-17.992 13.59-34.141 27.852-45.734s32.081-17.921 50.46-17.921c18.38 0 36.198 6.328 50.46 17.921s24.097 27.743 27.852 45.734c3.756 17.992 1.201 36.727-7.233 53.057s-22.234 29.257-39.079 36.609v82.88l192 96v-524.16h-32c-6.372 0.032-12.609-1.839-17.91-5.374s-9.428-8.572-11.85-14.466c-2.41-5.858-3.028-12.3-1.775-18.509s4.321-11.907 8.815-16.371l64-64c2.975-2.999 6.514-5.38 10.413-7.005s8.083-2.461 12.307-2.461c4.225 0 8.407 0.836 12.307 2.461s7.439 4.005 10.413 7.005l64 64c4.44 4.5 7.448 10.214 8.644 16.422s0.526 12.63-1.924 18.458c-2.401 5.844-6.477 10.846-11.716 14.377s-11.406 5.432-17.724 5.463h-32v364.16l192-96v-76.16h-16c-8.486 0-16.627-3.372-22.63-9.373-5.997-6.001-9.37-14.14-9.37-22.627v-96c0-8.487 3.373-16.627 9.37-22.627 6.003-6.001 14.144-9.373 22.63-9.373h96c8.486 0 16.627 3.372 22.63 9.373 5.997 6.001 9.37 14.14 9.37 22.627z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["technology-usb"],"grid":14,"colorPermutations":{"12714014111291321":[{}]}},"attrs":[{}],"properties":{"order":715,"id":2,"name":"arduino-technology-usb","prevSize":28,"code":59655},"setIdx":0,"setId":1,"iconIdx":13},{"icon":{"paths":["M512 832c35.346 0 64-28.653 64-64s-28.654-64-64-64c-35.346 0-64 28.653-64 64s28.654 64 64 64z","M647.699 664.32c-8.442-0.122-16.493-3.571-22.401-9.6-14.863-14.9-32.519-26.721-51.957-34.787s-40.277-12.218-61.323-12.218c-21.046 0-41.884 4.152-61.323 12.218s-37.094 19.887-51.957 34.787c-5.996 5.958-14.106 9.306-22.56 9.306s-16.564-3.347-22.56-9.306c-5.96-5.997-9.306-14.106-9.306-22.559s3.345-16.564 9.306-22.56c20.801-20.803 45.495-37.304 72.673-48.563s56.308-17.053 85.727-17.053c29.418 0 58.548 5.795 85.726 17.053s51.875 27.761 72.675 48.563c4.512 4.476 7.59 10.194 8.838 16.426 1.254 6.232 0.614 12.695-1.818 18.562-2.438 5.875-6.573 10.886-11.866 14.4-5.299 3.514-11.52 5.37-17.875 5.331z","M919.373 392.639c-4.269 0.195-8.538-0.47-12.55-1.954s-7.686-3.757-10.81-6.686c-101.965-101.613-240.045-158.669-383.997-158.669-143.951 0-282.035 57.056-384 158.669-6.026 5.983-14.181 9.328-22.673 9.298s-16.623-3.432-22.607-9.458c-5.983-6.026-9.327-14.181-9.298-22.673s3.432-16.623 9.458-22.607c114.009-113.924 268.588-177.918 429.76-177.918 161.175 0 315.754 63.994 429.757 177.918 3.002 2.975 5.382 6.514 7.008 10.413s2.458 8.083 2.458 12.307c0 4.225-0.832 8.407-2.458 12.307s-4.006 7.439-7.008 10.413c-3.078 2.89-6.701 5.14-10.656 6.623-3.949 1.483-8.16 2.168-12.384 2.017z","M783.706 528.316c-4.211 0.024-8.384-0.783-12.288-2.375-3.898-1.592-7.443-3.939-10.432-6.905-32.691-32.703-71.501-58.646-114.221-76.346-42.715-17.7-88.501-26.81-134.74-26.81s-92.025 9.11-134.742 26.81c-42.717 17.7-81.529 43.643-114.218 76.346-6.122 5.242-13.996 7.982-22.049 7.671s-15.693-3.65-21.393-9.349c-5.699-5.699-9.037-13.338-9.348-21.392s2.428-15.928 7.67-22.050c78.009-77.968 183.788-121.767 294.080-121.767s216.072 43.799 294.081 121.767c5.958 5.996 9.306 14.106 9.306 22.56s-3.347 16.564-9.306 22.56c-5.958 5.912-14.003 9.245-22.4 9.28z"],"attrs":[{},{},{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["technology-connection"],"grid":14,"colorPermutations":{"12714014111291321":[{},{},{},{}]}},"attrs":[{},{},{},{}],"properties":{"order":714,"id":3,"name":"arduino-technology-connection","prevSize":28,"code":59656},"setIdx":0,"setId":1,"iconIdx":14},{"icon":{"paths":["M512.006 991.994c-4.198 0.109-8.362-0.768-12.16-2.56-5.844-2.4-10.846-6.477-14.377-11.712-3.53-5.242-5.431-11.405-5.463-17.728v-370.877l-169.28 169.597c-2.984 2.989-6.525 5.35-10.424 6.97-3.898 1.613-8.077 2.445-12.296 2.445s-8.397-0.832-12.296-2.445c-3.898-1.619-7.441-3.981-10.424-6.97-2.984-2.982-5.35-6.522-6.965-10.419s-2.445-8.077-2.445-12.301c0-4.218 0.831-8.397 2.445-12.294s3.981-7.437 6.965-10.426l201.6-201.277-201.6-201.28c-6.026-6.026-9.411-14.198-9.411-22.72s3.385-16.694 9.411-22.72c6.026-6.026 14.198-9.411 22.72-9.411s16.694 3.386 22.72 9.411l169.28 169.6v-370.88c0.032-6.318 1.933-12.485 5.463-17.724s8.533-9.316 14.377-11.716c5.828-2.451 12.25-3.12 18.458-1.924s11.922 4.204 16.422 8.644l224.001 224c3.002 2.975 5.382 6.514 7.002 10.413 1.626 3.9 2.464 8.082 2.464 12.307s-0.838 8.407-2.464 12.307c-1.619 3.9-4 7.439-7.002 10.413l-201.601 201.28 201.601 201.277c3.002 2.976 5.382 6.515 7.002 10.419 1.626 3.898 2.464 8.077 2.464 12.301 0 4.23-0.838 8.41-2.464 12.307-1.619 3.904-4 7.443-7.002 10.413l-224.001 224c-2.99 2.97-6.536 5.318-10.435 6.906-3.899 1.594-8.074 2.4-12.285 2.374zM544.006 589.117v293.757l146.881-146.88-146.881-146.877zM544.006 141.117v293.76l146.881-146.88-146.881-146.88z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["technology-bluetooth"],"grid":14,"colorPermutations":{"12714014111291321":[{}]}},"attrs":[{}],"properties":{"order":713,"id":4,"name":"arduino-technology-bluetooth","prevSize":28,"code":59657},"setIdx":0,"setId":1,"iconIdx":15},{"icon":{"paths":["M613.86 663.104c-8.983 0.005-17.72-2.956-24.841-8.429-7.126-5.474-12.241-13.144-14.55-21.825s-1.685-17.883 1.778-26.173c3.463-8.29 9.57-15.202 17.366-19.661l304.621-173.965-488.052-278.887v296.386c0 10.801-4.291 21.16-11.929 28.799-7.638 7.636-17.997 11.927-28.799 11.927s-21.16-4.291-28.799-11.927c-7.638-7.638-11.929-17.997-11.929-28.799v-366.545c-0.004-7.135 1.867-14.146 5.426-20.33s8.681-11.324 14.852-14.905c6.171-3.581 13.175-5.477 20.31-5.499s14.15 1.832 20.343 5.376l610.91 349.045c6.232 3.561 11.413 8.707 15.020 14.917 3.603 6.21 5.502 13.261 5.502 20.441s-1.899 14.232-5.502 20.441c-3.607 6.21-8.788 11.356-15.020 14.917l-366.545 209.324c-6.135 3.528-13.089 5.381-20.163 5.371z","M491.636 797.094c10.803 0 21.16-4.291 28.798-11.93s11.93-17.994 11.93-28.798c0-10.803-4.291-21.16-11.93-28.798s-17.994-11.93-28.798-11.93h-43.173c-1.991-17.389-5.534-34.56-10.589-51.316l41.949-41.951c3.798-3.793 6.81-8.304 8.867-13.265 2.053-4.962 3.109-10.277 3.109-15.649s-1.057-10.687-3.109-15.649c-2.057-4.962-5.069-9.467-8.867-13.265s-8.304-6.81-13.265-8.867c-4.961-2.053-10.279-3.114-15.649-3.114s-10.688 1.061-15.649 3.114c-4.961 2.057-9.47 5.069-13.267 8.867l-21.585 21.583c-14.553-22.109-34.216-40.387-57.327-53.285-23.11-12.902-48.988-20.052-75.444-20.838-26.456 0.787-52.334 7.936-75.444 20.838s-42.774 31.181-57.327 53.29l-21.585-21.588c-7.669-7.671-18.070-11.976-28.915-11.976s-21.247 4.305-28.916 11.976c-7.669 7.666-11.978 18.069-11.978 28.914s4.308 21.248 11.977 28.914l41.949 41.951c-5.055 16.756-8.599 33.927-10.589 51.316h-43.171c-10.802 0-21.161 4.291-28.799 11.93s-11.929 17.994-11.929 28.798c0 10.803 4.291 21.16 11.929 28.798s17.997 11.93 28.799 11.93h43.173c1.991 17.389 5.534 34.56 10.589 51.316l-1.222 1.224-40.727 40.727c-7.631 7.685-11.913 18.078-11.913 28.914 0 10.831 4.282 21.225 11.913 28.914 7.72 7.568 18.102 11.813 28.915 11.813s21.194-4.245 28.915-11.813l21.585-21.588c14.553 22.109 34.216 40.387 57.327 53.29s48.989 20.052 75.445 20.838c26.456-0.787 52.334-7.936 75.444-20.838s42.774-31.181 57.327-53.29l21.585 21.588c7.72 7.573 18.102 11.813 28.915 11.813s21.194-4.24 28.916-11.813c7.629-7.689 11.911-18.083 11.911-28.914 0-10.836-4.282-21.229-11.911-28.914l-41.95-41.951c5.055-16.756 8.599-33.927 10.589-51.316h43.174zM267.636 593.458c37.058 0 69.644 32.991 87.564 81.455h-175.127c17.92-48.463 50.506-81.455 87.564-81.455zM267.636 919.276c-55.389 0-101.818-74.533-101.818-162.909h203.636c0 88.376-46.429 162.909-101.818 162.909z"],"attrs":[{},{}],"tags":["arduino-debugger"],"grid":14,"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"12714014111291321":[{},{}]}},"attrs":[{},{}],"properties":{"order":696,"id":5,"name":"arduino-debugger","prevSize":28,"code":59653},"setIdx":0,"setId":1,"iconIdx":16},{"icon":{"paths":["M1011.905 953.837l-286.249-286.249c66.349-81.248 98.942-184.882 91.034-289.478-7.903-104.597-55.702-202.157-133.511-272.506-77.804-70.35-179.671-108.111-284.533-105.473s-204.701 45.47-278.874 119.643c-74.172 74.172-117.006 174.012-119.643 278.874s35.123 206.729 105.473 284.537c70.35 77.804 167.91 125.604 272.506 133.506 104.597 7.907 208.231-24.685 289.479-91.034l286.249 286.249c3.8 3.832 8.323 6.874 13.305 8.95s10.328 3.145 15.727 3.145c5.398 0 10.745-1.071 15.727-3.145 4.986-2.075 9.506-5.117 13.31-8.95 3.832-3.804 6.874-8.323 8.95-13.31 2.075-4.982 3.145-10.328 3.145-15.727s-1.071-10.739-3.145-15.727c-2.075-4.982-5.117-9.506-8.95-13.305v0zM410.372 737.512c-64.702 0-127.952-19.184-181.75-55.132-53.798-35.944-95.728-87.038-120.49-146.816s-31.239-125.554-18.616-189.013c12.623-63.459 43.78-121.751 89.532-167.502s104.043-76.909 167.502-89.532c63.459-12.623 129.235-6.145 189.013 18.616s110.868 66.691 146.816 120.489c35.948 53.798 55.132 117.048 55.132 181.75 0 86.766-34.467 169.972-95.815 231.325-61.353 61.349-144.564 95.815-231.326 95.815v0z"],"attrs":[{}],"tags":["arduino-search"],"grid":14,"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"12714014111291321":[{}]}},"attrs":[{}],"properties":{"order":689,"id":6,"name":"arduino-search","prevSize":28,"code":59649},"setIdx":0,"setId":1,"iconIdx":17},{"icon":{"paths":["M997.684 728.889c0 11.506-4.572 22.538-12.707 30.67s-19.165 12.707-30.67 12.707h-433.777c-11.506 0-22.538-4.572-30.673-12.707s-12.705-19.165-12.705-30.67 4.571-22.538 12.705-30.67c8.136-8.134 19.166-12.707 30.673-12.707h433.777c11.506 0 22.538 4.572 30.67 12.707s12.707 19.165 12.707 30.67z","M1201.991 351.068l-74.173-73.742v-199.104c0-11.503-4.572-22.539-12.707-30.673s-19.165-12.705-30.67-12.705h-910.933c-11.503 0-22.539 4.571-30.673 12.705s-12.705 19.168-12.705 30.673v130.133h-86.756c-11.504 0-22.539 4.571-30.673 12.705s-12.705 19.168-12.705 30.673v216.89c0 11.503 4.571 22.539 12.705 30.673s19.168 12.705 30.673 12.705h86.756v433.777c0 11.506 4.571 22.538 12.705 30.67s19.168 12.707 30.673 12.707h910.933c5.71 0.034 11.368-1.062 16.653-3.216 5.285-2.161 10.092-5.342 14.143-9.365l86.756-86.756c4.020-4.052 7.203-8.859 9.365-14.143 2.157-5.285 3.253-10.94 3.216-16.653v-477.156c0.034-5.708-1.062-11.369-3.216-16.654-2.161-5.285-5.342-10.092-9.365-14.145zM86.751 425.243v-130.133h216.89v130.133h-216.89zM1127.818 841.24l-61.159 61.159h-849.774v-390.4h130.133c11.503 0 22.539-4.571 30.673-12.705s12.705-19.168 12.705-30.673v-216.89c0-11.503-4.571-22.539-12.705-30.673s-19.168-12.705-30.673-12.705h-130.133v-86.756h824.177v173.51c-0.034 5.708 1.062 11.369 3.216 16.654 2.161 5.285 5.342 10.092 9.365 14.145l74.173 73.742v441.589z"],"width":1214.5714285714287,"attrs":[{},{}],"tags":["arduino-boards"],"grid":14,"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"12714014111291321":[{},{}]}},"attrs":[{},{}],"properties":{"order":7,"id":7,"name":"arduino-boards","prevSize":28,"code":59650},"setIdx":0,"setId":1,"iconIdx":18},{"icon":{"paths":["M1021.954 918.445l-171.299-652.491c-2.901-9.738-9.491-17.956-18.363-22.903-8.876-4.946-19.333-6.228-29.138-3.571l-141.319 35.427v-230.085c0-10.325-4.102-20.227-11.403-27.529s-17.201-11.403-27.528-11.403h-155.725c-10.327 0-20.226 4.101-27.529 11.403-7.301 7.302-11.403 17.203-11.403 27.529v116.794h-155.725v-77.863c0-10.325-4.101-20.227-11.403-27.529s-17.203-11.403-27.529-11.403h-194.658c-10.325 0-20.227 4.101-27.529 11.403s-11.403 17.203-11.403 27.529v895.424c0 10.327 4.101 20.226 11.403 27.528s17.203 11.403 27.529 11.403h583.972c10.327 0 20.226-4.102 27.528-11.403s11.403-17.201 11.403-27.528v-454.332l119.909 456.668c2.207 8.565 7.265 16.124 14.34 21.433 7.079 5.308 15.751 8.044 24.591 7.764 3.364 0.379 6.758 0.379 10.123 0l164.678-43.212c9.975-2.589 18.518-9.032 23.75-17.908 2.581-4.721 4.156-9.926 4.627-15.288 0.467-5.361-0.178-10.759-1.9-15.857v0zM194.659 940.247h-116.794v-817.56h116.794v817.56zM428.248 940.247h-155.725v-700.766h155.725v700.766zM583.973 940.247h-77.863v-856.491h77.863v856.491zM847.15 923.896l-151.442-576.964 89.543-23.748 151.442 578.132-89.543 22.58z"],"attrs":[{}],"tags":["arduino-library"],"grid":14,"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"12714014111291321":[{}]}},"attrs":[{}],"properties":{"order":691,"id":8,"name":"arduino-library","prevSize":28,"code":59651},"setIdx":0,"setId":1,"iconIdx":19},{"icon":{"paths":["M1189.198 204.801h-542.21l-189.437-189.951c-4.784-4.746-10.457-8.499-16.696-11.048s-12.918-3.84-19.656-3.801h-358.398c-13.579 0-26.602 5.394-36.204 14.997s-14.997 22.624-14.997 36.204v921.597c0 13.581 5.394 26.601 14.997 36.203s22.624 14.998 36.204 14.998h1126.397c13.581 0 26.601-5.395 36.203-14.998s14.998-22.621 14.998-36.203v-716.798c0-13.579-5.395-26.602-14.998-36.204s-22.621-14.997-36.203-14.997zM114.001 102.4h286.208l102.4 102.4h-388.606v-102.4zM1137.998 921.598h-1023.998v-614.398h1023.998v614.398z"],"width":1252,"attrs":[{}],"tags":["arduino-folder"],"grid":14,"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"12714014111291321":[{}]}},"attrs":[{}],"properties":{"order":692,"id":9,"name":"arduino-folder","prevSize":28,"code":59652},"setIdx":0,"setId":1,"iconIdx":20},{"icon":{"paths":["M512.083 959.936c118.817 0 232.769-47.2 316.781-131.213 84.019-84.019 131.219-197.969 131.219-316.785 0-8.487-3.373-16.627-9.376-22.628-5.997-6.001-14.138-9.373-22.624-9.373s-16.627 3.372-22.63 9.373c-5.997 6.001-9.37 14.141-9.37 22.627-0.019 87.81-30.131 172.959-85.318 241.26s-132.115 115.622-217.962 134.086c-85.848 18.458-175.428 6.931-253.811-32.646-78.383-39.584-140.833-104.832-176.941-184.87-36.108-80.045-43.693-170.045-21.49-255.001s72.852-159.737 143.505-211.878c70.653-52.141 157.042-78.492 244.768-74.662s171.487 37.612 237.33 95.712h-158.081c-8.487 0-16.626 3.372-22.627 9.373s-9.373 14.141-9.373 22.627c0 8.487 3.372 16.627 9.373 22.628s14.14 9.372 22.627 9.372h224.001c8.486 0 16.627-3.371 22.624-9.372 6.003-6.001 9.376-14.141 9.376-22.628v-224c0-8.487-3.373-16.626-9.376-22.627-5.997-6.001-14.138-9.373-22.624-9.373s-16.627 3.371-22.63 9.373c-5.997 6.001-9.37 14.14-9.37 22.627v136.96c-55.162-46.332-120.678-78.68-191.002-94.301s-143.375-14.052-212.963 4.571c-69.588 18.623-133.659 53.753-186.78 102.41s-93.725 109.405-118.369 177.096c-24.644 67.69-32.602 140.324-23.199 211.745 9.404 71.419 35.891 139.521 77.216 198.523 41.325 59.008 96.27 107.174 160.174 140.422s134.885 50.598 206.922 50.573v0z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[{}],"12714014111291321":[{}]},"tags":["reload"],"grid":14},"attrs":[{}],"properties":{"order":681,"id":10,"name":"reload","prevSize":28,"code":59648},"setIdx":0,"setId":1,"iconIdx":21},{"icon":{"paths":["M846.857 600c34.857 20 46.857 65.143 26.857 100l-36.571 62.857c-20 34.857-65.143 46.857-100 26.857l-152-87.429v175.429c0 40-33.143 73.143-73.143 73.143h-73.143c-40 0-73.143-33.143-73.143-73.143v-175.429l-152 87.429c-34.857 20-80 8-100-26.857l-36.571-62.857c-20-34.857-8-80 26.857-100l152-88-152-88c-34.857-20-46.857-65.143-26.857-100l36.571-62.857c20-34.857 65.143-46.857 100-26.857l152 87.429v-175.429c0-40 33.143-73.143 73.143-73.143h73.143c40 0 73.143 33.143 73.143 73.143v175.429l152-87.429c34.857-20 80-8 100 26.857l36.571 62.857c20 34.857 8 80-26.857 100l-152 88z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["asterisk"],"defaultCode":61545,"grid":14},"attrs":[],"properties":{"name":"asterisk","id":11,"order":679,"prevSize":28,"code":61545},"setIdx":0,"setId":1,"iconIdx":22},{"icon":{"paths":["M804.571 420.571v109.714c0 30.286-24.571 54.857-54.857 54.857h-237.714v237.714c0 30.286-24.571 54.857-54.857 54.857h-109.714c-30.286 0-54.857-24.571-54.857-54.857v-237.714h-237.714c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h237.714v-237.714c0-30.286 24.571-54.857 54.857-54.857h109.714c30.286 0 54.857 24.571 54.857 54.857v237.714h237.714c30.286 0 54.857 24.571 54.857 54.857z"],"width":804.5714285714286,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["plus"],"defaultCode":61543,"grid":14},"attrs":[],"properties":{"name":"plus","id":12,"order":3,"prevSize":28,"code":61543},"setIdx":0,"setId":1,"iconIdx":23},{"icon":{"paths":["M402.286 717.714v137.143c0 12.571-10.286 22.857-22.857 22.857h-137.143c-12.571 0-22.857-10.286-22.857-22.857v-137.143c0-12.571 10.286-22.857 22.857-22.857h137.143c12.571 0 22.857 10.286 22.857 22.857zM582.857 374.857c0 108.571-73.714 150.286-128 180.571-33.714 19.429-54.857 58.857-54.857 75.429v0c0 12.571-9.714 27.429-22.857 27.429h-137.143c-12.571 0-20.571-19.429-20.571-32v-25.714c0-69.143 68.571-128.571 118.857-151.429 44-20 62.286-38.857 62.286-75.429 0-32-41.714-60.571-88-60.571-25.714 0-49.143 8-61.714 16.571-13.714 9.714-27.429 23.429-61.143 65.714-4.571 5.714-11.429 9.143-17.714 9.143-5.143 0-9.714-1.714-14.286-4.571l-93.714-71.429c-9.714-7.429-12-20-5.714-30.286 61.714-102.286 148.571-152 265.143-152 122.286 0 259.429 97.714 259.429 228.571z"],"width":634.88,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["question"],"defaultCode":61736,"grid":14},"attrs":[],"properties":{"name":"question","id":13,"order":4,"prevSize":28,"code":61736},"setIdx":0,"setId":1,"iconIdx":24},{"icon":{"paths":["M804.571 420.571v109.714c0 30.286-24.571 54.857-54.857 54.857h-694.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h694.857c30.286 0 54.857 24.571 54.857 54.857z"],"width":804.5714285714286,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["minus"],"defaultCode":61544,"grid":14},"attrs":[],"properties":{"name":"minus","id":14,"order":5,"prevSize":28,"code":61544},"setIdx":0,"setId":1,"iconIdx":25},{"icon":{"paths":["M877.714 128v640c0 80.571-120.571 109.714-182.857 109.714s-182.857-29.143-182.857-109.714 120.571-109.714 182.857-109.714c37.714 0 75.429 6.857 109.714 22.286v-306.857l-438.857 135.429v405.143c0 80.571-120.571 109.714-182.857 109.714s-182.857-29.143-182.857-109.714 120.571-109.714 182.857-109.714c37.714 0 75.429 6.857 109.714 22.286v-552.571c0-24 16-45.143 38.857-52.571l475.429-146.286c5.143-1.714 10.286-2.286 16-2.286 30.286 0 54.857 24.571 54.857 54.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["music"],"defaultCode":61441,"grid":14},"attrs":[],"properties":{"name":"music","id":15,"order":7,"prevSize":28,"code":61441},"setIdx":0,"setId":1,"iconIdx":26},{"icon":{"paths":["M658.286 475.429c0-141.143-114.857-256-256-256s-256 114.857-256 256 114.857 256 256 256 256-114.857 256-256zM950.857 950.857c0 40-33.143 73.143-73.143 73.143-19.429 0-38.286-8-51.429-21.714l-196-195.429c-66.857 46.286-146.857 70.857-228 70.857-222.286 0-402.286-180-402.286-402.286s180-402.286 402.286-402.286 402.286 180 402.286 402.286c0 81.143-24.571 161.143-70.857 228l196 196c13.143 13.143 21.143 32 21.143 51.429z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["search"],"defaultCode":61442,"grid":14},"attrs":[],"properties":{"name":"search","id":16,"order":8,"prevSize":28,"code":61442},"setIdx":0,"setId":1,"iconIdx":27},{"icon":{"paths":["M950.857 859.429v-438.857c-12 13.714-25.143 26.286-39.429 37.714-81.714 62.857-164 126.857-243.429 193.143-42.857 36-96 80-155.429 80h-1.143c-59.429 0-112.571-44-155.429-80-79.429-66.286-161.714-130.286-243.429-193.143-14.286-11.429-27.429-24-39.429-37.714v438.857c0 9.714 8.571 18.286 18.286 18.286h841.143c9.714 0 18.286-8.571 18.286-18.286zM950.857 258.857c0-14.286 3.429-39.429-18.286-39.429h-841.143c-9.714 0-18.286 8.571-18.286 18.286 0 65.143 32.571 121.714 84 162.286 76.571 60 153.143 120.571 229.143 181.143 30.286 24.571 85.143 77.143 125.143 77.143h1.143c40 0 94.857-52.571 125.143-77.143 76-60.571 152.571-121.143 229.143-181.143 37.143-29.143 84-92.571 84-141.143zM1024 237.714v621.714c0 50.286-41.143 91.429-91.429 91.429h-841.143c-50.286 0-91.429-41.143-91.429-91.429v-621.714c0-50.286 41.143-91.429 91.429-91.429h841.143c50.286 0 91.429 41.143 91.429 91.429z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["envelope-o"],"defaultCode":61443,"grid":14},"attrs":[],"properties":{"name":"envelope-o","id":17,"order":9,"prevSize":28,"code":61443},"setIdx":0,"setId":1,"iconIdx":28},{"icon":{"paths":["M512 950.857c-9.143 0-18.286-3.429-25.143-10.286l-356.571-344c-4.571-4-130.286-118.857-130.286-256 0-167.429 102.286-267.429 273.143-267.429 100 0 193.714 78.857 238.857 123.429 45.143-44.571 138.857-123.429 238.857-123.429 170.857 0 273.143 100 273.143 267.429 0 137.143-125.714 252-130.857 257.143l-356 342.857c-6.857 6.857-16 10.286-25.143 10.286z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["heart"],"defaultCode":61444,"grid":14},"attrs":[],"properties":{"name":"heart","id":18,"order":10,"prevSize":28,"code":61444},"setIdx":0,"setId":1,"iconIdx":29},{"icon":{"paths":["M950.857 369.714c0 10.286-7.429 20-14.857 27.429l-207.429 202.286 49.143 285.714c0.571 4 0.571 7.429 0.571 11.429 0 14.857-6.857 28.571-23.429 28.571-8 0-16-2.857-22.857-6.857l-256.571-134.857-256.571 134.857c-7.429 4-14.857 6.857-22.857 6.857-16.571 0-24-13.714-24-28.571 0-4 0.571-7.429 1.143-11.429l49.143-285.714-208-202.286c-6.857-7.429-14.286-17.143-14.286-27.429 0-17.143 17.714-24 32-26.286l286.857-41.714 128.571-260c5.143-10.857 14.857-23.429 28-23.429s22.857 12.571 28 23.429l128.571 260 286.857 41.714c13.714 2.286 32 9.143 32 26.286z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["star"],"defaultCode":61445,"grid":14},"attrs":[],"properties":{"name":"star","id":19,"order":11,"prevSize":28,"code":61445},"setIdx":0,"setId":1,"iconIdx":30},{"icon":{"paths":["M649.714 573.714l174.857-169.714-241.143-35.429-108-218.286-108 218.286-241.143 35.429 174.857 169.714-41.714 240.571 216-113.714 215.429 113.714zM950.857 369.714c0 10.286-7.429 20-14.857 27.429l-207.429 202.286 49.143 285.714c0.571 4 0.571 7.429 0.571 11.429 0 15.429-6.857 28.571-23.429 28.571-8 0-16-2.857-22.857-6.857l-256.571-134.857-256.571 134.857c-7.429 4-14.857 6.857-22.857 6.857-16.571 0-24-13.714-24-28.571 0-4 0.571-7.429 1.143-11.429l49.143-285.714-208-202.286c-6.857-7.429-14.286-17.143-14.286-27.429 0-17.143 17.714-24 32-26.286l286.857-41.714 128.571-260c5.143-10.857 14.857-23.429 28-23.429s22.857 12.571 28 23.429l128.571 260 286.857 41.714c13.714 2.286 32 9.143 32 26.286z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["star-o"],"defaultCode":61446,"grid":14},"attrs":[],"properties":{"name":"star-o","id":20,"order":12,"prevSize":28,"code":61446},"setIdx":0,"setId":1,"iconIdx":31},{"icon":{"paths":["M731.429 799.429c0 83.429-54.857 151.429-121.714 151.429h-488c-66.857 0-121.714-68-121.714-151.429 0-150.286 37.143-324 186.857-324 46.286 45.143 109.143 73.143 178.857 73.143s132.571-28 178.857-73.143c149.714 0 186.857 173.714 186.857 324zM585.143 292.571c0 121.143-98.286 219.429-219.429 219.429s-219.429-98.286-219.429-219.429 98.286-219.429 219.429-219.429 219.429 98.286 219.429 219.429z"],"width":731.4285714285713,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["user"],"defaultCode":61447,"grid":14},"attrs":[],"properties":{"name":"user","id":21,"order":13,"prevSize":28,"code":61447},"setIdx":0,"setId":1,"iconIdx":32},{"icon":{"paths":["M219.429 914.286v-73.143c0-20-16.571-36.571-36.571-36.571h-73.143c-20 0-36.571 16.571-36.571 36.571v73.143c0 20 16.571 36.571 36.571 36.571h73.143c20 0 36.571-16.571 36.571-36.571zM219.429 694.857v-73.143c0-20-16.571-36.571-36.571-36.571h-73.143c-20 0-36.571 16.571-36.571 36.571v73.143c0 20 16.571 36.571 36.571 36.571h73.143c20 0 36.571-16.571 36.571-36.571zM219.429 475.429v-73.143c0-20-16.571-36.571-36.571-36.571h-73.143c-20 0-36.571 16.571-36.571 36.571v73.143c0 20 16.571 36.571 36.571 36.571h73.143c20 0 36.571-16.571 36.571-36.571zM804.571 914.286v-292.571c0-20-16.571-36.571-36.571-36.571h-438.857c-20 0-36.571 16.571-36.571 36.571v292.571c0 20 16.571 36.571 36.571 36.571h438.857c20 0 36.571-16.571 36.571-36.571zM219.429 256v-73.143c0-20-16.571-36.571-36.571-36.571h-73.143c-20 0-36.571 16.571-36.571 36.571v73.143c0 20 16.571 36.571 36.571 36.571h73.143c20 0 36.571-16.571 36.571-36.571zM1024 914.286v-73.143c0-20-16.571-36.571-36.571-36.571h-73.143c-20 0-36.571 16.571-36.571 36.571v73.143c0 20 16.571 36.571 36.571 36.571h73.143c20 0 36.571-16.571 36.571-36.571zM804.571 475.429v-292.571c0-20-16.571-36.571-36.571-36.571h-438.857c-20 0-36.571 16.571-36.571 36.571v292.571c0 20 16.571 36.571 36.571 36.571h438.857c20 0 36.571-16.571 36.571-36.571zM1024 694.857v-73.143c0-20-16.571-36.571-36.571-36.571h-73.143c-20 0-36.571 16.571-36.571 36.571v73.143c0 20 16.571 36.571 36.571 36.571h73.143c20 0 36.571-16.571 36.571-36.571zM1024 475.429v-73.143c0-20-16.571-36.571-36.571-36.571h-73.143c-20 0-36.571 16.571-36.571 36.571v73.143c0 20 16.571 36.571 36.571 36.571h73.143c20 0 36.571-16.571 36.571-36.571zM1024 256v-73.143c0-20-16.571-36.571-36.571-36.571h-73.143c-20 0-36.571 16.571-36.571 36.571v73.143c0 20 16.571 36.571 36.571 36.571h73.143c20 0 36.571-16.571 36.571-36.571zM1097.143 164.571v768c0 50.286-41.143 91.429-91.429 91.429h-914.286c-50.286 0-91.429-41.143-91.429-91.429v-768c0-50.286 41.143-91.429 91.429-91.429h914.286c50.286 0 91.429 41.143 91.429 91.429z"],"width":1097.142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["film"],"defaultCode":61448,"grid":14},"attrs":[],"properties":{"name":"film","id":22,"order":14,"prevSize":28,"code":61448},"setIdx":0,"setId":1,"iconIdx":33},{"icon":{"paths":["M438.857 585.143v219.429c0 40-33.143 73.143-73.143 73.143h-292.571c-40 0-73.143-33.143-73.143-73.143v-219.429c0-40 33.143-73.143 73.143-73.143h292.571c40 0 73.143 33.143 73.143 73.143zM438.857 146.286v219.429c0 40-33.143 73.143-73.143 73.143h-292.571c-40 0-73.143-33.143-73.143-73.143v-219.429c0-40 33.143-73.143 73.143-73.143h292.571c40 0 73.143 33.143 73.143 73.143zM950.857 585.143v219.429c0 40-33.143 73.143-73.143 73.143h-292.571c-40 0-73.143-33.143-73.143-73.143v-219.429c0-40 33.143-73.143 73.143-73.143h292.571c40 0 73.143 33.143 73.143 73.143zM950.857 146.286v219.429c0 40-33.143 73.143-73.143 73.143h-292.571c-40 0-73.143-33.143-73.143-73.143v-219.429c0-40 33.143-73.143 73.143-73.143h292.571c40 0 73.143 33.143 73.143 73.143z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["th-large"],"defaultCode":61449,"grid":14},"attrs":[],"properties":{"name":"th-large","id":23,"order":15,"prevSize":28,"code":61449},"setIdx":0,"setId":1,"iconIdx":34},{"icon":{"paths":["M292.571 713.143v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM292.571 420.571v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM658.286 713.143v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM292.571 128v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM658.286 420.571v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM1024 713.143v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM658.286 128v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM1024 420.571v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM1024 128v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["th"],"defaultCode":61450,"grid":14},"attrs":[],"properties":{"name":"th","id":24,"order":16,"prevSize":28,"code":61450},"setIdx":0,"setId":1,"iconIdx":35},{"icon":{"paths":["M292.571 713.143v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM292.571 420.571v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM1024 713.143v109.714c0 30.286-24.571 54.857-54.857 54.857h-548.571c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h548.571c30.286 0 54.857 24.571 54.857 54.857zM292.571 128v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM1024 420.571v109.714c0 30.286-24.571 54.857-54.857 54.857h-548.571c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h548.571c30.286 0 54.857 24.571 54.857 54.857zM1024 128v109.714c0 30.286-24.571 54.857-54.857 54.857h-548.571c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h548.571c30.286 0 54.857 24.571 54.857 54.857z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["th-list"],"defaultCode":61451,"grid":14},"attrs":[],"properties":{"name":"th-list","id":25,"order":17,"prevSize":28,"code":61451},"setIdx":0,"setId":1,"iconIdx":36},{"icon":{"paths":["M725.322 782.343c3.477 3.448 6.237 7.547 8.118 12.069 1.885 4.515 2.853 9.364 2.853 14.259s-0.967 9.744-2.853 14.266c-1.881 4.515-4.641 8.623-8.118 12.069-3.448 3.472-7.547 6.232-12.069 8.118-4.515 1.881-9.364 2.848-14.259 2.848s-9.744-0.967-14.266-2.848c-4.522-1.885-8.623-4.646-12.069-8.118l-270.371-270.375-270.372 270.375c-3.448 3.472-7.549 6.232-12.069 8.118-4.519 1.881-9.366 2.848-14.263 2.848s-9.744-0.967-14.263-2.848c-4.519-1.885-8.622-4.646-12.069-8.118-3.474-3.448-6.235-7.555-8.118-12.069-1.884-4.522-2.853-9.37-2.853-14.266s0.97-9.744 2.853-14.259c1.884-4.522 4.643-8.623 8.118-12.069l270.372-270.375-270.372-270.372c-3.456-3.456-6.201-7.565-8.072-12.082s-2.835-9.36-2.835-14.25c0-4.891 0.964-9.732 2.835-14.25s4.617-8.626 8.072-12.081c3.456-3.456 7.564-6.201 12.081-8.072s9.361-2.835 14.25-2.835c4.891 0 9.732 0.964 14.25 2.835s8.626 4.617 12.081 8.072l270.372 270.372 270.371-270.372c6.984-6.983 16.455-10.909 26.335-10.909 9.875 0 19.347 3.923 26.33 10.909s10.909 16.456 10.909 26.333c0 9.877-3.923 19.348-10.909 26.333l-270.371 270.372 270.371 270.375z"],"width":804.5714285714286,"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[{}],"12714014111291321":[{}]},"tags":["close","remove","times"],"defaultCode":61453,"grid":14},"attrs":[{}],"properties":{"name":"close, remove, times","id":26,"order":19,"prevSize":28,"code":61453},"setIdx":0,"setId":1,"iconIdx":37},{"icon":{"paths":["M585.143 457.143v36.571c0 9.714-8.571 18.286-18.286 18.286h-128v128c0 9.714-8.571 18.286-18.286 18.286h-36.571c-9.714 0-18.286-8.571-18.286-18.286v-128h-128c-9.714 0-18.286-8.571-18.286-18.286v-36.571c0-9.714 8.571-18.286 18.286-18.286h128v-128c0-9.714 8.571-18.286 18.286-18.286h36.571c9.714 0 18.286 8.571 18.286 18.286v128h128c9.714 0 18.286 8.571 18.286 18.286zM658.286 475.429c0-141.143-114.857-256-256-256s-256 114.857-256 256 114.857 256 256 256 256-114.857 256-256zM950.857 950.857c0 40.571-32.571 73.143-73.143 73.143-19.429 0-38.286-8-51.429-21.714l-196-195.429c-66.857 46.286-146.857 70.857-228 70.857-222.286 0-402.286-180-402.286-402.286s180-402.286 402.286-402.286 402.286 180 402.286 402.286c0 81.143-24.571 161.143-70.857 228l196 196c13.143 13.143 21.143 32 21.143 51.429z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["search-plus"],"defaultCode":61454,"grid":14},"attrs":[],"properties":{"name":"search-plus","id":27,"order":20,"prevSize":28,"code":61454},"setIdx":0,"setId":1,"iconIdx":38},{"icon":{"paths":["M585.143 457.143v36.571c0 9.714-8.571 18.286-18.286 18.286h-329.143c-9.714 0-18.286-8.571-18.286-18.286v-36.571c0-9.714 8.571-18.286 18.286-18.286h329.143c9.714 0 18.286 8.571 18.286 18.286zM658.286 475.429c0-141.143-114.857-256-256-256s-256 114.857-256 256 114.857 256 256 256 256-114.857 256-256zM950.857 950.857c0 40.571-32.571 73.143-73.143 73.143-19.429 0-38.286-8-51.429-21.714l-196-195.429c-66.857 46.286-146.857 70.857-228 70.857-222.286 0-402.286-180-402.286-402.286s180-402.286 402.286-402.286 402.286 180 402.286 402.286c0 81.143-24.571 161.143-70.857 228l196 196c13.143 13.143 21.143 32 21.143 51.429z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["search-minus"],"defaultCode":61456,"grid":14},"attrs":[],"properties":{"name":"search-minus","id":28,"order":21,"prevSize":28,"code":61456},"setIdx":0,"setId":1,"iconIdx":39},{"icon":{"paths":["M877.714 512c0 241.714-197.143 438.857-438.857 438.857s-438.857-197.143-438.857-438.857c0-138.857 64-266.857 175.429-350.286 32.571-24.571 78.286-18.286 102.286 14.286 24.571 32 17.714 78.286-14.286 102.286-74.286 56-117.143 141.143-117.143 233.714 0 161.143 131.429 292.571 292.571 292.571s292.571-131.429 292.571-292.571c0-92.571-42.857-177.714-117.143-233.714-32-24-38.857-70.286-14.286-102.286 24-32.571 70.286-38.857 102.286-14.286 111.429 83.429 175.429 211.429 175.429 350.286zM512 73.143v365.714c0 40-33.143 73.143-73.143 73.143s-73.143-33.143-73.143-73.143v-365.714c0-40 33.143-73.143 73.143-73.143s73.143 33.143 73.143 73.143z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["power-off"],"defaultCode":61457,"grid":14},"attrs":[],"properties":{"name":"power-off","id":29,"order":22,"prevSize":28,"code":61457},"setIdx":0,"setId":1,"iconIdx":40},{"icon":{"paths":["M146.286 822.857v109.714c0 10.286-8 18.286-18.286 18.286h-109.714c-10.286 0-18.286-8-18.286-18.286v-109.714c0-10.286 8-18.286 18.286-18.286h109.714c10.286 0 18.286 8 18.286 18.286zM365.714 749.714v182.857c0 10.286-8 18.286-18.286 18.286h-109.714c-10.286 0-18.286-8-18.286-18.286v-182.857c0-10.286 8-18.286 18.286-18.286h109.714c10.286 0 18.286 8 18.286 18.286zM585.143 603.429v329.143c0 10.286-8 18.286-18.286 18.286h-109.714c-10.286 0-18.286-8-18.286-18.286v-329.143c0-10.286 8-18.286 18.286-18.286h109.714c10.286 0 18.286 8 18.286 18.286zM804.571 384v548.571c0 10.286-8 18.286-18.286 18.286h-109.714c-10.286 0-18.286-8-18.286-18.286v-548.571c0-10.286 8-18.286 18.286-18.286h109.714c10.286 0 18.286 8 18.286 18.286zM1024 91.429v841.143c0 10.286-8 18.286-18.286 18.286h-109.714c-10.286 0-18.286-8-18.286-18.286v-841.143c0-10.286 8-18.286 18.286-18.286h109.714c10.286 0 18.286 8 18.286 18.286z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["signal"],"defaultCode":61458,"grid":14},"attrs":[],"properties":{"name":"signal","id":30,"order":23,"prevSize":28,"code":61458},"setIdx":0,"setId":1,"iconIdx":41},{"icon":{"paths":["M585.143 512c0-80.571-65.714-146.286-146.286-146.286s-146.286 65.714-146.286 146.286 65.714 146.286 146.286 146.286 146.286-65.714 146.286-146.286zM877.714 449.714v126.857c0 8.571-6.857 18.857-16 20.571l-105.714 16c-6.286 18.286-13.143 35.429-22.286 52 19.429 28 40 53.143 61.143 78.857 3.429 4 5.714 9.143 5.714 14.286s-1.714 9.143-5.143 13.143c-13.714 18.286-90.857 102.286-110.286 102.286-5.143 0-10.286-2.286-14.857-5.143l-78.857-61.714c-16.571 8.571-34.286 16-52 21.714-4 34.857-7.429 72-16.571 106.286-2.286 9.143-10.286 16-20.571 16h-126.857c-10.286 0-19.429-7.429-20.571-17.143l-16-105.143c-17.714-5.714-34.857-12.571-51.429-21.143l-80.571 61.143c-4 3.429-9.143 5.143-14.286 5.143s-10.286-2.286-14.286-6.286c-30.286-27.429-70.286-62.857-94.286-96-2.857-4-4-8.571-4-13.143 0-5.143 1.714-9.143 4.571-13.143 19.429-26.286 40.571-51.429 60-78.286-9.714-18.286-17.714-37.143-23.429-56.571l-104.571-15.429c-9.714-1.714-16.571-10.857-16.571-20.571v-126.857c0-8.571 6.857-18.857 15.429-20.571l106.286-16c5.714-18.286 13.143-35.429 22.286-52.571-19.429-27.429-40-53.143-61.143-78.857-3.429-4-5.714-8.571-5.714-13.714s2.286-9.143 5.143-13.143c13.714-18.857 90.857-102.286 110.286-102.286 5.143 0 10.286 2.286 14.857 5.714l78.857 61.143c16.571-8.571 34.286-16 52-21.714 4-34.857 7.429-72 16.571-106.286 2.286-9.143 10.286-16 20.571-16h126.857c10.286 0 19.429 7.429 20.571 17.143l16 105.143c17.714 5.714 34.857 12.571 51.429 21.143l81.143-61.143c3.429-3.429 8.571-5.143 13.714-5.143s10.286 2.286 14.286 5.714c30.286 28 70.286 63.429 94.286 97.143 2.857 3.429 4 8 4 12.571 0 5.143-1.714 9.143-4.571 13.143-19.429 26.286-40.571 51.429-60 78.286 9.714 18.286 17.714 37.143 23.429 56l104.571 16c9.714 1.714 16.571 10.857 16.571 20.571z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["cog","gear"],"defaultCode":61459,"grid":14},"attrs":[],"properties":{"name":"cog, gear","id":31,"order":24,"prevSize":28,"code":61459},"setIdx":0,"setId":1,"iconIdx":42},{"icon":{"paths":["M292.571 420.571v329.143c0 10.286-8 18.286-18.286 18.286h-36.571c-10.286 0-18.286-8-18.286-18.286v-329.143c0-10.286 8-18.286 18.286-18.286h36.571c10.286 0 18.286 8 18.286 18.286zM438.857 420.571v329.143c0 10.286-8 18.286-18.286 18.286h-36.571c-10.286 0-18.286-8-18.286-18.286v-329.143c0-10.286 8-18.286 18.286-18.286h36.571c10.286 0 18.286 8 18.286 18.286zM585.143 420.571v329.143c0 10.286-8 18.286-18.286 18.286h-36.571c-10.286 0-18.286-8-18.286-18.286v-329.143c0-10.286 8-18.286 18.286-18.286h36.571c10.286 0 18.286 8 18.286 18.286zM658.286 834.286v-541.714h-512v541.714c0 27.429 15.429 43.429 18.286 43.429h475.429c2.857 0 18.286-16 18.286-43.429zM274.286 219.429h256l-27.429-66.857c-1.714-2.286-6.857-5.714-9.714-6.286h-181.143c-3.429 0.571-8 4-9.714 6.286zM804.571 237.714v36.571c0 10.286-8 18.286-18.286 18.286h-54.857v541.714c0 62.857-41.143 116.571-91.429 116.571h-475.429c-50.286 0-91.429-51.429-91.429-114.286v-544h-54.857c-10.286 0-18.286-8-18.286-18.286v-36.571c0-10.286 8-18.286 18.286-18.286h176.571l40-95.429c11.429-28 45.714-50.857 76-50.857h182.857c30.286 0 64.571 22.857 76 50.857l40 95.429h176.571c10.286 0 18.286 8 18.286 18.286z"],"width":804.5714285714286,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["trash-o"],"defaultCode":61460,"grid":14},"attrs":[],"properties":{"name":"trash-o","id":32,"order":25,"prevSize":28,"code":61460},"setIdx":0,"setId":1,"iconIdx":43},{"icon":{"paths":["M804.571 566.857v274.286c0 20-16.571 36.571-36.571 36.571h-219.429v-219.429h-146.286v219.429h-219.429c-20 0-36.571-16.571-36.571-36.571v-274.286c0-1.143 0.571-2.286 0.571-3.429l328.571-270.857 328.571 270.857c0.571 1.143 0.571 2.286 0.571 3.429zM932 527.429l-35.429 42.286c-2.857 3.429-7.429 5.714-12 6.286h-1.714c-4.571 0-8.571-1.143-12-4l-395.429-329.714-395.429 329.714c-4 2.857-8.571 4.571-13.714 4-4.571-0.571-9.143-2.857-12-6.286l-35.429-42.286c-6.286-7.429-5.143-19.429 2.286-25.714l410.857-342.286c24-20 62.857-20 86.857 0l139.429 116.571v-111.429c0-10.286 8-18.286 18.286-18.286h109.714c10.286 0 18.286 8 18.286 18.286v233.143l125.143 104c7.429 6.286 8.571 18.286 2.286 25.714z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["home"],"defaultCode":61461,"grid":14},"attrs":[],"properties":{"name":"home","id":33,"order":26,"prevSize":28,"code":61461},"setIdx":0,"setId":1,"iconIdx":44},{"icon":{"paths":["M838.857 217.143c21.143 21.143 38.857 63.429 38.857 93.714v658.286c0 30.286-24.571 54.857-54.857 54.857h-768c-30.286 0-54.857-24.571-54.857-54.857v-914.286c0-30.286 24.571-54.857 54.857-54.857h512c30.286 0 72.571 17.714 93.714 38.857zM585.143 77.714v214.857h214.857c-3.429-9.714-8.571-19.429-12.571-23.429l-178.857-178.857c-4-4-13.714-9.143-23.429-12.571zM804.571 950.857v-585.143h-237.714c-30.286 0-54.857-24.571-54.857-54.857v-237.714h-438.857v877.714h731.429z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["file-o"],"defaultCode":61462,"grid":14},"attrs":[],"properties":{"name":"file-o","id":34,"order":27,"prevSize":28,"code":61462},"setIdx":0,"setId":1,"iconIdx":45},{"icon":{"paths":["M512 310.857v256c0 10.286-8 18.286-18.286 18.286h-182.857c-10.286 0-18.286-8-18.286-18.286v-36.571c0-10.286 8-18.286 18.286-18.286h128v-201.143c0-10.286 8-18.286 18.286-18.286h36.571c10.286 0 18.286 8 18.286 18.286zM749.714 512c0-171.429-139.429-310.857-310.857-310.857s-310.857 139.429-310.857 310.857 139.429 310.857 310.857 310.857 310.857-139.429 310.857-310.857zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["clock-o"],"defaultCode":61463,"grid":14},"attrs":[],"properties":{"name":"clock-o","id":35,"order":28,"prevSize":28,"code":61463},"setIdx":0,"setId":1,"iconIdx":46},{"icon":{"paths":["M731.429 768c0-20-16.571-36.571-36.571-36.571s-36.571 16.571-36.571 36.571 16.571 36.571 36.571 36.571 36.571-16.571 36.571-36.571zM877.714 768c0-20-16.571-36.571-36.571-36.571s-36.571 16.571-36.571 36.571 16.571 36.571 36.571 36.571 36.571-16.571 36.571-36.571zM950.857 640v182.857c0 30.286-24.571 54.857-54.857 54.857h-841.143c-30.286 0-54.857-24.571-54.857-54.857v-182.857c0-30.286 24.571-54.857 54.857-54.857h265.714l77.143 77.714c21.143 20.571 48.571 32 77.714 32s56.571-11.429 77.714-32l77.714-77.714h265.143c30.286 0 54.857 24.571 54.857 54.857zM765.143 314.857c5.714 13.714 2.857 29.714-8 40l-256 256c-6.857 7.429-16.571 10.857-25.714 10.857s-18.857-3.429-25.714-10.857l-256-256c-10.857-10.286-13.714-26.286-8-40 5.714-13.143 18.857-22.286 33.714-22.286h146.286v-256c0-20 16.571-36.571 36.571-36.571h146.286c20 0 36.571 16.571 36.571 36.571v256h146.286c14.857 0 28 9.143 33.714 22.286z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["download"],"defaultCode":61465,"grid":14},"attrs":[],"properties":{"name":"download","id":36,"order":30,"prevSize":28,"code":61465},"setIdx":0,"setId":1,"iconIdx":47},{"icon":{"paths":["M640 530.286c0 5.143-2.286 9.714-5.714 13.714l-182.286 182.286c-4 3.429-8.571 5.143-13.143 5.143s-9.143-1.714-13.143-5.143l-182.857-182.857c-5.143-5.714-6.857-13.143-4-20s9.714-11.429 17.143-11.429h109.714v-201.143c0-10.286 8-18.286 18.286-18.286h109.714c10.286 0 18.286 8 18.286 18.286v201.143h109.714c10.286 0 18.286 8 18.286 18.286zM438.857 201.143c-171.429 0-310.857 139.429-310.857 310.857s139.429 310.857 310.857 310.857 310.857-139.429 310.857-310.857-139.429-310.857-310.857-310.857zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857v0c242.286 0 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["arrow-circle-o-down"],"defaultCode":61466,"grid":14},"attrs":[],"properties":{"name":"arrow-circle-o-down","id":37,"order":31,"prevSize":28,"code":61466},"setIdx":0,"setId":1,"iconIdx":48},{"icon":{"paths":["M638.857 500.571c-2.857 6.857-9.714 11.429-17.143 11.429h-109.714v201.143c0 10.286-8 18.286-18.286 18.286h-109.714c-10.286 0-18.286-8-18.286-18.286v-201.143h-109.714c-10.286 0-18.286-8-18.286-18.286 0-5.143 2.286-9.714 5.714-13.714l182.286-182.286c4-3.429 8.571-5.143 13.143-5.143s9.143 1.714 13.143 5.143l182.857 182.857c5.143 5.714 6.857 13.143 4 20zM438.857 201.143c-171.429 0-310.857 139.429-310.857 310.857s139.429 310.857 310.857 310.857 310.857-139.429 310.857-310.857-139.429-310.857-310.857-310.857zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857v0c242.286 0 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["arrow-circle-o-up"],"defaultCode":61467,"grid":14},"attrs":[],"properties":{"name":"arrow-circle-o-up","id":38,"order":32,"prevSize":28,"code":61467},"setIdx":0,"setId":1,"iconIdx":49},{"icon":{"paths":["M584.571 548.571h180.571c-1.143-2.857-1.714-6.286-2.857-9.143l-121.143-283.429h-404.571l-121.143 283.429c-1.143 2.857-1.714 6.286-2.857 9.143h180.571l54.286 109.714h182.857zM877.714 565.714v275.429c0 20-16.571 36.571-36.571 36.571h-804.571c-20 0-36.571-16.571-36.571-36.571v-275.429c0-20.571 6.286-50.857 14.286-70.286l136-315.429c8-18.857 30.857-33.714 50.857-33.714h475.429c20 0 42.857 14.857 50.857 33.714l136 315.429c8 19.429 14.286 49.714 14.286 70.286z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["inbox"],"defaultCode":61468,"grid":14},"attrs":[],"properties":{"name":"inbox","id":39,"order":33,"prevSize":28,"code":61468},"setIdx":0,"setId":1,"iconIdx":50},{"icon":{"paths":["M676.571 512c0 13.143-6.857 25.143-18.286 31.429l-310.857 182.857c-5.714 3.429-12 5.143-18.286 5.143s-12.571-1.714-18.286-4.571c-11.429-6.857-18.286-18.857-18.286-32v-365.714c0-13.143 6.857-25.143 18.286-32 11.429-6.286 25.714-6.286 36.571 0.571l310.857 182.857c11.429 6.286 18.286 18.286 18.286 31.429zM749.714 512c0-171.429-139.429-310.857-310.857-310.857s-310.857 139.429-310.857 310.857 139.429 310.857 310.857 310.857 310.857-139.429 310.857-310.857zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["play-circle-o"],"defaultCode":61469,"grid":14},"attrs":[],"properties":{"name":"play-circle-o","id":40,"order":34,"prevSize":28,"code":61469},"setIdx":0,"setId":1,"iconIdx":51},{"icon":{"paths":["M877.714 146.286v256c0 20-16.571 36.571-36.571 36.571h-256c-14.857 0-28-9.143-33.714-22.857-5.714-13.143-2.857-29.143 8-39.429l78.857-78.857c-53.714-49.714-124.571-78.286-199.429-78.286-161.143 0-292.571 131.429-292.571 292.571s131.429 292.571 292.571 292.571c90.857 0 174.857-41.143 230.857-113.714 2.857-4 8-6.286 13.143-6.857 5.143 0 10.286 1.714 14.286 5.143l78.286 78.857c6.857 6.286 6.857 17.143 1.143 24.571-83.429 100.571-206.857 158.286-337.714 158.286-241.714 0-438.857-197.143-438.857-438.857s197.143-438.857 438.857-438.857c112.571 0 221.714 45.143 302.286 121.143l74.286-73.714c10.286-10.857 26.286-13.714 40-8 13.143 5.714 22.286 18.857 22.286 33.714z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["repeat","rotate-right"],"defaultCode":61470,"grid":14},"attrs":[],"properties":{"name":"repeat, rotate-right","id":41,"order":35,"prevSize":28,"code":61470},"setIdx":0,"setId":1,"iconIdx":52},{"icon":{"paths":["M863.429 603.429c0 1.143 0 2.857-0.571 4-48.571 202.286-215.429 343.429-426.286 343.429-111.429 0-219.429-44-300.571-121.143l-73.714 73.714c-6.857 6.857-16 10.857-25.714 10.857-20 0-36.571-16.571-36.571-36.571v-256c0-20 16.571-36.571 36.571-36.571h256c20 0 36.571 16.571 36.571 36.571 0 9.714-4 18.857-10.857 25.714l-78.286 78.286c53.714 50.286 125.143 78.857 198.857 78.857 101.714 0 196-52.571 249.143-139.429 13.714-22.286 20.571-44 30.286-66.857 2.857-8 8.571-13.143 17.143-13.143h109.714c10.286 0 18.286 8.571 18.286 18.286zM877.714 146.286v256c0 20-16.571 36.571-36.571 36.571h-256c-20 0-36.571-16.571-36.571-36.571 0-9.714 4-18.857 10.857-25.714l78.857-78.857c-54.286-50.286-125.714-78.286-199.429-78.286-101.714 0-196 52.571-249.143 139.429-13.714 22.286-20.571 44-30.286 66.857-2.857 8-8.571 13.143-17.143 13.143h-113.714c-10.286 0-18.286-8.571-18.286-18.286v-4c49.143-202.857 217.714-343.429 428.571-343.429 112 0 221.143 44.571 302.286 121.143l74.286-73.714c6.857-6.857 16-10.857 25.714-10.857 20 0 36.571 16.571 36.571 36.571z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["refresh"],"defaultCode":61473,"grid":14},"attrs":[],"properties":{"name":"refresh","id":42,"order":36,"prevSize":28,"code":61473},"setIdx":0,"setId":1,"iconIdx":53},{"icon":{"paths":["M219.429 676.571v36.571c0 9.714-8.571 18.286-18.286 18.286h-36.571c-9.714 0-18.286-8.571-18.286-18.286v-36.571c0-9.714 8.571-18.286 18.286-18.286h36.571c9.714 0 18.286 8.571 18.286 18.286zM219.429 530.286v36.571c0 9.714-8.571 18.286-18.286 18.286h-36.571c-9.714 0-18.286-8.571-18.286-18.286v-36.571c0-9.714 8.571-18.286 18.286-18.286h36.571c9.714 0 18.286 8.571 18.286 18.286zM219.429 384v36.571c0 9.714-8.571 18.286-18.286 18.286h-36.571c-9.714 0-18.286-8.571-18.286-18.286v-36.571c0-9.714 8.571-18.286 18.286-18.286h36.571c9.714 0 18.286 8.571 18.286 18.286zM877.714 676.571v36.571c0 9.714-8.571 18.286-18.286 18.286h-548.571c-9.714 0-18.286-8.571-18.286-18.286v-36.571c0-9.714 8.571-18.286 18.286-18.286h548.571c9.714 0 18.286 8.571 18.286 18.286zM877.714 530.286v36.571c0 9.714-8.571 18.286-18.286 18.286h-548.571c-9.714 0-18.286-8.571-18.286-18.286v-36.571c0-9.714 8.571-18.286 18.286-18.286h548.571c9.714 0 18.286 8.571 18.286 18.286zM877.714 384v36.571c0 9.714-8.571 18.286-18.286 18.286h-548.571c-9.714 0-18.286-8.571-18.286-18.286v-36.571c0-9.714 8.571-18.286 18.286-18.286h548.571c9.714 0 18.286 8.571 18.286 18.286zM950.857 786.286v-475.429c0-9.714-8.571-18.286-18.286-18.286h-841.143c-9.714 0-18.286 8.571-18.286 18.286v475.429c0 9.714 8.571 18.286 18.286 18.286h841.143c9.714 0 18.286-8.571 18.286-18.286zM1024 164.571v621.714c0 50.286-41.143 91.429-91.429 91.429h-841.143c-50.286 0-91.429-41.143-91.429-91.429v-621.714c0-50.286 41.143-91.429 91.429-91.429h841.143c50.286 0 91.429 41.143 91.429 91.429z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["list-alt"],"defaultCode":61474,"grid":14},"attrs":[],"properties":{"name":"list-alt","id":43,"order":37,"prevSize":28,"code":61474},"setIdx":0,"setId":1,"iconIdx":54},{"icon":{"paths":["M182.857 438.857h292.571v-109.714c0-80.571-65.714-146.286-146.286-146.286s-146.286 65.714-146.286 146.286v109.714zM658.286 493.714v329.143c0 30.286-24.571 54.857-54.857 54.857h-548.571c-30.286 0-54.857-24.571-54.857-54.857v-329.143c0-30.286 24.571-54.857 54.857-54.857h18.286v-109.714c0-140.571 115.429-256 256-256s256 115.429 256 256v109.714h18.286c30.286 0 54.857 24.571 54.857 54.857z"],"width":658.2857142857142,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["lock"],"defaultCode":61475,"grid":14},"attrs":[],"properties":{"name":"lock","id":44,"order":38,"prevSize":28,"code":61475},"setIdx":0,"setId":1,"iconIdx":55},{"icon":{"paths":["M438.857 201.143v621.714c0 20-16.571 36.571-36.571 36.571-9.714 0-18.857-4-25.714-10.857l-190.286-190.286h-149.714c-20 0-36.571-16.571-36.571-36.571v-219.429c0-20 16.571-36.571 36.571-36.571h149.714l190.286-190.286c6.857-6.857 16-10.857 25.714-10.857 20 0 36.571 16.571 36.571 36.571z"],"width":438.85714285714283,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["volume-off"],"defaultCode":61478,"grid":14},"attrs":[],"properties":{"name":"volume-off","id":45,"order":41,"prevSize":28,"code":61478},"setIdx":0,"setId":1,"iconIdx":56},{"icon":{"paths":["M438.857 201.143v621.714c0 20-16.571 36.571-36.571 36.571-9.714 0-18.857-4-25.714-10.857l-190.286-190.286h-149.714c-20 0-36.571-16.571-36.571-36.571v-219.429c0-20 16.571-36.571 36.571-36.571h149.714l190.286-190.286c6.857-6.857 16-10.857 25.714-10.857 20 0 36.571 16.571 36.571 36.571zM658.286 512c0 57.143-34.857 112.571-88.571 134.286-4.571 2.286-9.714 2.857-14.286 2.857-20 0-36.571-16-36.571-36.571 0-43.429 66.286-31.429 66.286-100.571s-66.286-57.143-66.286-100.571c0-20.571 16.571-36.571 36.571-36.571 4.571 0 9.714 0.571 14.286 2.857 53.714 21.143 88.571 77.143 88.571 134.286z"],"width":658.2857142857142,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["volume-down"],"defaultCode":61479,"grid":14},"attrs":[],"properties":{"name":"volume-down","id":46,"order":42,"prevSize":28,"code":61479},"setIdx":0,"setId":1,"iconIdx":57},{"icon":{"paths":["M438.857 201.143v621.714c0 20-16.571 36.571-36.571 36.571-9.714 0-18.857-4-25.714-10.857l-190.286-190.286h-149.714c-20 0-36.571-16.571-36.571-36.571v-219.429c0-20 16.571-36.571 36.571-36.571h149.714l190.286-190.286c6.857-6.857 16-10.857 25.714-10.857 20 0 36.571 16.571 36.571 36.571zM658.286 512c0 57.143-34.857 112.571-88.571 134.286-4.571 2.286-9.714 2.857-14.286 2.857-20 0-36.571-16-36.571-36.571 0-43.429 66.286-31.429 66.286-100.571s-66.286-57.143-66.286-100.571c0-20.571 16.571-36.571 36.571-36.571 4.571 0 9.714 0.571 14.286 2.857 53.714 21.143 88.571 77.143 88.571 134.286zM804.571 512c0 116-69.714 224-177.143 269.143-4.571 1.714-9.714 2.857-14.286 2.857-20.571 0-37.143-16.571-37.143-36.571 0-16 9.143-26.857 22.286-33.714 15.429-8 29.714-14.857 43.429-25.143 56.571-41.143 89.714-106.857 89.714-176.571s-33.143-135.429-89.714-176.571c-13.714-10.286-28-17.143-43.429-25.143-13.143-6.857-22.286-17.714-22.286-33.714 0-20 16.571-36.571 36.571-36.571 5.143 0 10.286 1.143 14.857 2.857 107.429 45.143 177.143 153.143 177.143 269.143zM950.857 512c0 175.429-104.571 334.286-265.714 403.429-4.571 1.714-9.714 2.857-14.857 2.857-20 0-36.571-16.571-36.571-36.571 0-16.571 8.571-25.714 22.286-33.714 8-4.571 17.143-7.429 25.714-12 16-8.571 32-18.286 46.857-29.143 93.714-69.143 149.143-178.286 149.143-294.857s-55.429-225.714-149.143-294.857c-14.857-10.857-30.857-20.571-46.857-29.143-8.571-4.571-17.714-7.429-25.714-12-13.714-8-22.286-17.143-22.286-33.714 0-20 16.571-36.571 36.571-36.571 5.143 0 10.286 1.143 14.857 2.857 161.143 69.143 265.714 228 265.714 403.429z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["volume-up"],"defaultCode":61480,"grid":14},"attrs":[],"properties":{"name":"volume-up","id":47,"order":43,"prevSize":28,"code":61480},"setIdx":0,"setId":1,"iconIdx":58},{"icon":{"paths":["M219.429 658.286v73.143h-73.143v-73.143h73.143zM219.429 219.429v73.143h-73.143v-73.143h73.143zM658.286 219.429v73.143h-73.143v-73.143h73.143zM73.143 804h219.429v-218.857h-219.429v218.857zM73.143 365.714h219.429v-219.429h-219.429v219.429zM512 365.714h219.429v-219.429h-219.429v219.429zM365.714 512v365.714h-365.714v-365.714h365.714zM658.286 804.571v73.143h-73.143v-73.143h73.143zM804.571 804.571v73.143h-73.143v-73.143h73.143zM804.571 512v219.429h-219.429v-73.143h-73.143v219.429h-73.143v-365.714h219.429v73.143h73.143v-73.143h73.143zM365.714 73.143v365.714h-365.714v-365.714h365.714zM804.571 73.143v365.714h-365.714v-365.714h365.714z"],"width":804.5714285714286,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["qrcode"],"defaultCode":61481,"grid":14},"attrs":[],"properties":{"name":"qrcode","id":48,"order":44,"prevSize":28,"code":61481},"setIdx":0,"setId":1,"iconIdx":59},{"icon":{"paths":["M256 256c0-40.571-32.571-73.143-73.143-73.143s-73.143 32.571-73.143 73.143 32.571 73.143 73.143 73.143 73.143-32.571 73.143-73.143zM865.714 585.143c0 19.429-8 38.286-21.143 51.429l-280.571 281.143c-13.714 13.143-32.571 21.143-52 21.143s-38.286-8-51.429-21.143l-408.571-409.143c-29.143-28.571-52-84-52-124.571v-237.714c0-40 33.143-73.143 73.143-73.143h237.714c40.571 0 96 22.857 125.143 52l408.571 408c13.143 13.714 21.143 32.571 21.143 52z"],"width":865.7188571428571,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["tag"],"defaultCode":61483,"grid":14},"attrs":[],"properties":{"name":"tag","id":49,"order":46,"prevSize":28,"code":61483},"setIdx":0,"setId":1,"iconIdx":60},{"icon":{"paths":["M256 256c0-40.571-32.571-73.143-73.143-73.143s-73.143 32.571-73.143 73.143 32.571 73.143 73.143 73.143 73.143-32.571 73.143-73.143zM865.714 585.143c0 19.429-8 38.286-21.143 51.429l-280.571 281.143c-13.714 13.143-32.571 21.143-52 21.143s-38.286-8-51.429-21.143l-408.571-409.143c-29.143-28.571-52-84-52-124.571v-237.714c0-40 33.143-73.143 73.143-73.143h237.714c40.571 0 96 22.857 125.143 52l408.571 408c13.143 13.714 21.143 32.571 21.143 52zM1085.143 585.143c0 19.429-8 38.286-21.143 51.429l-280.571 281.143c-13.714 13.143-32.571 21.143-52 21.143-29.714 0-44.571-13.714-64-33.714l268.571-268.571c13.143-13.143 21.143-32 21.143-51.429s-8-38.286-21.143-52l-408.571-408c-29.143-29.143-84.571-52-125.143-52h128c40.571 0 96 22.857 125.143 52l408.571 408c13.143 13.714 21.143 32.571 21.143 52z"],"width":1085.1474285714285,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["tags"],"defaultCode":61484,"grid":14},"attrs":[],"properties":{"name":"tags","id":50,"order":47,"prevSize":28,"code":61484},"setIdx":0,"setId":1,"iconIdx":61},{"icon":{"paths":["M936.571 273.143c14.286 20.571 18.286 47.429 10.286 73.714l-157.143 517.714c-14.286 48.571-64.571 86.286-113.714 86.286h-527.429c-58.286 0-120.571-46.286-141.714-105.714-9.143-25.714-9.143-50.857-1.143-72.571 1.143-11.429 3.429-22.857 4-36.571 0.571-9.143-4.571-16.571-3.429-23.429 2.286-13.714 14.286-23.429 23.429-38.857 17.143-28.571 36.571-74.857 42.857-104.571 2.857-10.857-2.857-23.429 0-33.143 2.857-10.857 13.714-18.857 19.429-29.143 15.429-26.286 35.429-77.143 38.286-104 1.143-12-4.571-25.143-1.143-34.286 4-13.143 16.571-18.857 25.143-30.286 13.714-18.857 36.571-73.143 40-103.429 1.143-9.714-4.571-19.429-2.857-29.714 2.286-10.857 16-22.286 25.143-35.429 24-35.429 28.571-113.714 101.143-93.143l-0.571 1.714c9.714-2.286 19.429-5.143 29.143-5.143h434.857c26.857 0 50.857 12 65.143 32 14.857 20.571 18.286 47.429 10.286 74.286l-156.571 517.714c-26.857 88-41.714 107.429-114.286 107.429h-496.571c-7.429 0-16.571 1.714-21.714 8.571-4.571 6.857-5.143 12-0.571 24.571 11.429 33.143 50.857 40 82.286 40h527.429c21.143 0 45.714-12 52-32.571l171.429-564c3.429-10.857 3.429-22.286 2.857-32.571 13.143 5.143 25.143 13.143 33.714 24.571zM328.571 274.286c-3.429 10.286 2.286 18.286 12.571 18.286h347.429c9.714 0 20.571-8 24-18.286l12-36.571c3.429-10.286-2.286-18.286-12.571-18.286h-347.429c-9.714 0-20.571 8-24 18.286zM281.143 420.571c-3.429 10.286 2.286 18.286 12.571 18.286h347.429c9.714 0 20.571-8 24-18.286l12-36.571c3.429-10.286-2.286-18.286-12.571-18.286h-347.429c-9.714 0-20.571 8-24 18.286z"],"width":952.5394285714285,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["book"],"defaultCode":61485,"grid":14},"attrs":[],"properties":{"name":"book","id":51,"order":48,"prevSize":28,"code":61485},"setIdx":0,"setId":1,"iconIdx":62},{"icon":{"paths":["M219.429 877.714h512v-146.286h-512v146.286zM219.429 512h512v-219.429h-91.429c-30.286 0-54.857-24.571-54.857-54.857v-91.429h-365.714v365.714zM877.714 548.571c0-20-16.571-36.571-36.571-36.571s-36.571 16.571-36.571 36.571 16.571 36.571 36.571 36.571 36.571-16.571 36.571-36.571zM950.857 548.571v237.714c0 9.714-8.571 18.286-18.286 18.286h-128v91.429c0 30.286-24.571 54.857-54.857 54.857h-548.571c-30.286 0-54.857-24.571-54.857-54.857v-91.429h-128c-9.714 0-18.286-8.571-18.286-18.286v-237.714c0-60 49.714-109.714 109.714-109.714h36.571v-310.857c0-30.286 24.571-54.857 54.857-54.857h384c30.286 0 72 17.143 93.714 38.857l86.857 86.857c21.714 21.714 38.857 63.429 38.857 93.714v146.286h36.571c60 0 109.714 49.714 109.714 109.714z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["print"],"defaultCode":61487,"grid":14},"attrs":[],"properties":{"name":"print","id":52,"order":50,"prevSize":28,"code":61487},"setIdx":0,"setId":1,"iconIdx":63},{"icon":{"paths":["M996.571 804.571c25.143 0 33.143 16 17.714 36l-72 92.571c-15.429 20-40.571 20-56 0l-72-92.571c-15.429-20-7.429-36 17.714-36h45.714v-585.143h-45.714c-25.143 0-33.143-16-17.714-36l72-92.571c15.429-20 40.571-20 56 0l72 92.571c15.429 20 7.429 36-17.714 36h-45.714v585.143h45.714zM46.286 73.714l30.857 15.429c4 1.714 108.571 2.857 120.571 2.857 50.286 0 100.571-2.286 150.857-2.286 41.143 0 81.714 0.571 122.857 0.571h167.429c22.857 0 36 5.143 51.429-16.571l24-0.571c5.143 0 10.857 0.571 16 0.571 1.143 64 1.143 128 1.143 192 0 20 0.571 42.286-2.857 62.286-12.571 4.571-25.714 8.571-38.857 10.286-13.143-22.857-22.286-48-30.857-73.143-4-11.429-17.714-88.571-18.857-89.714-12-14.857-25.143-12-42.857-12-52 0-106.286-2.286-157.714 4-2.857 25.143-5.143 52-4.571 77.714 0.571 160.571 2.286 321.143 2.286 481.714 0 44-6.857 90.286 5.714 132.571 43.429 22.286 94.857 25.714 139.429 45.714 1.143 9.143 2.857 18.857 2.857 28.571 0 5.143-0.571 10.857-1.714 16.571l-19.429 0.571c-81.143 2.286-161.143-10.286-242.857-10.286-57.714 0-115.429 10.286-173.143 10.286-0.571-9.714-1.714-20-1.714-29.714v-5.143c21.714-34.857 100-35.429 136-56.571 12.571-28 10.857-182.857 10.857-218.857 0-115.429-3.429-230.857-3.429-346.286v-66.857c0-10.286 2.286-51.429-4.571-59.429-8-8.571-82.857-6.857-92.571-6.857-21.143 0-82.286 9.714-98.857 21.714-27.429 18.857-27.429 133.143-61.714 135.429-10.286-6.286-24.571-15.429-32-25.143v-218.857z"],"width":1029.7051428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["text-height"],"defaultCode":61492,"grid":14},"attrs":[],"properties":{"name":"text-height","id":53,"order":694,"prevSize":28,"code":61492},"setIdx":0,"setId":1,"iconIdx":64},{"icon":{"paths":["M46.286 73.714l30.857 15.429c4 1.714 108.571 2.857 120.571 2.857 50.286 0 100.571-2.286 150.857-2.286 151.429 0 304.571-3.429 456 1.714 12.571 0.571 24.571-7.429 32-17.714l24-0.571c5.143 0 10.857 0.571 16 0.571 1.143 64 1.143 128 1.143 192 0 20.571 0.571 42.286-2.857 62.286-12.571 4.571-25.714 8.571-38.857 10.286-13.143-22.857-22.286-48-30.857-73.143-4-11.429-18.286-88.571-18.857-89.714-4-5.143-9.143-8.571-15.429-10.857-4.571-1.714-32-1.143-37.714-1.143-70.286 0-151.429-4-220.571 4-2.857 25.143-5.143 52-4.571 77.714l0.571 86.857v-29.714c0.571 93.143 1.714 185.714 1.714 278.286 0 44-6.857 90.286 5.714 132.571 43.429 22.286 94.857 25.714 139.429 45.714 1.143 9.143 2.857 18.857 2.857 28.571 0 5.143-0.571 10.857-1.714 16.571l-19.429 0.571c-81.143 2.286-161.143-10.286-242.857-10.286-57.714 0-115.429 10.286-173.143 10.286-0.571-9.714-1.714-20-1.714-29.714v-5.143c21.714-34.857 100-35.429 136-56.571 14.286-32 10.286-302.286 10.286-352.571 0-8-2.857-16.571-2.857-25.143 0-23.429 4-157.714-4.571-167.429-8-8.571-82.857-6.857-92.571-6.857-24 0-158.286 12.571-172 21.714-26.857 17.714-27.429 132.571-61.714 135.429-10.286-6.286-24.571-15.429-32-25.143v-218.857zM748.571 806.286c20 0 96 68 111.429 80 8.571 6.857 14.857 16.571 14.857 28s-6.286 21.143-14.857 28c-15.429 12-91.429 80-111.429 80-26.286 0-17.143-61.143-17.143-71.429h-585.143c0 10.286 9.143 71.429-17.143 71.429-20 0-96-68-111.429-80-8.571-6.857-14.857-16.571-14.857-28s6.286-21.143 14.857-28c15.429-12 91.429-80 111.429-80 26.286 0 17.143 61.143 17.143 71.429h585.143c0-10.286-9.143-71.429 17.143-71.429z"],"width":878.2994285714285,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["text-width"],"defaultCode":61493,"grid":14},"attrs":[],"properties":{"name":"text-width","id":54,"order":695,"prevSize":28,"code":61493},"setIdx":0,"setId":1,"iconIdx":65},{"icon":{"paths":["M1024 768v73.143c0 20-16.571 36.571-36.571 36.571h-950.857c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h950.857c20 0 36.571 16.571 36.571 36.571zM804.571 548.571v73.143c0 20-16.571 36.571-36.571 36.571h-731.429c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h731.429c20 0 36.571 16.571 36.571 36.571zM950.857 329.143v73.143c0 20-16.571 36.571-36.571 36.571h-877.714c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h877.714c20 0 36.571 16.571 36.571 36.571zM731.429 109.714v73.143c0 20-16.571 36.571-36.571 36.571h-658.286c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h658.286c20 0 36.571 16.571 36.571 36.571z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["align-left"],"defaultCode":61494,"grid":14},"attrs":[],"properties":{"name":"align-left","id":55,"order":57,"prevSize":28,"code":61494},"setIdx":0,"setId":1,"iconIdx":66},{"icon":{"paths":["M1024 768v73.143c0 20-16.571 36.571-36.571 36.571h-950.857c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h950.857c20 0 36.571 16.571 36.571 36.571zM804.571 548.571v73.143c0 20-16.571 36.571-36.571 36.571h-512c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h512c20 0 36.571 16.571 36.571 36.571zM950.857 329.143v73.143c0 20-16.571 36.571-36.571 36.571h-804.571c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h804.571c20 0 36.571 16.571 36.571 36.571zM731.429 109.714v73.143c0 20-16.571 36.571-36.571 36.571h-365.714c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h365.714c20 0 36.571 16.571 36.571 36.571z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["align-center"],"defaultCode":61495,"grid":14},"attrs":[],"properties":{"name":"align-center","id":56,"order":58,"prevSize":28,"code":61495},"setIdx":0,"setId":1,"iconIdx":67},{"icon":{"paths":["M1024 768v73.143c0 20-16.571 36.571-36.571 36.571h-950.857c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h950.857c20 0 36.571 16.571 36.571 36.571zM1024 548.571v73.143c0 20-16.571 36.571-36.571 36.571h-731.429c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h731.429c20 0 36.571 16.571 36.571 36.571zM1024 329.143v73.143c0 20-16.571 36.571-36.571 36.571h-877.714c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h877.714c20 0 36.571 16.571 36.571 36.571zM1024 109.714v73.143c0 20-16.571 36.571-36.571 36.571h-658.286c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h658.286c20 0 36.571 16.571 36.571 36.571z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["align-right"],"defaultCode":61496,"grid":14},"attrs":[],"properties":{"name":"align-right","id":57,"order":59,"prevSize":28,"code":61496},"setIdx":0,"setId":1,"iconIdx":68},{"icon":{"paths":["M1024 768v73.143c0 20-16.571 36.571-36.571 36.571h-950.857c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h950.857c20 0 36.571 16.571 36.571 36.571zM1024 548.571v73.143c0 20-16.571 36.571-36.571 36.571h-950.857c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h950.857c20 0 36.571 16.571 36.571 36.571zM1024 329.143v73.143c0 20-16.571 36.571-36.571 36.571h-950.857c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h950.857c20 0 36.571 16.571 36.571 36.571zM1024 109.714v73.143c0 20-16.571 36.571-36.571 36.571h-950.857c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h950.857c20 0 36.571 16.571 36.571 36.571z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["align-justify"],"defaultCode":61497,"grid":14},"attrs":[],"properties":{"name":"align-justify","id":58,"order":60,"prevSize":28,"code":61497},"setIdx":0,"setId":1,"iconIdx":69},{"icon":{"paths":["M146.286 749.714v109.714c0 9.714-8.571 18.286-18.286 18.286h-109.714c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h109.714c9.714 0 18.286 8.571 18.286 18.286zM146.286 530.286v109.714c0 9.714-8.571 18.286-18.286 18.286h-109.714c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h109.714c9.714 0 18.286 8.571 18.286 18.286zM146.286 310.857v109.714c0 9.714-8.571 18.286-18.286 18.286h-109.714c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h109.714c9.714 0 18.286 8.571 18.286 18.286zM1024 749.714v109.714c0 9.714-8.571 18.286-18.286 18.286h-768c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h768c9.714 0 18.286 8.571 18.286 18.286zM146.286 91.429v109.714c0 9.714-8.571 18.286-18.286 18.286h-109.714c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h109.714c9.714 0 18.286 8.571 18.286 18.286zM1024 530.286v109.714c0 9.714-8.571 18.286-18.286 18.286h-768c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h768c9.714 0 18.286 8.571 18.286 18.286zM1024 310.857v109.714c0 9.714-8.571 18.286-18.286 18.286h-768c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h768c9.714 0 18.286 8.571 18.286 18.286zM1024 91.429v109.714c0 9.714-8.571 18.286-18.286 18.286h-768c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h768c9.714 0 18.286 8.571 18.286 18.286z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["list"],"defaultCode":61498,"grid":14},"attrs":[],"properties":{"name":"list","id":59,"order":61,"prevSize":28,"code":61498},"setIdx":0,"setId":1,"iconIdx":70},{"icon":{"paths":["M219.429 310.857v329.143c0 9.714-8.571 18.286-18.286 18.286-4.571 0-9.714-1.714-13.143-5.143l-164.571-164.571c-3.429-3.429-5.143-8.571-5.143-13.143s1.714-9.714 5.143-13.143l164.571-164.571c3.429-3.429 8.571-5.143 13.143-5.143 9.714 0 18.286 8.571 18.286 18.286zM1024 749.714v109.714c0 9.714-8.571 18.286-18.286 18.286h-987.429c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h987.429c9.714 0 18.286 8.571 18.286 18.286zM1024 530.286v109.714c0 9.714-8.571 18.286-18.286 18.286h-621.714c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h621.714c9.714 0 18.286 8.571 18.286 18.286zM1024 310.857v109.714c0 9.714-8.571 18.286-18.286 18.286h-621.714c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h621.714c9.714 0 18.286 8.571 18.286 18.286zM1024 91.429v109.714c0 9.714-8.571 18.286-18.286 18.286h-987.429c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h987.429c9.714 0 18.286 8.571 18.286 18.286z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["dedent","outdent"],"defaultCode":61499,"grid":14},"attrs":[],"properties":{"name":"dedent, outdent","id":60,"order":62,"prevSize":28,"code":61499},"setIdx":0,"setId":1,"iconIdx":71},{"icon":{"paths":["M201.143 475.429c0 4.571-1.714 9.714-5.143 13.143l-164.571 164.571c-3.429 3.429-8.571 5.143-13.143 5.143-9.714 0-18.286-8.571-18.286-18.286v-329.143c0-9.714 8.571-18.286 18.286-18.286 4.571 0 9.714 1.714 13.143 5.143l164.571 164.571c3.429 3.429 5.143 8.571 5.143 13.143zM1024 749.714v109.714c0 9.714-8.571 18.286-18.286 18.286h-987.429c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h987.429c9.714 0 18.286 8.571 18.286 18.286zM1024 530.286v109.714c0 9.714-8.571 18.286-18.286 18.286h-621.714c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h621.714c9.714 0 18.286 8.571 18.286 18.286zM1024 310.857v109.714c0 9.714-8.571 18.286-18.286 18.286h-621.714c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h621.714c9.714 0 18.286 8.571 18.286 18.286zM1024 91.429v109.714c0 9.714-8.571 18.286-18.286 18.286h-987.429c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h987.429c9.714 0 18.286 8.571 18.286 18.286z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["indent"],"defaultCode":61500,"grid":14},"attrs":[],"properties":{"name":"indent","id":61,"order":63,"prevSize":28,"code":61500},"setIdx":0,"setId":1,"iconIdx":72},{"icon":{"paths":["M207.429 877.714l52-52-134.286-134.286-52 52v61.143h73.143v73.143h61.143zM506.286 347.429c0-7.429-5.143-12.571-12.571-12.571-3.429 0-6.857 1.143-9.714 4l-309.714 309.714c-2.857 2.857-4 6.286-4 9.714 0 7.429 5.143 12.571 12.571 12.571 3.429 0 6.857-1.143 9.714-4l309.714-309.714c2.857-2.857 4-6.286 4-9.714zM475.429 237.714l237.714 237.714-475.429 475.429h-237.714v-237.714zM865.714 292.571c0 19.429-8 38.286-21.143 51.429l-94.857 94.857-237.714-237.714 94.857-94.286c13.143-13.714 32-21.714 51.429-21.714s38.286 8 52 21.714l134.286 133.714c13.143 13.714 21.143 32.571 21.143 52z"],"width":865.7188571428571,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["pencil"],"defaultCode":61504,"grid":14},"attrs":[],"properties":{"name":"pencil","id":62,"order":66,"prevSize":28,"code":61504},"setIdx":0,"setId":1,"iconIdx":73},{"icon":{"paths":["M438.857 822.857v-621.714c-171.429 0-310.857 139.429-310.857 310.857s139.429 310.857 310.857 310.857zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["adjust"],"defaultCode":61506,"grid":14},"attrs":[],"properties":{"name":"adjust","id":63,"order":68,"prevSize":28,"code":61506},"setIdx":0,"setId":1,"iconIdx":74},{"icon":{"paths":["M507.429 676.571l66.286-66.286-86.857-86.857-66.286 66.286v32h54.857v54.857h32zM758.857 265.143c-5.143-5.143-13.714-4.571-18.857 0.571l-200 200c-5.143 5.143-5.714 13.714-0.571 18.857s13.714 4.571 18.857-0.571l200-200c5.143-5.143 5.714-13.714 0.571-18.857zM804.571 604.571v108.571c0 90.857-73.714 164.571-164.571 164.571h-475.429c-90.857 0-164.571-73.714-164.571-164.571v-475.429c0-90.857 73.714-164.571 164.571-164.571h475.429c22.857 0 45.714 4.571 66.857 14.286 5.143 2.286 9.143 7.429 10.286 13.143 1.143 6.286-0.571 12-5.143 16.571l-28 28c-5.143 5.143-12 6.857-18.286 4.571-8.571-2.286-17.143-3.429-25.714-3.429h-475.429c-50.286 0-91.429 41.143-91.429 91.429v475.429c0 50.286 41.143 91.429 91.429 91.429h475.429c50.286 0 91.429-41.143 91.429-91.429v-72c0-4.571 1.714-9.143 5.143-12.571l36.571-36.571c5.714-5.714 13.143-6.857 20-4s11.429 9.143 11.429 16.571zM749.714 182.857l164.571 164.571-384 384h-164.571v-164.571zM1003.429 258.286l-52.571 52.571-164.571-164.571 52.571-52.571c21.143-21.143 56.571-21.143 77.714 0l86.857 86.857c21.143 21.143 21.143 56.571 0 77.714z"],"width":1024.5851428571427,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["edit","pencil-square-o"],"defaultCode":61508,"grid":14},"attrs":[],"properties":{"name":"edit, pencil-square-o","id":64,"order":70,"prevSize":28,"code":61508},"setIdx":0,"setId":1,"iconIdx":75},{"icon":{"paths":["M804.571 565.143v148c0 90.857-73.714 164.571-164.571 164.571h-475.429c-90.857 0-164.571-73.714-164.571-164.571v-475.429c0-90.857 73.714-164.571 164.571-164.571h145.714c9.714 0 18.286 8 18.286 18.286 0 9.143-6.286 16.571-14.857 18.286-28.571 9.714-54.286 21.143-76 34.286-2.857 1.143-5.714 2.286-9.143 2.286h-64c-50.286 0-91.429 41.143-91.429 91.429v475.429c0 50.286 41.143 91.429 91.429 91.429h475.429c50.286 0 91.429-41.143 91.429-91.429v-122.286c0-6.857 4-13.143 10.286-16.571 11.429-5.143 21.714-12.571 30.857-21.143 5.143-5.143 13.143-7.429 20-4.571s12 9.143 12 16.571zM940 281.714l-219.429 219.429c-6.857 7.429-16 10.857-25.714 10.857-4.571 0-9.714-1.143-14.286-2.857-13.143-5.714-22.286-18.857-22.286-33.714v-109.714h-91.429c-125.714 0-205.714 24-250.286 74.857-46.286 53.143-60 138.857-42.286 270.286 1.143 8-4 16-11.429 19.429-2.286 0.571-4.571 1.143-6.857 1.143-5.714 0-11.429-2.857-14.857-7.429-4-5.714-94.857-134.286-94.857-248.571 0-153.143 48-329.143 420.571-329.143h91.429v-109.714c0-14.857 9.143-28 22.286-33.714 4.571-1.714 9.714-2.857 14.286-2.857 9.714 0 18.857 4 25.714 10.857l219.429 219.429c14.286 14.286 14.286 37.143 0 51.429z"],"width":954.2948571428572,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["share-square-o"],"defaultCode":61509,"grid":14},"attrs":[],"properties":{"name":"share-square-o","id":65,"order":71,"prevSize":28,"code":61509},"setIdx":0,"setId":1,"iconIdx":76},{"icon":{"paths":["M804.571 531.429v181.714c0 90.857-73.714 164.571-164.571 164.571h-475.429c-90.857 0-164.571-73.714-164.571-164.571v-475.429c0-90.857 73.714-164.571 164.571-164.571h475.429c22.857 0 45.714 4.571 66.857 14.286 5.143 2.286 9.143 7.429 10.286 13.143 1.143 6.286-0.571 12-5.143 16.571l-28 28c-3.429 3.429-8.571 5.714-13.143 5.714-1.714 0-3.429-0.571-5.143-1.143-8.571-2.286-17.143-3.429-25.714-3.429h-475.429c-50.286 0-91.429 41.143-91.429 91.429v475.429c0 50.286 41.143 91.429 91.429 91.429h475.429c50.286 0 91.429-41.143 91.429-91.429v-145.143c0-4.571 1.714-9.143 5.143-12.571l36.571-36.571c4-4 8.571-5.714 13.143-5.714 2.286 0 4.571 0.571 6.857 1.714 6.857 2.857 11.429 9.143 11.429 16.571zM936.571 252l-465.143 465.143c-18.286 18.286-46.857 18.286-65.143 0l-245.714-245.714c-18.286-18.286-18.286-46.857 0-65.143l62.857-62.857c18.286-18.286 46.857-18.286 65.143 0l150.286 150.286 369.714-369.714c18.286-18.286 46.857-18.286 65.143 0l62.857 62.857c18.286 18.286 18.286 46.857 0 65.143z"],"width":954.8799999999999,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["check-square-o"],"defaultCode":61510,"grid":14},"attrs":[],"properties":{"name":"check-square-o","id":66,"order":719,"prevSize":28,"code":61510},"setIdx":0,"setId":1,"iconIdx":77},{"icon":{"paths":["M1024 512c0 9.714-4 18.857-10.857 25.714l-146.286 146.286c-6.857 6.857-16 10.857-25.714 10.857-20 0-36.571-16.571-36.571-36.571v-73.143h-219.429v219.429h73.143c20 0 36.571 16.571 36.571 36.571 0 9.714-4 18.857-10.857 25.714l-146.286 146.286c-6.857 6.857-16 10.857-25.714 10.857s-18.857-4-25.714-10.857l-146.286-146.286c-6.857-6.857-10.857-16-10.857-25.714 0-20 16.571-36.571 36.571-36.571h73.143v-219.429h-219.429v73.143c0 20-16.571 36.571-36.571 36.571-9.714 0-18.857-4-25.714-10.857l-146.286-146.286c-6.857-6.857-10.857-16-10.857-25.714s4-18.857 10.857-25.714l146.286-146.286c6.857-6.857 16-10.857 25.714-10.857 20 0 36.571 16.571 36.571 36.571v73.143h219.429v-219.429h-73.143c-20 0-36.571-16.571-36.571-36.571 0-9.714 4-18.857 10.857-25.714l146.286-146.286c6.857-6.857 16-10.857 25.714-10.857s18.857 4 25.714 10.857l146.286 146.286c6.857 6.857 10.857 16 10.857 25.714 0 20-16.571 36.571-36.571 36.571h-73.143v219.429h219.429v-73.143c0-20 16.571-36.571 36.571-36.571 9.714 0 18.857 4 25.714 10.857l146.286 146.286c6.857 6.857 10.857 16 10.857 25.714z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["arrows"],"defaultCode":61511,"grid":14},"attrs":[],"properties":{"name":"arrows","id":67,"order":73,"prevSize":28,"code":61511},"setIdx":0,"setId":1,"iconIdx":78},{"icon":{"paths":["M559.429 80.571c14.286-14.286 25.714-9.143 25.714 10.857v841.143c0 20-11.429 25.143-25.714 10.857l-405.714-405.714c-3.429-3.429-5.714-6.857-7.429-10.857v387.429c0 20-16.571 36.571-36.571 36.571h-73.143c-20 0-36.571-16.571-36.571-36.571v-804.571c0-20 16.571-36.571 36.571-36.571h73.143c20 0 36.571 16.571 36.571 36.571v387.429c1.714-4 4-7.429 7.429-10.857z"],"width":585.1428571428571,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["step-backward"],"defaultCode":61512,"grid":14},"attrs":[],"properties":{"name":"step-backward","id":68,"order":74,"prevSize":28,"code":61512},"setIdx":0,"setId":1,"iconIdx":79},{"icon":{"paths":["M998.286 80.571c14.286-14.286 25.714-9.143 25.714 10.857v841.143c0 20-11.429 25.143-25.714 10.857l-405.714-405.714c-3.429-3.429-5.714-6.857-7.429-10.857v405.714c0 20-11.429 25.143-25.714 10.857l-405.714-405.714c-3.429-3.429-5.714-6.857-7.429-10.857v387.429c0 20-16.571 36.571-36.571 36.571h-73.143c-20 0-36.571-16.571-36.571-36.571v-804.571c0-20 16.571-36.571 36.571-36.571h73.143c20 0 36.571 16.571 36.571 36.571v387.429c1.714-4 4-7.429 7.429-10.857l405.714-405.714c14.286-14.286 25.714-9.143 25.714 10.857v405.714c1.714-4 4-7.429 7.429-10.857z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["fast-backward"],"defaultCode":61513,"grid":14},"attrs":[],"properties":{"name":"fast-backward","id":69,"order":75,"prevSize":28,"code":61513},"setIdx":0,"setId":1,"iconIdx":80},{"icon":{"paths":["M925.143 80.571c14.286-14.286 25.714-9.143 25.714 10.857v841.143c0 20-11.429 25.143-25.714 10.857l-405.714-405.714c-3.429-3.429-5.714-6.857-7.429-10.857v405.714c0 20-11.429 25.143-25.714 10.857l-405.714-405.714c-14.286-14.286-14.286-37.143 0-51.429l405.714-405.714c14.286-14.286 25.714-9.143 25.714 10.857v405.714c1.714-4 4-7.429 7.429-10.857z"],"width":1017.1245714285715,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["backward"],"defaultCode":61514,"grid":14},"attrs":[],"properties":{"name":"backward","id":70,"order":76,"prevSize":28,"code":61514},"setIdx":0,"setId":1,"iconIdx":81},{"icon":{"paths":["M790.857 529.714l-758.857 421.714c-17.714 9.714-32 1.143-32-18.857v-841.143c0-20 14.286-28.571 32-18.857l758.857 421.714c17.714 9.714 17.714 25.714 0 35.429z"],"width":808.5942857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["play"],"defaultCode":61515,"grid":14},"attrs":[],"properties":{"name":"play","id":71,"order":77,"prevSize":28,"code":61515},"setIdx":0,"setId":1,"iconIdx":82},{"icon":{"paths":["M877.714 109.714v804.571c0 20-16.571 36.571-36.571 36.571h-292.571c-20 0-36.571-16.571-36.571-36.571v-804.571c0-20 16.571-36.571 36.571-36.571h292.571c20 0 36.571 16.571 36.571 36.571zM365.714 109.714v804.571c0 20-16.571 36.571-36.571 36.571h-292.571c-20 0-36.571-16.571-36.571-36.571v-804.571c0-20 16.571-36.571 36.571-36.571h292.571c20 0 36.571 16.571 36.571 36.571z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["pause"],"defaultCode":61516,"grid":14},"attrs":[],"properties":{"name":"pause","id":72,"order":78,"prevSize":28,"code":61516},"setIdx":0,"setId":1,"iconIdx":83},{"icon":{"paths":["M877.714 109.714v804.571c0 20-16.571 36.571-36.571 36.571h-804.571c-20 0-36.571-16.571-36.571-36.571v-804.571c0-20 16.571-36.571 36.571-36.571h804.571c20 0 36.571 16.571 36.571 36.571z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["stop"],"defaultCode":61517,"grid":14},"attrs":[],"properties":{"name":"stop","id":73,"order":79,"prevSize":28,"code":61517},"setIdx":0,"setId":1,"iconIdx":84},{"icon":{"paths":["M25.714 943.429c-14.286 14.286-25.714 9.143-25.714-10.857v-841.143c0-20 11.429-25.143 25.714-10.857l405.714 405.714c3.429 3.429 5.714 6.857 7.429 10.857v-405.714c0-20 11.429-25.143 25.714-10.857l405.714 405.714c14.286 14.286 14.286 37.143 0 51.429l-405.714 405.714c-14.286 14.286-25.714 9.143-25.714-10.857v-405.714c-1.714 4-4 7.429-7.429 10.857z"],"width":884.5897142857142,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["forward"],"defaultCode":61518,"grid":14},"attrs":[],"properties":{"name":"forward","id":74,"order":80,"prevSize":28,"code":61518},"setIdx":0,"setId":1,"iconIdx":85},{"icon":{"paths":["M25.714 943.429c-14.286 14.286-25.714 9.143-25.714-10.857v-841.143c0-20 11.429-25.143 25.714-10.857l405.714 405.714c3.429 3.429 5.714 6.857 7.429 10.857v-405.714c0-20 11.429-25.143 25.714-10.857l405.714 405.714c3.429 3.429 5.714 6.857 7.429 10.857v-387.429c0-20 16.571-36.571 36.571-36.571h73.143c20 0 36.571 16.571 36.571 36.571v804.571c0 20-16.571 36.571-36.571 36.571h-73.143c-20 0-36.571-16.571-36.571-36.571v-387.429c-1.714 4-4 7.429-7.429 10.857l-405.714 405.714c-14.286 14.286-25.714 9.143-25.714-10.857v-405.714c-1.714 4-4 7.429-7.429 10.857z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["fast-forward"],"defaultCode":61520,"grid":14},"attrs":[],"properties":{"name":"fast-forward","id":75,"order":81,"prevSize":28,"code":61520},"setIdx":0,"setId":1,"iconIdx":86},{"icon":{"paths":["M25.714 943.429c-14.286 14.286-25.714 9.143-25.714-10.857v-841.143c0-20 11.429-25.143 25.714-10.857l405.714 405.714c3.429 3.429 5.714 6.857 7.429 10.857v-387.429c0-20 16.571-36.571 36.571-36.571h73.143c20 0 36.571 16.571 36.571 36.571v804.571c0 20-16.571 36.571-36.571 36.571h-73.143c-20 0-36.571-16.571-36.571-36.571v-387.429c-1.714 4-4 7.429-7.429 10.857z"],"width":585.1428571428571,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["step-forward"],"defaultCode":61521,"grid":14},"attrs":[],"properties":{"name":"step-forward","id":76,"order":82,"prevSize":28,"code":61521},"setIdx":0,"setId":1,"iconIdx":87},{"icon":{"paths":["M8 559.429l405.714-405.714c14.286-14.286 37.143-14.286 51.429 0l405.714 405.714c14.286 14.286 9.143 25.714-10.857 25.714h-841.143c-20 0-25.143-11.429-10.857-25.714zM841.714 877.714h-804.571c-20 0-36.571-16.571-36.571-36.571v-146.286c0-20 16.571-36.571 36.571-36.571h804.571c20 0 36.571 16.571 36.571 36.571v146.286c0 20-16.571 36.571-36.571 36.571z"],"width":878.8845714285713,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["eject"],"defaultCode":61522,"grid":14},"attrs":[],"properties":{"name":"eject","id":77,"order":83,"prevSize":28,"code":61522},"setIdx":0,"setId":1,"iconIdx":88},{"icon":{"paths":["M669.143 172l-303.429 303.429 303.429 303.429c14.286 14.286 14.286 37.143 0 51.429l-94.857 94.857c-14.286 14.286-37.143 14.286-51.429 0l-424-424c-14.286-14.286-14.286-37.143 0-51.429l424-424c14.286-14.286 37.143-14.286 51.429 0l94.857 94.857c14.286 14.286 14.286 37.143 0 51.429z"],"width":768,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["chevron-left"],"defaultCode":61523,"grid":14},"attrs":[],"properties":{"name":"chevron-left","id":78,"order":84,"prevSize":28,"code":61523},"setIdx":0,"setId":1,"iconIdx":89},{"icon":{"paths":["M632.571 501.143l-424 424c-14.286 14.286-37.143 14.286-51.429 0l-94.857-94.857c-14.286-14.286-14.286-37.143 0-51.429l303.429-303.429-303.429-303.429c-14.286-14.286-14.286-37.143 0-51.429l94.857-94.857c14.286-14.286 37.143-14.286 51.429 0l424 424c14.286 14.286 14.286 37.143 0 51.429z"],"width":694.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["chevron-right"],"defaultCode":61524,"grid":14},"attrs":[],"properties":{"name":"chevron-right","id":79,"order":85,"prevSize":28,"code":61524},"setIdx":0,"setId":1,"iconIdx":90},{"icon":{"paths":["M694.857 548.571v-73.143c0-20-16.571-36.571-36.571-36.571h-146.286v-146.286c0-20-16.571-36.571-36.571-36.571h-73.143c-20 0-36.571 16.571-36.571 36.571v146.286h-146.286c-20 0-36.571 16.571-36.571 36.571v73.143c0 20 16.571 36.571 36.571 36.571h146.286v146.286c0 20 16.571 36.571 36.571 36.571h73.143c20 0 36.571-16.571 36.571-36.571v-146.286h146.286c20 0 36.571-16.571 36.571-36.571zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["plus-circle"],"defaultCode":61525,"grid":14},"attrs":[],"properties":{"name":"plus-circle","id":80,"order":86,"prevSize":28,"code":61525},"setIdx":0,"setId":1,"iconIdx":91},{"icon":{"paths":["M694.857 548.571v-73.143c0-20-16.571-36.571-36.571-36.571h-438.857c-20 0-36.571 16.571-36.571 36.571v73.143c0 20 16.571 36.571 36.571 36.571h438.857c20 0 36.571-16.571 36.571-36.571zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["minus-circle"],"defaultCode":61526,"grid":14},"attrs":[],"properties":{"name":"minus-circle","id":81,"order":87,"prevSize":28,"code":61526},"setIdx":0,"setId":1,"iconIdx":92},{"icon":{"paths":["M656.571 641.143c0-9.714-4-18.857-10.857-25.714l-103.429-103.429 103.429-103.429c6.857-6.857 10.857-16 10.857-25.714s-4-19.429-10.857-26.286l-51.429-51.429c-6.857-6.857-16.571-10.857-26.286-10.857s-18.857 4-25.714 10.857l-103.429 103.429-103.429-103.429c-6.857-6.857-16-10.857-25.714-10.857s-19.429 4-26.286 10.857l-51.429 51.429c-6.857 6.857-10.857 16.571-10.857 26.286s4 18.857 10.857 25.714l103.429 103.429-103.429 103.429c-6.857 6.857-10.857 16-10.857 25.714s4 19.429 10.857 26.286l51.429 51.429c6.857 6.857 16.571 10.857 26.286 10.857s18.857-4 25.714-10.857l103.429-103.429 103.429 103.429c6.857 6.857 16 10.857 25.714 10.857s19.429-4 26.286-10.857l51.429-51.429c6.857-6.857 10.857-16.571 10.857-26.286zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["times-circle"],"defaultCode":61527,"grid":14},"attrs":[],"properties":{"name":"times-circle","id":82,"order":88,"prevSize":28,"code":61527},"setIdx":0,"setId":1,"iconIdx":93},{"icon":{"paths":["M733.714 419.429c0-9.714-3.429-19.429-10.286-26.286l-52-51.429c-6.857-6.857-16-10.857-25.714-10.857s-18.857 4-25.714 10.857l-233.143 232.571-129.143-129.143c-6.857-6.857-16-10.857-25.714-10.857s-18.857 4-25.714 10.857l-52 51.429c-6.857 6.857-10.286 16.571-10.286 26.286s3.429 18.857 10.286 25.714l206.857 206.857c6.857 6.857 16.571 10.857 25.714 10.857 9.714 0 19.429-4 26.286-10.857l310.286-310.286c6.857-6.857 10.286-16 10.286-25.714zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["check-circle"],"defaultCode":61528,"grid":14},"attrs":[],"properties":{"name":"check-circle","id":83,"order":89,"prevSize":28,"code":61528},"setIdx":0,"setId":1,"iconIdx":94},{"icon":{"paths":["M512 786.286v-109.714c0-10.286-8-18.286-18.286-18.286h-109.714c-10.286 0-18.286 8-18.286 18.286v109.714c0 10.286 8 18.286 18.286 18.286h109.714c10.286 0 18.286-8 18.286-18.286zM658.286 402.286c0-104.571-109.714-182.857-208-182.857-93.143 0-162.857 40-212 121.714-5.143 8-2.857 18.286 4.571 24l75.429 57.143c2.857 2.286 6.857 3.429 10.857 3.429 5.143 0 10.857-2.286 14.286-6.857 26.857-34.286 38.286-44.571 49.143-52.571 9.714-6.857 28.571-13.714 49.143-13.714 36.571 0 70.286 23.429 70.286 48.571 0 29.714-15.429 44.571-50.286 60.571-40.571 18.286-96 65.714-96 121.143v20.571c0 10.286 8 18.286 18.286 18.286h109.714c10.286 0 18.286-8 18.286-18.286v0c0-13.143 16.571-41.143 43.429-56.571 43.429-24.571 102.857-57.714 102.857-144.571zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["question-circle"],"defaultCode":61529,"grid":14},"attrs":[],"properties":{"name":"question-circle","id":84,"order":90,"prevSize":28,"code":61529},"setIdx":0,"setId":1,"iconIdx":95},{"icon":{"paths":["M585.143 786.286v-91.429c0-10.286-8-18.286-18.286-18.286h-54.857v-292.571c0-10.286-8-18.286-18.286-18.286h-182.857c-10.286 0-18.286 8-18.286 18.286v91.429c0 10.286 8 18.286 18.286 18.286h54.857v182.857h-54.857c-10.286 0-18.286 8-18.286 18.286v91.429c0 10.286 8 18.286 18.286 18.286h256c10.286 0 18.286-8 18.286-18.286zM512 274.286v-91.429c0-10.286-8-18.286-18.286-18.286h-109.714c-10.286 0-18.286 8-18.286 18.286v91.429c0 10.286 8 18.286 18.286 18.286h109.714c10.286 0 18.286-8 18.286-18.286zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["info-circle"],"defaultCode":61530,"grid":14},"attrs":[],"properties":{"name":"info-circle","id":85,"order":91,"prevSize":28,"code":61530},"setIdx":0,"setId":1,"iconIdx":96},{"icon":{"paths":["M684 585.143h-62.286c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h62.286c-24.571-82.286-89.714-147.429-172-172v62.286c0 20-16.571 36.571-36.571 36.571h-73.143c-20 0-36.571-16.571-36.571-36.571v-62.286c-82.286 24.571-147.429 89.714-172 172h62.286c20 0 36.571 16.571 36.571 36.571v73.143c0 20-16.571 36.571-36.571 36.571h-62.286c24.571 82.286 89.714 147.429 172 172v-62.286c0-20 16.571-36.571 36.571-36.571h73.143c20 0 36.571 16.571 36.571 36.571v62.286c82.286-24.571 147.429-89.714 172-172zM877.714 475.429v73.143c0 20-16.571 36.571-36.571 36.571h-81.714c-28 122.857-124.571 219.429-247.429 247.429v81.714c0 20-16.571 36.571-36.571 36.571h-73.143c-20 0-36.571-16.571-36.571-36.571v-81.714c-122.857-28-219.429-124.571-247.429-247.429h-81.714c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h81.714c28-122.857 124.571-219.429 247.429-247.429v-81.714c0-20 16.571-36.571 36.571-36.571h73.143c20 0 36.571 16.571 36.571 36.571v81.714c122.857 28 219.429 124.571 247.429 247.429h81.714c20 0 36.571 16.571 36.571 36.571z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["crosshairs"],"defaultCode":61531,"grid":14},"attrs":[],"properties":{"name":"crosshairs","id":86,"order":92,"prevSize":28,"code":61531},"setIdx":0,"setId":1,"iconIdx":97},{"icon":{"paths":["M626.857 616.571l-83.429 83.429c-7.429 7.429-18.857 7.429-26.286 0l-78.286-78.286-78.286 78.286c-7.429 7.429-18.857 7.429-26.286 0l-83.429-83.429c-7.429-7.429-7.429-18.857 0-26.286l78.286-78.286-78.286-78.286c-7.429-7.429-7.429-18.857 0-26.286l83.429-83.429c7.429-7.429 18.857-7.429 26.286 0l78.286 78.286 78.286-78.286c7.429-7.429 18.857-7.429 26.286 0l83.429 83.429c7.429 7.429 7.429 18.857 0 26.286l-78.286 78.286 78.286 78.286c7.429 7.429 7.429 18.857 0 26.286zM749.714 512c0-171.429-139.429-310.857-310.857-310.857s-310.857 139.429-310.857 310.857 139.429 310.857 310.857 310.857 310.857-139.429 310.857-310.857zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["times-circle-o"],"defaultCode":61532,"grid":14},"attrs":[],"properties":{"name":"times-circle-o","id":87,"order":93,"prevSize":28,"code":61532},"setIdx":0,"setId":1,"iconIdx":98},{"icon":{"paths":["M669.143 464.571l-241.143 241.143c-14.286 14.286-37.143 14.286-51.429 0l-168-168c-14.286-14.286-14.286-37.143 0-51.429l58.286-58.286c14.286-14.286 37.143-14.286 51.429 0l84 84 157.143-157.143c14.286-14.286 37.143-14.286 51.429 0l58.286 58.286c14.286 14.286 14.286 37.143 0 51.429zM749.714 512c0-171.429-139.429-310.857-310.857-310.857s-310.857 139.429-310.857 310.857 139.429 310.857 310.857 310.857 310.857-139.429 310.857-310.857zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["check-circle-o"],"defaultCode":61533,"grid":14},"attrs":[],"properties":{"name":"check-circle-o","id":88,"order":94,"prevSize":28,"code":61533},"setIdx":0,"setId":1,"iconIdx":99},{"icon":{"paths":["M749.714 510.286c0-62.286-18.286-120-49.714-168.571l-430.857 430.286c49.143 32 107.429 50.857 169.714 50.857 171.429 0 310.857-140 310.857-312.571zM178.857 681.143l431.429-430.857c-49.143-33.143-108-52-171.429-52-171.429 0-310.857 140-310.857 312 0 63.429 18.857 121.714 50.857 170.857zM877.714 510.286c0 243.429-196.571 440.571-438.857 440.571s-438.857-197.143-438.857-440.571c0-242.857 196.571-440 438.857-440s438.857 197.143 438.857 440z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["ban"],"defaultCode":61534,"grid":14},"attrs":[],"properties":{"name":"ban","id":89,"order":95,"prevSize":28,"code":61534},"setIdx":0,"setId":1,"iconIdx":100},{"icon":{"paths":["M877.714 512v73.143c0 38.857-25.714 73.143-66.857 73.143h-402.286l167.429 168c13.714 13.143 21.714 32 21.714 51.429s-8 38.286-21.714 51.429l-42.857 43.429c-13.143 13.143-32 21.143-51.429 21.143s-38.286-8-52-21.143l-372-372.571c-13.143-13.143-21.143-32-21.143-51.429s8-38.286 21.143-52l372-371.429c13.714-13.714 32.571-21.714 52-21.714s37.714 8 51.429 21.714l42.857 42.286c13.714 13.714 21.714 32.571 21.714 52s-8 38.286-21.714 52l-167.429 167.429h402.286c41.143 0 66.857 34.286 66.857 73.143z"],"width":914.2857142857142,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["arrow-left"],"defaultCode":61536,"grid":14},"attrs":[],"properties":{"name":"arrow-left","id":90,"order":96,"prevSize":28,"code":61536},"setIdx":0,"setId":1,"iconIdx":101},{"icon":{"paths":["M841.143 548.571c0 19.429-7.429 38.286-21.143 52l-372 372c-13.714 13.143-32.571 21.143-52 21.143s-37.714-8-51.429-21.143l-42.857-42.857c-13.714-13.714-21.714-32.571-21.714-52s8-38.286 21.714-52l167.429-167.429h-402.286c-41.143 0-66.857-34.286-66.857-73.143v-73.143c0-38.857 25.714-73.143 66.857-73.143h402.286l-167.429-168c-13.714-13.143-21.714-32-21.714-51.429s8-38.286 21.714-51.429l42.857-42.857c13.714-13.714 32-21.714 51.429-21.714s38.286 8 52 21.714l372 372c13.714 13.143 21.143 32 21.143 51.429z"],"width":841.1428571428571,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["arrow-right"],"defaultCode":61537,"grid":14},"attrs":[],"properties":{"name":"arrow-right","id":91,"order":97,"prevSize":28,"code":61537},"setIdx":0,"setId":1,"iconIdx":102},{"icon":{"paths":["M920.571 554.857c0 19.429-8 37.714-21.143 51.429l-42.857 42.857c-13.714 13.714-32.571 21.714-52 21.714s-38.286-8-51.429-21.714l-168-167.429v402.286c0 41.143-34.286 66.857-73.143 66.857h-73.143c-38.857 0-73.143-25.714-73.143-66.857v-402.286l-168 167.429c-13.143 13.714-32 21.714-51.429 21.714s-38.286-8-51.429-21.714l-42.857-42.857c-13.714-13.714-21.714-32-21.714-51.429s8-38.286 21.714-52l372-372c13.143-13.714 32-21.143 51.429-21.143s38.286 7.429 52 21.143l372 372c13.143 13.714 21.143 32.571 21.143 52z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["arrow-up"],"defaultCode":61538,"grid":14},"attrs":[],"properties":{"name":"arrow-up","id":92,"order":98,"prevSize":28,"code":61538},"setIdx":0,"setId":1,"iconIdx":103},{"icon":{"paths":["M920.571 475.429c0 19.429-8 38.286-21.143 51.429l-372 372.571c-13.714 13.143-32.571 21.143-52 21.143s-38.286-8-51.429-21.143l-372-372.571c-13.714-13.143-21.714-32-21.714-51.429s8-38.286 21.714-52l42.286-42.857c13.714-13.143 32.571-21.143 52-21.143s38.286 8 51.429 21.143l168 168v-402.286c0-40 33.143-73.143 73.143-73.143h73.143c40 0 73.143 33.143 73.143 73.143v402.286l168-168c13.143-13.143 32-21.143 51.429-21.143s38.286 8 52 21.143l42.857 42.857c13.143 13.714 21.143 32.571 21.143 52z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["arrow-down"],"defaultCode":61539,"grid":14},"attrs":[],"properties":{"name":"arrow-down","id":93,"order":99,"prevSize":28,"code":61539},"setIdx":0,"setId":1,"iconIdx":104},{"icon":{"paths":["M1024 365.714c0 9.714-4 18.857-10.857 25.714l-292.571 292.571c-6.857 6.857-16 10.857-25.714 10.857-20 0-36.571-16.571-36.571-36.571v-146.286h-128c-246.286 0-408 47.429-408 320 0 23.429 1.143 46.857 2.857 70.286 0.571 9.143 2.857 19.429 2.857 28.571 0 10.857-6.857 20-18.286 20-8 0-12-4-16-9.714-8.571-12-14.857-30.286-21.143-43.429-32.571-73.143-72.571-177.714-72.571-257.714 0-64 6.286-129.714 30.286-190.286 79.429-197.143 312.571-230.286 500-230.286h128v-146.286c0-20 16.571-36.571 36.571-36.571 9.714 0 18.857 4 25.714 10.857l292.571 292.571c6.857 6.857 10.857 16 10.857 25.714z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["mail-forward","share"],"defaultCode":61540,"grid":14},"attrs":[],"properties":{"name":"mail-forward, share","id":94,"order":100,"prevSize":28,"code":61540},"setIdx":0,"setId":1,"iconIdx":105},{"icon":{"paths":["M431.429 603.429c0 4.571-2.286 9.714-5.714 13.143l-189.714 189.714 82.286 82.286c6.857 6.857 10.857 16 10.857 25.714 0 20-16.571 36.571-36.571 36.571h-256c-20 0-36.571-16.571-36.571-36.571v-256c0-20 16.571-36.571 36.571-36.571 9.714 0 18.857 4 25.714 10.857l82.286 82.286 189.714-189.714c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l65.143 65.143c3.429 3.429 5.714 8.571 5.714 13.143zM877.714 109.714v256c0 20-16.571 36.571-36.571 36.571-9.714 0-18.857-4-25.714-10.857l-82.286-82.286-189.714 189.714c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-65.143-65.143c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l189.714-189.714-82.286-82.286c-6.857-6.857-10.857-16-10.857-25.714 0-20 16.571-36.571 36.571-36.571h256c20 0 36.571 16.571 36.571 36.571z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["expand"],"defaultCode":61541,"grid":14},"attrs":[],"properties":{"name":"expand","id":95,"order":101,"prevSize":28,"code":61541},"setIdx":0,"setId":1,"iconIdx":106},{"icon":{"paths":["M438.857 548.571v256c0 20-16.571 36.571-36.571 36.571-9.714 0-18.857-4-25.714-10.857l-82.286-82.286-189.714 189.714c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-65.143-65.143c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l189.714-189.714-82.286-82.286c-6.857-6.857-10.857-16-10.857-25.714 0-20 16.571-36.571 36.571-36.571h256c20 0 36.571 16.571 36.571 36.571zM870.286 164.571c0 4.571-2.286 9.714-5.714 13.143l-189.714 189.714 82.286 82.286c6.857 6.857 10.857 16 10.857 25.714 0 20-16.571 36.571-36.571 36.571h-256c-20 0-36.571-16.571-36.571-36.571v-256c0-20 16.571-36.571 36.571-36.571 9.714 0 18.857 4 25.714 10.857l82.286 82.286 189.714-189.714c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l65.143 65.143c3.429 3.429 5.714 8.571 5.714 13.143z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["compress"],"defaultCode":61542,"grid":14},"attrs":[],"properties":{"name":"compress","id":96,"order":102,"prevSize":28,"code":61542},"setIdx":0,"setId":1,"iconIdx":107},{"icon":{"paths":["M438.857 73.143c242.286 0 438.857 196.571 438.857 438.857s-196.571 438.857-438.857 438.857-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857zM512 785.714v-108.571c0-10.286-8-18.857-17.714-18.857h-109.714c-10.286 0-18.857 8.571-18.857 18.857v108.571c0 10.286 8.571 18.857 18.857 18.857h109.714c9.714 0 17.714-8.571 17.714-18.857zM510.857 589.143l10.286-354.857c0-4-1.714-8-5.714-10.286-3.429-2.857-8.571-4.571-13.714-4.571h-125.714c-5.143 0-10.286 1.714-13.714 4.571-4 2.286-5.714 6.286-5.714 10.286l9.714 354.857c0 8 8.571 14.286 19.429 14.286h105.714c10.286 0 18.857-6.286 19.429-14.286z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["exclamation-circle"],"defaultCode":61546,"grid":14},"attrs":[],"properties":{"name":"exclamation-circle","id":97,"order":103,"prevSize":28,"code":61546},"setIdx":0,"setId":1,"iconIdx":108},{"icon":{"paths":["M950.857 548.571c-54.286-84-128.571-156-217.714-201.714 22.857 38.857 34.857 83.429 34.857 128.571 0 141.143-114.857 256-256 256s-256-114.857-256-256c0-45.143 12-89.714 34.857-128.571-89.143 45.714-163.429 117.714-217.714 201.714 97.714 150.857 255.429 256 438.857 256s341.143-105.143 438.857-256zM539.429 329.143c0-14.857-12.571-27.429-27.429-27.429-95.429 0-173.714 78.286-173.714 173.714 0 14.857 12.571 27.429 27.429 27.429s27.429-12.571 27.429-27.429c0-65.143 53.714-118.857 118.857-118.857 14.857 0 27.429-12.571 27.429-27.429zM1024 548.571c0 14.286-4.571 27.429-11.429 39.429-105.143 173.143-297.714 289.714-500.571 289.714s-395.429-117.143-500.571-289.714c-6.857-12-11.429-25.143-11.429-39.429s4.571-27.429 11.429-39.429c105.143-172.571 297.714-289.714 500.571-289.714s395.429 117.143 500.571 289.714c6.857 12 11.429 25.143 11.429 39.429z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["eye"],"defaultCode":61550,"grid":14},"attrs":[],"properties":{"name":"eye","id":98,"order":107,"prevSize":28,"code":61550},"setIdx":0,"setId":1,"iconIdx":109},{"icon":{"paths":["M317.143 762.857l44.571-80.571c-66.286-48-105.714-125.143-105.714-206.857 0-45.143 12-89.714 34.857-128.571-89.143 45.714-163.429 117.714-217.714 201.714 59.429 92 143.429 169.143 244 214.286zM539.429 329.143c0-14.857-12.571-27.429-27.429-27.429-95.429 0-173.714 78.286-173.714 173.714 0 14.857 12.571 27.429 27.429 27.429s27.429-12.571 27.429-27.429c0-65.714 53.714-118.857 118.857-118.857 14.857 0 27.429-12.571 27.429-27.429zM746.857 220c0 1.143 0 4-0.571 5.143-120.571 215.429-240 432-360.571 647.429l-28 50.857c-3.429 5.714-9.714 9.143-16 9.143-10.286 0-64.571-33.143-76.571-40-5.714-3.429-9.143-9.143-9.143-16 0-9.143 19.429-40 25.143-49.714-110.857-50.286-204-136-269.714-238.857-7.429-11.429-11.429-25.143-11.429-39.429 0-13.714 4-28 11.429-39.429 113.143-173.714 289.714-289.714 500.571-289.714 34.286 0 69.143 3.429 102.857 9.714l30.857-55.429c3.429-5.714 9.143-9.143 16-9.143 10.286 0 64 33.143 76 40 5.714 3.429 9.143 9.143 9.143 15.429zM768 475.429c0 106.286-65.714 201.143-164.571 238.857l160-286.857c2.857 16 4.571 32 4.571 48zM1024 548.571c0 14.857-4 26.857-11.429 39.429-17.714 29.143-40 57.143-62.286 82.857-112 128.571-266.286 206.857-438.286 206.857l42.286-75.429c166.286-14.286 307.429-115.429 396.571-253.714-42.286-65.714-96.571-123.429-161.143-168l36-64c70.857 47.429 142.286 118.857 186.857 192.571 7.429 12.571 11.429 24.571 11.429 39.429z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["eye-slash"],"defaultCode":61552,"grid":14},"attrs":[],"properties":{"name":"eye-slash","id":99,"order":108,"prevSize":28,"code":61552},"setIdx":0,"setId":1,"iconIdx":110},{"icon":{"paths":["M585.143 785.714v-108.571c0-10.286-8-18.857-18.286-18.857h-109.714c-10.286 0-18.286 8.571-18.286 18.857v108.571c0 10.286 8 18.857 18.286 18.857h109.714c10.286 0 18.286-8.571 18.286-18.857zM584 572l10.286-262.286c0-3.429-1.714-8-5.714-10.857-3.429-2.857-8.571-6.286-13.714-6.286h-125.714c-5.143 0-10.286 3.429-13.714 6.286-4 2.857-5.714 8.571-5.714 12l9.714 261.143c0 7.429 8.571 13.143 19.429 13.143h105.714c10.286 0 18.857-5.714 19.429-13.143zM576 38.286l438.857 804.571c12.571 22.286 12 49.714-1.143 72s-37.143 36-62.857 36h-877.714c-25.714 0-49.714-13.714-62.857-36s-13.714-49.714-1.143-72l438.857-804.571c12.571-23.429 37.143-38.286 64-38.286s51.429 14.857 64 38.286z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["exclamation-triangle","warning"],"defaultCode":61553,"grid":14},"attrs":[],"properties":{"name":"exclamation-triangle, warning","id":100,"order":109,"prevSize":28,"code":61553},"setIdx":0,"setId":1,"iconIdx":111},{"icon":{"paths":["M73.143 950.857h164.571v-164.571h-164.571v164.571zM274.286 950.857h182.857v-164.571h-182.857v164.571zM73.143 749.714h164.571v-182.857h-164.571v182.857zM274.286 749.714h182.857v-182.857h-182.857v182.857zM73.143 530.286h164.571v-164.571h-164.571v164.571zM493.714 950.857h182.857v-164.571h-182.857v164.571zM274.286 530.286h182.857v-164.571h-182.857v164.571zM713.143 950.857h164.571v-164.571h-164.571v164.571zM493.714 749.714h182.857v-182.857h-182.857v182.857zM292.571 256v-164.571c0-9.714-8.571-18.286-18.286-18.286h-36.571c-9.714 0-18.286 8.571-18.286 18.286v164.571c0 9.714 8.571 18.286 18.286 18.286h36.571c9.714 0 18.286-8.571 18.286-18.286zM713.143 749.714h164.571v-182.857h-164.571v182.857zM493.714 530.286h182.857v-164.571h-182.857v164.571zM713.143 530.286h164.571v-164.571h-164.571v164.571zM731.429 256v-164.571c0-9.714-8.571-18.286-18.286-18.286h-36.571c-9.714 0-18.286 8.571-18.286 18.286v164.571c0 9.714 8.571 18.286 18.286 18.286h36.571c9.714 0 18.286-8.571 18.286-18.286zM950.857 219.429v731.429c0 40-33.143 73.143-73.143 73.143h-804.571c-40 0-73.143-33.143-73.143-73.143v-731.429c0-40 33.143-73.143 73.143-73.143h73.143v-54.857c0-50.286 41.143-91.429 91.429-91.429h36.571c50.286 0 91.429 41.143 91.429 91.429v54.857h219.429v-54.857c0-50.286 41.143-91.429 91.429-91.429h36.571c50.286 0 91.429 41.143 91.429 91.429v54.857h73.143c40 0 73.143 33.143 73.143 73.143z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["calendar"],"defaultCode":61555,"grid":14},"attrs":[],"properties":{"name":"calendar","id":101,"order":111,"prevSize":28,"code":61555},"setIdx":0,"setId":1,"iconIdx":112},{"icon":{"paths":["M380.571 274.857c-32 49.143-55.429 102.286-78.286 156-33.143-69.143-69.714-138.286-156-138.286h-128c-10.286 0-18.286-8-18.286-18.286v-109.714c0-10.286 8-18.286 18.286-18.286h128c101.714 0 176.571 47.429 234.286 128.571zM1024 731.429c0 4.571-1.714 9.714-5.143 13.143l-182.857 182.857c-3.429 3.429-8.571 5.143-13.143 5.143-9.714 0-18.286-8.571-18.286-18.286v-109.714c-169.714 0-274.286 20-380-128.571 31.429-49.143 54.857-102.286 77.714-156 33.143 69.143 69.714 138.286 156 138.286h146.286v-109.714c0-10.286 8-18.286 18.286-18.286 5.143 0 9.714 2.286 13.714 5.714l182.286 182.286c3.429 3.429 5.143 8.571 5.143 13.143zM1024 219.429c0 4.571-1.714 9.714-5.143 13.143l-182.857 182.857c-3.429 3.429-8.571 5.143-13.143 5.143-9.714 0-18.286-8-18.286-18.286v-109.714h-146.286c-76 0-112 52-144 113.714-16.571 32-30.857 65.143-44.571 97.714-63.429 147.429-137.714 300.571-323.429 300.571h-128c-10.286 0-18.286-8-18.286-18.286v-109.714c0-10.286 8-18.286 18.286-18.286h128c76 0 112-52 144-113.714 16.571-32 30.857-65.143 44.571-97.714 63.429-147.429 137.714-300.571 323.429-300.571h146.286v-109.714c0-10.286 8-18.286 18.286-18.286 5.143 0 9.714 2.286 13.714 5.714l182.286 182.286c3.429 3.429 5.143 8.571 5.143 13.143z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["random"],"defaultCode":61556,"grid":14},"attrs":[],"properties":{"name":"random","id":102,"order":112,"prevSize":28,"code":61556},"setIdx":0,"setId":1,"iconIdx":113},{"icon":{"paths":["M1024 512c0 202.286-229.143 365.714-512 365.714-28 0-56-1.714-82.857-4.571-74.857 66.286-164 113.143-262.857 138.286-20.571 5.714-42.857 9.714-65.143 12.571-12.571 1.143-24.571-8-27.429-21.714v-0.571c-2.857-14.286 6.857-22.857 15.429-33.143 36-40.571 77.143-74.857 104-170.286-117.714-66.857-193.143-170.286-193.143-286.286 0-201.714 229.143-365.714 512-365.714s512 163.429 512 365.714z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["comment"],"defaultCode":61557,"grid":14},"attrs":[],"properties":{"name":"comment","id":103,"order":113,"prevSize":28,"code":61557},"setIdx":0,"setId":1,"iconIdx":114},{"icon":{"paths":["M961.714 760.571l-94.857 94.286c-14.286 14.286-37.143 14.286-51.429 0l-303.429-303.429-303.429 303.429c-14.286 14.286-37.143 14.286-51.429 0l-94.857-94.286c-14.286-14.286-14.286-37.714 0-52l424-423.429c14.286-14.286 37.143-14.286 51.429 0l424 423.429c14.286 14.286 14.286 37.714 0 52z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["chevron-up"],"defaultCode":61559,"grid":14},"attrs":[],"properties":{"name":"chevron-up","id":104,"order":115,"prevSize":28,"code":61559},"setIdx":0,"setId":1,"iconIdx":115},{"icon":{"paths":["M961.714 461.714l-424 423.429c-14.286 14.286-37.143 14.286-51.429 0l-424-423.429c-14.286-14.286-14.286-37.714 0-52l94.857-94.286c14.286-14.286 37.143-14.286 51.429 0l303.429 303.429 303.429-303.429c14.286-14.286 37.143-14.286 51.429 0l94.857 94.286c14.286 14.286 14.286 37.714 0 52z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["chevron-down"],"defaultCode":61560,"grid":14},"attrs":[],"properties":{"name":"chevron-down","id":105,"order":116,"prevSize":28,"code":61560},"setIdx":0,"setId":1,"iconIdx":116},{"icon":{"paths":["M731.429 859.429c0 9.714-8.571 18.286-18.286 18.286h-548.571c-21.143 0-18.286-22.286-18.286-36.571v-329.143h-109.714c-20 0-36.571-16.571-36.571-36.571 0-8.571 2.857-17.143 8.571-23.429l182.857-219.429c6.857-8 17.143-12.571 28-12.571s21.143 4.571 28 12.571l182.857 219.429c5.714 6.286 8.571 14.857 8.571 23.429 0 20-16.571 36.571-36.571 36.571h-109.714v219.429h329.143c5.143 0 10.857 2.286 14.286 6.286l91.429 109.714c2.286 3.429 4 8 4 12zM1097.143 621.714c0 8.571-2.857 17.143-8.571 23.429l-182.857 219.429c-6.857 8-17.143 13.143-28 13.143s-21.143-5.143-28-13.143l-182.857-219.429c-5.714-6.286-8.571-14.857-8.571-23.429 0-20 16.571-36.571 36.571-36.571h109.714v-219.429h-329.143c-5.143 0-10.857-2.286-14.286-6.857l-91.429-109.714c-2.286-2.857-4-7.429-4-11.429 0-9.714 8.571-18.286 18.286-18.286h548.571c21.143 0 18.286 22.286 18.286 36.571v329.143h109.714c20 0 36.571 16.571 36.571 36.571z"],"width":1097.142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["retweet"],"defaultCode":61561,"grid":14},"attrs":[],"properties":{"name":"retweet","id":106,"order":117,"prevSize":28,"code":61561},"setIdx":0,"setId":1,"iconIdx":117},{"icon":{"paths":["M950.857 347.429v402.286c0 70.286-57.714 128-128 128h-694.857c-70.286 0-128-57.714-128-128v-548.571c0-70.286 57.714-128 128-128h182.857c70.286 0 128 57.714 128 128v18.286h384c70.286 0 128 57.714 128 128z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["folder"],"defaultCode":61563,"grid":14},"attrs":[],"properties":{"name":"folder","id":107,"order":119,"prevSize":28,"code":61563},"setIdx":0,"setId":1,"iconIdx":118},{"icon":{"paths":["M1073.714 544c0 13.714-8.571 27.429-17.714 37.714l-192 226.286c-33.143 38.857-100.571 69.714-150.857 69.714h-621.714c-20.571 0-49.714-6.286-49.714-32 0-13.714 8.571-27.429 17.714-37.714l192-226.286c33.143-38.857 100.571-69.714 150.857-69.714h621.714c20.571 0 49.714 6.286 49.714 32zM877.714 347.429v91.429h-475.429c-71.429 0-160 40.571-206.286 95.429l-195.429 229.714c0-4.571-0.571-9.714-0.571-14.286v-548.571c0-70.286 57.714-128 128-128h182.857c70.286 0 128 57.714 128 128v18.286h310.857c70.286 0 128 57.714 128 128z"],"width":1073.7371428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["folder-open"],"defaultCode":61564,"grid":14},"attrs":[],"properties":{"name":"folder-open","id":108,"order":120,"prevSize":28,"code":61564},"setIdx":0,"setId":1,"iconIdx":119},{"icon":{"paths":["M402.286 182.857c0 20-16.571 36.571-36.571 36.571h-73.143v585.143h73.143c20 0 36.571 16.571 36.571 36.571 0 9.714-4 18.857-10.857 25.714l-146.286 146.286c-6.857 6.857-16 10.857-25.714 10.857s-18.857-4-25.714-10.857l-146.286-146.286c-6.857-6.857-10.857-16-10.857-25.714 0-20 16.571-36.571 36.571-36.571h73.143v-585.143h-73.143c-20 0-36.571-16.571-36.571-36.571 0-9.714 4-18.857 10.857-25.714l146.286-146.286c6.857-6.857 16-10.857 25.714-10.857s18.857 4 25.714 10.857l146.286 146.286c6.857 6.857 10.857 16 10.857 25.714z"],"width":438.85714285714283,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["arrows-v"],"defaultCode":61565,"grid":14},"attrs":[],"properties":{"name":"arrows-v","id":109,"order":121,"prevSize":28,"code":61565},"setIdx":0,"setId":1,"iconIdx":120},{"icon":{"paths":["M1024 512c0 9.714-4 18.857-10.857 25.714l-146.286 146.286c-6.857 6.857-16 10.857-25.714 10.857-20 0-36.571-16.571-36.571-36.571v-73.143h-585.143v73.143c0 20-16.571 36.571-36.571 36.571-9.714 0-18.857-4-25.714-10.857l-146.286-146.286c-6.857-6.857-10.857-16-10.857-25.714s4-18.857 10.857-25.714l146.286-146.286c6.857-6.857 16-10.857 25.714-10.857 20 0 36.571 16.571 36.571 36.571v73.143h585.143v-73.143c0-20 16.571-36.571 36.571-36.571 9.714 0 18.857 4 25.714 10.857l146.286 146.286c6.857 6.857 10.857 16 10.857 25.714z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["arrows-h"],"defaultCode":61566,"grid":14},"attrs":[],"properties":{"name":"arrows-h","id":110,"order":122,"prevSize":28,"code":61566},"setIdx":0,"setId":1,"iconIdx":121},{"icon":{"paths":["M512 512c0-80.571-65.714-146.286-146.286-146.286s-146.286 65.714-146.286 146.286 65.714 146.286 146.286 146.286 146.286-65.714 146.286-146.286zM950.857 804.571c0-40-33.143-73.143-73.143-73.143s-73.143 33.143-73.143 73.143c0 40.571 33.143 73.143 73.143 73.143 40.571 0 73.143-33.143 73.143-73.143zM950.857 219.429c0-40-33.143-73.143-73.143-73.143s-73.143 33.143-73.143 73.143c0 40.571 33.143 73.143 73.143 73.143 40.571 0 73.143-33.143 73.143-73.143zM731.429 460v105.714c0 7.429-5.714 16-13.143 17.143l-88.571 13.714c-4.571 14.857-10.857 29.143-18.286 43.429 16 22.857 33.143 44 51.429 65.714 2.286 3.429 4 6.857 4 11.429 0 4-1.143 8-4 10.857-11.429 15.429-75.429 85.143-92 85.143-4.571 0-8.571-1.714-12-4l-65.714-51.429c-14.286 7.429-28.571 13.143-44 17.714-2.857 29.143-5.714 60.571-13.143 88.571-2.286 8-9.143 13.714-17.143 13.714h-106.286c-8 0-16-6.286-17.143-14.286l-13.143-87.429c-14.857-4.571-29.143-10.857-42.857-17.714l-67.429 50.857c-2.857 2.857-7.429 4-11.429 4-4.571 0-8.571-1.714-12-4.571-14.857-13.714-82.286-74.857-82.286-91.429 0-4 1.714-7.429 4-10.857 16.571-21.714 33.714-42.857 50.286-65.143-8-15.429-14.857-30.857-20-46.857l-86.857-13.714c-8-1.143-13.714-8.571-13.714-16.571v-105.714c0-7.429 5.714-16 13.143-17.143l88.571-13.714c4.571-14.857 10.857-29.143 18.286-43.429-16-22.857-33.143-44-51.429-65.714-2.286-3.429-4-7.429-4-11.429s1.143-8 4-11.429c11.429-15.429 75.429-84.571 92-84.571 4.571 0 8.571 1.714 12 4l65.714 51.429c14.286-7.429 28.571-13.143 44-18.286 2.857-28.571 5.714-60 13.143-88 2.286-8 9.143-13.714 17.143-13.714h106.286c8 0 16 6.286 17.143 14.286l13.143 87.429c14.857 4.571 29.143 10.857 42.857 17.714l67.429-50.857c3.429-2.857 7.429-4 11.429-4 4.571 0 8.571 1.714 12 4.571 14.857 13.714 82.286 75.429 82.286 91.429 0 4-1.714 7.429-4 10.857-16.571 22.286-33.714 42.857-49.714 65.143 7.429 15.429 14.286 30.857 19.429 46.857l86.857 13.143c8 1.714 13.714 9.143 13.714 17.143zM1097.143 764.571v80c0 8.571-73.714 16.571-85.143 17.714-4.571 10.857-10.286 20.571-17.143 29.714 5.143 11.429 29.143 68.571 29.143 78.857 0 1.714-0.571 2.857-2.286 4-6.857 4-68 40.571-70.857 40.571-7.429 0-50.286-57.143-56-65.714-5.714 0.571-11.429 1.143-17.143 1.143s-11.429-0.571-17.143-1.143c-5.714 8.571-48.571 65.714-56 65.714-2.857 0-64-36.571-70.857-40.571-1.714-1.143-2.286-2.857-2.286-4 0-9.714 24-67.429 29.143-78.857-6.857-9.143-12.571-18.857-17.143-29.714-11.429-1.143-85.143-9.143-85.143-17.714v-80c0-8.571 73.714-16.571 85.143-17.714 4.571-10.286 10.286-20.571 17.143-29.714-5.143-11.429-29.143-69.143-29.143-78.857 0-1.143 0.571-2.857 2.286-4 6.857-3.429 68-40 70.857-40 7.429 0 50.286 56.571 56 65.143 5.714-0.571 11.429-1.143 17.143-1.143s11.429 0.571 17.143 1.143c16-22.286 33.143-44.571 52.571-64l3.429-1.143c2.857 0 64 36 70.857 40 1.714 1.143 2.286 2.857 2.286 4 0 10.286-24 67.429-29.143 78.857 6.857 9.143 12.571 19.429 17.143 29.714 11.429 1.143 85.143 9.143 85.143 17.714zM1097.143 179.429v80c0 8.571-73.714 16.571-85.143 17.714-4.571 10.857-10.286 20.571-17.143 29.714 5.143 11.429 29.143 68.571 29.143 78.857 0 1.714-0.571 2.857-2.286 4-6.857 4-68 40.571-70.857 40.571-7.429 0-50.286-57.143-56-65.714-5.714 0.571-11.429 1.143-17.143 1.143s-11.429-0.571-17.143-1.143c-5.714 8.571-48.571 65.714-56 65.714-2.857 0-64-36.571-70.857-40.571-1.714-1.143-2.286-2.857-2.286-4 0-9.714 24-67.429 29.143-78.857-6.857-9.143-12.571-18.857-17.143-29.714-11.429-1.143-85.143-9.143-85.143-17.714v-80c0-8.571 73.714-16.571 85.143-17.714 4.571-10.286 10.286-20.571 17.143-29.714-5.143-11.429-29.143-69.143-29.143-78.857 0-1.143 0.571-2.857 2.286-4 6.857-3.429 68-40 70.857-40 7.429 0 50.286 56.571 56 65.143 5.714-0.571 11.429-1.143 17.143-1.143s11.429 0.571 17.143 1.143c16-22.286 33.143-44.571 52.571-64l3.429-1.143c2.857 0 64 36 70.857 40 1.714 1.143 2.286 2.857 2.286 4 0 10.286-24 67.429-29.143 78.857 6.857 9.143 12.571 19.429 17.143 29.714 11.429 1.143 85.143 9.143 85.143 17.714z"],"width":1097.142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["cogs","gears"],"defaultCode":61573,"grid":14},"attrs":[],"properties":{"name":"cogs, gears","id":111,"order":128,"prevSize":28,"code":61573},"setIdx":0,"setId":1,"iconIdx":122},{"icon":{"paths":["M475.429 18.286v765.143l-256.571 134.857c-7.429 4-14.857 6.857-22.857 6.857-16.571 0-24-13.714-24-28.571 0-4 0.571-7.429 1.143-11.429l49.143-285.714-208-202.286c-6.857-7.429-14.286-17.143-14.286-27.429 0-17.143 17.714-24 32-26.286l286.857-41.714 128.571-260c5.143-10.857 14.857-23.429 28-23.429v0z"],"width":475.4285714285714,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["star-half"],"defaultCode":61577,"grid":14},"attrs":[],"properties":{"name":"star-half","id":112,"order":132,"prevSize":28,"code":61577},"setIdx":0,"setId":1,"iconIdx":123},{"icon":{"paths":["M950.857 340.571c0-160.571-108.571-194.286-200-194.286-85.143 0-181.143 92-210.857 127.429-13.714 16.571-42.286 16.571-56 0-29.714-35.429-125.714-127.429-210.857-127.429-91.429 0-200 33.714-200 194.286 0 104.571 105.714 201.714 106.857 202.857l332 320 331.429-319.429c1.714-1.714 107.429-98.857 107.429-203.429zM1024 340.571c0 137.143-125.714 252-130.857 257.143l-356 342.857c-6.857 6.857-16 10.286-25.143 10.286s-18.286-3.429-25.143-10.286l-356.571-344c-4.571-4-130.286-118.857-130.286-256 0-167.429 102.286-267.429 273.143-267.429 100 0 193.714 78.857 238.857 123.429 45.143-44.571 138.857-123.429 238.857-123.429 170.857 0 273.143 100 273.143 267.429z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["heart-o"],"defaultCode":61578,"grid":14},"attrs":[],"properties":{"name":"heart-o","id":113,"order":133,"prevSize":28,"code":61578},"setIdx":0,"setId":1,"iconIdx":124},{"icon":{"paths":["M365.714 822.857c0 16 7.429 54.857-18.286 54.857h-182.857c-90.857 0-164.571-73.714-164.571-164.571v-402.286c0-90.857 73.714-164.571 164.571-164.571h182.857c9.714 0 18.286 8.571 18.286 18.286 0 16 7.429 54.857-18.286 54.857h-182.857c-50.286 0-91.429 41.143-91.429 91.429v402.286c0 50.286 41.143 91.429 91.429 91.429h164.571c14.286 0 36.571-2.857 36.571 18.286zM896 512c0 9.714-4 18.857-10.857 25.714l-310.857 310.857c-6.857 6.857-16 10.857-25.714 10.857-20 0-36.571-16.571-36.571-36.571v-164.571h-256c-20 0-36.571-16.571-36.571-36.571v-219.429c0-20 16.571-36.571 36.571-36.571h256v-164.571c0-20 16.571-36.571 36.571-36.571 9.714 0 18.857 4 25.714 10.857l310.857 310.857c6.857 6.857 10.857 16 10.857 25.714z"],"width":896,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["sign-out"],"defaultCode":61579,"grid":14},"attrs":[],"properties":{"name":"sign-out","id":114,"order":134,"prevSize":28,"code":61579},"setIdx":0,"setId":1,"iconIdx":125},{"icon":{"paths":["M274.286 493.714v-256c0-10.286-8-18.286-18.286-18.286s-18.286 8-18.286 18.286v256c0 10.286 8 18.286 18.286 18.286s18.286-8 18.286-18.286zM658.286 694.857c0 20-16.571 36.571-36.571 36.571h-245.143l-29.143 276c-1.143 9.143-8.571 16.571-17.714 16.571h-0.571c-9.143 0-16.571-6.286-18.286-15.429l-43.429-277.143h-230.857c-20 0-36.571-16.571-36.571-36.571 0-93.714 70.857-182.857 146.286-182.857v-292.571c-40 0-73.143-33.143-73.143-73.143s33.143-73.143 73.143-73.143h365.714c40 0 73.143 33.143 73.143 73.143s-33.143 73.143-73.143 73.143v292.571c75.429 0 146.286 89.143 146.286 182.857z"],"width":658.2857142857142,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["thumb-tack"],"defaultCode":61581,"grid":14},"attrs":[],"properties":{"name":"thumb-tack","id":115,"order":136,"prevSize":28,"code":61581},"setIdx":0,"setId":1,"iconIdx":126},{"icon":{"paths":["M804.571 530.286v182.857c0 90.857-73.714 164.571-164.571 164.571h-475.429c-90.857 0-164.571-73.714-164.571-164.571v-475.429c0-90.857 73.714-164.571 164.571-164.571h402.286c10.286 0 18.286 8 18.286 18.286v36.571c0 10.286-8 18.286-18.286 18.286h-402.286c-50.286 0-91.429 41.143-91.429 91.429v475.429c0 50.286 41.143 91.429 91.429 91.429h475.429c50.286 0 91.429-41.143 91.429-91.429v-182.857c0-10.286 8-18.286 18.286-18.286h36.571c10.286 0 18.286 8 18.286 18.286zM1024 36.571v292.571c0 20-16.571 36.571-36.571 36.571-9.714 0-18.857-4-25.714-10.857l-100.571-100.571-372.571 372.571c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-65.143-65.143c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l372.571-372.571-100.571-100.571c-6.857-6.857-10.857-16-10.857-25.714 0-20 16.571-36.571 36.571-36.571h292.571c20 0 36.571 16.571 36.571 36.571z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["external-link"],"defaultCode":61582,"grid":14},"attrs":[],"properties":{"name":"external-link","id":116,"order":137,"prevSize":28,"code":61582},"setIdx":0,"setId":1,"iconIdx":127},{"icon":{"paths":["M676.571 512c0 9.714-4 18.857-10.857 25.714l-310.857 310.857c-6.857 6.857-16 10.857-25.714 10.857-20 0-36.571-16.571-36.571-36.571v-164.571h-256c-20 0-36.571-16.571-36.571-36.571v-219.429c0-20 16.571-36.571 36.571-36.571h256v-164.571c0-20 16.571-36.571 36.571-36.571 9.714 0 18.857 4 25.714 10.857l310.857 310.857c6.857 6.857 10.857 16 10.857 25.714zM877.714 310.857v402.286c0 90.857-73.714 164.571-164.571 164.571h-182.857c-9.714 0-18.286-8.571-18.286-18.286 0-16-7.429-54.857 18.286-54.857h182.857c50.286 0 91.429-41.143 91.429-91.429v-402.286c0-50.286-41.143-91.429-91.429-91.429h-164.571c-14.286 0-36.571 2.857-36.571-18.286 0-16-7.429-54.857 18.286-54.857h182.857c90.857 0 164.571 73.714 164.571 164.571z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["sign-in"],"defaultCode":61584,"grid":14},"attrs":[],"properties":{"name":"sign-in","id":117,"order":138,"prevSize":28,"code":61584},"setIdx":0,"setId":1,"iconIdx":128},{"icon":{"paths":["M731.429 841.143c0-20-16.571-36.571-36.571-36.571s-36.571 16.571-36.571 36.571 16.571 36.571 36.571 36.571 36.571-16.571 36.571-36.571zM877.714 841.143c0-20-16.571-36.571-36.571-36.571s-36.571 16.571-36.571 36.571 16.571 36.571 36.571 36.571 36.571-16.571 36.571-36.571zM950.857 713.143v182.857c0 30.286-24.571 54.857-54.857 54.857h-841.143c-30.286 0-54.857-24.571-54.857-54.857v-182.857c0-30.286 24.571-54.857 54.857-54.857h244c15.429 42.286 56 73.143 103.429 73.143h146.286c47.429 0 88-30.857 103.429-73.143h244c30.286 0 54.857 24.571 54.857 54.857zM765.143 342.857c-5.714 13.714-18.857 22.857-33.714 22.857h-146.286v256c0 20-16.571 36.571-36.571 36.571h-146.286c-20 0-36.571-16.571-36.571-36.571v-256h-146.286c-14.857 0-28-9.143-33.714-22.857-5.714-13.143-2.857-29.143 8-39.429l256-256c6.857-7.429 16.571-10.857 25.714-10.857s18.857 3.429 25.714 10.857l256 256c10.857 10.286 13.714 26.286 8 39.429z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["upload"],"defaultCode":61587,"grid":14},"attrs":[],"properties":{"name":"upload","id":118,"order":141,"prevSize":28,"code":61587},"setIdx":0,"setId":1,"iconIdx":129},{"icon":{"paths":["M640 146.286h-475.429c-50.286 0-91.429 41.143-91.429 91.429v475.429c0 50.286 41.143 91.429 91.429 91.429h475.429c50.286 0 91.429-41.143 91.429-91.429v-475.429c0-50.286-41.143-91.429-91.429-91.429zM804.571 237.714v475.429c0 90.857-73.714 164.571-164.571 164.571h-475.429c-90.857 0-164.571-73.714-164.571-164.571v-475.429c0-90.857 73.714-164.571 164.571-164.571h475.429c90.857 0 164.571 73.714 164.571 164.571z"],"width":804.5714285714286,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["square-o"],"defaultCode":61590,"grid":14},"attrs":[],"properties":{"name":"square-o","id":119,"order":144,"prevSize":28,"code":61590},"setIdx":0,"setId":1,"iconIdx":130},{"icon":{"paths":["M658.286 146.286h-585.143v709.714l292.571-280.571 50.857 48.571 241.714 232v-709.714zM665.143 73.143c8.571 0 17.143 1.714 25.143 5.143 25.143 9.714 41.143 33.143 41.143 58.857v736.571c0 25.714-16 49.143-41.143 58.857-8 3.429-16.571 4.571-25.143 4.571-17.714 0-34.286-6.286-47.429-18.286l-252-242.286-252 242.286c-13.143 12-29.714 18.857-47.429 18.857-8.571 0-17.143-1.714-25.143-5.143-25.143-9.714-41.143-33.143-41.143-58.857v-736.571c0-25.714 16-49.143 41.143-58.857 8-3.429 16.571-5.143 25.143-5.143h598.857z"],"width":731.4285714285713,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["bookmark-o"],"defaultCode":61591,"grid":14},"attrs":[],"properties":{"name":"bookmark-o","id":120,"order":145,"prevSize":28,"code":61591},"setIdx":0,"setId":1,"iconIdx":131},{"icon":{"paths":["M594.286 694.857c0 25.143-20.571 45.714-45.714 45.714s-45.714-20.571-45.714-45.714 20.571-45.714 45.714-45.714 45.714 20.571 45.714 45.714zM740.571 694.857c0 25.143-20.571 45.714-45.714 45.714s-45.714-20.571-45.714-45.714 20.571-45.714 45.714-45.714 45.714 20.571 45.714 45.714zM804.571 786.286v-182.857c0-9.714-8.571-18.286-18.286-18.286h-694.857c-9.714 0-18.286 8.571-18.286 18.286v182.857c0 9.714 8.571 18.286 18.286 18.286h694.857c9.714 0 18.286-8.571 18.286-18.286zM101.714 512h674.286l-89.714-275.429c-2.857-9.714-13.714-17.143-24-17.143h-446.857c-10.286 0-21.143 7.429-24 17.143zM877.714 603.429v182.857c0 50.286-41.143 91.429-91.429 91.429h-694.857c-50.286 0-91.429-41.143-91.429-91.429v-182.857c0-15.429 4.571-28.571 9.143-42.857l112.571-346.286c13.143-40 51.429-68 93.714-68h446.857c42.286 0 80.571 28 93.714 68l112.571 346.286c4.571 14.286 9.143 27.429 9.143 42.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["hdd-o"],"defaultCode":61600,"grid":14},"attrs":[],"properties":{"name":"hdd-o","id":121,"order":153,"prevSize":28,"code":61600},"setIdx":0,"setId":1,"iconIdx":132},{"icon":{"paths":["M521.143 969.143c0-5.143-4-9.143-9.143-9.143-45.143 0-82.286-37.143-82.286-82.286 0-5.143-4-9.143-9.143-9.143s-9.143 4-9.143 9.143c0 55.429 45.143 100.571 100.571 100.571 5.143 0 9.143-4 9.143-9.143zM140.571 804.571h742.857c-102.286-115.429-152-272-152-475.429 0-73.714-69.714-182.857-219.429-182.857s-219.429 109.143-219.429 182.857c0 203.429-49.714 360-152 475.429zM987.429 804.571c0 40-33.143 73.143-73.143 73.143h-256c0 80.571-65.714 146.286-146.286 146.286s-146.286-65.714-146.286-146.286h-256c-40 0-73.143-33.143-73.143-73.143 84.571-71.429 182.857-199.429 182.857-475.429 0-109.714 90.857-229.714 242.286-252-2.857-6.857-4.571-14.286-4.571-22.286 0-30.286 24.571-54.857 54.857-54.857s54.857 24.571 54.857 54.857c0 8-1.714 15.429-4.571 22.286 151.429 22.286 242.286 142.286 242.286 252 0 276 98.286 404 182.857 475.429z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["bell-o"],"defaultCode":61602,"grid":14},"attrs":[],"properties":{"name":"bell-o","id":122,"order":686,"prevSize":28,"code":61602},"setIdx":0,"setId":1,"iconIdx":133},{"icon":{"paths":["M786.286 512l78.857 77.143c10.857 10.286 14.857 25.714 11.429 40-4 14.286-15.429 25.714-29.714 29.143l-107.429 27.429 30.286 106.286c4 14.286 0 29.714-10.857 40-10.286 10.857-25.714 14.857-40 10.857l-106.286-30.286-27.429 107.429c-3.429 14.286-14.857 25.714-29.143 29.714-3.429 0.571-7.429 1.143-10.857 1.143-10.857 0-21.714-4.571-29.143-12.571l-77.143-78.857-77.143 78.857c-10.286 10.857-25.714 14.857-40 11.429-14.857-4-25.714-15.429-29.143-29.714l-27.429-107.429-106.286 30.286c-14.286 4-29.714 0-40-10.857-10.857-10.286-14.857-25.714-10.857-40l30.286-106.286-107.429-27.429c-14.286-3.429-25.714-14.857-29.714-29.143-3.429-14.286 0.571-29.714 11.429-40l78.857-77.143-78.857-77.143c-10.857-10.286-14.857-25.714-11.429-40 4-14.286 15.429-25.714 29.714-29.143l107.429-27.429-30.286-106.286c-4-14.286 0-29.714 10.857-40 10.286-10.857 25.714-14.857 40-10.857l106.286 30.286 27.429-107.429c3.429-14.286 14.857-25.714 29.143-29.143 14.286-4 29.714 0 40 10.857l77.143 79.429 77.143-79.429c10.286-10.857 25.143-14.857 40-10.857 14.286 3.429 25.714 14.857 29.143 29.143l27.429 107.429 106.286-30.286c14.286-4 29.714 0 40 10.857 10.857 10.286 14.857 25.714 10.857 40l-30.286 106.286 107.429 27.429c14.286 3.429 25.714 14.857 29.714 29.143 3.429 14.286-0.571 29.714-11.429 40z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["certificate"],"defaultCode":61603,"grid":14},"attrs":[],"properties":{"name":"certificate","id":123,"order":687,"prevSize":28,"code":61603},"setIdx":0,"setId":1,"iconIdx":134},{"icon":{"paths":["M731.429 548.571v-73.143c0-20-16.571-36.571-36.571-36.571h-286.857l108-108c6.857-6.857 10.857-16 10.857-25.714s-4-18.857-10.857-25.714l-52-52c-6.857-6.857-16-10.286-25.714-10.286s-18.857 3.429-25.714 10.286l-258.857 258.857c-6.857 6.857-10.286 16-10.286 25.714s3.429 18.857 10.286 25.714l258.857 258.857c6.857 6.857 16 10.286 25.714 10.286s18.857-3.429 25.714-10.286l52-52c6.857-6.857 10.286-16 10.286-25.714s-3.429-18.857-10.286-25.714l-108-108h286.857c20 0 36.571-16.571 36.571-36.571zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["arrow-circle-left"],"defaultCode":61608,"grid":14},"attrs":[],"properties":{"name":"arrow-circle-left","id":124,"order":161,"prevSize":28,"code":61608},"setIdx":0,"setId":1,"iconIdx":135},{"icon":{"paths":["M734.286 512c0-9.714-3.429-18.857-10.286-25.714l-258.857-258.857c-6.857-6.857-16-10.286-25.714-10.286s-18.857 3.429-25.714 10.286l-52 52c-6.857 6.857-10.286 16-10.286 25.714s3.429 18.857 10.286 25.714l108 108h-286.857c-20 0-36.571 16.571-36.571 36.571v73.143c0 20 16.571 36.571 36.571 36.571h286.857l-108 108c-6.857 6.857-10.857 16-10.857 25.714s4 18.857 10.857 25.714l52 52c6.857 6.857 16 10.286 25.714 10.286s18.857-3.429 25.714-10.286l258.857-258.857c6.857-6.857 10.286-16 10.286-25.714zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["arrow-circle-right"],"defaultCode":61609,"grid":14},"attrs":[],"properties":{"name":"arrow-circle-right","id":125,"order":162,"prevSize":28,"code":61609},"setIdx":0,"setId":1,"iconIdx":136},{"icon":{"paths":["M733.714 511.429c0-9.714-3.429-18.857-10.286-25.714l-258.857-258.857c-6.857-6.857-16-10.286-25.714-10.286s-18.857 3.429-25.714 10.286l-258.857 258.857c-6.857 6.857-10.286 16-10.286 25.714s3.429 18.857 10.286 25.714l52 52c6.857 6.857 16 10.286 25.714 10.286s18.857-3.429 25.714-10.286l108-108v286.857c0 20 16.571 36.571 36.571 36.571h73.143c20 0 36.571-16.571 36.571-36.571v-286.857l108 108c6.857 6.857 16 10.857 25.714 10.857s18.857-4 25.714-10.857l52-52c6.857-6.857 10.286-16 10.286-25.714zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["arrow-circle-up"],"defaultCode":61610,"grid":14},"attrs":[],"properties":{"name":"arrow-circle-up","id":126,"order":163,"prevSize":28,"code":61610},"setIdx":0,"setId":1,"iconIdx":137},{"icon":{"paths":["M733.714 512.571c0-9.714-3.429-18.857-10.286-25.714l-52-52c-6.857-6.857-16-10.286-25.714-10.286s-18.857 3.429-25.714 10.286l-108 108v-286.857c0-20-16.571-36.571-36.571-36.571h-73.143c-20 0-36.571 16.571-36.571 36.571v286.857l-108-108c-6.857-6.857-16-10.857-25.714-10.857s-18.857 4-25.714 10.857l-52 52c-6.857 6.857-10.286 16-10.286 25.714s3.429 18.857 10.286 25.714l258.857 258.857c6.857 6.857 16 10.286 25.714 10.286s18.857-3.429 25.714-10.286l258.857-258.857c6.857-6.857 10.286-16 10.286-25.714zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["arrow-circle-down"],"defaultCode":61611,"grid":14},"attrs":[],"properties":{"name":"arrow-circle-down","id":127,"order":164,"prevSize":28,"code":61611},"setIdx":0,"setId":1,"iconIdx":138},{"icon":{"paths":["M219.429 841.143c0-20-16.571-36.571-36.571-36.571s-36.571 16.571-36.571 36.571 16.571 36.571 36.571 36.571 36.571-16.571 36.571-36.571zM587.429 601.143l-389.714 389.714c-13.143 13.143-32 21.143-51.429 21.143s-38.286-8-52-21.143l-60.571-61.714c-13.714-13.143-21.714-32-21.714-51.429s8-38.286 21.714-52l389.143-389.143c29.714 74.857 89.714 134.857 164.571 164.571zM949.714 352.571c0 18.857-6.857 42.286-13.143 60.571-36 101.714-133.714 172-241.714 172-141.143 0-256-114.857-256-256s114.857-256 256-256c41.714 0 96 12.571 130.857 36 5.714 4 9.143 9.143 9.143 16 0 6.286-4 12.571-9.143 16l-167.429 96.571v128l110.286 61.143c18.857-10.857 151.429-94.286 162.857-94.286s18.286 8.571 18.286 20z"],"width":961.6822857142856,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["wrench"],"defaultCode":61613,"grid":14},"attrs":[],"properties":{"name":"wrench","id":128,"order":166,"prevSize":28,"code":61613},"setIdx":0,"setId":1,"iconIdx":139},{"icon":{"paths":["M585.143 804.571h365.714v-73.143h-365.714v73.143zM365.714 512h585.143v-73.143h-585.143v73.143zM731.429 219.429h219.429v-73.143h-219.429v73.143zM1024 694.857v146.286c0 20-16.571 36.571-36.571 36.571h-950.857c-20 0-36.571-16.571-36.571-36.571v-146.286c0-20 16.571-36.571 36.571-36.571h950.857c20 0 36.571 16.571 36.571 36.571zM1024 402.286v146.286c0 20-16.571 36.571-36.571 36.571h-950.857c-20 0-36.571-16.571-36.571-36.571v-146.286c0-20 16.571-36.571 36.571-36.571h950.857c20 0 36.571 16.571 36.571 36.571zM1024 109.714v146.286c0 20-16.571 36.571-36.571 36.571h-950.857c-20 0-36.571-16.571-36.571-36.571v-146.286c0-20 16.571-36.571 36.571-36.571h950.857c20 0 36.571 16.571 36.571 36.571z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["tasks"],"defaultCode":61614,"grid":14},"attrs":[],"properties":{"name":"tasks","id":129,"order":167,"prevSize":28,"code":61614},"setIdx":0,"setId":1,"iconIdx":140},{"icon":{"paths":["M801.714 168.571c5.714 13.714 2.857 29.714-8 40l-281.714 281.714v424c0 14.857-9.143 28-22.286 33.714-4.571 1.714-9.714 2.857-14.286 2.857-9.714 0-18.857-3.429-25.714-10.857l-146.286-146.286c-6.857-6.857-10.857-16-10.857-25.714v-277.714l-281.714-281.714c-10.857-10.286-13.714-26.286-8-40 5.714-13.143 18.857-22.286 33.714-22.286h731.429c14.857 0 28 9.143 33.714 22.286z"],"width":804.5714285714286,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["filter"],"defaultCode":61616,"grid":14},"attrs":[],"properties":{"name":"filter","id":130,"order":168,"prevSize":28,"code":61616},"setIdx":0,"setId":1,"iconIdx":141},{"icon":{"paths":["M365.714 146.286h292.571v-73.143h-292.571v73.143zM1024 512v274.286c0 50.286-41.143 91.429-91.429 91.429h-841.143c-50.286 0-91.429-41.143-91.429-91.429v-274.286h384v91.429c0 20 16.571 36.571 36.571 36.571h182.857c20 0 36.571-16.571 36.571-36.571v-91.429h384zM585.143 512v73.143h-146.286v-73.143h146.286zM1024 237.714v219.429h-1024v-219.429c0-50.286 41.143-91.429 91.429-91.429h201.143v-91.429c0-30.286 24.571-54.857 54.857-54.857h329.143c30.286 0 54.857 24.571 54.857 54.857v91.429h201.143c50.286 0 91.429 41.143 91.429 91.429z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["briefcase"],"defaultCode":61617,"grid":14},"attrs":[],"properties":{"name":"briefcase","id":131,"order":169,"prevSize":28,"code":61617},"setIdx":0,"setId":1,"iconIdx":142},{"icon":{"paths":["M733.143 309.143l-202.857 202.857 202.857 202.857 82.286-82.286c10.286-10.857 26.286-13.714 40-8 13.143 5.714 22.286 18.857 22.286 33.714v256c0 20-16.571 36.571-36.571 36.571h-256c-14.857 0-28-9.143-33.714-22.857-5.714-13.143-2.857-29.143 8-39.429l82.286-82.286-202.857-202.857-202.857 202.857 82.286 82.286c10.857 10.286 13.714 26.286 8 39.429-5.714 13.714-18.857 22.857-33.714 22.857h-256c-20 0-36.571-16.571-36.571-36.571v-256c0-14.857 9.143-28 22.857-33.714 13.143-5.714 29.143-2.857 39.429 8l82.286 82.286 202.857-202.857-202.857-202.857-82.286 82.286c-6.857 6.857-16 10.857-25.714 10.857-4.571 0-9.714-1.143-13.714-2.857-13.714-5.714-22.857-18.857-22.857-33.714v-256c0-20 16.571-36.571 36.571-36.571h256c14.857 0 28 9.143 33.714 22.857 5.714 13.143 2.857 29.143-8 39.429l-82.286 82.286 202.857 202.857 202.857-202.857-82.286-82.286c-10.857-10.286-13.714-26.286-8-39.429 5.714-13.714 18.857-22.857 33.714-22.857h256c20 0 36.571 16.571 36.571 36.571v256c0 14.857-9.143 28-22.286 33.714-4.571 1.714-9.714 2.857-14.286 2.857-9.714 0-18.857-4-25.714-10.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["arrows-alt"],"defaultCode":61618,"grid":14},"attrs":[],"properties":{"name":"arrows-alt","id":132,"order":170,"prevSize":28,"code":61618},"setIdx":0,"setId":1,"iconIdx":143},{"icon":{"paths":["M1097.143 658.286c0 121.143-98.286 219.429-219.429 219.429h-621.714c-141.143 0-256-114.857-256-256 0-102.286 60.571-190.857 147.429-231.429-0.571-8-1.143-16.571-1.143-24.571 0-161.714 130.857-292.571 292.571-292.571 122.286 0 226.857 74.857 270.857 181.714 25.143-22.286 58.286-35.429 94.857-35.429 80.571 0 146.286 65.714 146.286 146.286 0 29.143-8.571 56-23.429 78.857 97.143 22.857 169.714 109.714 169.714 213.714z"],"width":1097.142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["cloud"],"defaultCode":61634,"grid":14},"attrs":[],"properties":{"name":"cloud","id":133,"order":173,"prevSize":28,"code":61634},"setIdx":0,"setId":1,"iconIdx":144},{"icon":{"paths":["M969.143 219.429c30.286 0 54.857 24.571 54.857 54.857v694.857c0 30.286-24.571 54.857-54.857 54.857h-548.571c-30.286 0-54.857-24.571-54.857-54.857v-164.571h-310.857c-30.286 0-54.857-24.571-54.857-54.857v-384c0-30.286 17.714-72.571 38.857-93.714l233.143-233.143c21.143-21.143 63.429-38.857 93.714-38.857h237.714c30.286 0 54.857 24.571 54.857 54.857v187.429c22.286-13.143 50.857-22.857 73.143-22.857h237.714zM658.286 341.143l-170.857 170.857h170.857v-170.857zM292.571 121.714l-170.857 170.857h170.857v-170.857zM404.571 491.429l180.571-180.571v-237.714h-219.429v237.714c0 30.286-24.571 54.857-54.857 54.857h-237.714v365.714h292.571v-146.286c0-30.286 17.714-72.571 38.857-93.714zM950.857 950.857v-658.286h-219.429v237.714c0 30.286-24.571 54.857-54.857 54.857h-237.714v365.714h512z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["copy","files-o"],"defaultCode":61637,"grid":14},"attrs":[],"properties":{"name":"copy, files-o","id":134,"order":176,"prevSize":28,"code":61637},"setIdx":0,"setId":1,"iconIdx":145},{"icon":{"paths":["M219.429 877.714h438.857v-219.429h-438.857v219.429zM731.429 877.714h73.143v-512c0-10.857-9.714-34.286-17.143-41.714l-160.571-160.571c-8-8-30.286-17.143-41.714-17.143v237.714c0 30.286-24.571 54.857-54.857 54.857h-329.143c-30.286 0-54.857-24.571-54.857-54.857v-237.714h-73.143v731.429h73.143v-237.714c0-30.286 24.571-54.857 54.857-54.857h475.429c30.286 0 54.857 24.571 54.857 54.857v237.714zM512 347.429v-182.857c0-9.714-8.571-18.286-18.286-18.286h-109.714c-9.714 0-18.286 8.571-18.286 18.286v182.857c0 9.714 8.571 18.286 18.286 18.286h109.714c9.714 0 18.286-8.571 18.286-18.286zM877.714 365.714v530.286c0 30.286-24.571 54.857-54.857 54.857h-768c-30.286 0-54.857-24.571-54.857-54.857v-768c0-30.286 24.571-54.857 54.857-54.857h530.286c30.286 0 72 17.143 93.714 38.857l160 160c21.714 21.714 38.857 63.429 38.857 93.714z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["floppy-o","save"],"defaultCode":61639,"grid":14},"attrs":[],"properties":{"name":"floppy-o, save","id":135,"order":178,"prevSize":28,"code":61639},"setIdx":0,"setId":1,"iconIdx":146},{"icon":{"paths":["M877.714 237.714v548.571c0 90.857-73.714 164.571-164.571 164.571h-548.571c-90.857 0-164.571-73.714-164.571-164.571v-548.571c0-90.857 73.714-164.571 164.571-164.571h548.571c90.857 0 164.571 73.714 164.571 164.571z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["square"],"defaultCode":61640,"grid":14},"attrs":[],"properties":{"name":"square","id":136,"order":179,"prevSize":28,"code":61640},"setIdx":0,"setId":1,"iconIdx":147},{"icon":{"paths":["M877.714 768v73.143c0 20-16.571 36.571-36.571 36.571h-804.571c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h804.571c20 0 36.571 16.571 36.571 36.571zM877.714 475.429v73.143c0 20-16.571 36.571-36.571 36.571h-804.571c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h804.571c20 0 36.571 16.571 36.571 36.571zM877.714 182.857v73.143c0 20-16.571 36.571-36.571 36.571h-804.571c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h804.571c20 0 36.571 16.571 36.571 36.571z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["bars","navicon","reorder"],"defaultCode":61641,"grid":14},"attrs":[],"properties":{"name":"bars, navicon, reorder","id":137,"order":180,"prevSize":28,"code":61641},"setIdx":0,"setId":1,"iconIdx":148},{"icon":{"paths":["M219.429 804.571c0 60.571-49.143 109.714-109.714 109.714s-109.714-49.143-109.714-109.714 49.143-109.714 109.714-109.714 109.714 49.143 109.714 109.714zM219.429 512c0 60.571-49.143 109.714-109.714 109.714s-109.714-49.143-109.714-109.714 49.143-109.714 109.714-109.714 109.714 49.143 109.714 109.714zM1024 749.714v109.714c0 9.714-8.571 18.286-18.286 18.286h-694.857c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h694.857c9.714 0 18.286 8.571 18.286 18.286zM219.429 219.429c0 60.571-49.143 109.714-109.714 109.714s-109.714-49.143-109.714-109.714 49.143-109.714 109.714-109.714 109.714 49.143 109.714 109.714zM1024 457.143v109.714c0 9.714-8.571 18.286-18.286 18.286h-694.857c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h694.857c9.714 0 18.286 8.571 18.286 18.286zM1024 164.571v109.714c0 9.714-8.571 18.286-18.286 18.286h-694.857c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h694.857c9.714 0 18.286 8.571 18.286 18.286z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["list-ul"],"defaultCode":61642,"grid":14},"attrs":[],"properties":{"name":"list-ul","id":138,"order":181,"prevSize":28,"code":61642},"setIdx":0,"setId":1,"iconIdx":149},{"icon":{"paths":["M217.714 925.714c0 62.857-49.143 98.286-108.571 98.286-36 0-72.571-12-98.286-37.714l32.571-50.286c15.429 14.286 38.857 25.714 60.571 25.714 20 0 41.143-9.714 41.143-32.571 0-32-36.571-33.714-60-32l-14.857-32c20.571-26.286 39.429-55.429 64-77.714v-0.571c-18.286 0-37.143 1.143-55.429 1.143v30.286h-60.571v-86.857h190.286v50.286l-54.286 65.714c38.286 9.143 63.429 38.857 63.429 78.286zM218.857 567.429v90.857h-206.857c-1.714-10.286-3.429-20.571-3.429-30.857 0-105.714 129.143-121.714 129.143-169.714 0-19.429-12-29.714-30.857-29.714-20 0-36.571 17.143-46.286 33.143l-48.571-33.714c18.857-39.429 57.714-61.714 101.143-61.714 53.143 0 98.857 31.429 98.857 88 0 84.571-124 103.429-125.714 148h72.571v-34.286h60zM1024 749.714v109.714c0 9.714-8.571 18.286-18.286 18.286h-694.857c-10.286 0-18.286-8.571-18.286-18.286v-109.714c0-10.286 8-18.286 18.286-18.286h694.857c9.714 0 18.286 8 18.286 18.286zM219.429 236v56.571h-191.429v-56.571h61.143c0-46.286 0.571-92.571 0.571-138.857v-6.857h-1.143c-6.286 12.571-17.714 21.143-28.571 30.857l-40.571-43.429 77.714-72.571h60.571v230.857h61.714zM1024 457.143v109.714c0 9.714-8.571 18.286-18.286 18.286h-694.857c-10.286 0-18.286-8.571-18.286-18.286v-109.714c0-10.286 8-18.286 18.286-18.286h694.857c9.714 0 18.286 8 18.286 18.286zM1024 164.571v109.714c0 9.714-8.571 18.286-18.286 18.286h-694.857c-10.286 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8-18.286 18.286-18.286h694.857c9.714 0 18.286 8.571 18.286 18.286z"],"width":1032.5577142857144,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["list-ol"],"defaultCode":61643,"grid":14},"attrs":[],"properties":{"name":"list-ol","id":139,"order":182,"prevSize":28,"code":61643},"setIdx":0,"setId":1,"iconIdx":150},{"icon":{"paths":["M292.571 786.286v-109.714c0-10.286-8-18.286-18.286-18.286h-182.857c-10.286 0-18.286 8-18.286 18.286v109.714c0 10.286 8 18.286 18.286 18.286h182.857c10.286 0 18.286-8 18.286-18.286zM292.571 566.857v-109.714c0-10.286-8-18.286-18.286-18.286h-182.857c-10.286 0-18.286 8-18.286 18.286v109.714c0 10.286 8 18.286 18.286 18.286h182.857c10.286 0 18.286-8 18.286-18.286zM585.143 786.286v-109.714c0-10.286-8-18.286-18.286-18.286h-182.857c-10.286 0-18.286 8-18.286 18.286v109.714c0 10.286 8 18.286 18.286 18.286h182.857c10.286 0 18.286-8 18.286-18.286zM292.571 347.429v-109.714c0-10.286-8-18.286-18.286-18.286h-182.857c-10.286 0-18.286 8-18.286 18.286v109.714c0 10.286 8 18.286 18.286 18.286h182.857c10.286 0 18.286-8 18.286-18.286zM585.143 566.857v-109.714c0-10.286-8-18.286-18.286-18.286h-182.857c-10.286 0-18.286 8-18.286 18.286v109.714c0 10.286 8 18.286 18.286 18.286h182.857c10.286 0 18.286-8 18.286-18.286zM877.714 786.286v-109.714c0-10.286-8-18.286-18.286-18.286h-182.857c-10.286 0-18.286 8-18.286 18.286v109.714c0 10.286 8 18.286 18.286 18.286h182.857c10.286 0 18.286-8 18.286-18.286zM585.143 347.429v-109.714c0-10.286-8-18.286-18.286-18.286h-182.857c-10.286 0-18.286 8-18.286 18.286v109.714c0 10.286 8 18.286 18.286 18.286h182.857c10.286 0 18.286-8 18.286-18.286zM877.714 566.857v-109.714c0-10.286-8-18.286-18.286-18.286h-182.857c-10.286 0-18.286 8-18.286 18.286v109.714c0 10.286 8 18.286 18.286 18.286h182.857c10.286 0 18.286-8 18.286-18.286zM877.714 347.429v-109.714c0-10.286-8-18.286-18.286-18.286h-182.857c-10.286 0-18.286 8-18.286 18.286v109.714c0 10.286 8 18.286 18.286 18.286h182.857c10.286 0 18.286-8 18.286-18.286zM950.857 164.571v621.714c0 50.286-41.143 91.429-91.429 91.429h-768c-50.286 0-91.429-41.143-91.429-91.429v-621.714c0-50.286 41.143-91.429 91.429-91.429h768c50.286 0 91.429 41.143 91.429 91.429z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["table"],"defaultCode":61646,"grid":14},"attrs":[],"properties":{"name":"table","id":140,"order":185,"prevSize":28,"code":61646},"setIdx":0,"setId":1,"iconIdx":151},{"icon":{"paths":["M585.143 402.286c0 9.714-4 18.857-10.857 25.714l-256 256c-6.857 6.857-16 10.857-25.714 10.857s-18.857-4-25.714-10.857l-256-256c-6.857-6.857-10.857-16-10.857-25.714 0-20 16.571-36.571 36.571-36.571h512c20 0 36.571 16.571 36.571 36.571z"],"width":585.1428571428571,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["caret-down"],"defaultCode":61655,"grid":14},"attrs":[],"properties":{"name":"caret-down","id":141,"order":193,"prevSize":28,"code":61655},"setIdx":0,"setId":1,"iconIdx":152},{"icon":{"paths":["M585.143 694.857c0 20-16.571 36.571-36.571 36.571h-512c-20 0-36.571-16.571-36.571-36.571 0-9.714 4-18.857 10.857-25.714l256-256c6.857-6.857 16-10.857 25.714-10.857s18.857 4 25.714 10.857l256 256c6.857 6.857 10.857 16 10.857 25.714z"],"width":585.1428571428571,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["caret-up"],"defaultCode":61656,"grid":14},"attrs":[],"properties":{"name":"caret-up","id":142,"order":194,"prevSize":28,"code":61656},"setIdx":0,"setId":1,"iconIdx":153},{"icon":{"paths":["M365.714 256v512c0 20-16.571 36.571-36.571 36.571-9.714 0-18.857-4-25.714-10.857l-256-256c-6.857-6.857-10.857-16-10.857-25.714s4-18.857 10.857-25.714l256-256c6.857-6.857 16-10.857 25.714-10.857 20 0 36.571 16.571 36.571 36.571z"],"width":402.2857142857143,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["caret-left"],"defaultCode":61657,"grid":14},"attrs":[],"properties":{"name":"caret-left","id":143,"order":195,"prevSize":28,"code":61657},"setIdx":0,"setId":1,"iconIdx":154},{"icon":{"paths":["M329.143 512c0 9.714-4 18.857-10.857 25.714l-256 256c-6.857 6.857-16 10.857-25.714 10.857-20 0-36.571-16.571-36.571-36.571v-512c0-20 16.571-36.571 36.571-36.571 9.714 0 18.857 4 25.714 10.857l256 256c6.857 6.857 10.857 16 10.857 25.714z"],"width":329.1428571428571,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["caret-right"],"defaultCode":61658,"grid":14},"attrs":[],"properties":{"name":"caret-right","id":144,"order":196,"prevSize":28,"code":61658},"setIdx":0,"setId":1,"iconIdx":155},{"icon":{"paths":["M91.429 877.714h347.429v-658.286h-365.714v640c0 9.714 8.571 18.286 18.286 18.286zM877.714 859.429v-640h-365.714v658.286h347.429c9.714 0 18.286-8.571 18.286-18.286zM950.857 164.571v694.857c0 50.286-41.143 91.429-91.429 91.429h-768c-50.286 0-91.429-41.143-91.429-91.429v-694.857c0-50.286 41.143-91.429 91.429-91.429h768c50.286 0 91.429 41.143 91.429 91.429z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["columns"],"defaultCode":61659,"grid":14},"attrs":[],"properties":{"name":"columns","id":145,"order":197,"prevSize":28,"code":61659},"setIdx":0,"setId":1,"iconIdx":156},{"icon":{"paths":["M585.143 621.714c0 9.714-4 18.857-10.857 25.714l-256 256c-6.857 6.857-16 10.857-25.714 10.857s-18.857-4-25.714-10.857l-256-256c-6.857-6.857-10.857-16-10.857-25.714 0-20 16.571-36.571 36.571-36.571h512c20 0 36.571 16.571 36.571 36.571zM585.143 402.286c0 20-16.571 36.571-36.571 36.571h-512c-20 0-36.571-16.571-36.571-36.571 0-9.714 4-18.857 10.857-25.714l256-256c6.857-6.857 16-10.857 25.714-10.857s18.857 4 25.714 10.857l256 256c6.857 6.857 10.857 16 10.857 25.714z"],"width":585.1428571428571,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["sort","unsorted"],"defaultCode":61660,"grid":14},"attrs":[],"properties":{"name":"sort, unsorted","id":146,"order":198,"prevSize":28,"code":61660},"setIdx":0,"setId":1,"iconIdx":157},{"icon":{"paths":["M585.143 621.714c0 9.714-4 18.857-10.857 25.714l-256 256c-6.857 6.857-16 10.857-25.714 10.857s-18.857-4-25.714-10.857l-256-256c-6.857-6.857-10.857-16-10.857-25.714 0-20 16.571-36.571 36.571-36.571h512c20 0 36.571 16.571 36.571 36.571z"],"width":585.1428571428571,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["sort-desc","sort-down"],"defaultCode":61661,"grid":14},"attrs":[],"properties":{"name":"sort-desc, sort-down","id":147,"order":199,"prevSize":28,"code":61661},"setIdx":0,"setId":1,"iconIdx":158},{"icon":{"paths":["M585.143 402.286c0 20-16.571 36.571-36.571 36.571h-512c-20 0-36.571-16.571-36.571-36.571 0-9.714 4-18.857 10.857-25.714l256-256c6.857-6.857 16-10.857 25.714-10.857s18.857 4 25.714 10.857l256 256c6.857 6.857 10.857 16 10.857 25.714z"],"width":585.1428571428571,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["sort-asc","sort-up"],"defaultCode":61662,"grid":14},"attrs":[],"properties":{"name":"sort-asc, sort-up","id":148,"order":200,"prevSize":28,"code":61662},"setIdx":0,"setId":1,"iconIdx":159},{"icon":{"paths":["M877.714 512c0 241.714-197.143 438.857-438.857 438.857-130.857 0-254.286-57.714-337.714-158.286-5.714-7.429-5.143-18.286 1.143-24.571l78.286-78.857c4-3.429 9.143-5.143 14.286-5.143 5.143 0.571 10.286 2.857 13.143 6.857 56 72.571 140 113.714 230.857 113.714 161.143 0 292.571-131.429 292.571-292.571s-131.429-292.571-292.571-292.571c-74.857 0-145.714 28.571-198.857 78.286l78.286 78.857c10.857 10.286 13.714 26.286 8 39.429-5.714 13.714-18.857 22.857-33.714 22.857h-256c-20 0-36.571-16.571-36.571-36.571v-256c0-14.857 9.143-28 22.857-33.714 13.143-5.714 29.143-2.857 39.429 8l74.286 73.714c80.571-76 189.714-121.143 302.286-121.143 241.714 0 438.857 197.143 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["rotate-left","undo"],"defaultCode":61666,"grid":14},"attrs":[],"properties":{"name":"rotate-left, undo","id":149,"order":203,"prevSize":28,"code":61666},"setIdx":0,"setId":1,"iconIdx":160},{"icon":{"paths":["M838.857 217.143c21.143 21.143 38.857 63.429 38.857 93.714v658.286c0 30.286-24.571 54.857-54.857 54.857h-768c-30.286 0-54.857-24.571-54.857-54.857v-914.286c0-30.286 24.571-54.857 54.857-54.857h512c30.286 0 72.571 17.714 93.714 38.857zM585.143 77.714v214.857h214.857c-3.429-9.714-8.571-19.429-12.571-23.429l-178.857-178.857c-4-4-13.714-9.143-23.429-12.571zM804.571 950.857v-585.143h-237.714c-30.286 0-54.857-24.571-54.857-54.857v-237.714h-438.857v877.714h731.429zM219.429 457.143c0-10.286 8-18.286 18.286-18.286h402.286c10.286 0 18.286 8 18.286 18.286v36.571c0 10.286-8 18.286-18.286 18.286h-402.286c-10.286 0-18.286-8-18.286-18.286v-36.571zM640 585.143c10.286 0 18.286 8 18.286 18.286v36.571c0 10.286-8 18.286-18.286 18.286h-402.286c-10.286 0-18.286-8-18.286-18.286v-36.571c0-10.286 8-18.286 18.286-18.286h402.286zM640 731.429c10.286 0 18.286 8 18.286 18.286v36.571c0 10.286-8 18.286-18.286 18.286h-402.286c-10.286 0-18.286-8-18.286-18.286v-36.571c0-10.286 8-18.286 18.286-18.286h402.286z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["file-text-o"],"defaultCode":61686,"grid":14},"attrs":[],"properties":{"name":"file-text-o","id":150,"order":222,"prevSize":28,"code":61686},"setIdx":0,"setId":1,"iconIdx":161},{"icon":{"paths":["M731.429 548.571v-73.143c0-20-16.571-36.571-36.571-36.571h-182.857v-182.857c0-20-16.571-36.571-36.571-36.571h-73.143c-20 0-36.571 16.571-36.571 36.571v182.857h-182.857c-20 0-36.571 16.571-36.571 36.571v73.143c0 20 16.571 36.571 36.571 36.571h182.857v182.857c0 20 16.571 36.571 36.571 36.571h73.143c20 0 36.571-16.571 36.571-36.571v-182.857h182.857c20 0 36.571-16.571 36.571-36.571zM877.714 237.714v548.571c0 90.857-73.714 164.571-164.571 164.571h-548.571c-90.857 0-164.571-73.714-164.571-164.571v-548.571c0-90.857 73.714-164.571 164.571-164.571h548.571c90.857 0 164.571 73.714 164.571 164.571z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["plus-square"],"defaultCode":61694,"grid":14},"attrs":[],"properties":{"name":"plus-square","id":151,"order":230,"prevSize":28,"code":61694},"setIdx":0,"setId":1,"iconIdx":162},{"icon":{"paths":["M358.286 786.286c0 4.571-2.286 9.714-5.714 13.143l-28.571 28.571c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-266.286-266.286c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l266.286-266.286c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l28.571 28.571c3.429 3.429 5.714 8.571 5.714 13.143s-2.286 9.714-5.714 13.143l-224.571 224.571 224.571 224.571c3.429 3.429 5.714 8.571 5.714 13.143zM577.714 786.286c0 4.571-2.286 9.714-5.714 13.143l-28.571 28.571c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-266.286-266.286c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l266.286-266.286c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l28.571 28.571c3.429 3.429 5.714 8.571 5.714 13.143s-2.286 9.714-5.714 13.143l-224.571 224.571 224.571 224.571c3.429 3.429 5.714 8.571 5.714 13.143z"],"width":603.4285714285714,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["angle-double-left"],"defaultCode":61696,"grid":14},"attrs":[],"properties":{"name":"angle-double-left","id":152,"order":231,"prevSize":28,"code":61696},"setIdx":0,"setId":1,"iconIdx":163},{"icon":{"paths":["M340 548.571c0 4.571-2.286 9.714-5.714 13.143l-266.286 266.286c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-28.571-28.571c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l224.571-224.571-224.571-224.571c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l28.571-28.571c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l266.286 266.286c3.429 3.429 5.714 8.571 5.714 13.143zM559.429 548.571c0 4.571-2.286 9.714-5.714 13.143l-266.286 266.286c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-28.571-28.571c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l224.571-224.571-224.571-224.571c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l28.571-28.571c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l266.286 266.286c3.429 3.429 5.714 8.571 5.714 13.143z"],"width":566.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["angle-double-right"],"defaultCode":61697,"grid":14},"attrs":[],"properties":{"name":"angle-double-right","id":153,"order":232,"prevSize":28,"code":61697},"setIdx":0,"setId":1,"iconIdx":164},{"icon":{"paths":["M614.286 749.714c0 4.571-2.286 9.714-5.714 13.143l-28.571 28.571c-3.429 3.429-8 5.714-13.143 5.714-4.571 0-9.714-2.286-13.143-5.714l-224.571-224.571-224.571 224.571c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-28.571-28.571c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l266.286-266.286c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l266.286 266.286c3.429 3.429 5.714 8.571 5.714 13.143zM614.286 530.286c0 4.571-2.286 9.714-5.714 13.143l-28.571 28.571c-3.429 3.429-8 5.714-13.143 5.714-4.571 0-9.714-2.286-13.143-5.714l-224.571-224.571-224.571 224.571c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-28.571-28.571c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l266.286-266.286c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l266.286 266.286c3.429 3.429 5.714 8.571 5.714 13.143z"],"width":658.2857142857142,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["angle-double-up"],"defaultCode":61698,"grid":14},"attrs":[],"properties":{"name":"angle-double-up","id":154,"order":233,"prevSize":28,"code":61698},"setIdx":0,"setId":1,"iconIdx":165},{"icon":{"paths":["M614.286 493.714c0 4.571-2.286 9.714-5.714 13.143l-266.286 266.286c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-266.286-266.286c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l28.571-28.571c3.429-3.429 8-5.714 13.143-5.714 4.571 0 9.714 2.286 13.143 5.714l224.571 224.571 224.571-224.571c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l28.571 28.571c3.429 3.429 5.714 8.571 5.714 13.143zM614.286 274.286c0 4.571-2.286 9.714-5.714 13.143l-266.286 266.286c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-266.286-266.286c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l28.571-28.571c3.429-3.429 8-5.714 13.143-5.714 4.571 0 9.714 2.286 13.143 5.714l224.571 224.571 224.571-224.571c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l28.571 28.571c3.429 3.429 5.714 8.571 5.714 13.143z"],"width":658.2857142857142,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["angle-double-down"],"defaultCode":61699,"grid":14},"attrs":[],"properties":{"name":"angle-double-down","id":155,"order":234,"prevSize":28,"code":61699},"setIdx":0,"setId":1,"iconIdx":166},{"icon":{"paths":["M358.286 310.857c0 4.571-2.286 9.714-5.714 13.143l-224.571 224.571 224.571 224.571c3.429 3.429 5.714 8.571 5.714 13.143s-2.286 9.714-5.714 13.143l-28.571 28.571c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-266.286-266.286c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l266.286-266.286c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l28.571 28.571c3.429 3.429 5.714 8 5.714 13.143z"],"width":384,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["angle-left"],"defaultCode":61700,"grid":14},"attrs":[],"properties":{"name":"angle-left","id":156,"order":235,"prevSize":28,"code":61700},"setIdx":0,"setId":1,"iconIdx":167},{"icon":{"paths":["M340 548.571c0 4.571-2.286 9.714-5.714 13.143l-266.286 266.286c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-28.571-28.571c-3.429-3.429-5.714-8-5.714-13.143 0-4.571 2.286-9.714 5.714-13.143l224.571-224.571-224.571-224.571c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l28.571-28.571c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l266.286 266.286c3.429 3.429 5.714 8.571 5.714 13.143z"],"width":347.4285714285714,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["angle-right"],"defaultCode":61701,"grid":14},"attrs":[],"properties":{"name":"angle-right","id":157,"order":236,"prevSize":28,"code":61701},"setIdx":0,"setId":1,"iconIdx":168},{"icon":{"paths":["M614.286 676.571c0 4.571-2.286 9.714-5.714 13.143l-28.571 28.571c-3.429 3.429-8 5.714-13.143 5.714-4.571 0-9.714-2.286-13.143-5.714l-224.571-224.571-224.571 224.571c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-28.571-28.571c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l266.286-266.286c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l266.286 266.286c3.429 3.429 5.714 8.571 5.714 13.143z"],"width":658.2857142857142,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["angle-up"],"defaultCode":61702,"grid":14},"attrs":[],"properties":{"name":"angle-up","id":158,"order":237,"prevSize":28,"code":61702},"setIdx":0,"setId":1,"iconIdx":169},{"icon":{"paths":["M614.286 420.571c0 4.571-2.286 9.714-5.714 13.143l-266.286 266.286c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-266.286-266.286c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l28.571-28.571c3.429-3.429 8-5.714 13.143-5.714 4.571 0 9.714 2.286 13.143 5.714l224.571 224.571 224.571-224.571c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l28.571 28.571c3.429 3.429 5.714 8.571 5.714 13.143z"],"width":658.2857142857142,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["angle-down"],"defaultCode":61703,"grid":14},"attrs":[],"properties":{"name":"angle-down","id":159,"order":238,"prevSize":28,"code":61703},"setIdx":0,"setId":1,"iconIdx":170},{"icon":{"paths":["M438.857 201.143c-171.429 0-310.857 139.429-310.857 310.857s139.429 310.857 310.857 310.857 310.857-139.429 310.857-310.857-139.429-310.857-310.857-310.857zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857v0c242.286 0 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["circle-o"],"defaultCode":61708,"grid":14},"attrs":[],"properties":{"name":"circle-o","id":160,"order":243,"prevSize":28,"code":61708},"setIdx":0,"setId":1,"iconIdx":171},{"icon":{"paths":["M300.571 796.571c0 40-32.571 73.143-73.143 73.143-40 0-73.143-33.143-73.143-73.143 0-40.571 33.143-73.143 73.143-73.143 40.571 0 73.143 32.571 73.143 73.143zM585.143 914.286c0 40.571-32.571 73.143-73.143 73.143s-73.143-32.571-73.143-73.143 32.571-73.143 73.143-73.143 73.143 32.571 73.143 73.143zM182.857 512c0 40.571-32.571 73.143-73.143 73.143s-73.143-32.571-73.143-73.143 32.571-73.143 73.143-73.143 73.143 32.571 73.143 73.143zM869.714 796.571c0 40-33.143 73.143-73.143 73.143-40.571 0-73.143-33.143-73.143-73.143 0-40.571 32.571-73.143 73.143-73.143 40 0 73.143 32.571 73.143 73.143zM318.857 227.429c0 50.286-41.143 91.429-91.429 91.429s-91.429-41.143-91.429-91.429 41.143-91.429 91.429-91.429 91.429 41.143 91.429 91.429zM987.429 512c0 40.571-32.571 73.143-73.143 73.143s-73.143-32.571-73.143-73.143 32.571-73.143 73.143-73.143 73.143 32.571 73.143 73.143zM621.714 109.714c0 60.571-49.143 109.714-109.714 109.714s-109.714-49.143-109.714-109.714 49.143-109.714 109.714-109.714 109.714 49.143 109.714 109.714zM924.571 227.429c0 70.857-57.714 128-128 128-70.857 0-128-57.143-128-128 0-70.286 57.143-128 128-128 70.286 0 128 57.714 128 128z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["spinner"],"defaultCode":61712,"grid":14},"attrs":[],"properties":{"name":"spinner","id":161,"order":246,"prevSize":28,"code":61712},"setIdx":0,"setId":1,"iconIdx":172},{"icon":{"paths":["M877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["circle"],"defaultCode":61713,"grid":14},"attrs":[],"properties":{"name":"circle","id":162,"order":247,"prevSize":28,"code":61713},"setIdx":0,"setId":1,"iconIdx":173},{"icon":{"paths":["M1024 640c0 80-40 184.571-72.571 257.714-6.286 13.143-12.571 31.429-21.143 43.429-4 5.714-8 9.714-16 9.714-11.429 0-18.286-9.143-18.286-20 0-9.143 2.286-19.429 2.857-28.571 1.714-23.429 2.857-46.857 2.857-70.286 0-272.571-161.714-320-408-320h-128v146.286c0 20-16.571 36.571-36.571 36.571-9.714 0-18.857-4-25.714-10.857l-292.571-292.571c-6.857-6.857-10.857-16-10.857-25.714s4-18.857 10.857-25.714l292.571-292.571c6.857-6.857 16-10.857 25.714-10.857 20 0 36.571 16.571 36.571 36.571v146.286h128c187.429 0 420.571 33.143 500 230.286 24 60.571 30.286 126.286 30.286 190.286z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["mail-reply","reply"],"defaultCode":61714,"grid":14},"attrs":[],"properties":{"name":"mail-reply, reply","id":163,"order":248,"prevSize":28,"code":61714},"setIdx":0,"setId":1,"iconIdx":174},{"icon":{"paths":["M877.714 749.714v-402.286c0-30.286-24.571-54.857-54.857-54.857h-402.286c-30.286 0-54.857-24.571-54.857-54.857v-36.571c0-30.286-24.571-54.857-54.857-54.857h-182.857c-30.286 0-54.857 24.571-54.857 54.857v548.571c0 30.286 24.571 54.857 54.857 54.857h694.857c30.286 0 54.857-24.571 54.857-54.857zM950.857 347.429v402.286c0 70.286-57.714 128-128 128h-694.857c-70.286 0-128-57.714-128-128v-548.571c0-70.286 57.714-128 128-128h182.857c70.286 0 128 57.714 128 128v18.286h384c70.286 0 128 57.714 128 128z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["folder-o"],"defaultCode":61716,"grid":14},"attrs":[],"properties":{"name":"folder-o","id":164,"order":250,"prevSize":28,"code":61716},"setIdx":0,"setId":1,"iconIdx":175},{"icon":{"paths":["M1017.714 532c0-16-17.714-20-30.286-20h-621.714c-30.286 0-70.286 18.857-89.714 42.286l-168 207.429c-5.143 6.857-10.286 14.286-10.286 22.857 0 16 17.714 20 30.286 20h621.714c30.286 0 70.286-18.857 89.714-42.857l168-207.429c5.143-6.286 10.286-13.714 10.286-22.286zM365.714 438.857h438.857v-91.429c0-30.286-24.571-54.857-54.857-54.857h-329.143c-30.286 0-54.857-24.571-54.857-54.857v-36.571c0-30.286-24.571-54.857-54.857-54.857h-182.857c-30.286 0-54.857 24.571-54.857 54.857v487.429l146.286-180c33.143-40.571 94.286-69.714 146.286-69.714zM1090.857 532c0 25.143-10.857 49.143-26.286 68.571l-168.571 207.429c-32.571 40-94.857 69.714-146.286 69.714h-621.714c-70.286 0-128-57.714-128-128v-548.571c0-70.286 57.714-128 128-128h182.857c70.286 0 128 57.714 128 128v18.286h310.857c70.286 0 128 57.714 128 128v91.429h109.714c38.857 0 77.714 17.714 94.857 54.286 5.714 12 8.571 25.143 8.571 38.857z"],"width":1090.8525714285713,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["folder-open-o"],"defaultCode":61717,"grid":14},"attrs":[],"properties":{"name":"folder-open-o","id":165,"order":251,"prevSize":28,"code":61717},"setIdx":0,"setId":1,"iconIdx":176},{"icon":{"paths":["M219.429 667.429v54.857c0 5.143-4 9.143-9.143 9.143h-54.857c-5.143 0-9.143-4-9.143-9.143v-54.857c0-5.143 4-9.143 9.143-9.143h54.857c5.143 0 9.143 4 9.143 9.143zM292.571 521.143v54.857c0 5.143-4 9.143-9.143 9.143h-128c-5.143 0-9.143-4-9.143-9.143v-54.857c0-5.143 4-9.143 9.143-9.143h128c5.143 0 9.143 4 9.143 9.143zM219.429 374.857v54.857c0 5.143-4 9.143-9.143 9.143h-54.857c-5.143 0-9.143-4-9.143-9.143v-54.857c0-5.143 4-9.143 9.143-9.143h54.857c5.143 0 9.143 4 9.143 9.143zM804.571 667.429v54.857c0 5.143-4 9.143-9.143 9.143h-493.714c-5.143 0-9.143-4-9.143-9.143v-54.857c0-5.143 4-9.143 9.143-9.143h493.714c5.143 0 9.143 4 9.143 9.143zM438.857 521.143v54.857c0 5.143-4 9.143-9.143 9.143h-54.857c-5.143 0-9.143-4-9.143-9.143v-54.857c0-5.143 4-9.143 9.143-9.143h54.857c5.143 0 9.143 4 9.143 9.143zM365.714 374.857v54.857c0 5.143-4 9.143-9.143 9.143h-54.857c-5.143 0-9.143-4-9.143-9.143v-54.857c0-5.143 4-9.143 9.143-9.143h54.857c5.143 0 9.143 4 9.143 9.143zM585.143 521.143v54.857c0 5.143-4 9.143-9.143 9.143h-54.857c-5.143 0-9.143-4-9.143-9.143v-54.857c0-5.143 4-9.143 9.143-9.143h54.857c5.143 0 9.143 4 9.143 9.143zM512 374.857v54.857c0 5.143-4 9.143-9.143 9.143h-54.857c-5.143 0-9.143-4-9.143-9.143v-54.857c0-5.143 4-9.143 9.143-9.143h54.857c5.143 0 9.143 4 9.143 9.143zM731.429 521.143v54.857c0 5.143-4 9.143-9.143 9.143h-54.857c-5.143 0-9.143-4-9.143-9.143v-54.857c0-5.143 4-9.143 9.143-9.143h54.857c5.143 0 9.143 4 9.143 9.143zM950.857 667.429v54.857c0 5.143-4 9.143-9.143 9.143h-54.857c-5.143 0-9.143-4-9.143-9.143v-54.857c0-5.143 4-9.143 9.143-9.143h54.857c5.143 0 9.143 4 9.143 9.143zM658.286 374.857v54.857c0 5.143-4 9.143-9.143 9.143h-54.857c-5.143 0-9.143-4-9.143-9.143v-54.857c0-5.143 4-9.143 9.143-9.143h54.857c5.143 0 9.143 4 9.143 9.143zM804.571 374.857v54.857c0 5.143-4 9.143-9.143 9.143h-54.857c-5.143 0-9.143-4-9.143-9.143v-54.857c0-5.143 4-9.143 9.143-9.143h54.857c5.143 0 9.143 4 9.143 9.143zM950.857 374.857v201.143c0 5.143-4 9.143-9.143 9.143h-128c-5.143 0-9.143-4-9.143-9.143v-54.857c0-5.143 4-9.143 9.143-9.143h64v-137.143c0-5.143 4-9.143 9.143-9.143h54.857c5.143 0 9.143 4 9.143 9.143zM1024 804.571v-512h-950.857v512h950.857zM1097.143 292.571v512c0 40.571-32.571 73.143-73.143 73.143h-950.857c-40.571 0-73.143-32.571-73.143-73.143v-512c0-40.571 32.571-73.143 73.143-73.143h950.857c40.571 0 73.143 32.571 73.143 73.143z"],"width":1097.142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["keyboard-o"],"defaultCode":61724,"grid":14},"attrs":[],"properties":{"name":"keyboard-o","id":166,"order":256,"prevSize":28,"code":61724},"setIdx":0,"setId":1,"iconIdx":177},{"icon":{"paths":["M334.286 561.714l-266.286 266.286c-7.429 7.429-18.857 7.429-26.286 0l-28.571-28.571c-7.429-7.429-7.429-18.857 0-26.286l224.571-224.571-224.571-224.571c-7.429-7.429-7.429-18.857 0-26.286l28.571-28.571c7.429-7.429 18.857-7.429 26.286 0l266.286 266.286c7.429 7.429 7.429 18.857 0 26.286zM950.857 822.857v36.571c0 10.286-8 18.286-18.286 18.286h-548.571c-10.286 0-18.286-8-18.286-18.286v-36.571c0-10.286 8-18.286 18.286-18.286h548.571c10.286 0 18.286 8 18.286 18.286z"],"width":956.5622857142856,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["terminal"],"defaultCode":61728,"grid":14},"attrs":[],"properties":{"name":"terminal","id":167,"order":259,"prevSize":28,"code":61728},"setIdx":0,"setId":1,"iconIdx":178},{"icon":{"paths":["M352.571 799.429l-28.571 28.571c-7.429 7.429-18.857 7.429-26.286 0l-266.286-266.286c-7.429-7.429-7.429-18.857 0-26.286l266.286-266.286c7.429-7.429 18.857-7.429 26.286 0l28.571 28.571c7.429 7.429 7.429 18.857 0 26.286l-224.571 224.571 224.571 224.571c7.429 7.429 7.429 18.857 0 26.286zM690.286 189.714l-213.143 737.714c-2.857 9.714-13.143 15.429-22.286 12.571l-35.429-9.714c-9.714-2.857-15.429-13.143-12.571-22.857l213.143-737.714c2.857-9.714 13.143-15.429 22.286-12.571l35.429 9.714c9.714 2.857 15.429 13.143 12.571 22.857zM1065.714 561.714l-266.286 266.286c-7.429 7.429-18.857 7.429-26.286 0l-28.571-28.571c-7.429-7.429-7.429-18.857 0-26.286l224.571-224.571-224.571-224.571c-7.429-7.429-7.429-18.857 0-26.286l28.571-28.571c7.429-7.429 18.857-7.429 26.286 0l266.286 266.286c7.429 7.429 7.429 18.857 0 26.286z"],"width":1097.142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["code"],"defaultCode":61729,"grid":14},"attrs":[],"properties":{"name":"code","id":168,"order":684,"prevSize":28,"code":61729},"setIdx":0,"setId":1,"iconIdx":179},{"icon":{"paths":["M365.714 618.286v40c0 14.857-9.143 28-22.286 33.714-4.571 1.714-9.714 2.857-14.286 2.857-9.714 0-18.857-3.429-25.714-10.857l-292.571-292.571c-14.286-14.286-14.286-37.143 0-51.429l292.571-292.571c10.286-10.857 26.286-13.714 40-8 13.143 5.714 22.286 18.857 22.286 33.714v39.429l-226.857 227.429c-14.286 14.286-14.286 37.143 0 51.429zM1024 640c0 118.857-89.714 293.714-93.714 301.143-2.857 6.286-9.143 9.714-16 9.714-1.714 0-3.429 0-5.143-0.571-8.571-2.857-13.714-10.857-13.143-19.429 16.571-156-2.857-258.857-60.571-322.857-48.571-54.286-127.429-83.429-250.286-93.143v143.429c0 14.857-9.143 28-22.286 33.714-4.571 1.714-9.714 2.857-14.286 2.857-9.714 0-18.857-3.429-25.714-10.857l-292.571-292.571c-14.286-14.286-14.286-37.143 0-51.429l292.571-292.571c10.286-10.857 26.286-13.714 40-8 13.143 5.714 22.286 18.857 22.286 33.714v149.714c157.714 10.857 270.286 52.571 342.286 126.286 86.286 88.571 96.571 208.571 96.571 290.857z"],"width":1020.5622857142856,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["mail-reply-all","reply-all"],"defaultCode":61730,"grid":14},"attrs":[],"properties":{"name":"mail-reply-all, reply-all","id":169,"order":685,"prevSize":28,"code":61730},"setIdx":0,"setId":1,"iconIdx":180},{"icon":{"paths":["M677.714 546.857l146.857-142.857-241.143-35.429-17.143-34.286-90.857-184v550.286l33.714 17.714 181.714 96-34.286-202.857-6.857-37.714zM936 397.143l-207.429 202.286 49.143 285.714c4 25.143-5.143 40-22.857 40-6.286 0-14.286-2.286-22.857-6.857l-256.571-134.857-256.571 134.857c-8.571 4.571-16.571 6.857-22.857 6.857-17.714 0-26.857-14.857-22.857-40l49.143-285.714-208-202.286c-24.571-24.571-16.571-48.571 17.714-53.714l286.857-41.714 128.571-260c7.429-15.429 17.714-23.429 28-23.429v0c10.286 0 20 8 28 23.429l128.571 260 286.857 41.714c34.286 5.143 42.286 29.143 17.143 53.714z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["star-half-empty","star-half-full","star-half-o"],"defaultCode":61731,"grid":14},"attrs":[],"properties":{"name":"star-half-empty, star-half-full, star-half-o","id":170,"order":262,"prevSize":28,"code":61731},"setIdx":0,"setId":1,"iconIdx":181},{"icon":{"paths":["M318.286 731.429h340v-340zM292.571 705.714l340-340h-340v340zM950.857 749.714v109.714c0 10.286-8 18.286-18.286 18.286h-128v128c0 10.286-8 18.286-18.286 18.286h-109.714c-10.286 0-18.286-8-18.286-18.286v-128h-493.714c-10.286 0-18.286-8-18.286-18.286v-493.714h-128c-10.286 0-18.286-8-18.286-18.286v-109.714c0-10.286 8-18.286 18.286-18.286h128v-128c0-10.286 8-18.286 18.286-18.286h109.714c10.286 0 18.286 8 18.286 18.286v128h486.286l140.571-141.143c7.429-6.857 18.857-6.857 26.286 0 6.857 7.429 6.857 18.857 0 26.286l-141.143 140.571v486.286h128c10.286 0 18.286 8 18.286 18.286z"],"width":952.5394285714285,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["crop"],"defaultCode":61733,"grid":14},"attrs":[],"properties":{"name":"crop","id":171,"order":264,"prevSize":28,"code":61733},"setIdx":0,"setId":1,"iconIdx":182},{"icon":{"paths":["M164.571 841.143c0-30.286-24.571-54.857-54.857-54.857s-54.857 24.571-54.857 54.857 24.571 54.857 54.857 54.857 54.857-24.571 54.857-54.857zM164.571 182.857c0-30.286-24.571-54.857-54.857-54.857s-54.857 24.571-54.857 54.857 24.571 54.857 54.857 54.857 54.857-24.571 54.857-54.857zM530.286 256c0-30.286-24.571-54.857-54.857-54.857s-54.857 24.571-54.857 54.857 24.571 54.857 54.857 54.857 54.857-24.571 54.857-54.857zM585.143 256c0 40.571-22.286 76-54.857 94.857-1.714 206.286-148 252-245.143 282.857-90.857 28.571-120.571 42.286-120.571 97.714v14.857c32.571 18.857 54.857 54.286 54.857 94.857 0 60.571-49.143 109.714-109.714 109.714s-109.714-49.143-109.714-109.714c0-40.571 22.286-76 54.857-94.857v-468.571c-32.571-18.857-54.857-54.286-54.857-94.857 0-60.571 49.143-109.714 109.714-109.714s109.714 49.143 109.714 109.714c0 40.571-22.286 76-54.857 94.857v284c29.143-14.286 60-24 88-32.571 106.286-33.714 166.857-58.857 168-178.286-32.571-18.857-54.857-54.286-54.857-94.857 0-60.571 49.143-109.714 109.714-109.714s109.714 49.143 109.714 109.714z"],"width":585.1428571428571,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["code-fork"],"defaultCode":61734,"grid":14},"attrs":[],"properties":{"name":"code-fork","id":172,"order":265,"prevSize":28,"code":61734},"setIdx":0,"setId":1,"iconIdx":183},{"icon":{"paths":["M250.857 726.286l-146.286 146.286c-4 3.429-8.571 5.143-13.143 5.143s-9.143-1.714-13.143-5.143c-6.857-7.429-6.857-18.857 0-26.286l146.286-146.286c7.429-6.857 18.857-6.857 26.286 0 6.857 7.429 6.857 18.857 0 26.286zM347.429 749.714v182.857c0 10.286-8 18.286-18.286 18.286s-18.286-8-18.286-18.286v-182.857c0-10.286 8-18.286 18.286-18.286s18.286 8 18.286 18.286zM219.429 621.714c0 10.286-8 18.286-18.286 18.286h-182.857c-10.286 0-18.286-8-18.286-18.286s8-18.286 18.286-18.286h182.857c10.286 0 18.286 8 18.286 18.286zM941.714 694.857c0 44-17.143 85.143-48.571 116l-84 83.429c-30.857 30.857-72 47.429-116 47.429s-85.714-17.143-116.571-48.571l-190.857-191.429c-9.714-9.714-17.143-20.571-24-32l136.571-10.286 156 156.571c20.571 20.571 57.143 21.143 77.714 0.571l84-83.429c10.286-10.286 16-24 16-38.286 0-14.857-5.714-28.571-16-38.857l-156.571-157.143 10.286-136.571c11.429 6.857 22.286 14.286 32 24l192 192c30.857 31.429 48 72.571 48 116.571zM589.143 281.143l-136.571 10.286-156-156.571c-10.286-10.286-24-16-38.857-16s-28.571 5.714-38.857 15.429l-84 83.429c-10.286 10.286-16 24-16 38.286 0 14.857 5.714 28.571 16 38.857l156.571 156.571-10.286 137.143c-11.429-6.857-22.286-14.286-32-24l-192-192c-30.857-31.429-48-72.571-48-116.571s17.143-85.143 48.571-116l84-83.429c30.857-30.857 72-47.429 116-47.429s85.714 17.143 116.571 48.571l190.857 191.429c9.714 9.714 17.143 20.571 24 32zM950.857 329.143c0 10.286-8 18.286-18.286 18.286h-182.857c-10.286 0-18.286-8-18.286-18.286s8-18.286 18.286-18.286h182.857c10.286 0 18.286 8 18.286 18.286zM640 18.286v182.857c0 10.286-8 18.286-18.286 18.286s-18.286-8-18.286-18.286v-182.857c0-10.286 8-18.286 18.286-18.286s18.286 8 18.286 18.286zM872.571 104.571l-146.286 146.286c-4 3.429-8.571 5.143-13.143 5.143s-9.143-1.714-13.143-5.143c-6.857-7.429-6.857-18.857 0-26.286l146.286-146.286c7.429-6.857 18.857-6.857 26.286 0 6.857 7.429 6.857 18.857 0 26.286z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["chain-broken","unlink"],"defaultCode":61735,"grid":14},"attrs":[],"properties":{"name":"chain-broken, unlink","id":173,"order":266,"prevSize":28,"code":61735},"setIdx":0,"setId":1,"iconIdx":184},{"icon":{"paths":["M511.999 960c-88.606 0-175.222-26.276-248.895-75.5-73.673-49.229-131.095-119.199-165.002-201.057-33.908-81.864-42.78-171.94-25.494-258.844s59.954-166.729 122.608-229.383c62.654-62.654 142.48-105.322 229.383-122.608s176.98-8.414 258.844 25.494c81.859 33.908 151.828 91.329 201.057 165.002 49.224 73.673 75.5 160.29 75.5 248.895 0 118.815-47.201 232.765-131.215 316.785-84.019 84.014-197.97 131.215-316.785 131.215zM511.999 128c-75.948 0-150.19 22.521-213.339 64.716s-112.367 102.167-141.431 172.334c-29.064 70.167-36.668 147.375-21.852 221.866 14.817 74.486 51.389 142.909 105.093 196.613s122.126 90.276 196.615 105.093c74.488 14.817 151.699 7.214 221.863-21.852 70.17-29.066 130.14-78.285 172.334-141.43 42.194-63.15 64.717-137.39 64.717-213.34 0-101.843-40.458-199.515-112.471-271.529s-169.687-112.471-271.529-112.471z","M495.999 352c26.511 0 48-21.49 48-48s-21.489-48-48-48c-26.51 0-48 21.49-48 48s21.49 48 48 48z","M671.999 704c0 8.489-3.369 16.625-9.375 22.625-6.001 6.006-14.136 9.375-22.625 9.375h-256c-8.487 0-16.626-3.369-22.627-9.375-6.001-6.001-9.373-14.136-9.373-22.625s3.372-16.625 9.373-22.625c6.001-6.006 14.14-9.375 22.627-9.375h96v-192h-64c-8.487 0-16.626-3.372-22.627-9.373s-9.373-14.14-9.373-22.627c0-8.487 3.372-16.626 9.373-22.627s14.14-9.373 22.627-9.373h96c8.489 0 16.625 3.372 22.625 9.373 6.006 6.001 9.375 14.14 9.375 22.627v224h96c8.489 0 16.625 3.369 22.625 9.375 6.006 6.001 9.375 14.136 9.375 22.625z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["info"],"defaultCode":61737,"grid":14},"attrs":[],"properties":{"name":"info","id":174,"order":678,"prevSize":28,"code":61737},"setIdx":0,"setId":1,"iconIdx":185},{"icon":{"paths":["M917.119 944.34h-812.798c-5.469-0.020-10.84-1.444-15.602-4.137-4.762-2.688-8.755-6.554-11.598-11.223-2.809-4.864-4.287-10.383-4.287-16s1.479-11.136 4.287-16l406.4-799.999c2.685-5.242 6.765-9.64 11.79-12.712s10.8-4.697 16.688-4.697c5.893 0 11.668 1.625 16.691 4.697 5.028 3.072 9.103 7.471 11.791 12.712l406.4 799.999c2.806 4.864 4.285 10.383 4.285 16s-1.48 11.136-4.285 16c-3.057 5.059-7.46 9.175-12.713 11.884-5.253 2.714-11.151 3.917-17.050 3.476zM156.481 880.34h708.481l-354.243-697.279-354.238 697.279z","M510.709 816.34c26.511 0 48-21.489 48-48s-21.489-48-48-48c-26.51 0-48 21.489-48 48s21.49 48 48 48z","M510.709 656.34c-8.487 0-16.626-3.369-22.627-9.375-6.001-6.001-9.373-14.136-9.373-22.625v-224c0-8.487 3.372-16.626 9.373-22.627s14.14-9.373 22.627-9.373c8.489 0 16.625 3.372 22.625 9.373 6.006 6.001 9.375 14.14 9.375 22.627v224c0 8.489-3.369 16.625-9.375 22.625-6.001 6.006-14.136 9.375-22.625 9.375z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["exclamation"],"defaultCode":61738,"grid":14},"attrs":[],"properties":{"name":"exclamation","id":175,"order":268,"prevSize":28,"code":61738},"setIdx":0,"setId":1,"iconIdx":186},{"icon":{"paths":["M822.857 256c0-30.286-24.571-54.857-54.857-54.857s-54.857 24.571-54.857 54.857 24.571 54.857 54.857 54.857 54.857-24.571 54.857-54.857zM950.857 91.429c0 189.714-52.571 316-188 452-33.143 32.571-70.857 66.286-111.429 100.571l-11.429 216.571c-0.571 5.714-4 11.429-9.143 14.857l-219.429 128c-2.857 1.714-5.714 2.286-9.143 2.286-4.571 0-9.143-1.714-13.143-5.143l-36.571-36.571c-4.571-5.143-6.286-12-4.571-18.286l48.571-157.714-160.571-160.571-157.714 48.571c-1.714 0.571-3.429 0.571-5.143 0.571-4.571 0-9.714-1.714-13.143-5.143l-36.571-36.571c-5.714-6.286-6.857-15.429-2.857-22.286l128-219.429c3.429-5.143 9.143-8.571 14.857-9.143l216.571-11.429c34.286-40.571 68-78.286 100.571-111.429 142.857-142.286 252-188 450.857-188 10.286 0 19.429 8 19.429 18.286z"],"width":967.4605714285714,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["rocket"],"defaultCode":61749,"grid":14},"attrs":[],"properties":{"name":"rocket","id":176,"order":682,"prevSize":28,"code":61749},"setIdx":0,"setId":1,"iconIdx":187},{"icon":{"paths":["M997.143 441.714l-93.714 436h-190.857l101.714-475.429c4.571-20 1.714-38.286-8.571-50.286-9.714-12-26.857-18.857-47.429-18.857h-96.571l-116.571 544.571h-190.857l116.571-544.571h-163.429l-116.571 544.571h-190.857l116.571-544.571-87.429-186.857h729.143c77.143 0 147.429 32 192.571 88 45.714 56 62.286 132 46.286 207.429z"],"width":1013.1748571428571,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["maxcdn"],"defaultCode":61750,"grid":14},"attrs":[],"properties":{"name":"maxcdn","id":177,"order":683,"prevSize":28,"code":61750},"setIdx":0,"setId":1,"iconIdx":188},{"icon":{"paths":["M519.429 797.143l58.286-58.286c14.286-14.286 14.286-37.143 0-51.429l-175.429-175.429 175.429-175.429c14.286-14.286 14.286-37.143 0-51.429l-58.286-58.286c-14.286-14.286-37.143-14.286-51.429 0l-259.429 259.429c-14.286 14.286-14.286 37.143 0 51.429l259.429 259.429c14.286 14.286 37.143 14.286 51.429 0zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["chevron-circle-left"],"defaultCode":61751,"grid":14},"attrs":[],"properties":{"name":"chevron-circle-left","id":178,"order":280,"prevSize":28,"code":61751},"setIdx":0,"setId":1,"iconIdx":189},{"icon":{"paths":["M409.714 797.143l259.429-259.429c14.286-14.286 14.286-37.143 0-51.429l-259.429-259.429c-14.286-14.286-37.143-14.286-51.429 0l-58.286 58.286c-14.286 14.286-14.286 37.143 0 51.429l175.429 175.429-175.429 175.429c-14.286 14.286-14.286 37.143 0 51.429l58.286 58.286c14.286 14.286 37.143 14.286 51.429 0zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["chevron-circle-right"],"defaultCode":61752,"grid":14},"attrs":[],"properties":{"name":"chevron-circle-right","id":179,"order":281,"prevSize":28,"code":61752},"setIdx":0,"setId":1,"iconIdx":190},{"icon":{"paths":["M665.714 650.857l58.286-58.286c14.286-14.286 14.286-37.143 0-51.429l-259.429-259.429c-14.286-14.286-37.143-14.286-51.429 0l-259.429 259.429c-14.286 14.286-14.286 37.143 0 51.429l58.286 58.286c14.286 14.286 37.143 14.286 51.429 0l175.429-175.429 175.429 175.429c14.286 14.286 37.143 14.286 51.429 0zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["chevron-circle-up"],"defaultCode":61753,"grid":14},"attrs":[],"properties":{"name":"chevron-circle-up","id":180,"order":282,"prevSize":28,"code":61753},"setIdx":0,"setId":1,"iconIdx":191},{"icon":{"paths":["M464.571 742.286l259.429-259.429c14.286-14.286 14.286-37.143 0-51.429l-58.286-58.286c-14.286-14.286-37.143-14.286-51.429 0l-175.429 175.429-175.429-175.429c-14.286-14.286-37.143-14.286-51.429 0l-58.286 58.286c-14.286 14.286-14.286 37.143 0 51.429l259.429 259.429c14.286 14.286 37.143 14.286 51.429 0zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["chevron-circle-down"],"defaultCode":61754,"grid":14},"attrs":[],"properties":{"name":"chevron-circle-down","id":181,"order":283,"prevSize":28,"code":61754},"setIdx":0,"setId":1,"iconIdx":192},{"icon":{"paths":["M219.429 420.571v109.714c0 30.286-24.571 54.857-54.857 54.857h-109.714c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h109.714c30.286 0 54.857 24.571 54.857 54.857zM512 420.571v109.714c0 30.286-24.571 54.857-54.857 54.857h-109.714c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h109.714c30.286 0 54.857 24.571 54.857 54.857zM804.571 420.571v109.714c0 30.286-24.571 54.857-54.857 54.857h-109.714c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h109.714c30.286 0 54.857 24.571 54.857 54.857z"],"width":804.5714285714286,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["ellipsis-h"],"defaultCode":61761,"grid":14},"attrs":[],"properties":{"name":"ellipsis-h","id":182,"order":289,"prevSize":28,"code":61761},"setIdx":0,"setId":1,"iconIdx":193},{"icon":{"paths":["M437.143 742.286c2.857 6.857 1.714 14.286-2.857 20l-200 219.429c-3.429 3.429-8 5.714-13.143 5.714v0c-5.143 0-10.286-2.286-13.714-5.714l-202.857-219.429c-4.571-5.714-5.714-13.143-2.857-20 2.857-6.286 9.143-10.857 16.571-10.857h128v-713.143c0-10.286 8-18.286 18.286-18.286h109.714c10.286 0 18.286 8 18.286 18.286v713.143h128c7.429 0 13.714 4 16.571 10.857z"],"width":438.85714285714283,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["long-arrow-down"],"defaultCode":61813,"grid":14},"attrs":[],"properties":{"name":"long-arrow-down","id":183,"order":338,"prevSize":28,"code":61813},"setIdx":0,"setId":1,"iconIdx":194},{"icon":{"paths":["M437.143 281.714c-2.857 6.286-9.143 10.857-16.571 10.857h-128v713.143c0 10.286-8 18.286-18.286 18.286h-109.714c-10.286 0-18.286-8-18.286-18.286v-713.143h-128c-7.429 0-13.714-4-16.571-10.857s-1.714-14.286 2.857-20l200-219.429c3.429-3.429 8-5.714 13.143-5.714v0c5.143 0 10.286 2.286 13.714 5.714l202.857 219.429c4.571 5.714 5.714 13.143 2.857 20z"],"width":438.85714285714283,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["long-arrow-up"],"defaultCode":61814,"grid":14},"attrs":[],"properties":{"name":"long-arrow-up","id":184,"order":339,"prevSize":28,"code":61814},"setIdx":0,"setId":1,"iconIdx":195},{"icon":{"paths":["M1024 457.143v109.714c0 10.286-8 18.286-18.286 18.286h-713.143v128c0 7.429-4 13.714-10.857 16.571s-14.286 1.714-20-2.857l-219.429-200c-3.429-3.429-5.714-8-5.714-13.143v0c0-5.143 2.286-10.286 5.714-13.714l219.429-202.286c5.714-5.143 13.143-6.286 20-3.429 6.286 2.857 10.857 9.143 10.857 16.571v128h713.143c10.286 0 18.286 8 18.286 18.286z"],"width":1060.5714285714284,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["long-arrow-left"],"defaultCode":61815,"grid":14},"attrs":[],"properties":{"name":"long-arrow-left","id":185,"order":340,"prevSize":28,"code":61815},"setIdx":0,"setId":1,"iconIdx":196},{"icon":{"paths":["M987.429 510.286c0 5.143-2.286 10.286-5.714 13.714l-219.429 202.286c-5.714 5.143-13.143 6.286-20 3.429-6.286-2.857-10.857-9.143-10.857-16.571v-128h-713.143c-10.286 0-18.286-8-18.286-18.286v-109.714c0-10.286 8-18.286 18.286-18.286h713.143v-128c0-7.429 4-13.714 10.857-16.571s14.286-1.714 20 2.857l219.429 200c3.429 3.429 5.714 8 5.714 13.143v0z"],"width":987.4285714285713,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["long-arrow-right"],"defaultCode":61816,"grid":14},"attrs":[],"properties":{"name":"long-arrow-right","id":186,"order":341,"prevSize":28,"code":61816},"setIdx":0,"setId":1,"iconIdx":197},{"icon":{"paths":["M109.714 731.429v73.143h-64c-5.143 0-9.143-4-9.143-9.143v-9.143h-27.429c-5.143 0-9.143-4-9.143-9.143v-18.286c0-5.143 4-9.143 9.143-9.143h27.429v-9.143c0-5.143 4-9.143 9.143-9.143h64zM109.714 585.143v73.143h-64c-5.143 0-9.143-4-9.143-9.143v-9.143h-27.429c-5.143 0-9.143-4-9.143-9.143v-18.286c0-5.143 4-9.143 9.143-9.143h27.429v-9.143c0-5.143 4-9.143 9.143-9.143h64zM109.714 438.857v73.143h-64c-5.143 0-9.143-4-9.143-9.143v-9.143h-27.429c-5.143 0-9.143-4-9.143-9.143v-18.286c0-5.143 4-9.143 9.143-9.143h27.429v-9.143c0-5.143 4-9.143 9.143-9.143h64zM109.714 292.571v73.143h-64c-5.143 0-9.143-4-9.143-9.143v-9.143h-27.429c-5.143 0-9.143-4-9.143-9.143v-18.286c0-5.143 4-9.143 9.143-9.143h27.429v-9.143c0-5.143 4-9.143 9.143-9.143h64zM109.714 146.286v73.143h-64c-5.143 0-9.143-4-9.143-9.143v-9.143h-27.429c-5.143 0-9.143-4-9.143-9.143v-18.286c0-5.143 4-9.143 9.143-9.143h27.429v-9.143c0-5.143 4-9.143 9.143-9.143h64zM731.429 54.857v841.143c0 30.286-24.571 54.857-54.857 54.857h-475.429c-30.286 0-54.857-24.571-54.857-54.857v-841.143c0-30.286 24.571-54.857 54.857-54.857h475.429c30.286 0 54.857 24.571 54.857 54.857zM877.714 758.857v18.286c0 5.143-4 9.143-9.143 9.143h-27.429v9.143c0 5.143-4 9.143-9.143 9.143h-64v-73.143h64c5.143 0 9.143 4 9.143 9.143v9.143h27.429c5.143 0 9.143 4 9.143 9.143zM877.714 612.571v18.286c0 5.143-4 9.143-9.143 9.143h-27.429v9.143c0 5.143-4 9.143-9.143 9.143h-64v-73.143h64c5.143 0 9.143 4 9.143 9.143v9.143h27.429c5.143 0 9.143 4 9.143 9.143zM877.714 466.286v18.286c0 5.143-4 9.143-9.143 9.143h-27.429v9.143c0 5.143-4 9.143-9.143 9.143h-64v-73.143h64c5.143 0 9.143 4 9.143 9.143v9.143h27.429c5.143 0 9.143 4 9.143 9.143zM877.714 320v18.286c0 5.143-4 9.143-9.143 9.143h-27.429v9.143c0 5.143-4 9.143-9.143 9.143h-64v-73.143h64c5.143 0 9.143 4 9.143 9.143v9.143h27.429c5.143 0 9.143 4 9.143 9.143zM877.714 173.714v18.286c0 5.143-4 9.143-9.143 9.143h-27.429v9.143c0 5.143-4 9.143-9.143 9.143h-64v-73.143h64c5.143 0 9.143 4 9.143 9.143v9.143h27.429c5.143 0 9.143 4 9.143 9.143z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["microchip"],"defaultCode":62171,"grid":14},"attrs":[],"properties":{"name":"microchip","id":187,"order":693,"prevSize":28,"code":62171},"setIdx":0,"setId":1,"iconIdx":198}],"height":1024,"metadata":{"name":"FontAwesome"},"preferences":{"showGlyphs":true,"showQuickUse":true,"showQuickUse2":true,"showSVGs":true,"fontPref":{"prefix":"fa-","metadata":{"fontFamily":"FontAwesome","majorVersion":1,"minorVersion":0},"metrics":{"emSize":1024,"baseline":6.25,"whitespace":50},"embed":false,"noie8":true,"ie7":false,"showSelector":false,"selector":"i","showMetrics":false,"showMetadata":false,"showVersion":false},"imagePref":{"prefix":"icon-","png":true,"useClassSelector":true,"color":0,"bgColor":16777215,"classSelector":".icon","name":"icomoon"},"historySize":50,"showCodes":true,"gridSize":16}} diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index 8f41acb7b..ff9a09eff 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -1,128 +1,136 @@ { "name": "arduino-ide-extension", - "version": "2.0.0", + "version": "2.3.7", "description": "An extension for Theia building the Arduino IDE", "license": "AGPL-3.0-or-later", "scripts": { - "prepare": "yarn download-cli && yarn download-fwuploader && yarn download-ls && yarn copy-i18n && yarn clean && yarn download-examples && yarn build && yarn test", + "prepare": "yarn download-cli && yarn download-fwuploader && yarn download-ls && yarn copy-i18n && yarn download-examples", "clean": "rimraf lib", "compose-changelog": "node ./scripts/compose-changelog.js", "download-cli": "node ./scripts/download-cli.js", "download-fwuploader": "node ./scripts/download-fwuploader.js", - "copy-i18n": "npx ncp ../i18n ./build/i18n", + "copy-i18n": "ncp ../i18n ./src/node/resources/i18n", "download-ls": "node ./scripts/download-ls.js", "download-examples": "node ./scripts/download-examples.js", "generate-protocol": "node ./scripts/generate-protocol.js", - "lint": "eslint", - "build": "tsc && ncp ./src/node/cli-protocol/ ./lib/node/cli-protocol/ && yarn lint", + "lint": "eslint .", + "prebuild": "rimraf lib", + "build": "tsc", + "build:dev": "yarn build", + "postbuild": "ncp ./src/node/cli-protocol/ ./lib/node/cli-protocol/", "watch": "tsc -w", - "test": "mocha \"./lib/test/**/*.test.js\"", - "test:watch": "mocha --watch --watch-files lib \"./lib/test/**/*.test.js\"" + "test": "cross-env IDE2_TEST=true mocha \"./lib/test/**/*.test.js\"", + "test:slow": "cross-env IDE2_TEST=true mocha \"./lib/test/**/*.slow-test.js\" --slow 5000" }, "dependencies": { - "@grpc/grpc-js": "^1.6.7", - "@theia/application-package": "1.25.0", - "@theia/core": "1.25.0", - "@theia/editor": "1.25.0", - "@theia/electron": "1.25.0", - "@theia/filesystem": "1.25.0", - "@theia/keymaps": "1.25.0", - "@theia/markers": "1.25.0", - "@theia/monaco": "1.25.0", - "@theia/navigator": "1.25.0", - "@theia/outline-view": "1.25.0", - "@theia/output": "1.25.0", - "@theia/preferences": "1.25.0", - "@theia/search-in-workspace": "1.25.0", - "@theia/terminal": "1.25.0", - "@theia/workspace": "1.25.0", + "@grpc/grpc-js": "^1.8.14", + "@theia/application-package": "1.57.0", + "@theia/core": "1.57.0", + "@theia/debug": "1.57.0", + "@theia/editor": "1.57.0", + "@theia/electron": "1.57.0", + "@theia/filesystem": "1.57.0", + "@theia/keymaps": "1.57.0", + "@theia/markers": "1.57.0", + "@theia/messages": "1.57.0", + "@theia/monaco": "1.57.0", + "@theia/monaco-editor-core": "1.83.101", + "@theia/navigator": "1.57.0", + "@theia/outline-view": "1.57.0", + "@theia/output": "1.57.0", + "@theia/plugin-ext": "1.57.0", + "@theia/plugin-ext-vscode": "1.57.0", + "@theia/preferences": "1.57.0", + "@theia/scm": "1.57.0", + "@theia/search-in-workspace": "1.57.0", + "@theia/terminal": "1.57.0", + "@theia/test": "1.57.0", + "@theia/typehierarchy": "1.57.0", + "@theia/workspace": "1.57.0", "@tippyjs/react": "^4.2.5", - "@types/atob": "^2.1.2", - "@types/auth0-js": "^9.14.0", + "@types/auth0-js": "^9.21.3", "@types/btoa": "^1.2.3", "@types/dateformat": "^3.0.1", - "@types/deep-equal": "^1.0.1", - "@types/deepmerge": "^2.2.0", - "@types/glob": "^7.2.0", "@types/google-protobuf": "^3.7.2", "@types/js-yaml": "^3.12.2", - "@types/keytar": "^4.4.0", + "@types/jsdom": "^21.1.1", "@types/lodash.debounce": "^4.0.6", - "@types/ncp": "^2.0.4", "@types/node-fetch": "^2.5.7", + "@types/p-queue": "^2.3.1", "@types/ps-tree": "^1.1.0", - "@types/react-select": "^3.0.0", - "@types/react-tabs": "^2.3.2", "@types/temp": "^0.8.34", - "@types/which": "^1.3.1", - "ajv": "^6.5.3", - "arduino-serial-plotter-webapp": "0.1.0", + "arduino-serial-plotter-webapp": "0.2.0", "async-mutex": "^0.3.0", - "atob": "^2.1.2", - "auth0-js": "^9.14.0", + "auth0-js": "^9.23.2", "btoa": "^1.2.1", "classnames": "^2.3.1", + "cross-fetch": "^3.1.5", "dateformat": "^3.0.3", - "deep-equal": "^2.0.5", - "deepmerge": "2.0.1", + "deepmerge": "^4.2.2", + "dompurify": "^2.4.7", + "drivelist": "^9.2.4", "electron-updater": "^4.6.5", + "fast-deep-equal": "^3.1.3", + "fast-json-stable-stringify": "^2.1.0", "fast-safe-stringify": "^2.1.1", - "glob": "^7.1.6", + "filename-reserved-regex": "^2.0.0", + "fqbn": "^1.0.5", + "glob": "10.4.4", "google-protobuf": "^3.20.1", "hash.js": "^1.1.7", - "is-valid-path": "^0.1.1", + "is-online": "^10.0.0", "js-yaml": "^3.13.1", + "jsdom": "^21.1.1", + "jsonc-parser": "^2.2.0", + "just-diff": "^5.1.1", "jwt-decode": "^3.1.2", "keytar": "7.2.0", "lodash.debounce": "^4.0.8", - "ncp": "^2.0.0", + "minimatch": "^3.1.2", "node-fetch": "^2.6.1", + "node-log-rotate": "^0.1.5", "open": "^8.0.6", - "p-queue": "^5.0.0", + "p-debounce": "^2.1.0", + "p-queue": "^2.4.2", + "process": "^0.11.10", "ps-tree": "^1.2.0", "query-string": "^7.0.1", - "react-disable": "^0.1.0", + "react-disable": "^0.1.1", "react-markdown": "^8.0.0", - "react-select": "^3.0.4", - "react-tabs": "^3.1.2", + "react-perfect-scrollbar": "^1.5.8", + "react-select": "^5.6.0", + "react-tabs": "^6.1.0", "react-window": "^1.8.6", "semver": "^7.3.2", "string-natural-compare": "^2.0.3", "temp": "^0.9.1", "temp-dir": "^2.0.0", "tree-kill": "^1.2.1", - "upath": "^1.1.2", - "url": "^0.11.0", - "which": "^1.3.1" + "util": "^0.12.5", + "vscode-arduino-api": "^0.1.2" }, "devDependencies": { "@octokit/rest": "^18.12.0", "@types/chai": "^4.2.7", - "@types/chai-string": "^1.4.2", - "@types/mocha": "^5.2.7", + "@types/mocha": "^10.0.0", "@types/react-window": "^1.8.5", - "@types/sinon": "^10.0.6", - "@types/sinon-chai": "^3.2.6", + "@xhmikosr/downloader": "^13.0.1", "chai": "^4.2.0", - "chai-string": "^1.5.0", + "cross-env": "^7.0.3", "decompress": "^4.2.0", + "decompress-tarbz2": "^4.1.1", "decompress-targz": "^4.1.1", "decompress-unzip": "^4.0.1", - "download": "^7.1.0", - "grpc_tools_node_protoc_ts": "^4.1.0", - "mocha": "^7.0.0", + "grpc_tools_node_protoc_ts": "^5.3.3", + "mocha": "^10.2.0", "mockdate": "^3.0.5", "moment": "^2.24.0", - "protoc": "^1.0.4", - "shelljs": "^0.8.3", - "sinon": "^12.0.1", - "sinon-chai": "^3.7.0", - "typemoq": "^2.1.0", - "uuid": "^3.2.1", - "yargs": "^11.1.0" + "ncp": "^2.0.0", + "rimraf": "^5.0.0" }, "optionalDependencies": { - "grpc-tools": "^1.9.0" + "@pingghost/protoc": "^1.0.2", + "grpc-tools": "^1.12.4" }, "mocha": { "require": [ @@ -142,34 +150,42 @@ "examples" ], "theiaExtensions": [ + { + "preload": "lib/electron-browser/preload" + }, { "backend": "lib/node/arduino-ide-backend-module", "frontend": "lib/browser/arduino-ide-frontend-module" }, { - "frontend": "lib/browser/theia/core/browser-menu-module", "frontendElectron": "lib/electron-browser/theia/core/electron-menu-module" }, { - "frontend": "lib/browser/theia/core/browser-window-module", "frontendElectron": "lib/electron-browser/theia/core/electron-window-module" }, + { + "frontendElectron": "lib/electron-browser/electron-arduino-module" + }, { "electronMain": "lib/electron-main/arduino-electron-main-module" } ], "arduino": { - "cli": { - "version": "0.27.1" + "arduino-cli": { + "version": "1.2.0" }, - "fwuploader": { - "version": "2.2.0" + "arduino-fwuploader": { + "version": "2.4.1" + }, + "arduino-language-server": { + "version": { + "owner": "arduino", + "repo": "arduino-language-server", + "commitish": "05ec308" + } }, "clangd": { "version": "14.0.0" - }, - "languageServer": { - "version": "0.7.1" } } } diff --git a/arduino-ide-extension/scripts/compose-changelog.js b/arduino-ide-extension/scripts/compose-changelog.js index aba9dae46..f8a4c42ba 100755 --- a/arduino-ide-extension/scripts/compose-changelog.js +++ b/arduino-ide-extension/scripts/compose-changelog.js @@ -34,7 +34,7 @@ }, ''); const args = process.argv.slice(2); - if (args.length == 0) { + if (args.length === 0) { console.error('Missing argument to destination file'); process.exit(1); } diff --git a/arduino-ide-extension/scripts/download-cli.js b/arduino-ide-extension/scripts/download-cli.js index 531e22a50..df4873706 100755 --- a/arduino-ide-extension/scripts/download-cli.js +++ b/arduino-ide-extension/scripts/download-cli.js @@ -2,7 +2,6 @@ (async () => { const path = require('path'); - const shell = require('shelljs'); const semver = require('semver'); const moment = require('moment'); const downloader = require('./downloader'); @@ -19,7 +18,7 @@ return undefined; } - const { cli } = arduino; + const cli = arduino['arduino-cli']; if (!cli) { return undefined; } @@ -29,19 +28,28 @@ })(); if (!version) { - shell.echo(`Could not retrieve CLI version info from the 'package.json'.`); - shell.exit(1); + console.log(`Could not retrieve CLI version info from the 'package.json'.`); + process.exit(1); } const { platform, arch } = process; - const buildFolder = path.join(__dirname, '..', 'build'); + const resourcesFolder = path.join( + __dirname, + '..', + 'src', + 'node', + 'resources' + ); const cliName = `arduino-cli${platform === 'win32' ? '.exe' : ''}`; - const destinationPath = path.join(buildFolder, cliName); + const destinationPath = path.join(resourcesFolder, cliName); if (typeof version === 'string') { const suffix = (() => { switch (platform) { case 'darwin': + if (arch === 'arm64') { + return 'macOS_ARM64.tar.gz'; + } return 'macOS_64bit.tar.gz'; case 'win32': return 'Windows_64bit.zip'; @@ -62,24 +70,24 @@ } })(); if (!suffix) { - shell.echo(`The CLI is not available for ${platform} ${arch}.`); - shell.exit(1); + console.log(`The CLI is not available for ${platform} ${arch}.`); + process.exit(1); } if (semver.valid(version)) { const url = `https://downloads.arduino.cc/arduino-cli/arduino-cli_${version}_${suffix}`; - shell.echo( + console.log( `📦 Identified released version of the CLI. Downloading version ${version} from '${url}'` ); await downloader.downloadUnzipFile(url, destinationPath, 'arduino-cli'); } else if (moment(version, 'YYYYMMDD', true).isValid()) { const url = `https://downloads.arduino.cc/arduino-cli/nightly/arduino-cli_nightly-${version}_${suffix}`; - shell.echo( + console.log( `🌙 Identified nightly version of the CLI. Downloading version ${version} from '${url}'` ); await downloader.downloadUnzipFile(url, destinationPath, 'arduino-cli'); } else { - shell.echo(`🔥 Could not interpret 'version': ${version}`); - shell.exit(1); + console.log(`🔥 Could not interpret 'version': ${version}`); + process.exit(1); } } else { taskBuildFromGit(version, destinationPath, 'CLI'); diff --git a/arduino-ide-extension/scripts/download-examples.js b/arduino-ide-extension/scripts/download-examples.js index c7bcf9865..f58b465e2 100644 --- a/arduino-ide-extension/scripts/download-examples.js +++ b/arduino-ide-extension/scripts/download-examples.js @@ -1,38 +1,61 @@ // @ts-check // The version to use. -const version = '1.9.1'; +const version = '1.10.2'; (async () => { - const os = require('os'); - const { promises: fs } = require('fs'); - const path = require('path'); - const shell = require('shelljs'); - const { v4 } = require('uuid'); + const os = require('node:os'); + const { + existsSync, + promises: fs, + mkdirSync, + readdirSync, + cpSync, + } = require('node:fs'); + const path = require('node:path'); + const { exec } = require('./utils'); - const repository = path.join(os.tmpdir(), `${v4()}-arduino-examples`); - if (shell.mkdir('-p', repository).code !== 0) { - shell.exit(1); + const destination = path.join( + __dirname, + '..', + 'src', + 'node', + 'resources', + 'Examples' + ); + if (existsSync(destination)) { + console.log( + `Skipping Git checkout of the examples because the repository already exists: ${destination}` + ); + return; } - if ( - shell.exec( - `git clone https://github.com/arduino/arduino-examples.git ${repository}` - ).code !== 0 - ) { - shell.exit(1); - } + const repository = await fs.mkdtemp( + path.join(os.tmpdir(), 'arduino-examples-') + ); - if ( - shell.exec(`git -C ${repository} checkout tags/${version} -b ${version}`) - .code !== 0 - ) { - shell.exit(1); - } + exec( + 'git', + ['clone', 'https://github.com/arduino/arduino-examples.git', repository], + { logStdout: true } + ); + + exec( + 'git', + ['-C', repository, 'checkout', `tags/${version}`, '-b', version], + { logStdout: true } + ); - const destination = path.join(__dirname, '..', 'Examples'); - shell.mkdir('-p', destination); - shell.cp('-fR', path.join(repository, 'examples', '*'), destination); + mkdirSync(destination, { recursive: true }); + const examplesPath = path.join(repository, 'examples'); + const exampleResources = readdirSync(examplesPath); + for (const exampleResource of exampleResources) { + cpSync( + path.join(examplesPath, exampleResource), + path.join(destination, exampleResource), + { recursive: true } + ); + } const isSketch = async (pathLike) => { try { @@ -92,5 +115,5 @@ const version = '1.9.1'; JSON.stringify(examples, null, 2), { encoding: 'utf8' } ); - shell.echo(`Generated output to ${path.join(destination, 'examples.json')}`); + console.log(`Generated output to ${path.join(destination, 'examples.json')}`); })(); diff --git a/arduino-ide-extension/scripts/download-fwuploader.js b/arduino-ide-extension/scripts/download-fwuploader.js index 4c13b628a..54b527b1d 100755 --- a/arduino-ide-extension/scripts/download-fwuploader.js +++ b/arduino-ide-extension/scripts/download-fwuploader.js @@ -1,12 +1,10 @@ // @ts-check (async () => { - const fs = require('fs'); - const path = require('path'); - const temp = require('temp'); - const shell = require('shelljs'); + const path = require('node:path'); const semver = require('semver'); const downloader = require('./downloader'); + const { taskBuildFromGit } = require('./utils'); const version = (() => { const pkg = require(path.join(__dirname, '..', 'package.json')); @@ -19,7 +17,7 @@ return undefined; } - const { fwuploader } = arduino; + const fwuploader = arduino['arduino-fwuploader']; if (!fwuploader) { return undefined; } @@ -29,24 +27,37 @@ })(); if (!version) { - shell.echo( + console.log( `Could not retrieve Firmware Uploader version info from the 'package.json'.` ); - shell.exit(1); + process.exit(1); } const { platform, arch } = process; - const buildFolder = path.join(__dirname, '..', 'build'); + const resourcesFolder = path.join( + __dirname, + '..', + 'src', + 'node', + 'resources' + ); const fwuploderName = `arduino-fwuploader${ platform === 'win32' ? '.exe' : '' }`; - const destinationPath = path.join(buildFolder, fwuploderName); + const destinationPath = path.join(resourcesFolder, fwuploderName); if (typeof version === 'string') { const suffix = (() => { switch (platform) { case 'darwin': - return 'macOS_64bit.tar.gz'; + switch (arch) { + case 'arm64': + return 'macOS_ARM64.tar.gz'; + case 'x64': + return 'macOS_64bit.tar.gz'; + default: + return undefined; + } case 'win32': return 'Windows_64bit.zip'; case 'linux': { @@ -66,14 +77,14 @@ } })(); if (!suffix) { - shell.echo( + console.log( `The Firmware Uploader is not available for ${platform} ${arch}.` ); - shell.exit(1); + process.exit(1); } if (semver.valid(version)) { const url = `https://downloads.arduino.cc/arduino-fwuploader/arduino-fwuploader_${version}_${suffix}`; - shell.echo( + console.log( `📦 Identified released version of the Firmware Uploader. Downloading version ${version} from '${url}'` ); await downloader.downloadUnzipFile( @@ -82,85 +93,10 @@ 'arduino-fwuploader' ); } else { - shell.echo(`🔥 Could not interpret 'version': ${version}`); - shell.exit(1); + console.log(`🔥 Could not interpret 'version': ${version}`); + process.exit(1); } } else { - // We assume an object with `owner`, `repo`, commitish?` properties. - const { owner, repo, commitish } = version; - if (!owner) { - shell.echo(`Could not retrieve 'owner' from ${JSON.stringify(version)}`); - shell.exit(1); - } - if (!repo) { - shell.echo(`Could not retrieve 'repo' from ${JSON.stringify(version)}`); - shell.exit(1); - } - const url = `https://github.com/${owner}/${repo}.git`; - shell.echo( - `Building Firmware Uploader from ${url}. Commitish: ${ - commitish ? commitish : 'HEAD' - }` - ); - - if (fs.existsSync(destinationPath)) { - shell.echo( - `Skipping the Firmware Uploader build because it already exists: ${destinationPath}` - ); - return; - } - - if (shell.mkdir('-p', buildFolder).code !== 0) { - shell.echo('Could not create build folder.'); - shell.exit(1); - } - - const tempRepoPath = temp.mkdirSync(); - shell.echo(`>>> Cloning Firmware Uploader source to ${tempRepoPath}...`); - if (shell.exec(`git clone ${url} ${tempRepoPath}`).code !== 0) { - shell.exit(1); - } - shell.echo('<<< Cloned Firmware Uploader repo.'); - - if (commitish) { - shell.echo(`>>> Checking out ${commitish}...`); - if ( - shell.exec(`git -C ${tempRepoPath} checkout ${commitish}`).code !== 0 - ) { - shell.exit(1); - } - shell.echo(`<<< Checked out ${commitish}.`); - } - - shell.echo(`>>> Building the Firmware Uploader...`); - if (shell.exec('go build', { cwd: tempRepoPath }).code !== 0) { - shell.exit(1); - } - shell.echo('<<< Firmware Uploader build done.'); - - if (!fs.existsSync(path.join(tempRepoPath, fwuploderName))) { - shell.echo( - `Could not find the Firmware Uploader at ${path.join( - tempRepoPath, - fwuploderName - )}.` - ); - shell.exit(1); - } - - const builtFwUploaderPath = path.join(tempRepoPath, fwuploderName); - shell.echo( - `>>> Copying Firmware Uploader from ${builtFwUploaderPath} to ${destinationPath}...` - ); - if (shell.cp(builtFwUploaderPath, destinationPath).code !== 0) { - shell.exit(1); - } - shell.echo(`<<< Copied the Firmware Uploader.`); - - shell.echo('<<< Verifying Firmware Uploader...'); - if (!fs.existsSync(destinationPath)) { - shell.exit(1); - } - shell.echo('>>> Verified Firmware Uploader.'); + taskBuildFromGit(version, destinationPath, 'Firmware Uploader'); } })(); diff --git a/arduino-ide-extension/scripts/download-ls.js b/arduino-ide-extension/scripts/download-ls.js index a67c65929..8fc2e1989 100755 --- a/arduino-ide-extension/scripts/download-ls.js +++ b/arduino-ide-extension/scripts/download-ls.js @@ -5,7 +5,6 @@ (() => { const path = require('path'); - const shell = require('shelljs'); const downloader = require('./downloader'); const { goBuildFromGit } = require('./utils'); @@ -16,7 +15,8 @@ const { arduino } = pkg; if (!arduino) return [undefined, undefined]; - const { languageServer, clangd } = arduino; + const { clangd } = arduino; + const languageServer = arduino['arduino-language-server']; if (!languageServer) return [undefined, undefined]; if (!clangd) return [undefined, undefined]; @@ -24,20 +24,20 @@ })(); if (!DEFAULT_LS_VERSION) { - shell.echo( + console.log( `Could not retrieve Arduino Language Server version info from the 'package.json'.` ); - shell.exit(1); + process.exit(1); } if (!DEFAULT_CLANGD_VERSION) { - shell.echo( + console.log( `Could not retrieve clangd version info from the 'package.json'.` ); - shell.exit(1); + process.exit(1); } - const yargs = require('yargs') + const yargs = require('@theia/core/shared/yargs') .option('ls-version', { alias: 'lv', default: DEFAULT_LS_VERSION, @@ -62,29 +62,50 @@ const force = yargs['force-download']; const { platform, arch } = process; const platformArch = platform + '-' + arch; - const build = path.join(__dirname, '..', 'build'); + const resourcesFolder = path.join( + __dirname, + '..', + 'src', + 'node', + 'resources' + ); const lsExecutablePath = path.join( - build, + resourcesFolder, `arduino-language-server${platform === 'win32' ? '.exe' : ''}` ); let clangdExecutablePath, clangFormatExecutablePath, lsSuffix, clangdSuffix; switch (platformArch) { case 'darwin-x64': - clangdExecutablePath = path.join(build, 'clangd'); - clangFormatExecutablePath = path.join(build, 'clang-format'); + clangdExecutablePath = path.join(resourcesFolder, 'clangd'); + clangFormatExecutablePath = path.join(resourcesFolder, 'clang-format'); lsSuffix = 'macOS_64bit.tar.gz'; clangdSuffix = 'macOS_64bit'; break; + case 'darwin-arm64': + clangdExecutablePath = path.join(resourcesFolder, 'clangd'); + clangFormatExecutablePath = path.join(resourcesFolder, 'clang-format'); + lsSuffix = 'macOS_ARM64.tar.gz'; + clangdSuffix = 'macOS_ARM64'; + break; case 'linux-x64': - clangdExecutablePath = path.join(build, 'clangd'); - clangFormatExecutablePath = path.join(build, 'clang-format'); + clangdExecutablePath = path.join(resourcesFolder, 'clangd'); + clangFormatExecutablePath = path.join(resourcesFolder, 'clang-format'); lsSuffix = 'Linux_64bit.tar.gz'; clangdSuffix = 'Linux_64bit'; break; + case 'linux-arm64': + clangdExecutablePath = path.join(resourcesFolder, 'clangd'); + clangFormatExecutablePath = path.join(resourcesFolder, 'clang-format'); + lsSuffix = 'Linux_ARM64.tar.gz'; + clangdSuffix = 'Linux_ARM64'; + break; case 'win32-x64': - clangdExecutablePath = path.join(build, 'clangd.exe'); - clangFormatExecutablePath = path.join(build, 'clang-format.exe'); + clangdExecutablePath = path.join(resourcesFolder, 'clangd.exe'); + clangFormatExecutablePath = path.join( + resourcesFolder, + 'clang-format.exe' + ); lsSuffix = 'Windows_64bit.zip'; clangdSuffix = 'Windows_64bit'; break; @@ -92,10 +113,10 @@ throw new Error(`Unsupported platform/arch: ${platformArch}.`); } if (!lsSuffix || !clangdSuffix) { - shell.echo( + console.log( `The arduino-language-server is not available for ${platform} ${arch}.` ); - shell.exit(1); + process.exit(1); } if (typeof lsVersion === 'string') { @@ -104,20 +125,31 @@ ? 'nightly/arduino-language-server' : 'arduino-language-server_' + lsVersion }_${lsSuffix}`; - downloader.downloadUnzipAll(lsUrl, build, lsExecutablePath, force); + downloader.downloadUnzipAll( + lsUrl, + resourcesFolder, + lsExecutablePath, + force + ); } else { goBuildFromGit(lsVersion, lsExecutablePath, 'language-server'); } const clangdUrl = `https://downloads.arduino.cc/tools/clangd_${clangdVersion}_${clangdSuffix}.tar.bz2`; - downloader.downloadUnzipAll(clangdUrl, build, clangdExecutablePath, force, { - strip: 1, - }); // `strip`: the new clangd (12.x) is zipped into a folder, so we have to strip the outmost folder. + downloader.downloadUnzipAll( + clangdUrl, + resourcesFolder, + clangdExecutablePath, + force, + { + strip: 1, + } + ); // `strip`: the new clangd (12.x) is zipped into a folder, so we have to strip the outmost folder. const clangdFormatUrl = `https://downloads.arduino.cc/tools/clang-format_${clangdVersion}_${clangdSuffix}.tar.bz2`; downloader.downloadUnzipAll( clangdFormatUrl, - build, + resourcesFolder, clangFormatExecutablePath, force, { diff --git a/arduino-ide-extension/scripts/downloader.js b/arduino-ide-extension/scripts/downloader.js index 41041cd2f..dc1939ccc 100644 --- a/arduino-ide-extension/scripts/downloader.js +++ b/arduino-ide-extension/scripts/downloader.js @@ -1,21 +1,19 @@ +// @ts-check + const fs = require('fs'); const path = require('path'); -const shell = require('shelljs'); -const download = require('download'); const decompress = require('decompress'); const unzip = require('decompress-unzip'); const untargz = require('decompress-targz'); const untarbz2 = require('decompress-tarbz2'); -process.on('unhandledRejection', (reason, _) => { - shell.echo(String(reason)); - shell.exit(1); - throw reason; +process.on('unhandledRejection', (reason) => { + console.log(String(reason)); + process.exit(1); }); process.on('uncaughtException', (error) => { - shell.echo(String(error)); - shell.exit(1); - throw error; + console.log(String(error)); + process.exit(1); }); /** @@ -31,54 +29,42 @@ exports.downloadUnzipFile = async ( force = false ) => { if (fs.existsSync(targetFile) && !force) { - shell.echo(`Skipping download because file already exists: ${targetFile}`); + console.log(`Skipping download because file already exists: ${targetFile}`); return; } - if (!fs.existsSync(path.dirname(targetFile))) { - if (shell.mkdir('-p', path.dirname(targetFile)).code !== 0) { - shell.echo('Could not create new directory.'); - shell.exit(1); - } - } + fs.mkdirSync(path.dirname(targetFile), { recursive: true }); const downloads = path.join(__dirname, '..', 'downloads'); - if (shell.rm('-rf', targetFile, downloads).code !== 0) { - shell.exit(1); - } + fs.rmSync(targetFile, { recursive: true, force: true }); + fs.rmSync(downloads, { recursive: true, force: true }); - shell.echo(`>>> Downloading from '${url}'...`); + console.log(`>>> Downloading from '${url}'...`); const data = await download(url); - shell.echo(`<<< Download succeeded.`); + console.log(`<<< Download succeeded.`); - shell.echo('>>> Decompressing...'); + console.log('>>> Decompressing...'); const files = await decompress(data, downloads, { plugins: [unzip(), untargz(), untarbz2()], }); if (files.length === 0) { - shell.echo('Error ocurred while decompressing the archive.'); - shell.exit(1); + console.log('Error ocurred while decompressing the archive.'); + process.exit(1); } const fileIndex = files.findIndex((f) => f.path.startsWith(filePrefix)); if (fileIndex === -1) { - shell.echo( + console.log( `The downloaded artifact does not contain any file with prefix ${filePrefix}.` ); - shell.exit(1); + process.exit(1); } - shell.echo('<<< Decompressing succeeded.'); + console.log('<<< Decompressing succeeded.'); - if ( - shell.mv('-f', path.join(downloads, files[fileIndex].path), targetFile) - .code !== 0 - ) { - shell.echo(`Could not move file to target path: ${targetFile}`); - shell.exit(1); - } + fs.renameSync(path.join(downloads, files[fileIndex].path), targetFile); if (!fs.existsSync(targetFile)) { - shell.echo(`Could not find file: ${targetFile}`); - shell.exit(1); + console.log(`Could not find file: ${targetFile}`); + process.exit(1); } - shell.echo(`Done: ${targetFile}`); + console.log(`Done: ${targetFile}`); }; /** @@ -86,7 +72,7 @@ exports.downloadUnzipFile = async ( * @param targetDir {string} Directory into which to decompress the archive * @param targetFile {string} Path to the main file expected after decompressing * @param force {boolean} Whether to download even if the target file exists - * @param decompressOptions {import('decompress').DecompressOptions} + * @param decompressOptions {import('decompress').DecompressOptions|undefined} [decompressOptions] */ exports.downloadUnzipAll = async ( url, @@ -96,21 +82,16 @@ exports.downloadUnzipAll = async ( decompressOptions = undefined ) => { if (fs.existsSync(targetFile) && !force) { - shell.echo(`Skipping download because file already exists: ${targetFile}`); + console.log(`Skipping download because file already exists: ${targetFile}`); return; } - if (!fs.existsSync(targetDir)) { - if (shell.mkdir('-p', targetDir).code !== 0) { - shell.echo('Could not create new directory.'); - shell.exit(1); - } - } + fs.mkdirSync(targetDir, { recursive: true }); - shell.echo(`>>> Downloading from '${url}'...`); + console.log(`>>> Downloading from '${url}'...`); const data = await download(url); - shell.echo(`<<< Download succeeded.`); + console.log(`<<< Download succeeded.`); - shell.echo('>>> Decompressing...'); + console.log('>>> Decompressing...'); let options = { plugins: [unzip(), untargz(), untarbz2()], }; @@ -119,14 +100,27 @@ exports.downloadUnzipAll = async ( } const files = await decompress(data, targetDir, options); if (files.length === 0) { - shell.echo('Error ocurred while decompressing the archive.'); - shell.exit(1); + console.log('Error ocurred while decompressing the archive.'); + process.exit(1); } - shell.echo('<<< Decompressing succeeded.'); + console.log('<<< Decompressing succeeded.'); if (!fs.existsSync(targetFile)) { - shell.echo(`Could not find file: ${targetFile}`); - shell.exit(1); + console.log(`Could not find file: ${targetFile}`); + process.exit(1); } - shell.echo(`Done: ${targetFile}`); + console.log(`Done: ${targetFile}`); }; + +/** + * @param {string} url + * @returns {Promise} + */ +async function download(url) { + const { default: download } = await import('@xhmikosr/downloader'); + /** @type {import('node:buffer').Buffer} */ + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + const data = await download(url); + return data; +} diff --git a/arduino-ide-extension/scripts/generate-protocol.js b/arduino-ide-extension/scripts/generate-protocol.js index ca51d6d71..7e0cf8a55 100644 --- a/arduino-ide-extension/scripts/generate-protocol.js +++ b/arduino-ide-extension/scripts/generate-protocol.js @@ -1,82 +1,88 @@ // @ts-check (async () => { + const os = require('node:os'); + const path = require('node:path'); + const decompress = require('decompress'); + const unzip = require('decompress-unzip'); + const { mkdirSync, promises: fs, rmSync, existsSync } = require('node:fs'); + const { exec } = require('./utils'); + const { glob } = require('glob'); + const { SemVer, gte, valid: validSemVer, eq } = require('semver'); + // Use a node-protoc fork until apple arm32 is supported + // https://github.com/YePpHa/node-protoc/pull/10 + const protoc = path.dirname(require('@pingghost/protoc/protoc')); - const os = require('os'); - const path = require('path'); - const glob = require('glob'); - const { v4 } = require('uuid'); - const shell = require('shelljs'); - const protoc = path.dirname(require('protoc/protoc')); - shell.env.PATH = `${shell.env.PATH}${path.delimiter}${protoc}`; - shell.env.PATH = `${shell.env.PATH}${path.delimiter}${path.join(__dirname, '..', 'node_modules', '.bin')}`; - - const repository = path.join(os.tmpdir(), `${v4()}-arduino-cli`); - if (shell.mkdir('-p', repository).code !== 0) { - shell.exit(1); + const { owner, repo, commitish } = (() => { + const pkg = require(path.join(__dirname, '..', 'package.json')); + if (!pkg) { + console.log(`Could not parse the 'package.json'.`); + process.exit(1); } - const { owner, repo, commitish } = (() => { - const pkg = require(path.join(__dirname, '..', 'package.json')); - if (!pkg) { - shell.echo(`Could not parse the 'package.json'.`); - shell.exit(1); - } - - const { arduino } = pkg; - if (!arduino) { - return { owner: 'arduino', repo: 'arduino-cli' }; - } - - const { cli } = arduino; - if (!cli) { - return { owner: 'arduino', repo: 'arduino-cli' }; - } - - const { version } = cli; - if (!version) { - return { owner: 'arduino', repo: 'arduino-cli' }; - } - - if (typeof version === 'string') { - return { owner: 'arduino', repo: 'arduino-cli' }; - } - - // We assume an object with `owner`, `repo`, commitish?` properties. - const { owner, repo, commitish } = version; - if (!owner) { - shell.echo(`Could not retrieve 'owner' from ${JSON.stringify(version)}`); - shell.exit(1); - } - if (!repo) { - shell.echo(`Could not retrieve 'repo' from ${JSON.stringify(version)}`); - shell.exit(1); - } - - return { owner, repo, commitish }; - })(); + const defaultVersion = { + owner: 'arduino', + repo: 'arduino-cli', + commitish: undefined, + }; + const { arduino } = pkg; + if (!arduino) { + return defaultVersion; + } - const url = `https://github.com/${owner}/${repo}.git`; - shell.echo(`>>> Cloning repository from '${url}'...`); - if (shell.exec(`git clone ${url} ${repository}`).code !== 0) { - shell.exit(1); + const cli = arduino['arduino-cli']; + if (!cli) { + return defaultVersion; + } + + const { version } = cli; + if (!version) { + return defaultVersion; + } + + if (typeof version === 'string') { + return defaultVersion; + } + + // We assume an object with `owner`, `repo`, commitish?` properties. + const { owner, repo, commitish } = version; + if (!owner) { + console.log(`Could not retrieve 'owner' from ${JSON.stringify(version)}`); + process.exit(1); } - shell.echo(`<<< Repository cloned.`); - - const { platform } = process; - const build = path.join(__dirname, '..', 'build'); - const cli = path.join(build, `arduino-cli${platform === 'win32' ? '.exe' : ''}`); - const versionJson = shell.exec(`${cli} version --format json`).trim(); - if (!versionJson) { - shell.echo(`Could not retrieve the CLI version from ${cli}.`); - shell.exit(1); + if (!repo) { + console.log(`Could not retrieve 'repo' from ${JSON.stringify(version)}`); + process.exit(1); } - // As of today (28.01.2021), the `VersionString` can be one of the followings: - // - `nightly-YYYYMMDD` stands for the nightly build, we use the , the `commitish` from the `package.json` to check out the code. - // - `0.0.0-git` for local builds, we use the `commitish` from the `package.json` to check out the code and generate the APIs. - // - `git-snapshot` for local build executed via `task build`. We do not do this. - // - rest, we assume it is a valid semver and has the corresponding tagged code, we use the tag to generate the APIs from the `proto` files. - /* + + return { owner, repo, commitish }; + })(); + + const { platform } = process; + const resourcesFolder = path.join( + __dirname, + '..', + 'src', + 'node', + 'resources' + ); + const cli = path.join( + resourcesFolder, + `arduino-cli${platform === 'win32' ? '.exe' : ''}` + ); + const versionJson = exec(cli, ['version', '--format', 'json'], { + logStdout: true, + }).trim(); + if (!versionJson) { + console.log(`Could not retrieve the CLI version from ${cli}.`); + process.exit(1); + } + // As of today (28.01.2021), the `VersionString` can be one of the followings: + // - `nightly-YYYYMMDD` stands for the nightly build, we use the , the `commitish` from the `package.json` to check out the code. + // - `0.0.0-git` for local builds, we use the `commitish` from the `package.json` to check out the code and generate the APIs. + // - `git-snapshot` for local build executed via `task build`. We do not do this. + // - rest, we assume it is a valid semver and has the corresponding tagged code, we use the tag to generate the APIs from the `proto` files. + /* { "Application": "arduino-cli", "VersionString": "nightly-20210126", @@ -84,73 +90,200 @@ "Status": "alpha", "Date": "2021-01-26T01:46:31Z" } - */ - const versionObject = JSON.parse(versionJson); - const version = versionObject.VersionString; - if (version && !version.startsWith('nightly-') && version !== '0.0.0-git' && version !== 'git-snapshot') { - shell.echo(`>>> Checking out tagged version: '${version}'...`); - shell.exec(`git -C ${repository} fetch --all --tags`); - if (shell.exec(`git -C ${repository} checkout tags/${version} -b ${version}`).code !== 0) { - shell.exit(1); - } - shell.echo(`<<< Checked out tagged version: '${commitish}'.`); + */ + const versionObject = JSON.parse(versionJson); + + async function globProtos(folder, pattern = '**/*.proto') { + let protos = []; + try { + const matches = await glob(pattern, { cwd: folder }); + protos = matches.map((filename) => path.join(folder, filename)); + } catch (error) { + console.log(error.stack ?? error.message); + } + return protos; + } + + async function getProtosFromRepo( + commitish = '', + version = '', + owner = 'arduino', + repo = 'arduino-cli' + ) { + const repoFolder = await fs.mkdtemp(path.join(os.tmpdir(), 'arduino-cli-')); + + const url = `https://github.com/${owner}/${repo}.git`; + console.log(`>>> Cloning repository from '${url}'...`); + exec('git', ['clone', url, repoFolder], { logStdout: true }); + console.log(`<<< Repository cloned.`); + + if (validSemVer(version)) { + let versionTag = version; + // https://github.com/arduino/arduino-cli/pull/2374 + if ( + gte(new SemVer(version, { loose: true }), new SemVer('0.35.0-rc.1')) + ) { + versionTag = `v${version}`; + } + console.log(`>>> Checking out tagged version: '${versionTag}'...`); + exec('git', ['-C', repoFolder, 'fetch', '--all', '--tags'], { + logStdout: true, + }); + exec( + 'git', + ['-C', repoFolder, 'checkout', `tags/${versionTag}`, '-b', versionTag], + { logStdout: true } + ); + console.log(`<<< Checked out tagged version: '${versionTag}'.`); } else if (commitish) { - shell.echo(`>>> Checking out commitish from 'package.json': '${commitish}'...`); - if (shell.exec(`git -C ${repository} checkout ${commitish}`).code !== 0) { - shell.exit(1); - } - shell.echo(`<<< Checked out commitish from 'package.json': '${commitish}'.`); - } else if (versionObject.Commit) { - shell.echo(`>>> Checking out commitish from the CLI: '${versionObject.Commit}'...`); - if (shell.exec(`git -C ${repository} checkout ${versionObject.Commit}`).code !== 0) { - shell.exit(1); - } - shell.echo(`<<< Checked out commitish from the CLI: '${versionObject.Commit}'.`); + console.log(`>>> Checking out commitish: '${commitish}'...`); + exec('git', ['-C', repoFolder, 'checkout', commitish], { + logStdout: true, + }); + console.log(`<<< Checked out commitish: '${commitish}'.`); } else { - shell.echo(`WARN: no 'git checkout'. Generating from the HEAD revision.`); + console.log( + `WARN: no 'git checkout'. Generating from the HEAD revision.` + ); } - shell.echo('>>> Generating TS/JS API from:'); - if (shell.exec(`git -C ${repository} rev-parse --abbrev-ref HEAD`).code !== 0) { - shell.exit(1); + const rpcFolder = await fs.mkdtemp( + path.join(os.tmpdir(), 'arduino-cli-rpc') + ); + + // Copy the the repository rpc folder so we can remove the repository + await fs.cp(path.join(repoFolder, 'rpc'), path.join(rpcFolder), { + recursive: true, + }); + rmSync(repoFolder, { recursive: true, maxRetries: 5, force: true }); + + // Patch for https://github.com/arduino/arduino-cli/issues/2755 + // Google proto files are removed from source since v1.1.0 + if (!existsSync(path.join(rpcFolder, 'google'))) { + // Include packaged google proto files from v1.1.1 + // See https://github.com/arduino/arduino-cli/pull/2761 + console.log(`>>> Missing google proto files. Including from v1.1.1...`); + const v111ProtoFolder = await getProtosFromZip('1.1.1'); + + // Create an return a folder name google in rpcFolder + const googleFolder = path.join(rpcFolder, 'google'); + await fs.cp(path.join(v111ProtoFolder, 'google'), googleFolder, { + recursive: true, + }); + console.log(`<<< Included google proto files from v1.1.1.`); } - const rpc = path.join(repository, 'rpc'); - const out = path.join(__dirname, '..', 'src', 'node', 'cli-protocol'); - shell.mkdir('-p', out); - - const protos = await new Promise(resolve => - glob('**/*.proto', { cwd: rpc }, (error, matches) => { - if (error) { - shell.echo(error.stack); - resolve([]); - return; - } - resolve(matches.map(filename => path.join(rpc, filename))); - })); - if (!protos || protos.length === 0) { - shell.echo(`Could not find any .proto files under ${rpc}.`); - shell.exit(1); + return rpcFolder; + } + + async function getProtosFromZip(version) { + if (!version) { + console.log(`Could not download proto files: CLI version not provided.`); + process.exit(1); } + console.log(`>>> Downloading proto files from zip for ${version}.`); + + const url = `https://downloads.arduino.cc/arduino-cli/arduino-cli_${version}_proto.zip`; + const protos = await fs.mkdtemp( + path.join(os.tmpdir(), 'arduino-cli-proto') + ); + + const { default: download } = await import('@xhmikosr/downloader'); + /** @type {import('node:buffer').Buffer} */ + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + const data = await download(url); + + await decompress(data, protos, { + plugins: [unzip()], + filter: (file) => file.path.endsWith('.proto'), + }); + + console.log( + `<<< Finished downloading and extracting proto files for ${version}.` + ); + + return protos; + } + + let protosFolder; + + if (commitish) { + protosFolder = await getProtosFromRepo(commitish, undefined, owner, repo); + } else if ( + versionObject.VersionString && + validSemVer(versionObject.VersionString) + ) { + const version = versionObject.VersionString; + // v1.1.0 does not contains google proto files in zip + // See https://github.com/arduino/arduino-cli/issues/2755 + const isV110 = eq(new SemVer(version, { loose: true }), '1.1.0'); + protosFolder = isV110 + ? await getProtosFromRepo(undefined, version) + : await getProtosFromZip(version); + } else if (versionObject.Commit) { + protosFolder = await getProtosFromRepo(versionObject.Commit); + } + + if (!protosFolder) { + console.log(`Could not get proto files: missing commitish or version.`); + process.exit(1); + } + + const protos = await globProtos(protosFolder); + + if (!protos || protos.length === 0) { + rmSync(protosFolder, { recursive: true, maxRetries: 5, force: true }); + console.log(`Could not find any .proto files under ${protosFolder}.`); + process.exit(1); + } + + console.log('>>> Generating TS/JS API from:'); + const out = path.join(__dirname, '..', 'src', 'node', 'cli-protocol'); + // Must wipe the gen output folder. Otherwise, dangling service implementation remain in IDE2 code, + // although it has been removed from the proto file. + // For example, https://github.com/arduino/arduino-cli/commit/50a8bf5c3e61d5b661ccfcd6a055e82eeb510859. + // rmSync(out, { recursive: true, maxRetries: 5, force: true }); + mkdirSync(out, { recursive: true }); + + try { // Generate JS code from the `.proto` files. - if (shell.exec(`grpc_tools_node_protoc \ ---js_out=import_style=commonjs,binary:${out} \ ---grpc_out=generate_package_definition:${out} \ --I ${rpc} \ -${protos.join(' ')}`).code !== 0) { - shell.exit(1); - } + exec( + 'grpc_tools_node_protoc', + [ + `--js_out=import_style=commonjs,binary:${out}`, + `--grpc_out=generate_package_definition:${out}`, + '-I', + protosFolder, + ...protos, + ], + { logStdout: true } + ); // Generate the `.d.ts` files for JS. - if (shell.exec(`protoc \ ---plugin=protoc-gen-ts=${path.resolve(__dirname, '..', 'node_modules', '.bin', `protoc-gen-ts${platform === 'win32' ? '.cmd' : ''}`)} \ ---ts_out=generate_package_definition:${out} \ --I ${rpc} \ -${protos.join(' ')}`).code !== 0) { - shell.exit(1); - } - - shell.echo('<<< Generation was successful.'); + exec( + path.join(protoc, `protoc${platform === 'win32' ? '.exe' : ''}`), + [ + `--plugin=protoc-gen-ts=${path.resolve( + __dirname, + '..', + 'node_modules', + '.bin', + `protoc-gen-ts${platform === 'win32' ? '.cmd' : ''}` + )}`, + `--ts_out=generate_package_definition:${out}`, + '-I', + protosFolder, + ...protos, + ], + { logStdout: true } + ); + } catch (error) { + console.log(error); + } finally { + rmSync(protosFolder, { recursive: true, maxRetries: 5, force: true }); + } + console.log('<<< Generation was successful.'); })(); diff --git a/arduino-ide-extension/scripts/utils.js b/arduino-ide-extension/scripts/utils.js index c7ca7851e..8b06a3cb1 100644 --- a/arduino-ide-extension/scripts/utils.js +++ b/arduino-ide-extension/scripts/utils.js @@ -1,3 +1,28 @@ +// @ts-check + +const exec = ( + /** @type {string} */ command, + /** @type {readonly string[]} */ args, + /** @type {Partial & { logStdout?: boolean }|undefined} */ options = undefined +) => { + try { + const stdout = require('node:child_process').execFileSync(command, args, { + encoding: 'utf8', + ...(options ?? {}), + }); + if (options?.logStdout) { + console.log(stdout.trim()); + } + return stdout; + } catch (err) { + console.log( + `Failed to execute ${command} with args: ${JSON.stringify(args)}` + ); + throw err; + } +}; +exports.exec = exec; + /** * Clones something from GitHub and builds it with [`Task`](https://taskfile.dev/). * @@ -21,90 +46,98 @@ exports.goBuildFromGit = (version, destinationPath, taskName) => { }; /** - * The `command` is either `go` or `task`. + * The `command` must be either `'go'` or `'task'`. + * @param {string} command + * @param {{ owner: any; repo: any; commitish: any; }} version + * @param {string} destinationPath + * @param {string} taskName */ function buildFromGit(command, version, destinationPath, taskName) { - const fs = require('fs'); - const path = require('path'); + const fs = require('node:fs'); + const path = require('node:path'); const temp = require('temp'); - const shell = require('shelljs'); // We assume an object with `owner`, `repo`, commitish?` properties. if (typeof version !== 'object') { - shell.echo( + console.log( `Expected a \`{ owner, repo, commitish }\` object. Got <${version}> instead.` ); } const { owner, repo, commitish } = version; if (!owner) { - shell.echo(`Could not retrieve 'owner' from ${JSON.stringify(version)}`); - shell.exit(1); + console.log(`Could not retrieve 'owner' from ${JSON.stringify(version)}`); + process.exit(1); } if (!repo) { - shell.echo(`Could not retrieve 'repo' from ${JSON.stringify(version)}`); - shell.exit(1); + console.log(`Could not retrieve 'repo' from ${JSON.stringify(version)}`); + process.exit(1); } const url = `https://github.com/${owner}/${repo}.git`; - shell.echo( + console.log( `Building ${taskName} from ${url}. Commitish: ${ commitish ? commitish : 'HEAD' }` ); if (fs.existsSync(destinationPath)) { - shell.echo( + console.log( `Skipping the ${taskName} build because it already exists: ${destinationPath}` ); return; } - const buildFolder = path.join(__dirname, '..', 'build'); - if (shell.mkdir('-p', buildFolder).code !== 0) { - shell.echo('Could not create build folder.'); - shell.exit(1); - } + const resourcesFolder = path.join( + __dirname, + '..', + 'src', + 'node', + 'resources' + ); + fs.mkdirSync(resourcesFolder, { recursive: true }); const tempRepoPath = temp.mkdirSync(); - shell.echo(`>>> Cloning ${taskName} source to ${tempRepoPath}...`); - if (shell.exec(`git clone ${url} ${tempRepoPath}`).code !== 0) { - shell.exit(1); - } - shell.echo(`<<< Cloned ${taskName} repo.`); + console.log(`>>> Cloning ${taskName} source to ${tempRepoPath}...`); + exec('git', ['clone', url, tempRepoPath], { logStdout: true }); + console.log(`<<< Cloned ${taskName} repo.`); if (commitish) { - shell.echo(`>>> Checking out ${commitish}...`); - if (shell.exec(`git -C ${tempRepoPath} checkout ${commitish}`).code !== 0) { - shell.exit(1); - } - shell.echo(`<<< Checked out ${commitish}.`); + console.log(`>>> Checking out ${commitish}...`); + exec('git', ['-C', tempRepoPath, 'checkout', commitish], { + logStdout: true, + }); + console.log(`<<< Checked out ${commitish}.`); } - shell.echo(`>>> Building the ${taskName}...`); - if (shell.exec(`${command} build`, { cwd: tempRepoPath }).code !== 0) { - shell.exit(1); - } - shell.echo(`<<< Done ${taskName} build.`); + exec('git', ['-C', tempRepoPath, 'rev-parse', '--short', 'HEAD'], { + logStdout: true, + }); + + console.log(`>>> Building the ${taskName}...`); + exec(command, ['build'], { + cwd: tempRepoPath, + encoding: 'utf8', + logStdout: true, + }); + console.log(`<<< Done ${taskName} build.`); const binName = path.basename(destinationPath); if (!fs.existsSync(path.join(tempRepoPath, binName))) { - shell.echo( + console.log( `Could not find the ${taskName} at ${path.join(tempRepoPath, binName)}.` ); - shell.exit(1); + process.exit(1); } const binPath = path.join(tempRepoPath, binName); - shell.echo( + console.log( `>>> Copying ${taskName} from ${binPath} to ${destinationPath}...` ); - if (shell.cp(binPath, destinationPath).code !== 0) { - shell.exit(1); - } - shell.echo(`<<< Copied the ${taskName}.`); + fs.copyFileSync(binPath, destinationPath); + console.log(`<<< Copied the ${taskName}.`); - shell.echo(`<<< Verifying ${taskName}...`); + console.log(`<<< Verifying ${taskName}...`); if (!fs.existsSync(destinationPath)) { - shell.exit(1); + process.exit(1); } - shell.echo(`>>> Verified ${taskName}.`); + console.log(`>>> Verified ${taskName}.`); } diff --git a/arduino-ide-extension/src/browser/app-service.ts b/arduino-ide-extension/src/browser/app-service.ts new file mode 100644 index 000000000..4598b9fd5 --- /dev/null +++ b/arduino-ide-extension/src/browser/app-service.ts @@ -0,0 +1,16 @@ +import type { Disposable } from '@theia/core/lib/common/disposable'; +import type { AppInfo } from '../electron-common/electron-arduino'; +import type { StartupTasks } from '../electron-common/startup-task'; +import type { Sketch } from './contributions/contribution'; + +export type { AppInfo }; + +export const AppService = Symbol('AppService'); +export interface AppService { + quit(): void; + info(): Promise; + registerStartupTasksHandler( + handler: (tasks: StartupTasks) => void + ): Disposable; + scheduleDeletion(sketch: Sketch): void; // TODO: find a better place +} diff --git a/arduino-ide-extension/src/browser/arduino-frontend-contribution.tsx b/arduino-ide-extension/src/browser/arduino-frontend-contribution.tsx index bcbd4747f..d5969aedf 100644 --- a/arduino-ide-extension/src/browser/arduino-frontend-contribution.tsx +++ b/arduino-ide-extension/src/browser/arduino-frontend-contribution.tsx @@ -1,44 +1,47 @@ -import * as remote from '@theia/core/electron-shared/@electron/remote'; -import { - inject, - injectable, - postConstruct, -} from '@theia/core/shared/inversify'; -import * as React from '@theia/core/shared/react'; -import { - MAIN_MENU_BAR, - MenuContribution, - MenuModelRegistry, -} from '@theia/core'; -import { - FrontendApplication, - FrontendApplicationContribution, -} from '@theia/core/lib/browser'; import { ColorContribution } from '@theia/core/lib/browser/color-application-contribution'; import { ColorRegistry } from '@theia/core/lib/browser/color-registry'; import { CommonMenus } from '@theia/core/lib/browser/common-frontend-contribution'; +import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application-contribution'; +import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state'; import { TabBarToolbarContribution, TabBarToolbarRegistry, } from '@theia/core/lib/browser/shell/tab-bar-toolbar'; -import { nls } from '@theia/core/lib/common'; +import { + ColorTheme, + CssStyleCollector, + StylingParticipant, +} from '@theia/core/lib/browser/styling-service'; import { CommandContribution, CommandRegistry, } from '@theia/core/lib/common/command'; +import { + MAIN_MENU_BAR, + MenuContribution, + MenuModelRegistry, +} from '@theia/core/lib/common/menu'; import { MessageService } from '@theia/core/lib/common/message-service'; -import { EditorCommands, EditorMainMenu } from '@theia/editor/lib/browser'; +import { nls } from '@theia/core/lib/common/nls'; +import { isHighContrast } from '@theia/core/lib/common/theme'; +import { ElectronWindowPreferences } from '@theia/core/lib/electron-browser/window/electron-window-preferences'; +import { + inject, + injectable, + postConstruct, +} from '@theia/core/shared/inversify'; +import React from '@theia/core/shared/react'; +import { EditorCommands } from '@theia/editor/lib/browser/editor-command'; +import { EditorMainMenu } from '@theia/editor/lib/browser/editor-menu'; import { MonacoMenus } from '@theia/monaco/lib/browser/monaco-menu'; import { FileNavigatorCommands } from '@theia/navigator/lib/browser/navigator-contribution'; import { TerminalMenus } from '@theia/terminal/lib/browser/terminal-frontend-contribution'; -import { ArduinoPreferences } from './arduino-preferences'; import { BoardsServiceProvider } from './boards/boards-service-provider'; import { BoardsToolBarItem } from './boards/boards-toolbar-item'; import { ArduinoMenus } from './menu/arduino-menus'; import { MonitorViewContribution } from './serial/monitor/monitor-view-contribution'; -import { ArduinoToolbar } from './toolbar/arduino-toolbar'; -import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state'; import { SerialPlotterContribution } from './serial/plotter/plotter-frontend-contribution'; +import { ArduinoToolbar } from './toolbar/arduino-toolbar'; @injectable() export class ArduinoFrontendContribution @@ -47,7 +50,8 @@ export class ArduinoFrontendContribution TabBarToolbarContribution, CommandContribution, MenuContribution, - ColorContribution + ColorContribution, + StylingParticipant { @inject(MessageService) private readonly messageService: MessageService; @@ -58,14 +62,14 @@ export class ArduinoFrontendContribution @inject(CommandRegistry) private readonly commandRegistry: CommandRegistry; - @inject(ArduinoPreferences) - private readonly arduinoPreferences: ArduinoPreferences; + @inject(ElectronWindowPreferences) + private readonly electronWindowPreferences: ElectronWindowPreferences; @inject(FrontendApplicationStateService) private readonly appStateService: FrontendApplicationStateService; @postConstruct() - protected async init(): Promise { + protected init(): void { if (!window.navigator.onLine) { // tslint:disable-next-line:max-line-length this.messageService.warn( @@ -77,30 +81,25 @@ export class ArduinoFrontendContribution } } - onStart(app: FrontendApplication): void { - this.arduinoPreferences.onPreferenceChanged((event) => { + onStart(): void { + this.electronWindowPreferences.onPreferenceChanged((event) => { if (event.newValue !== event.oldValue) { switch (event.preferenceName) { - case 'arduino.window.zoomLevel': + case 'window.zoomLevel': if (typeof event.newValue === 'number') { - const webContents = remote.getCurrentWebContents(); - webContents.setZoomLevel(event.newValue || 0); + window.electronTheiaCore.setZoomLevel(event.newValue || 0); } break; } } }); this.appStateService.reachedState('ready').then(() => - this.arduinoPreferences.ready.then(() => { - const webContents = remote.getCurrentWebContents(); - const zoomLevel = this.arduinoPreferences.get( - 'arduino.window.zoomLevel' - ); - webContents.setZoomLevel(zoomLevel); + this.electronWindowPreferences.ready.then(() => { + const zoomLevel = + this.electronWindowPreferences.get('window.zoomLevel'); + window.electronTheiaCore.setZoomLevel(zoomLevel); }) ); - // Removes the _Settings_ (cog) icon from the left sidebar - app.shell.leftPanelHandler.removeBottomMenu('settings-menu'); } registerToolbarItems(registry: TabBarToolbarRegistry): void { @@ -174,7 +173,8 @@ export class ArduinoFrontendContribution defaults: { dark: 'button.background', light: 'button.background', - hc: 'activityBar.inactiveForeground', + hcDark: 'activityBar.inactiveForeground', + hcLight: 'activityBar.inactiveForeground', }, description: 'Background color of the toolbar items. Such as Upload, Verify, etc.', @@ -184,7 +184,8 @@ export class ArduinoFrontendContribution defaults: { dark: 'button.hoverBackground', light: 'button.hoverBackground', - hc: 'button.background', + hcDark: 'button.background', + hcLight: 'button.background', }, description: 'Background color of the toolbar items when hovering over them. Such as Upload, Verify, etc.', @@ -194,7 +195,8 @@ export class ArduinoFrontendContribution defaults: { dark: 'secondaryButton.foreground', light: 'button.foreground', - hc: 'activityBar.inactiveForeground', + hcDark: 'activityBar.inactiveForeground', + hcLight: 'activityBar.inactiveForeground', }, description: 'Foreground color of the toolbar items. Such as Serial Monitor and Serial Plotter', @@ -204,7 +206,8 @@ export class ArduinoFrontendContribution defaults: { dark: 'secondaryButton.hoverBackground', light: 'button.hoverBackground', - hc: 'textLink.foreground', + hcDark: 'textLink.foreground', + hcLight: 'textLink.foreground', }, description: 'Background color of the toolbar items when hovering over them, such as "Serial Monitor" and "Serial Plotter"', @@ -214,7 +217,8 @@ export class ArduinoFrontendContribution defaults: { dark: 'editor.selectionBackground', light: 'editor.selectionBackground', - hc: 'textPreformat.foreground', + hcDark: 'textPreformat.foreground', + hcLight: 'textPreformat.foreground', }, description: 'Toggle color of the toolbar items when they are currently toggled (the command is in progress)', @@ -224,37 +228,38 @@ export class ArduinoFrontendContribution defaults: { dark: 'dropdown.border', light: 'dropdown.border', - hc: 'dropdown.border', + hcDark: 'dropdown.border', + hcLight: 'dropdown.border', }, description: 'Border color of the Board Selector.', }, - { id: 'arduino.toolbar.dropdown.borderActive', defaults: { dark: 'focusBorder', light: 'focusBorder', - hc: 'focusBorder', + hcDark: 'focusBorder', + hcLight: 'focusBorder', }, description: "Border color of the Board Selector when it's active", }, - { id: 'arduino.toolbar.dropdown.background', defaults: { dark: 'tab.unfocusedActiveBackground', light: 'dropdown.background', - hc: 'dropdown.background', + hcDark: 'dropdown.background', + hcLight: 'dropdown.background', }, description: 'Background color of the Board Selector.', }, - { id: 'arduino.toolbar.dropdown.label', defaults: { dark: 'dropdown.foreground', light: 'dropdown.foreground', - hc: 'dropdown.foreground', + hcDark: 'dropdown.foreground', + hcLight: 'dropdown.foreground', }, description: 'Font color of the Board Selector.', }, @@ -263,7 +268,8 @@ export class ArduinoFrontendContribution defaults: { dark: 'list.activeSelectionIconForeground', light: 'list.activeSelectionIconForeground', - hc: 'list.activeSelectionIconForeground', + hcDark: 'list.activeSelectionIconForeground', + hcLight: 'list.activeSelectionIconForeground', }, description: 'Color of the selected protocol icon in the Board Selector.', @@ -273,7 +279,8 @@ export class ArduinoFrontendContribution defaults: { dark: 'list.hoverBackground', light: 'list.hoverBackground', - hc: 'list.hoverBackground', + hcDark: 'list.hoverBackground', + hcLight: 'list.hoverBackground', }, description: 'Background color on hover of the Board Selector options.', }, @@ -282,11 +289,191 @@ export class ArduinoFrontendContribution defaults: { dark: 'list.activeSelectionBackground', light: 'list.activeSelectionBackground', - hc: 'list.activeSelectionBackground', + hcDark: 'list.activeSelectionBackground', + hcLight: 'list.activeSelectionBackground', }, description: 'Background color of the selected board in the Board Selector.', } ); } + + registerThemeStyle(theme: ColorTheme, collector: CssStyleCollector): void { + const warningForeground = theme.getColor('warningForeground'); + const warningBackground = theme.getColor('warningBackground'); + const focusBorder = theme.getColor('focusBorder'); + const contrastBorder = theme.getColor('contrastBorder'); + const notificationsBackground = theme.getColor('notifications.background'); + const buttonBorder = theme.getColor('button.border'); + const buttonBackground = theme.getColor('button.background') || 'none'; + const dropdownBackground = theme.getColor('dropdown.background'); + const arduinoToolbarButtonBackground = theme.getColor( + 'arduino.toolbar.button.background' + ); + if (isHighContrast(theme.type)) { + // toolbar items + collector.addRule(` + .p-TabBar-toolbar .item.arduino-tool-item.enabled:hover > div.toggle-serial-monitor, + .p-TabBar-toolbar .item.arduino-tool-item.enabled:hover > div.toggle-serial-plotter { + background: transparent; + } + `); + if (contrastBorder) { + collector.addRule(` + .quick-input-widget { + outline: 1px solid ${contrastBorder}; + outline-offset: -1px; + } + `); + } + if (focusBorder) { + // customized react-select widget + collector.addRule(` + .arduino-select__option--is-selected { + outline: 1px solid ${focusBorder}; + } + `); + collector.addRule(` + .arduino-select__option--is-focused { + outline: 1px dashed ${focusBorder}; + } + `); + // boards selector dropdown + collector.addRule(` + #select-board-dialog .selectBoardContainer .list .item:hover { + outline: 1px dashed ${focusBorder}; + } + `); + // button hover + collector.addRule(` + .theia-button:hover, + button.theia-button:hover { + outline: 1px dashed ${focusBorder}; + } + `); + collector.addRule(` + .theia-button { + border: 1px solid ${focusBorder}; + } + `); + collector.addRule(` + .component-list-item .header .installed-version:hover:before { + background-color: transparent; + outline: 1px dashed ${focusBorder}; + } + `); + // tree node + collector.addRule(` + .theia-TreeNode:hover { + outline: 1px dashed ${focusBorder}; + } + `); + collector.addRule(` + .quick-input-list .monaco-list-row.focused, + .theia-Tree .theia-TreeNode.theia-mod-selected { + outline: 1px dotted ${focusBorder}; + } + `); + collector.addRule(` + div#select-board-dialog .selectBoardContainer .list .item.selected, + .theia-Tree:focus .theia-TreeNode.theia-mod-selected, + .theia-Tree .ReactVirtualized__List:focus .theia-TreeNode.theia-mod-selected { + outline: 1px solid ${focusBorder}; + } + `); + // quick input + collector.addRule(` + .quick-input-list .monaco-list-row:hover { + outline: 1px dashed ${focusBorder}; + } + `); + // editor tab-bar + collector.addRule(` + .p-TabBar.theia-app-centers .p-TabBar-tab.p-mod-closable > .p-TabBar-tabCloseIcon:hover { + outline: 1px dashed ${focusBorder}; + } + `); + collector.addRule(` + #theia-main-content-panel .p-TabBar .p-TabBar-tab:hover { + outline: 1px dashed ${focusBorder}; + outline-offset: -4px; + } + `); + collector.addRule(` + #theia-main-content-panel .p-TabBar .p-TabBar-tab.p-mod-current { + outline: 1px solid ${focusBorder}; + outline-offset: -4px; + } + `); + // boards selector dropdown + collector.addRule(` + .arduino-boards-dropdown-item:hover { + outline: 1px dashed ${focusBorder}; + outline-offset: -2px; + } + `); + if (notificationsBackground) { + // notification + collector.addRule(` + .theia-notification-list-item:hover:not(:focus) { + background-color: ${notificationsBackground}; + outline: 1px dashed ${focusBorder}; + outline-offset: -2px; + } + `); + } + if (arduinoToolbarButtonBackground) { + // toolbar item + collector.addRule(` + .item.arduino-tool-item.toggled .arduino-upload-sketch--toolbar, + .item.arduino-tool-item.toggled .arduino-verify-sketch--toolbar { + background-color: ${arduinoToolbarButtonBackground} !important; + outline: 1px solid ${focusBorder}; + } + `); + collector.addRule(` + .p-TabBar-toolbar .item.arduino-tool-item.enabled:hover > div { + background: ${arduinoToolbarButtonBackground}; + outline: 1px dashed ${focusBorder}; + } + `); + } + } + if (dropdownBackground) { + // boards selector dropdown + collector.addRule(` + .arduino-boards-dropdown-item:hover { + background: ${dropdownBackground}; + } + `); + } + if (warningForeground && warningBackground) { + // widget with inverted foreground and background colors + collector.addRule(` + .theia-input.warning:focus, + .theia-input.warning::placeholder, + .theia-input.warning { + color: ${warningBackground}; + background-color: ${warningForeground}; + } + `); + } + if (buttonBorder) { + collector.addRule(` + button.theia-button, + button.theia-button.secondary, + .component-list-item .theia-button.secondary.no-border, + .component-list-item .theia-button.secondary.no-border:hover { + border: 1px solid ${buttonBorder}; + } + `); + collector.addRule(` + .component-list-item .header .installed-version:before { + color: ${buttonBackground}; + border: 1px solid ${buttonBorder}; + } + `); + } + } + } } diff --git a/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts b/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts index 9ff8a5389..9625ffae5 100644 --- a/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts +++ b/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts @@ -1,17 +1,12 @@ import '../../src/browser/style/index.css'; -import { ContainerModule } from '@theia/core/shared/inversify'; +import { Container, ContainerModule } from '@theia/core/shared/inversify'; import { WidgetFactory } from '@theia/core/lib/browser/widget-manager'; import { CommandContribution } from '@theia/core/lib/common/command'; import { bindViewContribution } from '@theia/core/lib/browser/shell/view-contribution'; -import { - TabBarToolbarContribution, - TabBarToolbarFactory, -} 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 { - FrontendApplicationContribution, - FrontendApplication as TheiaFrontendApplication, -} from '@theia/core/lib/browser/frontend-application'; +import { FrontendApplication as TheiaFrontendApplication } from '@theia/core/lib/browser/frontend-application'; +import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application-contribution'; import { LibraryListWidget } from './library/library-list-widget'; import { ArduinoFrontendContribution } from './arduino-frontend-contribution'; import { @@ -26,11 +21,14 @@ import { SketchesService, SketchesServicePath, } from '../common/protocol/sketches-service'; -import { SketchesServiceClientImpl } from '../common/protocol/sketches-service-client-impl'; +import { SketchesServiceClientImpl } from './sketches-service-client-impl'; import { CoreService, CoreServicePath } from '../common/protocol/core-service'; import { BoardsListWidget } from './boards/boards-list-widget'; import { BoardsListWidgetFrontendContribution } from './boards/boards-widget-frontend-contribution'; -import { BoardsServiceProvider } from './boards/boards-service-provider'; +import { + BoardListDumper, + BoardsServiceProvider, +} from './boards/boards-service-provider'; import { WorkspaceService as TheiaWorkspaceService } from '@theia/workspace/lib/browser/workspace-service'; import { WorkspaceService } from './theia/workspace/workspace-service'; import { OutlineViewContribution as TheiaOutlineViewContribution } from '@theia/outline-view/lib/browser/outline-view-contribution'; @@ -53,8 +51,6 @@ import { DockPanelRenderer as TheiaDockPanelRenderer, TabBarRendererFactory, ContextMenuRenderer, - createTreeContainer, - TreeWidget, } from '@theia/core/lib/browser'; import { MenuContribution } from '@theia/core/lib/common/menu'; import { @@ -66,7 +62,6 @@ import { BoardsConfigDialog, BoardsConfigDialogProps, } from './boards/boards-config-dialog'; -import { BoardsConfigDialogWidget } from './boards/boards-config-dialog-widget'; import { ScmContribution as TheiaScmContribution } from '@theia/scm/lib/browser/scm-contribution'; import { ScmContribution } from './theia/scm/scm-contribution'; import { SearchInWorkspaceFrontendContribution as TheiaSearchInWorkspaceFrontendContribution } from '@theia/search-in-workspace/lib/browser/search-in-workspace-frontend-contribution'; @@ -84,28 +79,30 @@ import { ProblemManager as TheiaProblemManager } from '@theia/markers/lib/browse import { ProblemManager } from './theia/markers/problem-manager'; import { BoardsAutoInstaller } from './boards/boards-auto-installer'; import { ShellLayoutRestorer } from './theia/core/shell-layout-restorer'; -import { ListItemRenderer } from './widgets/component-list/list-item-renderer'; -import { ColorContribution } from '@theia/core/lib/browser/color-application-contribution'; import { - MonacoThemeJson, - MonacoThemingService, -} from '@theia/monaco/lib/browser/monaco-theming-service'; + ArduinoComponentContextMenuRenderer, + ListItemRenderer, +} from './widgets/component-list/list-item-renderer'; +import { ColorContribution } from '@theia/core/lib/browser/color-application-contribution'; + import { ArduinoDaemonPath, ArduinoDaemon, } from '../common/protocol/arduino-daemon'; -import { EditorCommandContribution as TheiaEditorCommandContribution } from '@theia/editor/lib/browser'; import { FrontendConnectionStatusService, ApplicationConnectionStatusContribution, + DaemonPort, + IsOnline, } from './theia/core/connection-status-service'; import { FrontendConnectionStatusService as TheiaFrontendConnectionStatusService, ApplicationConnectionStatusContribution as TheiaApplicationConnectionStatusContribution, } from '@theia/core/lib/browser/connection-status-service'; -import { BoardsDataMenuUpdater } from './boards/boards-data-menu-updater'; +import { BoardsDataMenuUpdater } from './contributions/boards-data-menu-updater'; import { BoardsDataStore } from './boards/boards-data-store'; -import { ILogger } from '@theia/core'; +import { ILogger } from '@theia/core/lib/common/logger'; +import { bindContributionProvider } from '@theia/core/lib/common/contribution-provider'; import { FileSystemExt, FileSystemExtPath, @@ -125,7 +122,10 @@ import { OpenSketch } from './contributions/open-sketch'; import { Close } from './contributions/close'; import { SaveAsSketch } from './contributions/save-as-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 { CommonFrontendContribution } from './theia/core/common-frontend-contribution'; import { EditContributions } from './contributions/edit-contributions'; @@ -134,11 +134,10 @@ import { PreferencesContribution as TheiaPreferencesContribution } from '@theia/ import { PreferencesContribution } from './theia/preferences/preferences-contribution'; import { QuitApp } from './contributions/quit-app'; import { SketchControl } from './contributions/sketch-control'; -import { Settings } from './contributions/settings'; +import { OpenSettings } from './contributions/open-settings'; import { WorkspaceCommandContribution } from './theia/workspace/workspace-commands'; import { WorkspaceDeleteHandler as TheiaWorkspaceDeleteHandler } from '@theia/workspace/lib/browser/workspace-delete-handler'; import { WorkspaceDeleteHandler } from './theia/workspace/workspace-delete-handler'; -import { TabBarToolbar } from './theia/core/tab-bar-toolbar'; import { EditorWidgetFactory as TheiaEditorWidgetFactory } from '@theia/editor/lib/browser/editor-widget-factory'; import { EditorWidgetFactory } from './theia/editor/editor-widget-factory'; import { BurnBootloader } from './contributions/burn-bootloader'; @@ -178,12 +177,9 @@ import { import { About } from './contributions/about'; import { IconThemeService } from '@theia/core/lib/browser/icon-theme-service'; 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 } from './theia/navigator/navigator-tab-bar-decorator'; -import { Debug } from './contributions/debug'; -import { DebugSessionManager } from './theia/debug/debug-session-manager'; -import { DebugSessionManager as TheiaDebugSessionManager } from '@theia/debug/lib/browser/debug-session-manager'; +import { Debug, DebugDisabledStatusMessageSource } from './contributions/debug'; import { Sketchbook } from './contributions/sketchbook'; import { DebugFrontendApplicationContribution } from './theia/debug/debug-frontend-application-contribution'; import { DebugFrontendApplicationContribution as TheiaDebugFrontendApplicationContribution } from '@theia/debug/lib/browser/debug-frontend-application-contribution'; @@ -206,18 +202,13 @@ import { WorkspaceVariableContribution as TheiaWorkspaceVariableContribution } f import { WorkspaceVariableContribution } from './theia/workspace/workspace-variable-contribution'; import { DebugConfigurationManager } from './theia/debug/debug-configuration-manager'; import { DebugConfigurationManager as TheiaDebugConfigurationManager } from '@theia/debug/lib/browser/debug-configuration-manager'; -import { SearchInWorkspaceWidget as TheiaSearchInWorkspaceWidget } from '@theia/search-in-workspace/lib/browser/search-in-workspace-widget'; -import { SearchInWorkspaceWidget } from './theia/search-in-workspace/search-in-workspace-widget'; import { SearchInWorkspaceFactory as TheiaSearchInWorkspaceFactory } from '@theia/search-in-workspace/lib/browser/search-in-workspace-factory'; import { SearchInWorkspaceFactory } from './theia/search-in-workspace/search-in-workspace-factory'; -import { SearchInWorkspaceResultTreeWidget as TheiaSearchInWorkspaceResultTreeWidget } from '@theia/search-in-workspace/lib/browser/search-in-workspace-result-tree-widget'; -import { SearchInWorkspaceResultTreeWidget } from './theia/search-in-workspace/search-in-workspace-result-tree-widget'; import { MonacoEditorProvider } from './theia/monaco/monaco-editor-provider'; import { MonacoEditorFactory, MonacoEditorProvider as TheiaMonacoEditorProvider, } from '@theia/monaco/lib/browser/monaco-editor-provider'; -import { StorageWrapper } from './storage-wrapper'; import { NotificationManager } from './theia/messages/notifications-manager'; import { NotificationManager as TheiaNotificationManager } from '@theia/messages/lib/browser/notifications-manager'; import { NotificationsRenderer as TheiaNotificationsRenderer } from '@theia/messages/lib/browser/notifications-renderer'; @@ -246,9 +237,7 @@ import { UploadFirmware } from './contributions/upload-firmware'; import { UploadFirmwareDialog, UploadFirmwareDialogProps, - UploadFirmwareDialogWidget, } from './dialogs/firmware-uploader/firmware-uploader-dialog'; - import { UploadCertificate } from './contributions/upload-certificate'; import { ArduinoFirmwareUploader, @@ -263,7 +252,6 @@ import { PlotterFrontendContribution } from './serial/plotter/plotter-frontend-c import { UserFieldsDialog, UserFieldsDialogProps, - UserFieldsDialogWidget, } from './dialogs/user-fields/user-fields-dialog'; import { nls } from '@theia/core/lib/common'; import { IDEUpdaterCommands } from './ide-updater/ide-updater-commands'; @@ -276,15 +264,14 @@ import { IDEUpdaterClientImpl } from './ide-updater/ide-updater-client-impl'; import { IDEUpdaterDialog, IDEUpdaterDialogProps, - IDEUpdaterDialogWidget, } 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 { MonitorManagerProxyClientImpl } from './monitor-manager-proxy-client-impl'; import { EditorManager as TheiaEditorManager } from '@theia/editor/lib/browser/editor-manager'; import { EditorManager } from './theia/editor/editor-manager'; -import { HostedPluginEvents } from './hosted-plugin-events'; -import { HostedPluginSupport } from './theia/plugin-ext/hosted-plugin'; +import { HostedPluginEvents } from './hosted/hosted-plugin-events'; +import { HostedPluginSupportImpl } from './theia/plugin-ext/hosted-plugin'; import { HostedPluginSupport as TheiaHostedPluginSupport } from '@theia/plugin-ext/lib/hosted/browser/hosted-plugin'; import { Formatter, FormatterPath } from '../common/protocol/formatter'; import { Format } from './contributions/format'; @@ -298,17 +285,13 @@ import { PreferenceTreeGenerator } from './theia/preferences/preference-tree-gen import { PreferenceTreeGenerator as TheiaPreferenceTreeGenerator } from '@theia/preferences/lib/browser/util/preference-tree-generator'; import { AboutDialog } from './theia/core/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 as TheiaWindowContribution } from '@theia/core/lib/browser/window-contribution'; import { CoreErrorHandler } from './contributions/core-error-handler'; import { CompilerErrors } from './contributions/compiler-errors'; import { WidgetManager } from './theia/core/widget-manager'; import { WidgetManager as TheiaWidgetManager } from '@theia/core/lib/browser/widget-manager'; -import { StartupTasks } from './widgets/sketchbook/startup-task'; +import { StartupTasksExecutor } from './contributions/startup-tasks-executor'; import { IndexesUpdateProgress } from './contributions/indexes-update-progress'; import { Daemon } from './contributions/daemon'; import { FirstStartupInstaller } from './contributions/first-startup-installer'; @@ -318,10 +301,6 @@ import { SelectedBoard } from './contributions/selected-board'; import { CheckForIDEUpdates } from './contributions/check-for-ide-updates'; import { OpenBoardsConfig } from './contributions/open-boards-config'; import { SketchFilesTracker } from './contributions/sketch-files-tracker'; -import { MonacoThemeServiceIsReady } from './utils/window'; -import { Deferred } from '@theia/core/lib/common/promise-util'; -import { StatusBarImpl } from './theia/core/status-bar'; -import { StatusBarImpl as TheiaStatusBarImpl } from '@theia/core/lib/browser'; import { EditorMenuContribution } from './theia/editor/editor-file'; import { EditorMenuContribution as TheiaEditorMenuContribution } from '@theia/editor/lib/browser/editor-menu'; import { PreferencesEditorWidget as TheiaPreferencesEditorWidget } from '@theia/preferences/lib/browser/views/preference-editor-widget'; @@ -334,41 +313,87 @@ import { } from './widgets/component-list/filter-renderer'; import { CheckForUpdates } from './contributions/check-for-updates'; import { OutputEditorFactory } from './theia/output/output-editor-factory'; +import { StartupTaskProvider } from '../electron-common/startup-task'; +import { DeleteSketch } from './contributions/delete-sketch'; +import { UserFields } from './contributions/user-fields'; +import { UpdateIndexes } from './contributions/update-indexes'; +import { InterfaceScale } from './contributions/interface-scale'; +import { OpenHandler } from '@theia/core/lib/browser/opener-service'; +import { NewCloudSketch } from './contributions/new-cloud-sketch'; +import { SketchbookCompositeWidget } from './widgets/sketchbook/sketchbook-composite-widget'; +import { WindowTitleUpdater } from './theia/core/window-title-updater'; +import { WindowTitleUpdater as TheiaWindowTitleUpdater } from '@theia/core/lib/browser/window/window-title-updater'; +import { + MonacoThemingService, + CleanupObsoleteThemes, + ThemesRegistrationSummary, + MonacoThemeRegistry, +} from './theia/monaco/monaco-theming-service'; +import { MonacoThemeRegistry as TheiaMonacoThemeRegistry } from '@theia/monaco/lib/browser/textmate/monaco-theme-registry'; +import { MonacoThemingService as TheiaMonacoThemingService } from '@theia/monaco/lib/browser/monaco-theming-service'; +import { TypeHierarchyServiceProvider } from './theia/typehierarchy/type-hierarchy-service'; +import { TypeHierarchyServiceProvider as TheiaTypeHierarchyServiceProvider } from '@theia/typehierarchy/lib/browser/typehierarchy-service'; +import { TypeHierarchyContribution } from './theia/typehierarchy/type-hierarchy-contribution'; +import { TypeHierarchyContribution as TheiaTypeHierarchyContribution } from '@theia/typehierarchy/lib/browser/typehierarchy-contribution'; +import { DefaultDebugSessionFactory } from './theia/debug/debug-session-contribution'; +import { DebugSessionFactory } from '@theia/debug/lib/browser/debug-session-contribution'; +import { ConfigServiceClient } from './config/config-service-client'; +import { ValidateSketch } from './contributions/validate-sketch'; +import { RenameCloudSketch } from './contributions/rename-cloud-sketch'; +import { CreateFeatures } from './create/create-features'; +import { Account } from './contributions/account'; +import { SidebarBottomMenuWidget } from './theia/core/sidebar-bottom-menu-widget'; +import { SidebarBottomMenuWidget as TheiaSidebarBottomMenuWidget } from '@theia/core/lib/browser/shell/sidebar-bottom-menu-widget'; +import { CreateCloudCopy } from './contributions/create-cloud-copy'; +import { FileResourceResolver } from './theia/filesystem/file-resource'; +import { FileResourceResolver as TheiaFileResourceResolver } from '@theia/filesystem/lib/browser/file-resource'; +import { StylingParticipant } from '@theia/core/lib/browser/styling-service'; +import { MonacoEditorMenuContribution } from './theia/monaco/monaco-menu'; +import { MonacoEditorMenuContribution as TheiaMonacoEditorMenuContribution } from '@theia/monaco/lib/browser/monaco-menu'; +import { UpdateArduinoState } from './contributions/update-arduino-state'; +import { TerminalFrontendContribution } from './theia/terminal/terminal-frontend-contribution'; +import { TerminalFrontendContribution as TheiaTerminalFrontendContribution } from '@theia/terminal/lib/browser/terminal-frontend-contribution'; +import { SelectionService } from '@theia/core/lib/common/selection-service'; +import { CommandService } from '@theia/core/lib/common/command'; +import { CorePreferences } from '@theia/core/lib/browser/core-preferences'; +import { AutoSelectProgrammer } from './contributions/auto-select-programmer'; +import { HostedPluginSupport } from './hosted/hosted-plugin-support'; +import { DebugSessionManager as TheiaDebugSessionManager } from '@theia/debug/lib/browser/debug-session-manager'; +import { DebugSessionManager } from './theia/debug/debug-session-manager'; +import { DebugWidget as TheiaDebugWidget } from '@theia/debug/lib/browser/view/debug-widget'; +import { DebugWidget } from './theia/debug/debug-widget'; +import { DebugViewModel } from '@theia/debug/lib/browser/view/debug-view-model'; +import { DebugSessionWidget } from '@theia/debug/lib/browser/view/debug-session-widget'; +import { DebugConfigurationWidget } from './theia/debug/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'; -const registerArduinoThemes = () => { - const themes: MonacoThemeJson[] = [ - { - id: 'arduino-theme', - label: 'Light (Arduino)', - uiTheme: 'vs', - json: require('../../src/browser/data/default.color-theme.json'), - }, - { - id: 'arduino-theme-dark', - label: 'Dark (Arduino)', - uiTheme: 'vs-dark', - json: require('../../src/browser/data/dark.color-theme.json'), - }, - ]; - themes.forEach((theme) => MonacoThemingService.register(theme)); -}; -// eslint-disable-next-line @typescript-eslint/no-explicit-any -const global = window as any; -const ready = global[MonacoThemeServiceIsReady] as Deferred; -if (ready) { - ready.promise.then(registerArduinoThemes); -} else { - registerArduinoThemes(); -} +import { + VersionWelcomeDialog, + VersionWelcomeDialogProps, +} 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. +// https://github.com/eclipse-theia/theia/issues/12487 +import('@theia/core/lib/browser/common-frontend-contribution.js').then( + (theiaCommonContribution) => { + theiaCommonContribution['supportCopy'] = true; + theiaCommonContribution['supportCut'] = true; + theiaCommonContribution['supportPaste'] = true; + } +); export default new ContainerModule((bind, unbind, isBound, rebind) => { - // Commands and toolbar items + // Commands, colors, theme adjustments, and toolbar items bind(ArduinoFrontendContribution).toSelf().inSingletonScope(); bind(CommandContribution).toService(ArduinoFrontendContribution); bind(MenuContribution).toService(ArduinoFrontendContribution); bind(TabBarToolbarContribution).toService(ArduinoFrontendContribution); bind(FrontendApplicationContribution).toService(ArduinoFrontendContribution); bind(ColorContribution).toService(ArduinoFrontendContribution); + bind(StylingParticipant).toService(ArduinoFrontendContribution); bind(ArduinoToolbarContribution).toSelf().inSingletonScope(); bind(FrontendApplicationContribution).toService(ArduinoToolbarContribution); @@ -398,6 +423,7 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { bind(FrontendApplicationContribution).toService( LibraryListWidgetFrontendContribution ); + bind(OpenHandler).toService(LibraryListWidgetFrontendContribution); // Sketch list service bind(SketchesService) @@ -420,6 +446,8 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { ) ) .inSingletonScope(); + bind(ConfigServiceClient).toSelf().inSingletonScope(); + bind(FrontendApplicationContribution).toService(ConfigServiceClient); // Boards service bind(BoardsService) @@ -433,13 +461,15 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { // Boards service client to receive and delegate notifications from the backend. bind(BoardsServiceProvider).toSelf().inSingletonScope(); bind(FrontendApplicationContribution).toService(BoardsServiceProvider); + bind(CommandContribution).toService(BoardsServiceProvider); + bind(BoardListDumper).toSelf().inSingletonScope(); // To be able to track, and update the menu based on the core settings (aka. board details) of the currently selected board. - bind(FrontendApplicationContribution) - .to(BoardsDataMenuUpdater) - .inSingletonScope(); bind(BoardsDataStore).toSelf().inSingletonScope(); bind(FrontendApplicationContribution).toService(BoardsDataStore); + bind(CommandContribution).toService(BoardsDataStore); + bind(StartupTaskProvider).toService(BoardsDataStore); // to inherit the boards config options, programmer, etc in a new window + // Logger for the Arduino daemon bind(ILogger) .toDynamicValue((ctx) => { @@ -463,9 +493,9 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { bind(FrontendApplicationContribution).toService( BoardsListWidgetFrontendContribution ); + bind(OpenHandler).toService(BoardsListWidgetFrontendContribution); // Board select dialog - bind(BoardsConfigDialogWidget).toSelf().inSingletonScope(); bind(BoardsConfigDialog).toSelf().inSingletonScope(); bind(BoardsConfigDialogProps).toConstantValue({ title: nls.localize( @@ -493,15 +523,7 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { bind(TabBarToolbarContribution).toService(MonitorViewContribution); bind(WidgetFactory).toDynamicValue((context) => ({ id: MonitorWidget.ID, - createWidget: () => { - return new MonitorWidget( - context.container.get(MonitorModel), - context.container.get( - MonitorManagerProxyClient - ), - context.container.get(BoardsServiceProvider) - ); - }, + createWidget: () => context.container.get(MonitorWidget), })); bind(MonitorManagerProxyFactory).toFactory( @@ -532,15 +554,6 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { WorkspaceVariableContribution ); - bind(SurveyNotificationService) - .toDynamicValue((context) => { - return ElectronIpcConnectionProvider.createProxy( - context.container, - SurveyNotificationServicePath - ); - }) - .inSingletonScope(); - // Layout and shell customizations. rebind(TheiaOutlineViewContribution) .to(OutlineViewContribution) @@ -581,14 +594,6 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { .to(WorkspaceDeleteHandler) .inSingletonScope(); rebind(TheiaEditorWidgetFactory).to(EditorWidgetFactory).inSingletonScope(); - rebind(TabBarToolbarFactory).toFactory( - ({ container: parentContainer }) => - () => { - const container = parentContainer.createChild(); - container.bind(TabBarToolbar).toSelf().inSingletonScope(); - return container.get(TabBarToolbar); - } - ); bind(OutputChannelManager).toSelf().inSingletonScope(); rebind(TheiaOutputChannelManager).toService(OutputChannelManager); bind(OutputChannelRegistryMainImpl).toSelf().inTransientScope(); @@ -600,9 +605,6 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { bind(MonacoEditorProvider).toSelf().inSingletonScope(); rebind(TheiaMonacoEditorProvider).toService(MonacoEditorProvider); - bind(SearchInWorkspaceWidget).toSelf(); - rebind(TheiaSearchInWorkspaceWidget).toService(SearchInWorkspaceWidget); - // Disabled reference counter in the editor manager to avoid opening the same editor (with different opener options) multiple times. bind(EditorManager).toSelf().inSingletonScope(); rebind(TheiaEditorManager).toService(EditorManager); @@ -612,17 +614,6 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { .to(SearchInWorkspaceFactory) .inSingletonScope(); - rebind(TheiaSearchInWorkspaceResultTreeWidget).toDynamicValue( - ({ container }) => { - const childContainer = createTreeContainer(container); - childContainer.bind(SearchInWorkspaceResultTreeWidget).toSelf(); - childContainer - .rebind(TreeWidget) - .toService(SearchInWorkspaceResultTreeWidget); - return childContainer.get(SearchInWorkspaceResultTreeWidget); - } - ); - // Show a disconnected status bar, when the daemon is not available bind(ApplicationConnectionStatusContribution).toSelf().inSingletonScope(); rebind(TheiaApplicationConnectionStatusContribution).toService( @@ -727,7 +718,7 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { Contribution.configure(bind, EditContributions); Contribution.configure(bind, QuitApp); Contribution.configure(bind, SketchControl); - Contribution.configure(bind, Settings); + Contribution.configure(bind, OpenSettings); Contribution.configure(bind, BurnBootloader); Contribution.configure(bind, BuiltInExamples); Contribution.configure(bind, LibraryExamples); @@ -746,7 +737,7 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { Contribution.configure(bind, PlotterFrontendContribution); Contribution.configure(bind, Format); Contribution.configure(bind, CompilerErrors); - Contribution.configure(bind, StartupTasks); + Contribution.configure(bind, StartupTasksExecutor); Contribution.configure(bind, IndexesUpdateProgress); Contribution.configure(bind, Daemon); Contribution.configure(bind, FirstStartupInstaller); @@ -757,6 +748,26 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { Contribution.configure(bind, OpenBoardsConfig); Contribution.configure(bind, SketchFilesTracker); Contribution.configure(bind, CheckForUpdates); + Contribution.configure(bind, UserFields); + Contribution.configure(bind, DeleteSketch); + Contribution.configure(bind, UpdateIndexes); + Contribution.configure(bind, InterfaceScale); + Contribution.configure(bind, NewCloudSketch); + Contribution.configure(bind, ValidateSketch); + Contribution.configure(bind, RenameCloudSketch); + Contribution.configure(bind, Account); + Contribution.configure(bind, CloudSketchbookContribution); + Contribution.configure(bind, CreateCloudCopy); + Contribution.configure(bind, UpdateArduinoState); + Contribution.configure(bind, BoardsDataMenuUpdater); + Contribution.configure(bind, AutoSelectProgrammer); + + bind(CompileSummaryProvider).toService(VerifySketch); + + bindContributionProvider(bind, StartupTaskProvider); + bind(StartupTaskProvider).toService(BoardsServiceProvider); // to reuse the boards config in another window + + bind(DebugDisabledStatusMessageSource).toService(Debug); // Disabled the quick-pick customization from Theia when multiple formatters are available. // Use the default VS Code behavior, and pick the first one. In the IDE2, clang-format has `exclusive` selectors. @@ -800,20 +811,22 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { ); const iconThemeService = context.container.get(IconThemeService); + const selectionService = + context.container.get(SelectionService); + const commandService = + context.container.get(CommandService); + const corePreferences = + context.container.get(CorePreferences); return new TabBarRenderer( contextMenuRenderer, decoratorService, - iconThemeService + iconThemeService, + selectionService, + commandService, + corePreferences ); }); - // 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. bind(NavigatorTabBarDecorator).toSelf().inSingletonScope(); rebind(TheiaNavigatorTabBarDecorator).toService(NavigatorTabBarDecorator); @@ -838,9 +851,6 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { bind(AboutDialog).toSelf().inSingletonScope(); rebind(TheiaAboutDialog).toService(AboutDialog); - // To avoid running `Save All` when there are no dirty editors before starting the debug session. - bind(DebugSessionManager).toSelf().inSingletonScope(); - rebind(TheiaDebugSessionManager).toService(DebugSessionManager); // To remove the `Run` menu item from the application menu. bind(DebugFrontendApplicationContribution).toSelf().inSingletonScope(); rebind(TheiaDebugFrontendApplicationContribution).toService( @@ -849,15 +859,33 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { // To be able to use a `launch.json` from outside of the workspace. bind(DebugConfigurationManager).toSelf().inSingletonScope(); rebind(TheiaDebugConfigurationManager).toService(DebugConfigurationManager); + // To update the currently selected debug config to update it programmatically. + bind(WidgetFactory) + .toDynamicValue(({ container }) => ({ + id: TheiaDebugWidget.ID, + createWidget: () => { + const child = new Container({ defaultScope: 'Singleton' }); + child.parent = container; + child.bind(DebugViewModel).toSelf(); + child.bind(DebugToolBar).toSelf(); + child.bind(DebugSessionWidget).toSelf(); + child.bind(DebugConfigurationWidget).toSelf(); // with the patched select + child // use the customized one in the Theia DI + .bind(TheiaDebugConfigurationWidget) + .toService(DebugConfigurationWidget); + child.bind(DebugWidget).toSelf(); + return child.get(DebugWidget); + }, + })) + .inSingletonScope(); // To avoid duplicate tabs use deepEqual instead of string equal: https://github.com/eclipse-theia/theia/issues/11309 bind(WidgetManager).toSelf().inSingletonScope(); rebind(TheiaWidgetManager).toService(WidgetManager); - // To avoid running a status bar update on every single `keypress` event from the editor. - bind(StatusBarImpl).toSelf().inSingletonScope(); - rebind(TheiaStatusBarImpl).toService(StatusBarImpl); - // Debounced update for the tab-bar toolbar when typing in the editor. bind(DockPanelRenderer).toSelf(); rebind(TheiaDockPanelRenderer).toService(DockPanelRenderer); @@ -889,9 +917,6 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { ), }); - bind(StorageWrapper).toSelf().inSingletonScope(); - bind(CommandContribution).toService(StorageWrapper); - bind(NotificationManager).toSelf().inSingletonScope(); rebind(TheiaNotificationManager).toService(NotificationManager); bind(NotificationsRenderer).toSelf().inSingletonScope(); @@ -908,6 +933,11 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { id: 'arduino-sketchbook-widget', createWidget: () => container.get(SketchbookWidget), })); + bind(SketchbookCompositeWidget).toSelf(); + bind(WidgetFactory).toDynamicValue((ctx) => ({ + id: 'sketchbook-composite-widget', + createWidget: () => ctx.container.get(SketchbookCompositeWidget), + })); bind(CloudSketchbookWidget).toSelf(); rebind(SketchbookWidget).toService(CloudSketchbookWidget); @@ -916,6 +946,8 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { ); bind(CreateApi).toSelf().inSingletonScope(); bind(SketchCache).toSelf().inSingletonScope(); + bind(CreateFeatures).toSelf().inSingletonScope(); + bind(FrontendApplicationContribution).toService(CreateFeatures); bind(ShareSketchDialog).toSelf().inSingletonScope(); bind(AuthenticationClientService).toSelf().inSingletonScope(); @@ -932,17 +964,14 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { bind(CreateFsProvider).toSelf().inSingletonScope(); bind(FrontendApplicationContribution).toService(CreateFsProvider); bind(FileServiceContribution).toService(CreateFsProvider); - bind(CloudSketchbookContribution).toSelf().inSingletonScope(); - bind(CommandContribution).toService(CloudSketchbookContribution); bind(LocalCacheFsProvider).toSelf().inSingletonScope(); bind(FileServiceContribution).toService(LocalCacheFsProvider); bind(CloudSketchbookCompositeWidget).toSelf(); - bind(WidgetFactory).toDynamicValue((ctx) => ({ + bind(WidgetFactory).toDynamicValue((ctx) => ({ id: 'cloud-sketchbook-composite-widget', createWidget: () => ctx.container.get(CloudSketchbookCompositeWidget), })); - bind(UploadFirmwareDialogWidget).toSelf().inSingletonScope(); bind(UploadFirmwareDialog).toSelf().inSingletonScope(); bind(UploadFirmwareDialogProps).toConstantValue({ title: 'UploadFirmware', @@ -953,13 +982,16 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { title: 'UploadCertificate', }); - bind(IDEUpdaterDialogWidget).toSelf().inSingletonScope(); bind(IDEUpdaterDialog).toSelf().inSingletonScope(); bind(IDEUpdaterDialogProps).toConstantValue({ title: 'IDEUpdater', }); - bind(UserFieldsDialogWidget).toSelf().inSingletonScope(); + bind(VersionWelcomeDialog).toSelf().inSingletonScope(); + bind(VersionWelcomeDialogProps).toConstantValue({ + title: 'VersionWelcomeDialog', + }); + bind(UserFieldsDialog).toSelf().inSingletonScope(); bind(UserFieldsDialogProps).toConstantValue({ title: 'UserFields', @@ -982,8 +1014,69 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { }) .inSingletonScope(); - bind(HostedPluginSupport).toSelf().inSingletonScope(); - rebind(TheiaHostedPluginSupport).toService(HostedPluginSupport); + bind(HostedPluginSupportImpl).toSelf().inSingletonScope(); + bind(HostedPluginSupport).toService(HostedPluginSupportImpl); + rebind(TheiaHostedPluginSupport).toService(HostedPluginSupportImpl); bind(HostedPluginEvents).toSelf().inSingletonScope(); bind(FrontendApplicationContribution).toService(HostedPluginEvents); + + // custom window titles + bind(WindowTitleUpdater).toSelf().inSingletonScope(); + rebind(TheiaWindowTitleUpdater).toService(WindowTitleUpdater); + + // register Arduino themes + bind(MonacoThemingService).toSelf().inSingletonScope(); + rebind(TheiaMonacoThemingService).toService(MonacoThemingService); + + // workaround for themes cannot be removed after registration + // https://github.com/eclipse-theia/theia/issues/11151 + bind(CleanupObsoleteThemes).toSelf().inSingletonScope(); + bind(FrontendApplicationContribution).toService(CleanupObsoleteThemes); + bind(ThemesRegistrationSummary).toSelf().inSingletonScope(); + bind(MonacoThemeRegistry).toSelf().inSingletonScope(); + rebind(TheiaMonacoThemeRegistry).toService(MonacoThemeRegistry); + + // disable type-hierarchy support + // https://github.com/eclipse-theia/theia/commit/16c88a584bac37f5cf3cc5eb92ffdaa541bda5be + bind(TypeHierarchyServiceProvider).toSelf().inSingletonScope(); + rebind(TheiaTypeHierarchyServiceProvider).toService( + TypeHierarchyServiceProvider + ); + bind(TypeHierarchyContribution).toSelf().inSingletonScope(); + rebind(TheiaTypeHierarchyContribution).toService(TypeHierarchyContribution); + + bind(DefaultDebugSessionFactory).toSelf().inSingletonScope(); + rebind(DebugSessionFactory).toService(DefaultDebugSessionFactory); + + bind(SidebarBottomMenuWidget).toSelf(); + rebind(TheiaSidebarBottomMenuWidget).toService(SidebarBottomMenuWidget); + + bind(ArduinoComponentContextMenuRenderer).toSelf().inSingletonScope(); + + bind(DaemonPort).toSelf().inSingletonScope(); + bind(FrontendApplicationContribution).toService(DaemonPort); + bind(IsOnline).toSelf().inSingletonScope(); + bind(FrontendApplicationContribution).toService(IsOnline); + + // https://github.com/arduino/arduino-ide/issues/437 + bind(FileResourceResolver).toSelf().inSingletonScope(); + rebind(TheiaFileResourceResolver).toService(FileResourceResolver); + + // Full control over the editor context menu to filter undesired menu items contributed by Theia. + // https://github.com/arduino/arduino-ide/issues/1394 + // https://github.com/arduino/arduino-ide/pull/2027#pullrequestreview-1414246614 + bind(MonacoEditorMenuContribution).toSelf().inSingletonScope(); + rebind(TheiaMonacoEditorMenuContribution).toService( + MonacoEditorMenuContribution + ); + + // Patch terminal issues. + bind(TerminalFrontendContribution).toSelf().inSingletonScope(); + rebind(TheiaTerminalFrontendContribution).toService( + TerminalFrontendContribution + ); + + // Hides the Test Explorer from the side-bar + bind(TestViewContribution).toSelf().inSingletonScope(); + rebind(TheiaTestViewContribution).toService(TestViewContribution); }); diff --git a/arduino-ide-extension/src/browser/arduino-preferences.ts b/arduino-ide-extension/src/browser/arduino-preferences.ts index 5fef59072..77c65cbbe 100644 --- a/arduino-ide-extension/src/browser/arduino-preferences.ts +++ b/arduino-ide-extension/src/browser/arduino-preferences.ts @@ -1,12 +1,15 @@ -import { interfaces } from '@theia/core/shared/inversify'; import { - createPreferenceProxy, - PreferenceProxy, - PreferenceService, PreferenceContribution, + PreferenceProxy, PreferenceSchema, + PreferenceService, + createPreferenceProxy, } from '@theia/core/lib/browser/preferences'; -import { nls } from '@theia/core/lib/common'; +import { ApplicationShell } from '@theia/core/lib/browser/shell/application-shell'; +import { nls } from '@theia/core/lib/common/nls'; +import { PreferenceSchemaProperty } from '@theia/core/lib/common/preferences/preference-schema'; +import { interfaces } from '@theia/core/shared/inversify'; +import { serialMonitorWidgetLabel } from '../common/nls'; import { CompilerWarningLiterals, CompilerWarnings } from '../common/protocol'; export enum UpdateChannel { @@ -31,7 +34,7 @@ export const ErrorRevealStrategyLiterals = [ */ 'centerIfOutsideViewport', ] as const; -export type ErrorRevealStrategy = typeof ErrorRevealStrategyLiterals[number]; +export type ErrorRevealStrategy = (typeof ErrorRevealStrategyLiterals)[number]; export namespace ErrorRevealStrategy { // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types, @typescript-eslint/no-explicit-any export function is(arg: any): arg is ErrorRevealStrategy { @@ -40,229 +43,296 @@ export namespace ErrorRevealStrategy { export const Default: ErrorRevealStrategy = 'centerIfOutsideViewport'; } +export type MonitorWidgetDockPanel = Extract< + ApplicationShell.Area, + 'bottom' | 'right' +>; +export const defaultMonitorWidgetDockPanel: MonitorWidgetDockPanel = 'bottom'; +export function isMonitorWidgetDockPanel( + arg: unknown +): arg is MonitorWidgetDockPanel { + return arg === 'bottom' || arg === 'right'; +} + +export const defaultAsyncWorkers = 0 as const; +export const minAsyncWorkers = defaultAsyncWorkers; +export const maxAsyncWorkers = 8 as const; + +type StrictPreferenceSchemaProperties = { + [p in keyof T]: PreferenceSchemaProperty; +}; +type ArduinoPreferenceSchemaProperties = + StrictPreferenceSchemaProperties & { + 'arduino.window.zoomLevel': PreferenceSchemaProperty; + }; + +const properties: ArduinoPreferenceSchemaProperties = { + 'arduino.language.log': { + type: 'boolean', + description: nls.localize( + 'arduino/preferences/language.log', + "True if the Arduino Language Server should generate log files into the sketch folder. Otherwise, false. It's false by default." + ), + default: false, + }, + 'arduino.language.realTimeDiagnostics': { + type: 'boolean', + description: nls.localize( + 'arduino/preferences/language.realTimeDiagnostics', + "If true, the language server provides real-time diagnostics when typing in the editor. It's false by default." + ), + default: false, + }, + 'arduino.language.asyncWorkers': { + type: 'number', + description: nls.localize( + 'arduino/preferences/language.asyncWorkers', + 'Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.' + ), + minimum: minAsyncWorkers, + maximum: maxAsyncWorkers, + default: defaultAsyncWorkers, + }, + 'arduino.compile.verbose': { + type: 'boolean', + description: nls.localize( + 'arduino/preferences/compile.verbose', + 'True for verbose compile output. False by default' + ), + default: false, + }, + 'arduino.compile.experimental': { + type: 'boolean', + description: nls.localize( + 'arduino/preferences/compile.experimental', + 'True if the IDE should handle multiple compiler errors. False by default' + ), + default: false, + }, + 'arduino.compile.revealRange': { + enum: [...ErrorRevealStrategyLiterals], + description: nls.localize( + 'arduino/preferences/compile.revealRange', + "Adjusts how compiler errors are revealed in the editor after a failed verify/upload. Possible values: 'auto': Scroll vertically as necessary and reveal a line. 'center': Scroll vertically as necessary and reveal a line centered vertically. 'top': Scroll vertically as necessary and reveal a line close to the top of the viewport, optimized for viewing a code definition. 'centerIfOutsideViewport': Scroll vertically as necessary and reveal a line centered vertically only if it lies outside the viewport. The default value is '{0}'.", + ErrorRevealStrategy.Default + ), + default: ErrorRevealStrategy.Default, + }, + 'arduino.compile.warnings': { + enum: [...CompilerWarningLiterals], + description: nls.localize( + 'arduino/preferences/compile.warnings', + "Tells gcc which warning level to use. It's 'None' by default" + ), + default: 'None', + }, + 'arduino.upload.verbose': { + type: 'boolean', + description: nls.localize( + 'arduino/preferences/upload.verbose', + 'True for verbose upload output. False by default.' + ), + default: false, + }, + 'arduino.upload.verify': { + type: 'boolean', + default: false, + description: nls.localize( + 'arduino/preferences/upload.verify', + 'After upload, verify that the contents of the memory on the board match the uploaded binary.' + ), + }, + 'arduino.upload.autoVerify': { + type: 'boolean', + default: true, + description: nls.localize( + 'arduino/preferences/upload.autoVerify', + "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing." + ), + }, + 'arduino.window.autoScale': { + type: 'boolean', + description: nls.localize( + 'arduino/preferences/window.autoScale', + 'True if the user interface automatically scales with the font size.' + ), + default: true, + }, + 'arduino.window.zoomLevel': { + type: 'number', + description: '', + default: 0, + deprecationMessage: nls.localize( + 'arduino/preferences/window.zoomLevel/deprecationMessage', + "Deprecated. Use 'window.zoomLevel' instead." + ), + }, + 'arduino.ide.updateChannel': { + type: 'string', + enum: Object.values(UpdateChannel) as UpdateChannel[], + default: UpdateChannel.Stable, + description: nls.localize( + 'arduino/preferences/ide.updateChannel', + "Release channel to get updated from. 'stable' is the stable release, 'nightly' is the latest development build." + ), + }, + 'arduino.ide.updateBaseUrl': { + type: 'string', + default: 'https://downloads.arduino.cc/arduino-ide', + description: nls.localize( + 'arduino/preferences/ide.updateBaseUrl', + "The base URL where to download updates from. Defaults to 'https://downloads.arduino.cc/arduino-ide'" + ), + }, + 'arduino.board.certificates': { + type: 'string', + description: nls.localize( + 'arduino/preferences/board.certificates', + 'List of certificates that can be uploaded to boards' + ), + default: '', + }, + 'arduino.sketchbook.showAllFiles': { + type: 'boolean', + description: nls.localize( + 'arduino/preferences/sketchbook.showAllFiles', + 'True to show all sketch files inside the sketch. It is false by default.' + ), + default: false, + }, + 'arduino.cloud.enabled': { + type: 'boolean', + description: nls.localize( + 'arduino/preferences/cloud.enabled', + 'True if the sketch sync functions are enabled. Defaults to true.' + ), + default: true, + }, + 'arduino.cloud.pull.warn': { + type: 'boolean', + description: nls.localize( + 'arduino/preferences/cloud.pull.warn', + 'True if users should be warned before pulling a cloud sketch. Defaults to true.' + ), + default: true, + }, + 'arduino.cloud.push.warn': { + type: 'boolean', + description: nls.localize( + 'arduino/preferences/cloud.push.warn', + 'True if users should be warned before pushing a cloud sketch. Defaults to true.' + ), + default: true, + }, + 'arduino.cloud.pushpublic.warn': { + type: 'boolean', + description: nls.localize( + 'arduino/preferences/cloud.pushpublic.warn', + 'True if users should be warned before pushing a public sketch to the cloud. Defaults to true.' + ), + default: true, + }, + 'arduino.cloud.sketchSyncEndpoint': { + type: 'string', + description: nls.localize( + 'arduino/preferences/cloud.sketchSyncEndpoint', + 'The endpoint used to push and pull sketches from a backend. By default it points to Arduino Cloud API.' + ), + default: 'https://api2.arduino.cc/create', + }, + 'arduino.cloud.sharedSpaceID': { + type: 'string', + description: nls.localize( + 'arduino/preferences/cloud.sharedSpaceId', + 'The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.' + ), + default: '', + }, + 'arduino.auth.clientID': { + type: 'string', + description: nls.localize( + 'arduino/preferences/auth.clientID', + 'The OAuth2 client ID.' + ), + default: 'C34Ya6ex77jTNxyKWj01lCe1vAHIaPIo', + }, + 'arduino.auth.domain': { + type: 'string', + description: nls.localize( + 'arduino/preferences/auth.domain', + 'The OAuth2 domain.' + ), + default: 'login.arduino.cc', + }, + 'arduino.auth.audience': { + type: 'string', + description: nls.localize( + 'arduino/preferences/auth.audience', + 'The OAuth2 audience.' + ), + default: 'https://api.arduino.cc', + }, + 'arduino.auth.registerUri': { + type: 'string', + description: nls.localize( + 'arduino/preferences/auth.registerUri', + 'The URI used to register a new user.' + ), + default: 'https://auth.arduino.cc/login#/register', + }, + 'arduino.cli.daemon.debug': { + type: 'boolean', + description: nls.localize( + 'arduino/preferences/cli.daemonDebug', + "Enable debug logging of the gRPC calls to the Arduino CLI. A restart of the IDE is needed for this setting to take effect. It's false by default." + ), + default: false, + }, + 'arduino.checkForUpdates': { + type: 'boolean', + description: nls.localize( + 'arduino/preferences/checkForUpdate', + "Receive notifications of available updates for the IDE, boards, and libraries. Requires an IDE restart after change. It's true by default." + ), + default: true, + }, + 'arduino.sketch.inoBlueprint': { + type: 'string', + markdownDescription: nls.localize( + 'arduino/preferences/sketch/inoBlueprint', + 'Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect.' + ), + default: undefined, + }, + 'arduino.monitor.dockPanel': { + type: 'string', + enum: ['bottom', 'right'], + markdownDescription: nls.localize( + 'arduino/preferences/monitor/dockPanel', + 'The area of the application shell where the _{0}_ widget will reside. It is either "bottom" or "right". It defaults to "{1}".', + serialMonitorWidgetLabel, + defaultMonitorWidgetDockPanel + ), + default: defaultMonitorWidgetDockPanel, + }, +}; export const ArduinoConfigSchema: PreferenceSchema = { type: 'object', - properties: { - 'arduino.language.log': { - type: 'boolean', - description: nls.localize( - 'arduino/preferences/language.log', - "True if the Arduino Language Server should generate log files into the sketch folder. Otherwise, false. It's false by default." - ), - default: false, - }, - 'arduino.language.realTimeDiagnostics': { - type: 'boolean', - description: nls.localize( - 'arduino/preferences/language.realTimeDiagnostics', - "If true, the language server provides real-time diagnostics when typing in the editor. It's false by default." - ), - default: false, - }, - 'arduino.compile.verbose': { - type: 'boolean', - description: nls.localize( - 'arduino/preferences/compile.verbose', - 'True for verbose compile output. False by default' - ), - default: false, - }, - 'arduino.compile.experimental': { - type: 'boolean', - description: nls.localize( - 'arduino/preferences/compile.experimental', - 'True if the IDE should handle multiple compiler errors. False by default' - ), - default: false, - }, - 'arduino.compile.revealRange': { - enum: [...ErrorRevealStrategyLiterals], - description: nls.localize( - 'arduino/preferences/compile.revealRange', - "Adjusts how compiler errors are revealed in the editor after a failed verify/upload. Possible values: 'auto': Scroll vertically as necessary and reveal a line. 'center': Scroll vertically as necessary and reveal a line centered vertically. 'top': Scroll vertically as necessary and reveal a line close to the top of the viewport, optimized for viewing a code definition. 'centerIfOutsideViewport': Scroll vertically as necessary and reveal a line centered vertically only if it lies outside the viewport. The default value is '{0}'.", - ErrorRevealStrategy.Default - ), - default: ErrorRevealStrategy.Default, - }, - 'arduino.compile.warnings': { - enum: [...CompilerWarningLiterals], - description: nls.localize( - 'arduino/preferences/compile.warnings', - "Tells gcc which warning level to use. It's 'None' by default" - ), - default: 'None', - }, - 'arduino.upload.verbose': { - type: 'boolean', - description: nls.localize( - 'arduino/preferences/upload.verbose', - 'True for verbose upload output. False by default.' - ), - default: false, - }, - 'arduino.upload.verify': { - type: 'boolean', - default: false, - }, - 'arduino.window.autoScale': { - type: 'boolean', - description: nls.localize( - 'arduino/preferences/window.autoScale', - 'True if the user interface automatically scales with the font size.' - ), - default: true, - }, - 'arduino.window.zoomLevel': { - type: 'number', - description: nls.localize( - 'arduino/preferences/window.zoomLevel', - 'Adjust the zoom level of the window. The original size is 0 and each increment above (e.g. 1) or below (e.g. -1) represents zooming 20% larger or smaller. You can also enter decimals to adjust the zoom level with a finer granularity.' - ), - default: 0, - }, - 'arduino.ide.updateChannel': { - type: 'string', - enum: Object.values(UpdateChannel) as UpdateChannel[], - default: UpdateChannel.Stable, - description: nls.localize( - 'arduino/preferences/ide.updateChannel', - "Release channel to get updated from. 'stable' is the stable release, 'nightly' is the latest development build." - ), - }, - 'arduino.ide.updateBaseUrl': { - type: 'string', - default: 'https://downloads.arduino.cc/arduino-ide', - description: nls.localize( - 'arduino/preferences/ide.updateBaseUrl', - "The base URL where to download updates from. Defaults to 'https://downloads.arduino.cc/arduino-ide'" - ), - }, - 'arduino.board.certificates': { - type: 'string', - description: nls.localize( - 'arduino/preferences/board.certificates', - 'List of certificates that can be uploaded to boards' - ), - default: '', - }, - 'arduino.sketchbook.showAllFiles': { - type: 'boolean', - description: nls.localize( - 'arduino/preferences/sketchbook.showAllFiles', - 'True to show all sketch files inside the sketch. It is false by default.' - ), - default: false, - }, - 'arduino.cloud.enabled': { - type: 'boolean', - description: nls.localize( - 'arduino/preferences/cloud.enabled', - 'True if the sketch sync functions are enabled. Defaults to true.' - ), - default: true, - }, - 'arduino.cloud.pull.warn': { - type: 'boolean', - description: nls.localize( - 'arduino/preferences/cloud.pull.warn', - 'True if users should be warned before pulling a cloud sketch. Defaults to true.' - ), - default: true, - }, - 'arduino.cloud.push.warn': { - type: 'boolean', - description: nls.localize( - 'arduino/preferences/cloud.push.warn', - 'True if users should be warned before pushing a cloud sketch. Defaults to true.' - ), - default: true, - }, - 'arduino.cloud.pushpublic.warn': { - type: 'boolean', - description: nls.localize( - 'arduino/preferences/cloud.pushpublic.warn', - 'True if users should be warned before pushing a public sketch to the cloud. Defaults to true.' - ), - default: true, - }, - 'arduino.cloud.sketchSyncEndpoint': { - type: 'string', - description: nls.localize( - 'arduino/preferences/cloud.sketchSyncEndpoint', - 'The endpoint used to push and pull sketches from a backend. By default it points to Arduino Cloud API.' - ), - default: 'https://api2.arduino.cc/create', - }, - 'arduino.auth.clientID': { - type: 'string', - description: nls.localize( - 'arduino/preferences/auth.clientID', - 'The OAuth2 client ID.' - ), - default: 'C34Ya6ex77jTNxyKWj01lCe1vAHIaPIo', - }, - 'arduino.auth.domain': { - type: 'string', - description: nls.localize( - 'arduino/preferences/auth.domain', - 'The OAuth2 domain.' - ), - default: 'login.arduino.cc', - }, - 'arduino.auth.audience': { - type: 'string', - description: nls.localize( - 'arduino/preferences/auth.audience', - 'The OAuth2 audience.' - ), - default: 'https://api.arduino.cc', - }, - 'arduino.auth.registerUri': { - type: 'string', - description: nls.localize( - 'arduino/preferences/auth.registerUri', - 'The URI used to register a new user.' - ), - 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': { - type: 'boolean', - description: nls.localize( - 'arduino/preferences/cli.daemonDebug', - "Enable debug logging of the gRPC calls to the Arduino CLI. A restart of the IDE is needed for this setting to take effect. It's false by default." - ), - default: false, - }, - 'arduino.checkForUpdates': { - type: 'boolean', - description: nls.localize( - 'arduino/preferences/checkForUpdate', - "Receive notifications of available updates for the IDE, boards, and libraries. Requires an IDE restart after change. It's true by default." - ), - default: true, - }, - }, + properties, }; export interface ArduinoConfiguration { 'arduino.language.log': boolean; 'arduino.language.realTimeDiagnostics': boolean; + 'arduino.language.asyncWorkers': number; 'arduino.compile.verbose': boolean; 'arduino.compile.experimental': boolean; 'arduino.compile.revealRange': ErrorRevealStrategy; 'arduino.compile.warnings': CompilerWarnings; 'arduino.upload.verbose': boolean; 'arduino.upload.verify': boolean; + 'arduino.upload.autoVerify': boolean; 'arduino.window.autoScale': boolean; - 'arduino.window.zoomLevel': number; 'arduino.ide.updateChannel': UpdateChannel; 'arduino.ide.updateBaseUrl': string; 'arduino.board.certificates': string; @@ -272,13 +342,15 @@ export interface ArduinoConfiguration { 'arduino.cloud.push.warn': boolean; 'arduino.cloud.pushpublic.warn': boolean; 'arduino.cloud.sketchSyncEndpoint': string; + 'arduino.cloud.sharedSpaceID': string; 'arduino.auth.clientID': string; 'arduino.auth.domain': string; 'arduino.auth.audience': string; 'arduino.auth.registerUri': string; - 'arduino.survey.notification': boolean; 'arduino.cli.daemon.debug': boolean; + 'arduino.sketch.inoBlueprint': string; 'arduino.checkForUpdates': boolean; + 'arduino.monitor.dockPanel': MonitorWidgetDockPanel; } export const ArduinoPreferences = Symbol('ArduinoPreferences'); diff --git a/arduino-ide-extension/src/browser/arduino-workspace-resolver.ts b/arduino-ide-extension/src/browser/arduino-workspace-resolver.ts deleted file mode 100644 index 547e44229..000000000 --- a/arduino-ide-extension/src/browser/arduino-workspace-resolver.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { URI } from '@theia/core/shared/vscode-uri'; -import { isWindows } from '@theia/core/lib/common/os'; -import { notEmpty } from '@theia/core/lib/common/objects'; -import { MaybePromise } from '@theia/core/lib/common/types'; - -/** - * Class for determining the default workspace location from the - * `location.hash`, the historical workspace locations, and recent sketch files. - * - * The following logic is used for determining the default workspace location: - * - `hash` points to an existing location? - * - Yes - * - `validate location`. Is valid sketch location? - * - Yes - * - Done. - * - No - * - `try open recent workspace roots`, then `try open last modified sketches`, finally `create new sketch`. - * - No - * - `try open recent workspace roots`, then `try open last modified sketches`, finally `create new sketch`. - */ -namespace ArduinoWorkspaceRootResolver { - export interface InitOptions { - readonly isValid: (uri: string) => MaybePromise; - } - export interface ResolveOptions { - readonly hash?: string; - readonly recentWorkspaces: string[]; - // Gathered from the default sketch folder. The default sketch folder is defined by the CLI. - readonly recentSketches: string[]; - } -} -export class ArduinoWorkspaceRootResolver { - constructor(protected options: ArduinoWorkspaceRootResolver.InitOptions) {} - - async resolve( - options: ArduinoWorkspaceRootResolver.ResolveOptions - ): Promise<{ uri: string } | undefined> { - const { hash, recentWorkspaces, recentSketches } = options; - for (const uri of [ - this.hashToUri(hash), - ...recentWorkspaces, - ...recentSketches, - ].filter(notEmpty)) { - const valid = await this.isValid(uri); - if (valid) { - return { uri }; - } - } - return undefined; - } - - protected isValid(uri: string): MaybePromise { - return this.options.isValid(uri); - } - - // Note: here, the `hash` was defined as new `URI(yourValidFsPath).path` so we have to map it to a valid FS path first. - // This is important for Windows only and a NOOP on POSIX. - // Note: we set the `new URI(myValidUri).path.toString()` as the `hash`. See: - // - https://github.com/eclipse-theia/theia/blob/8196e9dcf9c8de8ea0910efeb5334a974f426966/packages/workspace/src/browser/workspace-service.ts#L143 and - // - https://github.com/eclipse-theia/theia/blob/8196e9dcf9c8de8ea0910efeb5334a974f426966/packages/workspace/src/browser/workspace-service.ts#L423 - protected hashToUri(hash: string | undefined): string | undefined { - if (hash && hash.length > 1 && hash.startsWith('#')) { - const path = decodeURI(hash.slice(1)).replace(/\\/g, '/'); // Trim the leading `#`, decode the URI and replace Windows separators - return URI.file(path.slice(isWindows && hash.startsWith('/') ? 1 : 0)).toString(); - } - return undefined; - } -} diff --git a/arduino-ide-extension/src/browser/auth/authentication-client-service.ts b/arduino-ide-extension/src/browser/auth/authentication-client-service.ts index 4411a8eb5..9f1b05b1c 100644 --- a/arduino-ide-extension/src/browser/auth/authentication-client-service.ts +++ b/arduino-ide-extension/src/browser/auth/authentication-client-service.ts @@ -3,19 +3,19 @@ import { Emitter } from '@theia/core/lib/common/event'; import { JsonRpcProxy } from '@theia/core/lib/common/messaging/proxy-factory'; import { WindowService } from '@theia/core/lib/browser/window/window-service'; 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 { CommandRegistry, CommandContribution, } from '@theia/core/lib/common/command'; import { + AuthOptions, AuthenticationService, AuthenticationServiceClient, AuthenticationSession, + authServerPort, } from '../../common/protocol/authentication-service'; import { CloudUserCommands } from './cloud-user-commands'; -import { serverPort } from '../../node/auth/authentication-server'; -import { AuthOptions } from '../../node/auth/types'; import { ArduinoPreferences } from '../arduino-preferences'; @injectable() @@ -61,7 +61,7 @@ export class AuthenticationClientService setOptions(): Promise { return this.service.setOptions({ - redirectUri: `http://localhost:${serverPort}/callback`, + redirectUri: `http://localhost:${authServerPort}/callback`, responseType: 'code', clientID: this.arduinoPreferences['arduino.auth.clientID'], domain: this.arduinoPreferences['arduino.auth.domain'], @@ -83,9 +83,13 @@ export class AuthenticationClientService registerCommands(registry: CommandRegistry): void { registry.registerCommand(CloudUserCommands.LOGIN, { execute: () => this.service.login(), + isEnabled: () => !this._session, + isVisible: () => !this._session, }); registry.registerCommand(CloudUserCommands.LOGOUT, { execute: () => this.service.logout(), + isEnabled: () => !!this._session, + isVisible: () => !!this._session, }); } diff --git a/arduino-ide-extension/src/browser/auth/cloud-user-commands.ts b/arduino-ide-extension/src/browser/auth/cloud-user-commands.ts index 165d5bda7..17ac787b9 100644 --- a/arduino-ide-extension/src/browser/auth/cloud-user-commands.ts +++ b/arduino-ide-extension/src/browser/auth/cloud-user-commands.ts @@ -1,5 +1,8 @@ import { Command } from '@theia/core/lib/common/command'; +export const LEARN_MORE_URL = + 'https://docs.arduino.cc/software/ide-v2/tutorials/ide-v2-cloud-sketch-sync'; + export namespace CloudUserCommands { export const LOGIN = Command.toLocalizedCommand( { @@ -16,9 +19,4 @@ export namespace CloudUserCommands { }, 'arduino/cloud/signOut' ); - - export const OPEN_PROFILE_CONTEXT_MENU: Command = { - id: 'arduino-cloud-sketchbook--open-profile-menu', - label: 'Contextual menu', - }; } diff --git a/arduino-ide-extension/src/browser/boards/boards-auto-installer.ts b/arduino-ide-extension/src/browser/boards/boards-auto-installer.ts index f516258f6..d5b548556 100644 --- a/arduino-ide-extension/src/browser/boards/boards-auto-installer.ts +++ b/arduino-ide-extension/src/browser/boards/boards-auto-installer.ts @@ -1,281 +1,229 @@ -import { injectable, inject } from '@theia/core/shared/inversify'; +import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application-contribution'; +import { DisposableCollection } from '@theia/core/lib/common/disposable'; import { MessageService } from '@theia/core/lib/common/message-service'; -import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application'; +import { MessageType } from '@theia/core/lib/common/message-service-protocol'; +import { nls } from '@theia/core/lib/common/nls'; +import { notEmpty } from '@theia/core/lib/common/objects'; +import { inject, injectable } from '@theia/core/shared/inversify'; +import { NotificationManager } from '@theia/messages/lib/browser/notifications-manager'; +import { InstallManually } from '../../common/nls'; +import { Installable, ResponseServiceClient } from '../../common/protocol'; import { - BoardsService, + BoardIdentifier, BoardsPackage, - Board, - Port, + BoardsService, + createPlatformIdentifier, + isBoardIdentifierChangeEvent, + PlatformIdentifier, + platformIdentifierEquals, + serializePlatformIdentifier, } from '../../common/protocol/boards-service'; +import { NotificationCenter } from '../notification-center'; import { BoardsServiceProvider } from './boards-service-provider'; -import { Installable, ResponseServiceClient } from '../../common/protocol'; import { BoardsListWidgetFrontendContribution } from './boards-widget-frontend-contribution'; -import { nls } from '@theia/core/lib/common'; -import { NotificationCenter } from '../notification-center'; -import { InstallManually } from '../../common/nls'; - -interface AutoInstallPromptAction { - // isAcceptance, whether or not the action indicates acceptance of auto-install proposal - isAcceptance?: boolean; - key: string; - handler: (...args: unknown[]) => unknown; -} - -type AutoInstallPromptActions = AutoInstallPromptAction[]; /** - * Listens on `BoardsConfig.Config` changes, if a board is selected which does not + * Listens on `BoardsConfigChangeEvent`s, if a board is selected which does not * have the corresponding core installed, it proposes the user to install the core. */ - -// * Cases in which we do not show the auto-install prompt: -// 1. When a related platform is already installed -// 2. When a prompt is already showing in the UI -// 3. When a board is unplugged @injectable() export class BoardsAutoInstaller implements FrontendApplicationContribution { @inject(NotificationCenter) private readonly notificationCenter: NotificationCenter; - @inject(MessageService) - protected readonly messageService: MessageService; - + private readonly messageService: MessageService; + @inject(NotificationManager) + private readonly notificationManager: NotificationManager; @inject(BoardsService) - protected readonly boardsService: BoardsService; - + private readonly boardsService: BoardsService; @inject(BoardsServiceProvider) - protected readonly boardsServiceClient: BoardsServiceProvider; - + private readonly boardsServiceProvider: BoardsServiceProvider; @inject(ResponseServiceClient) - protected readonly responseService: ResponseServiceClient; - + private readonly responseService: ResponseServiceClient; @inject(BoardsListWidgetFrontendContribution) - protected readonly boardsManagerFrontendContribution: BoardsListWidgetFrontendContribution; + private readonly boardsManagerWidgetContribution: BoardsListWidgetFrontendContribution; // Workaround for https://github.com/eclipse-theia/theia/issues/9349 - protected notifications: Board[] = []; - - // * "refusal" meaning a "prompt action" not accepting the auto-install offer ("X" or "install manually") - // we can use "portSelectedOnLastRefusal" to deduce when a board is unplugged after a user has "refused" - // an auto-install prompt. Important to know as we do not want "an unplug" to trigger a "refused" prompt - // showing again - private portSelectedOnLastRefusal: Port | undefined; - private lastRefusedPackageId: string | undefined; + private readonly installNotificationInfos: Readonly<{ + boardName: string; + platformId: string; + notificationId: string; + }>[] = []; + private readonly toDispose = new DisposableCollection(); onStart(): void { - const setEventListeners = () => { - this.boardsServiceClient.onBoardsConfigChanged((config) => { - const { selectedBoard, selectedPort } = config; - - const boardWasUnplugged = - !selectedPort && this.portSelectedOnLastRefusal; - - this.clearLastRefusedPromptInfo(); - - if ( - boardWasUnplugged || - !selectedBoard || - this.promptAlreadyShowingForBoard(selectedBoard) - ) { - return; - } - - this.ensureCoreExists(selectedBoard, selectedPort); - }); - - // we "clearRefusedPackageInfo" if a "refused" package is eventually - // installed, though this is not strictly necessary. It's more of a - // cleanup, to ensure the related variables are representative of - // current state. - this.notificationCenter.onPlatformDidInstall((installed) => { - if (this.lastRefusedPackageId === installed.item.id) { - this.clearLastRefusedPromptInfo(); + this.toDispose.pushAll([ + this.boardsServiceProvider.onBoardsConfigDidChange((event) => { + if (isBoardIdentifierChangeEvent(event)) { + this.ensureCoreExists(event.selectedBoard); } - }); - }; - - // we should invoke this.ensureCoreExists only once we're sure - // everything has been reconciled - this.boardsServiceClient.reconciled.then(() => { - const { selectedBoard, selectedPort } = - this.boardsServiceClient.boardsConfig; - - if (selectedBoard) { - this.ensureCoreExists(selectedBoard, selectedPort); - } - - setEventListeners(); + }), + this.notificationCenter.onPlatformDidInstall((event) => + this.clearAllNotificationForPlatform(event.item.id) + ), + ]); + this.boardsServiceProvider.ready.then(() => { + const { selectedBoard } = this.boardsServiceProvider.boardsConfig; + this.ensureCoreExists(selectedBoard); }); } - private removeNotificationByBoard(selectedBoard: Board): void { - const index = this.notifications.findIndex((notification) => - Board.sameAs(notification, selectedBoard) - ); - if (index !== -1) { - this.notifications.splice(index, 1); + private async findPlatformToInstall( + selectedBoard: BoardIdentifier + ): Promise { + const platformId = await this.findPlatformIdToInstall(selectedBoard); + if (!platformId) { + return undefined; } + const id = serializePlatformIdentifier(platformId); + const platform = await this.boardsService.getBoardPackage({ id }); + if (!platform) { + console.warn(`Could not resolve platform for ID: ${id}`); + return undefined; + } + if (platform.installedVersion) { + return undefined; + } + return platform; } - private clearLastRefusedPromptInfo(): void { - this.lastRefusedPackageId = undefined; - this.portSelectedOnLastRefusal = undefined; - } - - private setLastRefusedPromptInfo( - packageId: string, - selectedPort?: Port - ): void { - this.lastRefusedPackageId = packageId; - this.portSelectedOnLastRefusal = selectedPort; - } - - private promptAlreadyShowingForBoard(board: Board): boolean { - return Boolean( - this.notifications.find((notification) => - Board.sameAs(notification, board) - ) - ); - } - - protected ensureCoreExists(selectedBoard: Board, selectedPort?: Port): void { - this.notifications.push(selectedBoard); - this.boardsService.search({}).then((packages) => { - const candidate = this.getInstallCandidate(packages, selectedBoard); - - if (candidate) { - this.showAutoInstallPrompt(candidate, selectedBoard, selectedPort); - } else { - this.removeNotificationByBoard(selectedBoard); + private async findPlatformIdToInstall( + selectedBoard: BoardIdentifier + ): Promise { + const selectedBoardPlatformId = createPlatformIdentifier(selectedBoard); + // The board is installed or the FQBN is available from the `board list watch` for Arduino boards. The latter might change! + if (selectedBoardPlatformId) { + const installedPlatforms = + await this.boardsService.getInstalledPlatforms(); + const installedPlatformIds = installedPlatforms + .map((platform) => createPlatformIdentifier(platform.id)) + .filter(notEmpty); + if ( + installedPlatformIds.every( + (installedPlatformId) => + !platformIdentifierEquals( + installedPlatformId, + selectedBoardPlatformId + ) + ) + ) { + return selectedBoardPlatformId; } - }); + } else { + // IDE2 knows that selected board is not installed. Look for board `name` match in not yet installed platforms. + // The order should be correct when there is a board name collision (e.g. Arduino Nano RP2040 from Arduino Mbed OS Nano Boards, [DEPRECATED] Arduino Mbed OS Nano Boards). The CLI boosts the platforms, so picking the first name match should be fine. + const platforms = await this.boardsService.search({}); + for (const platform of platforms) { + // Ignore installed platforms + if (platform.installedVersion) { + continue; + } + if ( + platform.boards.some((board) => board.name === selectedBoard.name) + ) { + const platformId = createPlatformIdentifier(platform.id); + if (platformId) { + return platformId; + } + } + } + } + return undefined; } - private getInstallCandidate( - packages: BoardsPackage[], - selectedBoard: Board - ): BoardsPackage | undefined { - // filter packagesForBoard selecting matches from the cli (installed packages) - // and matches based on the board name - // NOTE: this ensures the Deprecated & new packages are all in the array - // so that we can check if any of the valid packages is already installed - const packagesForBoard = packages.filter( - (pkg) => - BoardsPackage.contains(selectedBoard, pkg) || - pkg.boards.some((board) => board.name === selectedBoard.name) - ); - - // check if one of the packages for the board is already installed. if so, no hint - if (packagesForBoard.some(({ installedVersion }) => !!installedVersion)) { + private async ensureCoreExists( + selectedBoard: BoardIdentifier | undefined + ): Promise { + if (!selectedBoard) { return; } + const candidate = await this.findPlatformToInstall(selectedBoard); + if (!candidate) { + return; + } + const platformIdToInstall = candidate.id; + const selectedBoardName = selectedBoard.name; + if ( + this.installNotificationInfos.some( + ({ boardName, platformId }) => + platformIdToInstall === platformId && selectedBoardName === boardName + ) + ) { + // Already has a notification for the board with the same platform. Nothing to do. + return; + } + this.clearAllNotificationForPlatform(platformIdToInstall); - // filter the installable (not installed) packages, - // CLI returns the packages already sorted with the deprecated ones at the end of the list - // in order to ensure the new ones are preferred - const candidates = packagesForBoard.filter( - ({ installable, installedVersion }) => installable && !installedVersion - ); - - return candidates[0]; - } - - private showAutoInstallPrompt( - candidate: BoardsPackage, - selectedBoard: Board, - selectedPort?: Port - ): void { - const candidateName = candidate.name; const version = candidate.availableVersions[0] ? `[v ${candidate.availableVersions[0]}]` : ''; - - const info = this.generatePromptInfoText( - candidateName, - version, - selectedBoard.name - ); - - const actions = this.createPromptActions(candidate); - - const onRefuse = () => { - this.setLastRefusedPromptInfo(candidate.id, selectedPort); - }; - const handleAction = this.createOnAnswerHandler(actions, onRefuse); - - const onAnswer = (answer: string) => { - this.removeNotificationByBoard(selectedBoard); - - handleAction(answer); - }; - - this.messageService - .info(info, ...actions.map((action) => action.key)) - .then(onAnswer); - } - - private generatePromptInfoText( - candidateName: string, - version: string, - boardName: string - ): string { - return nls.localize( + const yes = nls.localize('vscode/extensionsUtils/yes', 'Yes'); + const message = nls.localize( 'arduino/board/installNow', 'The "{0} {1}" core has to be installed for the currently selected "{2}" board. Do you want to install it now?', - candidateName, + candidate.name, version, - boardName + selectedBoard.name + ); + const notificationId = this.notificationId(message, InstallManually, yes); + this.installNotificationInfos.push({ + boardName: selectedBoardName, + platformId: platformIdToInstall, + notificationId, + }); + const answer = await this.messageService.info( + message, + InstallManually, + yes ); + if (answer) { + const index = this.installNotificationInfos.findIndex( + ({ boardName, platformId }) => + platformIdToInstall === platformId && selectedBoardName === boardName + ); + if (index !== -1) { + this.installNotificationInfos.splice(index, 1); + } + if (answer === yes) { + await Installable.installWithProgress({ + installable: this.boardsService, + item: candidate, + messageService: this.messageService, + responseService: this.responseService, + version: candidate.availableVersions[0], + }); + return; + } + if (answer === InstallManually) { + this.boardsManagerWidgetContribution + .openView({ reveal: true }) + .then((widget) => + widget.refresh({ + query: candidate.name.toLocaleLowerCase(), + type: 'All', + }) + ); + } + } } - private createPromptActions( - candidate: BoardsPackage - ): AutoInstallPromptActions { - const yes = nls.localize('vscode/extensionsUtils/yes', 'Yes'); - - const actions: AutoInstallPromptActions = [ - { - key: InstallManually, - handler: () => { - this.boardsManagerFrontendContribution - .openView({ reveal: true }) - .then((widget) => - widget.refresh({ - query: candidate.name.toLocaleLowerCase(), - type: 'All', - }) - ); - }, - }, - { - isAcceptance: true, - key: yes, - handler: () => { - return Installable.installWithProgress({ - installable: this.boardsService, - item: candidate, - messageService: this.messageService, - responseService: this.responseService, - version: candidate.availableVersions[0], - }); - }, - }, - ]; - - return actions; + private clearAllNotificationForPlatform(predicatePlatformId: string): void { + // Discard all install notifications for the same platform. + const notificationsLength = this.installNotificationInfos.length; + for (let i = notificationsLength - 1; i >= 0; i--) { + const { notificationId, platformId } = this.installNotificationInfos[i]; + if (platformId === predicatePlatformId) { + this.installNotificationInfos.splice(i, 1); + this.notificationManager.clear(notificationId); + } + } } - private createOnAnswerHandler( - actions: AutoInstallPromptActions, - onRefuse?: () => void - ): (answer: string) => void { - return (answer) => { - const actionToHandle = actions.find((action) => action.key === answer); - actionToHandle?.handler(); - - if (!actionToHandle?.isAcceptance && onRefuse) { - onRefuse(); - } - }; + private notificationId(message: string, ...actions: string[]): string { + return this.notificationManager['getMessageId']({ + text: message, + actions, + type: MessageType.Info, + }); } } diff --git a/arduino-ide-extension/src/browser/boards/boards-config-component.tsx b/arduino-ide-extension/src/browser/boards/boards-config-component.tsx new file mode 100644 index 000000000..f14b8f390 --- /dev/null +++ b/arduino-ide-extension/src/browser/boards/boards-config-component.tsx @@ -0,0 +1,345 @@ +import { DisposableCollection } from '@theia/core/lib/common/disposable'; +import { Event } from '@theia/core/lib/common/event'; +import { FrontendApplicationState } from '@theia/core/lib/common/frontend-application-state'; +import { nls } from '@theia/core/lib/common/nls'; +import React from '@theia/core/shared/react'; +import { EditBoardsConfigActionParams } from '../../common/protocol/board-list'; +import { + Board, + BoardIdentifier, + BoardWithPackage, + DetectedPort, + findMatchingPortIndex, + Port, + PortIdentifier, +} from '../../common/protocol/boards-service'; +import type { Defined } from '../../common/types'; +import { NotificationCenter } from '../notification-center'; +import { BoardsConfigDialogState } from './boards-config-dialog'; + +namespace BoardsConfigComponent { + export interface Props { + /** + * This is not the real config, it's only living in the dialog. Users can change it without update and can cancel any modifications. + */ + readonly boardsConfig: BoardsConfigDialogState; + readonly searchSet: BoardIdentifier[] | undefined; + readonly notificationCenter: NotificationCenter; + readonly appState: FrontendApplicationState; + readonly onFocusNodeSet: (element: HTMLElement | undefined) => void; + readonly onFilteredTextDidChangeEvent: Event< + Defined + >; + readonly onAppStateDidChange: Event; + readonly onBoardSelected: (board: BoardIdentifier) => void; + readonly onPortSelected: (port: PortIdentifier) => void; + readonly searchBoards: (query?: { + query?: string; + }) => Promise; + readonly ports: ( + predicate?: (port: DetectedPort) => boolean + ) => readonly DetectedPort[]; + } + + export interface State { + searchResults: Array; + showAllPorts: boolean; + query: string; + } +} + +class Item extends React.Component<{ + item: T; + label: string; + selected: boolean; + onClick: (item: T) => void; + missing?: boolean; + details?: string; + title?: string | ((item: T) => string); +}> { + override render(): React.ReactNode { + const { selected, label, missing, details, item } = this.props; + const classNames = ['item']; + if (selected) { + classNames.push('selected'); + } + if (missing === true) { + classNames.push('missing'); + } + let title = this.props.title ?? `${label}${!details ? '' : details}`; + if (typeof title === 'function') { + title = title(item); + } + return ( +
+
{label}
+ {!details ? '' :
{details}
} + {!selected ? ( + '' + ) : ( +
+ +
+ )} +
+ ); + } + + private readonly onClick = () => { + this.props.onClick(this.props.item); + }; +} + +export class BoardsConfigComponent extends React.Component< + BoardsConfigComponent.Props, + BoardsConfigComponent.State +> { + private readonly toDispose: DisposableCollection; + + constructor(props: BoardsConfigComponent.Props) { + super(props); + this.state = { + searchResults: [], + showAllPorts: false, + query: '', + }; + this.toDispose = new DisposableCollection(); + } + + override componentDidMount(): void { + this.toDispose.pushAll([ + this.props.onAppStateDidChange(async (state) => { + if (state === 'ready') { + const searchResults = await this.queryBoards({}); + this.setState({ searchResults }); + } + }), + this.props.notificationCenter.onPlatformDidInstall(() => + this.updateBoards(this.state.query) + ), + this.props.notificationCenter.onPlatformDidUninstall(() => + this.updateBoards(this.state.query) + ), + this.props.notificationCenter.onIndexUpdateDidComplete(() => + this.updateBoards(this.state.query) + ), + this.props.notificationCenter.onDaemonDidStart(() => + this.updateBoards(this.state.query) + ), + this.props.notificationCenter.onDaemonDidStop(() => + this.setState({ searchResults: [] }) + ), + this.props.onFilteredTextDidChangeEvent((query) => { + if (typeof query === 'string') { + this.setState({ query }, () => this.updateBoards(this.state.query)); + } + }), + ]); + } + + override componentWillUnmount(): void { + this.toDispose.dispose(); + } + + private readonly updateBoards = ( + eventOrQuery: React.ChangeEvent | string = '' + ) => { + const query = + typeof eventOrQuery === 'string' + ? eventOrQuery + : eventOrQuery.target.value.toLowerCase(); + this.setState({ query }); + this.queryBoards({ query }).then((searchResults) => + this.setState({ searchResults }) + ); + }; + + private readonly queryBoards = async ( + options: { query?: string } = {} + ): Promise> => { + const result = await this.props.searchBoards(options); + const { searchSet } = this.props; + if (searchSet) { + return result.filter((board) => + searchSet.some( + (restriction) => + restriction.fqbn === board.fqbn || restriction.name === board.fqbn + ) + ); + } + return result; + }; + + private readonly toggleFilterPorts = () => { + this.setState({ showAllPorts: !this.state.showAllPorts }); + }; + + private readonly selectPort = (selectedPort: PortIdentifier) => { + this.props.onPortSelected(selectedPort); + }; + + private readonly selectBoard = (selectedBoard: BoardWithPackage) => { + this.props.onBoardSelected(selectedBoard); + }; + + private readonly focusNodeSet = (element: HTMLElement | null) => { + this.props.onFocusNodeSet(element || undefined); + }; + + override render(): React.ReactNode { + return ( + <> + {this.renderContainer( + nls.localize('arduino/board/boards', 'boards'), + this.renderBoards.bind(this) + )} + {this.renderContainer( + nls.localize('arduino/board/ports', 'ports'), + this.renderPorts.bind(this), + this.renderPortsFooter.bind(this) + )} + + ); + } + + private renderContainer( + title: string, + contentRenderer: () => React.ReactNode, + footerRenderer?: () => React.ReactNode + ): React.ReactNode { + return ( +
+
+
{title}
+ {contentRenderer()} +
{footerRenderer ? footerRenderer() : ''}
+
+
+ ); + } + + private renderBoards(): React.ReactNode { + const { boardsConfig } = this.props; + const { searchResults, query } = this.state; + // Board names are not unique per core https://github.com/arduino/arduino-pro-ide/issues/262#issuecomment-661019560 + // It is tricky when the core is not yet installed, no FQBNs are available. + const distinctBoards = new Map(); + const toKey = ({ name, packageName, fqbn }: Board.Detailed) => + !!fqbn ? `${name}-${packageName}-${fqbn}` : `${name}-${packageName}`; + for (const board of Board.decorateBoards( + boardsConfig.selectedBoard, + searchResults + )) { + const key = toKey(board); + if (!distinctBoards.has(key)) { + distinctBoards.set(key, board); + } + } + const title = (board: Board.Detailed): string => { + const { details, manuallyInstalled } = board; + let label = board.name; + if (details) { + label += details; + } + if (manuallyInstalled) { + label += nls.localize('arduino/board/inSketchbook', ' (in Sketchbook)'); + } + return label; + }; + + const boardsList = Array.from(distinctBoards.values()).map((board) => ( + + key={toKey(board)} + item={board} + label={board.name} + details={board.details} + selected={board.selected} + onClick={this.selectBoard} + missing={board.missing} + title={title} + /> + )); + + return ( + +
+ + +
+ {boardsList.length > 0 ? ( +
{boardsList}
+ ) : ( +
+ {nls.localize( + 'arduino/board/noBoardsFound', + 'No boards found for "{0}"', + query + )} +
+ )} +
+ ); + } + + private renderPorts(): React.ReactNode { + const predicate = this.state.showAllPorts ? undefined : Port.isVisiblePort; + const detectedPorts = this.props.ports(predicate); + const matchingIndex = findMatchingPortIndex( + this.props.boardsConfig.selectedPort, + detectedPorts + ); + return !detectedPorts.length ? ( +
+ {nls.localize('arduino/board/noPortsDiscovered', 'No ports discovered')} +
+ ) : ( +
+ {detectedPorts.map((detectedPort, index) => ( + + key={`${Port.keyOf(detectedPort.port)}`} + item={detectedPort.port} + label={Port.toString(detectedPort.port)} + selected={index === matchingIndex} + onClick={this.selectPort} + /> + ))} +
+ ); + } + + private renderPortsFooter(): React.ReactNode { + return ( +
+ +
+ ); + } +} diff --git a/arduino-ide-extension/src/browser/boards/boards-config-dialog-widget.tsx b/arduino-ide-extension/src/browser/boards/boards-config-dialog-widget.tsx deleted file mode 100644 index 7ad65697a..000000000 --- a/arduino-ide-extension/src/browser/boards/boards-config-dialog-widget.tsx +++ /dev/null @@ -1,71 +0,0 @@ -import * as React from '@theia/core/shared/react'; -import { injectable, inject } from '@theia/core/shared/inversify'; -import { Emitter } from '@theia/core/lib/common/event'; -import { ReactWidget, Message } from '@theia/core/lib/browser'; -import { BoardsService } from '../../common/protocol/boards-service'; -import { BoardsConfig } from './boards-config'; -import { BoardsServiceProvider } from './boards-service-provider'; -import { NotificationCenter } from '../notification-center'; - -@injectable() -export class BoardsConfigDialogWidget extends ReactWidget { - @inject(BoardsService) - protected readonly boardsService: BoardsService; - - @inject(BoardsServiceProvider) - protected readonly boardsServiceClient: BoardsServiceProvider; - - @inject(NotificationCenter) - protected readonly notificationCenter: NotificationCenter; - - protected readonly onFilterTextDidChangeEmitter = new Emitter(); - protected readonly onBoardConfigChangedEmitter = - new Emitter(); - readonly onBoardConfigChanged = this.onBoardConfigChangedEmitter.event; - - protected focusNode: HTMLElement | undefined; - - constructor() { - super(); - this.id = 'select-board-dialog'; - this.toDispose.pushAll([ - this.onBoardConfigChangedEmitter, - this.onFilterTextDidChangeEmitter, - ]); - } - - search(query: string): void { - this.onFilterTextDidChangeEmitter.fire(query); - } - - protected fireConfigChanged = (config: BoardsConfig.Config) => { - this.onBoardConfigChangedEmitter.fire(config); - }; - - protected setFocusNode = (element: HTMLElement | undefined) => { - this.focusNode = element; - }; - - protected render(): React.ReactNode { - return ( -
- -
- ); - } - - protected override onActivateRequest(msg: Message): void { - super.onActivateRequest(msg); - if (this.focusNode instanceof HTMLInputElement) { - this.focusNode.select(); - } - (this.focusNode || this.node).focus(); - } -} diff --git a/arduino-ide-extension/src/browser/boards/boards-config-dialog.ts b/arduino-ide-extension/src/browser/boards/boards-config-dialog.ts deleted file mode 100644 index ffec830d1..000000000 --- a/arduino-ide-extension/src/browser/boards/boards-config-dialog.ts +++ /dev/null @@ -1,141 +0,0 @@ -import { - injectable, - inject, - postConstruct, -} from '@theia/core/shared/inversify'; -import { Message } from '@theia/core/shared/@phosphor/messaging'; -import { DialogProps, Widget, DialogError } from '@theia/core/lib/browser'; -import { AbstractDialog } from '../theia/dialogs/dialogs'; -import { BoardsConfig } from './boards-config'; -import { BoardsService } from '../../common/protocol/boards-service'; -import { BoardsServiceProvider } from './boards-service-provider'; -import { BoardsConfigDialogWidget } from './boards-config-dialog-widget'; -import { nls } from '@theia/core/lib/common'; - -@injectable() -export class BoardsConfigDialogProps extends DialogProps {} - -@injectable() -export class BoardsConfigDialog extends AbstractDialog { - @inject(BoardsConfigDialogWidget) - protected readonly widget: BoardsConfigDialogWidget; - - @inject(BoardsService) - protected readonly boardService: BoardsService; - - @inject(BoardsServiceProvider) - protected readonly boardsServiceClient: BoardsServiceProvider; - - protected config: BoardsConfig.Config = {}; - - constructor( - @inject(BoardsConfigDialogProps) - protected override readonly props: BoardsConfigDialogProps - ) { - super({ ...props, maxWidth: 500 }); - - this.contentNode.classList.add('select-board-dialog'); - this.contentNode.appendChild(this.createDescription()); - - this.appendCloseButton( - nls.localize('vscode/issueMainService/cancel', 'Cancel') - ); - this.appendAcceptButton(nls.localize('vscode/issueMainService/ok', 'OK')); - } - - @postConstruct() - protected init(): void { - this.toDispose.push( - this.boardsServiceClient.onBoardsConfigChanged((config) => { - this.config = config; - this.update(); - }) - ); - } - - /** - * Pass in an empty string if you want to reset the search term. Using `undefined` has no effect. - */ - override async open( - query: string | undefined = undefined - ): Promise { - if (typeof query === 'string') { - this.widget.search(query); - } - return super.open(); - } - - protected createDescription(): HTMLElement { - const head = document.createElement('div'); - head.classList.add('head'); - - const text = document.createElement('div'); - text.classList.add('text'); - head.appendChild(text); - - for (const paragraph of [ - nls.localize( - 'arduino/board/configDialog1', - 'Select both a Board and a Port if you want to upload a sketch.' - ), - nls.localize( - 'arduino/board/configDialog2', - 'If you only select a Board you will be able to compile, but not to upload your sketch.' - ), - ]) { - const p = document.createElement('div'); - p.textContent = paragraph; - text.appendChild(p); - } - - return head; - } - - protected override onAfterAttach(msg: Message): void { - if (this.widget.isAttached) { - Widget.detach(this.widget); - } - Widget.attach(this.widget, this.contentNode); - this.toDisposeOnDetach.push( - this.widget.onBoardConfigChanged((config) => { - this.config = config; - this.update(); - }) - ); - super.onAfterAttach(msg); - this.update(); - } - - protected override onUpdateRequest(msg: Message): void { - super.onUpdateRequest(msg); - this.widget.update(); - } - - protected override onActivateRequest(msg: Message): void { - super.onActivateRequest(msg); - this.widget.activate(); - } - - protected override handleEnter(event: KeyboardEvent): boolean | void { - if (event.target instanceof HTMLTextAreaElement) { - return false; - } - } - - protected override isValid(value: BoardsConfig.Config): DialogError { - if (!value.selectedBoard) { - if (value.selectedPort) { - return nls.localize( - 'arduino/board/pleasePickBoard', - 'Please pick a board connected to the port you have selected.' - ); - } - return false; - } - return ''; - } - - get value(): BoardsConfig.Config { - return this.config; - } -} diff --git a/arduino-ide-extension/src/browser/boards/boards-config-dialog.tsx b/arduino-ide-extension/src/browser/boards/boards-config-dialog.tsx new file mode 100644 index 000000000..39aebaadd --- /dev/null +++ b/arduino-ide-extension/src/browser/boards/boards-config-dialog.tsx @@ -0,0 +1,203 @@ +import { DialogError, DialogProps } from '@theia/core/lib/browser/dialogs'; +import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state'; +import { Emitter } from '@theia/core/lib/common/event'; +import { nls } from '@theia/core/lib/common/nls'; +import { deepClone } from '@theia/core/lib/common/objects'; +import type { Message } from '@theia/core/shared/@phosphor/messaging'; +import { + inject, + injectable, + postConstruct, +} from '@theia/core/shared/inversify'; +import React from '@theia/core/shared/react'; +import type { ReactNode } from '@theia/core/shared/react/index'; +import { EditBoardsConfigActionParams } from '../../common/protocol/board-list'; +import { + BoardIdentifier, + BoardsConfig, + BoardWithPackage, + DetectedPort, + emptyBoardsConfig, + PortIdentifier, +} from '../../common/protocol/boards-service'; +import type { Defined } from '../../common/types'; +import { NotificationCenter } from '../notification-center'; +import { ReactDialog } from '../theia/dialogs/dialogs'; +import { BoardsConfigComponent } from './boards-config-component'; +import { BoardsServiceProvider } from './boards-service-provider'; + +@injectable() +export class BoardsConfigDialogProps extends DialogProps {} + +export type BoardsConfigDialogState = Omit & { + selectedBoard: BoardsConfig['selectedBoard'] | BoardWithPackage; +}; + +@injectable() +export class BoardsConfigDialog extends ReactDialog { + @inject(BoardsServiceProvider) + private readonly boardsServiceProvider: BoardsServiceProvider; + @inject(NotificationCenter) + private readonly notificationCenter: NotificationCenter; + @inject(FrontendApplicationStateService) + private readonly appStateService: FrontendApplicationStateService; + + private readonly onFilterTextDidChangeEmitter: Emitter< + Defined + >; + private readonly onBoardSelected = (board: BoardWithPackage): void => { + this._boardsConfig.selectedBoard = board; + this.update(); + }; + private readonly onPortSelected = (port: PortIdentifier): void => { + this._boardsConfig.selectedPort = port; + this.update(); + }; + private readonly setFocusNode = (element: HTMLElement | undefined): void => { + this.focusNode = element; + }; + private readonly searchBoards = (options: { + query?: string; + }): Promise => { + return this.boardsServiceProvider.searchBoards(options); + }; + private readonly ports = ( + predicate?: (port: DetectedPort) => boolean + ): readonly DetectedPort[] => { + return this.boardsServiceProvider.boardList.ports(predicate); + }; + private _boardsConfig: BoardsConfigDialogState; + /** + * When the dialog's boards result set is limited to a subset of boards when searching, this field is set. + */ + private _searchSet: BoardIdentifier[] | undefined; + private focusNode: HTMLElement | undefined; + + constructor( + @inject(BoardsConfigDialogProps) + protected override readonly props: BoardsConfigDialogProps + ) { + super({ ...props, maxWidth: 500 }); + this.node.id = 'select-board-dialog-container'; + this.contentNode.classList.add('select-board-dialog'); + this.appendCloseButton( + nls.localize('vscode/issueMainService/cancel', 'Cancel') + ); + this.appendAcceptButton(nls.localize('vscode/issueMainService/ok', 'OK')); + this._boardsConfig = emptyBoardsConfig(); + this.onFilterTextDidChangeEmitter = new Emitter(); + } + + @postConstruct() + protected init(): void { + this.boardsServiceProvider.onBoardListDidChange(() => { + this._boardsConfig = deepClone(this.boardsServiceProvider.boardsConfig); + this.update(); + }); + this._boardsConfig = deepClone(this.boardsServiceProvider.boardsConfig); + } + + override async open( + disposeOnResolve = true, + params?: EditBoardsConfigActionParams + ): Promise { + this._searchSet = undefined; + this._boardsConfig.selectedBoard = + this.boardsServiceProvider.boardsConfig.selectedBoard; + this._boardsConfig.selectedPort = + this.boardsServiceProvider.boardsConfig.selectedPort; + if (params) { + if (typeof params.query === 'string') { + this.onFilterTextDidChangeEmitter.fire(params.query); + } + if (params.portToSelect) { + this._boardsConfig.selectedPort = params.portToSelect; + } + if (params.boardToSelect) { + this._boardsConfig.selectedBoard = params.boardToSelect; + } + if (params.searchSet) { + this._searchSet = params.searchSet.slice(); + } + } + return super.open(disposeOnResolve); + } + + protected override onAfterAttach(msg: Message): void { + super.onAfterAttach(msg); + this.update(); + } + + protected override render(): ReactNode { + return ( + <> +
+
+
+ {nls.localize( + 'arduino/board/configDialog1', + 'Select both a Board and a Port if you want to upload a sketch.' + )} +
+
+ {nls.localize( + 'arduino/board/configDialog2', + 'If you only select a Board you will be able to compile, but not to upload your sketch.' + )} +
+
+
+
+
+ +
+
+ + ); + } + + protected override onActivateRequest(msg: Message): void { + super.onActivateRequest(msg); + if (this.focusNode instanceof HTMLInputElement) { + this.focusNode.select(); + } + (this.focusNode || this.node).focus(); + } + + protected override handleEnter(event: KeyboardEvent): boolean | void { + if (event.target instanceof HTMLTextAreaElement) { + return false; + } + } + + protected override isValid(value: BoardsConfig): DialogError { + if (!value.selectedBoard) { + if (value.selectedPort) { + return nls.localize( + 'arduino/board/pleasePickBoard', + 'Please pick a board connected to the port you have selected.' + ); + } + return false; + } + return ''; + } + + get value(): BoardsConfigDialogState { + return this._boardsConfig; + } +} diff --git a/arduino-ide-extension/src/browser/boards/boards-config.tsx b/arduino-ide-extension/src/browser/boards/boards-config.tsx deleted file mode 100644 index fb04b0e2e..000000000 --- a/arduino-ide-extension/src/browser/boards/boards-config.tsx +++ /dev/null @@ -1,465 +0,0 @@ -import * as React from '@theia/core/shared/react'; -import { Event } from '@theia/core/lib/common/event'; -import { notEmpty } from '@theia/core/lib/common/objects'; -import { MaybePromise } from '@theia/core/lib/common/types'; -import { DisposableCollection } from '@theia/core/lib/common/disposable'; -import { - Board, - Port, - AttachedBoardsChangeEvent, - BoardWithPackage, -} from '../../common/protocol/boards-service'; -import { NotificationCenter } from '../notification-center'; -import { - AvailableBoard, - BoardsServiceProvider, -} from './boards-service-provider'; -import { naturalCompare } from '../../common/utils'; -import { nls } from '@theia/core/lib/common'; -import { FrontendApplicationState } from '@theia/core/lib/common/frontend-application-state'; - -export namespace BoardsConfig { - export interface Config { - selectedBoard?: Board; - selectedPort?: Port; - } - - export interface Props { - readonly boardsServiceProvider: BoardsServiceProvider; - readonly notificationCenter: NotificationCenter; - readonly onConfigChange: (config: Config) => void; - readonly onFocusNodeSet: (element: HTMLElement | undefined) => void; - readonly onFilteredTextDidChangeEvent: Event; - readonly onAppStateDidChange: Event; - } - - export interface State extends Config { - searchResults: Array; - knownPorts: Port[]; - showAllPorts: boolean; - query: string; - } -} - -export abstract class Item extends React.Component<{ - item: T; - label: string; - selected: boolean; - onClick: (item: T) => void; - missing?: boolean; - details?: string; -}> { - override render(): React.ReactNode { - const { selected, label, missing, details } = this.props; - const classNames = ['item']; - if (selected) { - classNames.push('selected'); - } - if (missing === true) { - classNames.push('missing'); - } - return ( -
-
{label}
- {!details ? '' :
{details}
} - {!selected ? ( - '' - ) : ( -
- -
- )} -
- ); - } - - protected onClick = () => { - this.props.onClick(this.props.item); - }; -} - -export class BoardsConfig extends React.Component< - BoardsConfig.Props, - BoardsConfig.State -> { - protected toDispose = new DisposableCollection(); - - constructor(props: BoardsConfig.Props) { - super(props); - - const { boardsConfig } = props.boardsServiceProvider; - this.state = { - searchResults: [], - knownPorts: [], - showAllPorts: false, - query: '', - ...boardsConfig, - }; - } - - override componentDidMount(): void { - this.toDispose.pushAll([ - this.props.onAppStateDidChange((state) => { - if (state === 'ready') { - this.updateBoards(); - this.updatePorts( - this.props.boardsServiceProvider.availableBoards - .map(({ port }) => port) - .filter(notEmpty) - ); - } - }), - this.props.notificationCenter.onAttachedBoardsDidChange((event) => - this.updatePorts( - event.newState.ports, - AttachedBoardsChangeEvent.diff(event).detached.ports - ) - ), - this.props.boardsServiceProvider.onBoardsConfigChanged( - ({ selectedBoard, selectedPort }) => { - this.setState({ selectedBoard, selectedPort }, () => - this.fireConfigChanged() - ); - } - ), - this.props.notificationCenter.onPlatformDidInstall(() => - this.updateBoards(this.state.query) - ), - this.props.notificationCenter.onPlatformDidUninstall(() => - this.updateBoards(this.state.query) - ), - this.props.notificationCenter.onIndexDidUpdate(() => - this.updateBoards(this.state.query) - ), - this.props.notificationCenter.onDaemonDidStart(() => - this.updateBoards(this.state.query) - ), - this.props.notificationCenter.onDaemonDidStop(() => - this.setState({ searchResults: [] }) - ), - this.props.onFilteredTextDidChangeEvent((query) => - this.setState({ query }, () => this.updateBoards(this.state.query)) - ), - ]); - } - - override componentWillUnmount(): void { - this.toDispose.dispose(); - } - - protected fireConfigChanged(): void { - const { selectedBoard, selectedPort } = this.state; - this.props.onConfigChange({ selectedBoard, selectedPort }); - } - - protected updateBoards = ( - eventOrQuery: React.ChangeEvent | string = '' - ) => { - const query = - typeof eventOrQuery === 'string' - ? eventOrQuery - : eventOrQuery.target.value.toLowerCase(); - this.setState({ query }); - this.queryBoards({ query }).then((searchResults) => - this.setState({ searchResults }) - ); - }; - - protected updatePorts = (ports: Port[] = [], removedPorts: Port[] = []) => { - this.queryPorts(Promise.resolve(ports)).then(({ knownPorts }) => { - let { selectedPort } = this.state; - // If the currently selected port is not available anymore, unset the selected port. - if (removedPorts.some((port) => Port.sameAs(port, selectedPort))) { - selectedPort = undefined; - } - this.setState({ knownPorts, selectedPort }, () => - this.fireConfigChanged() - ); - }); - }; - - protected queryBoards = ( - options: { query?: string } = {} - ): Promise> => { - return this.props.boardsServiceProvider.searchBoards(options); - }; - - protected get availablePorts(): MaybePromise { - return this.props.boardsServiceProvider.availableBoards - .map(({ port }) => port) - .filter(notEmpty); - } - - protected get availableBoards(): AvailableBoard[] { - return this.props.boardsServiceProvider.availableBoards; - } - - protected queryPorts = async ( - availablePorts: MaybePromise = this.availablePorts - ) => { - // Available ports must be sorted in this order: - // 1. Serial with recognized boards - // 2. Serial with guessed boards - // 3. Serial with incomplete boards - // 4. Network with recognized boards - // 5. Other protocols with recognized boards - const ports = (await availablePorts).sort((left: Port, right: Port) => { - if (left.protocol === 'serial' && right.protocol !== 'serial') { - return -1; - } else if (left.protocol !== 'serial' && right.protocol === 'serial') { - return 1; - } else if (left.protocol === 'network' && right.protocol !== 'network') { - return -1; - } else if (left.protocol !== 'network' && right.protocol === 'network') { - return 1; - } else if (left.protocol === right.protocol) { - // We show ports, including those that have guessed - // or unrecognized boards, so we must sort those too. - const leftBoard = this.availableBoards.find( - (board) => board.port === left - ); - const rightBoard = this.availableBoards.find( - (board) => board.port === right - ); - if (leftBoard && !rightBoard) { - return -1; - } else if (!leftBoard && rightBoard) { - return 1; - } else if (leftBoard?.state! < rightBoard?.state!) { - return -1; - } else if (leftBoard?.state! > rightBoard?.state!) { - return 1; - } - } - return naturalCompare(left.address, right.address); - }); - return { knownPorts: ports }; - }; - - protected toggleFilterPorts = () => { - this.setState({ showAllPorts: !this.state.showAllPorts }); - }; - - protected selectPort = (selectedPort: Port | undefined) => { - this.setState({ selectedPort }, () => this.fireConfigChanged()); - }; - - protected selectBoard = (selectedBoard: BoardWithPackage | undefined) => { - this.setState({ selectedBoard }, () => this.fireConfigChanged()); - }; - - protected focusNodeSet = (element: HTMLElement | null) => { - this.props.onFocusNodeSet(element || undefined); - }; - - override render(): React.ReactNode { - return ( - <> - {this.renderContainer('boards', this.renderBoards.bind(this))} - {this.renderContainer( - 'ports', - this.renderPorts.bind(this), - this.renderPortsFooter.bind(this) - )} - - ); - } - - protected renderContainer( - title: string, - contentRenderer: () => React.ReactNode, - footerRenderer?: () => React.ReactNode - ): React.ReactNode { - return ( -
-
-
{title}
- {contentRenderer()} -
{footerRenderer ? footerRenderer() : ''}
-
-
- ); - } - - protected renderBoards(): React.ReactNode { - const { selectedBoard, searchResults, query } = this.state; - // Board names are not unique per core https://github.com/arduino/arduino-pro-ide/issues/262#issuecomment-661019560 - // It is tricky when the core is not yet installed, no FQBNs are available. - const distinctBoards = new Map(); - const toKey = ({ name, packageName, fqbn }: Board.Detailed) => - !!fqbn ? `${name}-${packageName}-${fqbn}` : `${name}-${packageName}`; - for (const board of Board.decorateBoards(selectedBoard, searchResults)) { - const key = toKey(board); - if (!distinctBoards.has(key)) { - distinctBoards.set(key, board); - } - } - - return ( - -
- - -
-
- {Array.from(distinctBoards.values()).map((board) => ( - - key={toKey(board)} - item={board} - label={board.name} - details={board.details} - selected={board.selected} - onClick={this.selectBoard} - missing={board.missing} - /> - ))} -
-
- ); - } - - protected renderPorts(): React.ReactNode { - let ports = [] as Port[]; - if (this.state.showAllPorts) { - ports = this.state.knownPorts; - } else { - ports = this.state.knownPorts.filter( - Port.visiblePorts(this.availableBoards) - ); - } - return !ports.length ? ( -
- {nls.localize('arduino/board/noPortsDiscovered', 'No ports discovered')} -
- ) : ( -
- {ports.map((port) => ( - - key={`${Port.keyOf(port)}`} - item={port} - label={Port.toString(port)} - selected={Port.sameAs(this.state.selectedPort, port)} - onClick={this.selectPort} - /> - ))} -
- ); - } - - protected renderPortsFooter(): React.ReactNode { - return ( -
- -
- ); - } -} - -export namespace BoardsConfig { - export namespace Config { - export function sameAs(config: Config, other: Config | Board): boolean { - const { selectedBoard, selectedPort } = config; - if (Board.is(other)) { - return ( - !!selectedBoard && - Board.equals(other, selectedBoard) && - Port.sameAs(selectedPort, other.port) - ); - } - return sameAs(config, other); - } - - export function equals(left: Config, right: Config): boolean { - return ( - left.selectedBoard === right.selectedBoard && - left.selectedPort === right.selectedPort - ); - } - - export function toString( - config: Config, - options: { default: string } = { default: '' } - ): string { - const { selectedBoard, selectedPort: port } = config; - if (!selectedBoard) { - return options.default; - } - const { name } = selectedBoard; - return `${name}${port ? ` at ${port.address}` : ''}`; - } - - export function setConfig( - config: Config | undefined, - urlToAttachTo: URL - ): URL { - const copy = new URL(urlToAttachTo.toString()); - if (!config) { - copy.searchParams.delete('boards-config'); - return copy; - } - - const selectedBoard = config.selectedBoard - ? { - name: config.selectedBoard.name, - fqbn: config.selectedBoard.fqbn, - } - : undefined; - const selectedPort = config.selectedPort - ? { - protocol: config.selectedPort.protocol, - address: config.selectedPort.address, - } - : undefined; - const jsonConfig = JSON.stringify({ selectedBoard, selectedPort }); - copy.searchParams.set('boards-config', encodeURIComponent(jsonConfig)); - return copy; - } - - export function getConfig(url: URL): Config | undefined { - const encoded = url.searchParams.get('boards-config'); - if (!encoded) { - return undefined; - } - try { - const raw = decodeURIComponent(encoded); - const candidate = JSON.parse(raw); - if (typeof candidate === 'object') { - return candidate; - } - console.warn( - `Expected candidate to be an object. It was ${typeof candidate}. URL was: ${url}` - ); - return undefined; - } catch (e) { - console.log(`Could not get board config from URL: ${url}.`, e); - return undefined; - } - } - } -} diff --git a/arduino-ide-extension/src/browser/boards/boards-data-store.ts b/arduino-ide-extension/src/browser/boards/boards-data-store.ts index 30f2f7781..65fd90290 100644 --- a/arduino-ide-extension/src/browser/boards/boards-data-store.ts +++ b/arduino-ide-extension/src/browser/boards/boards-data-store.ts @@ -1,77 +1,202 @@ -import { injectable, inject, named } from '@theia/core/shared/inversify'; +import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application-contribution'; +import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state'; +import { StorageService } from '@theia/core/lib/browser/storage-service'; +import type { + Command, + CommandContribution, + CommandRegistry, +} from '@theia/core/lib/common/command'; +import { DisposableCollection } from '@theia/core/lib/common/disposable'; +import { Emitter, Event } from '@theia/core/lib/common/event'; import { ILogger } from '@theia/core/lib/common/logger'; -import { deepClone } from '@theia/core/lib/common/objects'; -import { Event, Emitter } from '@theia/core/lib/common/event'; -import { - FrontendApplicationContribution, - LocalStorageService, -} from '@theia/core/lib/browser'; -import { notEmpty } from '../../common/utils'; +import { deepClone, deepFreeze } from '@theia/core/lib/common/objects'; +import type { Mutable } from '@theia/core/lib/common/types'; +import { inject, injectable, named } from '@theia/core/shared/inversify'; +import { FQBN } from 'fqbn'; import { + BoardDetails, BoardsService, ConfigOption, - BoardDetails, + ConfigValue, Programmer, + isBoardIdentifierChangeEvent, + isProgrammer, + sanitizeFqbn, } from '../../common/protocol'; +import { notEmpty } from '../../common/utils'; +import type { + StartupTask, + StartupTaskProvider, +} from '../../electron-common/startup-task'; import { NotificationCenter } from '../notification-center'; +import { BoardsServiceProvider } from './boards-service-provider'; + +export interface SelectConfigOptionParams { + readonly fqbn: string; + readonly optionsToUpdate: readonly Readonly<{ + option: string; + selectedValue: string; + }>[]; +} @injectable() -export class BoardsDataStore implements FrontendApplicationContribution { +export class BoardsDataStore + implements + FrontendApplicationContribution, + StartupTaskProvider, + CommandContribution +{ @inject(ILogger) @named('store') - protected readonly logger: ILogger; - + private readonly logger: ILogger; @inject(BoardsService) - protected readonly boardsService: BoardsService; - + private readonly boardsService: BoardsService; @inject(NotificationCenter) - protected readonly notificationCenter: NotificationCenter; - - @inject(LocalStorageService) - protected readonly storageService: LocalStorageService; + private readonly notificationCenter: NotificationCenter; + // When `@theia/workspace` is part of the application, the workspace-scoped storage service is the default implementation, and the `StorageService` symbol must be used for the injection. + // https://github.com/eclipse-theia/theia/blob/ba3722b04ff91eb6a4af6a571c9e263c77cdd8b5/packages/workspace/src/browser/workspace-frontend-module.ts#L97-L98 + // In other words, store the data (such as the board configs) per sketch, not per IDE2 installation. https://github.com/arduino/arduino-ide/issues/2240 + @inject(StorageService) + private readonly storageService: StorageService; + @inject(BoardsServiceProvider) + private readonly boardsServiceProvider: BoardsServiceProvider; + @inject(FrontendApplicationStateService) + private readonly appStateService: FrontendApplicationStateService; - protected readonly onChangedEmitter = new Emitter(); + private readonly onDidChangeEmitter = + new Emitter(); + private readonly toDispose = new DisposableCollection( + this.onDidChangeEmitter + ); + private _selectedBoardData: BoardsDataStoreChange | undefined; onStart(): void { - this.notificationCenter.onPlatformDidInstall(async ({ item }) => { - let shouldFireChanged = false; - for (const fqbn of item.boards - .map(({ fqbn }) => fqbn) - .filter(notEmpty) - .filter((fqbn) => !!fqbn)) { - const key = this.getStorageKey(fqbn); - let data = await this.storageService.getData< - ConfigOption[] | undefined - >(key); - if (!data || !data.length) { - const details = await this.getBoardDetailsSafe(fqbn); + this.toDispose.pushAll([ + this.boardsServiceProvider.onBoardsConfigDidChange((event) => { + if (isBoardIdentifierChangeEvent(event)) { + this.updateSelectedBoardData( + event.selectedBoard?.fqbn, + // If the change event comes from toolbar and the FQBN contains custom board options, change the currently selected options + // https://github.com/arduino/arduino-ide/issues/1588 + event.reason === 'toolbar' + ); + } + }), + this.notificationCenter.onPlatformDidInstall(async ({ item }) => { + const boardsWithFqbn = item.boards + .map(({ fqbn }) => fqbn) + .filter(notEmpty); + const changes: BoardsDataStoreChange[] = []; + for (const fqbn of boardsWithFqbn) { + const key = this.getStorageKey(fqbn); + const storedData = + await this.storageService.getData(key); + if (!storedData) { + // if no previously value is available for the board, do not update the cache + continue; + } + const details = await this.loadBoardDetails(fqbn); if (details) { - data = details.configOptions; - if (data.length) { - await this.storageService.setData(key, data); - shouldFireChanged = true; - } + const data = createDataStoreEntry(details); + await this.storageService.setData(key, data); + changes.push({ fqbn, data }); } } + if (changes.length) { + this.fireChanged(...changes); + } + }), + this.onDidChange((event) => { + const selectedFqbn = + this.boardsServiceProvider.boardsConfig.selectedBoard?.fqbn; + if (event.changes.find((change) => change.fqbn === selectedFqbn)) { + this.updateSelectedBoardData(selectedFqbn); + } + }), + ]); + + Promise.all([ + this.boardsServiceProvider.ready, + this.appStateService.reachedState('ready'), + ]).then(() => + this.updateSelectedBoardData( + this.boardsServiceProvider.boardsConfig.selectedBoard?.fqbn + ) + ); + } + + private async getSelectedBoardData( + fqbn: string | undefined + ): Promise { + if (!fqbn) { + return undefined; + } else { + const data = await this.getData(sanitizeFqbn(fqbn)); + if (data === BoardsDataStore.Data.EMPTY) { + return undefined; } - if (shouldFireChanged) { - this.fireChanged(); + return { fqbn, data }; + } + } + + private async updateSelectedBoardData( + fqbn: string | undefined, + updateConfigOptions = false + ): Promise { + this._selectedBoardData = await this.getSelectedBoardData(fqbn); + if (fqbn && updateConfigOptions) { + const { options } = new FQBN(fqbn); + if (options) { + const optionsToUpdate = Object.entries(options).map(([key, value]) => ({ + option: key, + selectedValue: value, + })); + const params = { fqbn, optionsToUpdate }; + await this.selectConfigOption(params); + this._selectedBoardData = await this.getSelectedBoardData(fqbn); // reload the updated data } + } + } + + onStop(): void { + this.toDispose.dispose(); + } + + registerCommands(registry: CommandRegistry): void { + registry.registerCommand(USE_INHERITED_DATA, { + execute: async (arg: unknown) => { + if (isBoardsDataStoreChange(arg)) { + await this.setData(arg); + this.fireChanged(arg); + } + }, }); } - get onChanged(): Event { - return this.onChangedEmitter.event; + tasks(): StartupTask[] { + if (!this._selectedBoardData) { + return []; + } + return [ + { + command: USE_INHERITED_DATA.id, + args: [this._selectedBoardData], + }, + ]; + } + + get onDidChange(): Event { + return this.onDidChangeEmitter.event; } async appendConfigToFqbn( - fqbn: string | undefined, + fqbn: string | undefined ): Promise { if (!fqbn) { return undefined; } const { configOptions } = await this.getData(fqbn); - return ConfigOption.decorate(fqbn, configOptions); + return new FQBN(fqbn).withConfigOptions(...configOptions).toString(); } async getData(fqbn: string | undefined): Promise { @@ -80,83 +205,106 @@ export class BoardsDataStore implements FrontendApplicationContribution { } const key = this.getStorageKey(fqbn); - let data = await this.storageService.getData< + const storedData = await this.storageService.getData< BoardsDataStore.Data | undefined >(key, undefined); - if (BoardsDataStore.Data.is(data)) { - return data; + if (BoardsDataStore.Data.is(storedData)) { + return storedData; } - const boardDetails = await this.getBoardDetailsSafe(fqbn); + const boardDetails = await this.loadBoardDetails(fqbn); if (!boardDetails) { return BoardsDataStore.Data.EMPTY; } - data = { - configOptions: boardDetails.configOptions, - programmers: boardDetails.programmers, - }; + const data = createDataStoreEntry(boardDetails); await this.storageService.setData(key, data); return data; } - async selectProgrammer( - { - fqbn, - selectedProgrammer, - }: { fqbn: string; selectedProgrammer: Programmer }, - ): Promise { - const data = deepClone(await this.getData(fqbn)); - const { programmers } = data; + async reloadBoardData(fqbn: string | undefined): Promise { + if (!fqbn) { + return; + } + const key = this.getStorageKey(fqbn); + const details = await this.loadBoardDetails(fqbn, true); + if (!details) { + return; + } + const data = createDataStoreEntry(details); + await this.storageService.setData(key, data); + this.fireChanged({ fqbn, data }); + } + + async selectProgrammer({ + fqbn, + selectedProgrammer, + }: { + fqbn: string; + selectedProgrammer: Programmer; + }): Promise { + const sanitizedFQBN = sanitizeFqbn(fqbn); + const storedData = deepClone(await this.getData(sanitizedFQBN)); + const { programmers } = storedData; if (!programmers.find((p) => Programmer.equals(selectedProgrammer, p))) { return false; } - await this.setData({ - fqbn, - data: { ...data, selectedProgrammer }, - }); - this.fireChanged(); + const change: BoardsDataStoreChange = { + fqbn: sanitizedFQBN, + data: { ...storedData, selectedProgrammer }, + }; + await this.setData(change); + this.fireChanged(change); return true; } - async selectConfigOption( - { - fqbn, - option, - selectedValue, - }: { fqbn: string; option: string; selectedValue: string } - ): Promise { - const data = deepClone(await this.getData(fqbn)); - const { configOptions } = data; - const configOption = configOptions.find((c) => c.option === option); - if (!configOption) { + async selectConfigOption(params: SelectConfigOptionParams): Promise { + const { fqbn, optionsToUpdate } = params; + if (!optionsToUpdate.length) { return false; } - let updated = false; - for (const value of configOption.values) { - if (value.value === selectedValue) { - (value as any).selected = true; - updated = true; - } else { - (value as any).selected = false; + + const sanitizedFQBN = sanitizeFqbn(fqbn); + const mutableData = deepClone(await this.getData(sanitizedFQBN)); + let didChange = false; + + for (const { option, selectedValue } of optionsToUpdate) { + const { configOptions } = mutableData; + const configOption = configOptions.find((c) => c.option === option); + if (configOption) { + const configOptionValueIndex = configOption.values.findIndex( + (configOptionValue) => configOptionValue.value === selectedValue + ); + if (configOptionValueIndex >= 0) { + // unselect all + configOption.values + .map((value) => value as Mutable) + .forEach((value) => (value.selected = false)); + const mutableConfigValue: Mutable = + configOption.values[configOptionValueIndex]; + // make the new value `selected` + mutableConfigValue.selected = true; + didChange = true; + } } } - if (!updated) { + + if (!didChange) { return false; } - await this.setData({ fqbn, data }); - this.fireChanged(); + + const change: BoardsDataStoreChange = { + fqbn: sanitizedFQBN, + data: mutableData, + }; + await this.setData(change); + this.fireChanged(change); return true; } - protected async setData({ - fqbn, - data, - }: { - fqbn: string; - data: BoardsDataStore.Data; - }): Promise { + protected async setData(change: BoardsDataStoreChange): Promise { + const { fqbn, data } = change; const key = this.getStorageKey(fqbn); return this.storageService.setData(key, data); } @@ -165,11 +313,15 @@ export class BoardsDataStore implements FrontendApplicationContribution { return `.arduinoIDE-configOptions-${fqbn}`; } - protected async getBoardDetailsSafe( - fqbn: string + async loadBoardDetails( + fqbn: string, + forceRefresh = false ): Promise { try { - const details = this.boardsService.getBoardDetails({ fqbn }); + const details = await this.boardsService.getBoardDetails({ + fqbn, + forceRefresh, + }); return details; } catch (err) { if ( @@ -190,8 +342,8 @@ export class BoardsDataStore implements FrontendApplicationContribution { } } - protected fireChanged(): void { - this.onChangedEmitter.fire(); + protected fireChanged(...changes: BoardsDataStoreChange[]): void { + this.onDidChangeEmitter.fire({ changes }); } } @@ -200,20 +352,86 @@ export namespace BoardsDataStore { readonly configOptions: ConfigOption[]; readonly programmers: Programmer[]; readonly selectedProgrammer?: Programmer; + readonly defaultProgrammerId?: string; } export namespace Data { - export const EMPTY: Data = { + export const EMPTY: Data = deepFreeze({ configOptions: [], programmers: [], - }; - export function is(arg: any): arg is Data { + }); + + export function is(arg: unknown): arg is Data { return ( - !!arg && - 'configOptions' in arg && - Array.isArray(arg['configOptions']) && - 'programmers' in arg && - Array.isArray(arg['programmers']) + typeof arg === 'object' && + arg !== null && + Array.isArray((arg).configOptions) && + Array.isArray((arg).programmers) && + ((arg).selectedProgrammer === undefined || + isProgrammer((arg).selectedProgrammer)) && + ((arg).defaultProgrammerId === undefined || + typeof (arg).defaultProgrammerId === 'string') ); } } } + +export function isEmptyData(data: BoardsDataStore.Data): boolean { + return ( + Boolean(!data.configOptions.length) && + Boolean(!data.programmers.length) && + Boolean(!data.selectedProgrammer) && + Boolean(!data.defaultProgrammerId) + ); +} + +export function findDefaultProgrammer( + programmers: readonly Programmer[], + defaultProgrammerId: string | undefined | BoardsDataStore.Data +): Programmer | undefined { + if (!defaultProgrammerId) { + return undefined; + } + const id = + typeof defaultProgrammerId === 'string' + ? defaultProgrammerId + : defaultProgrammerId.defaultProgrammerId; + return programmers.find((p) => p.id === id); +} +function createDataStoreEntry(details: BoardDetails): BoardsDataStore.Data { + const configOptions = details.configOptions.slice(); + const programmers = details.programmers.slice(); + const { defaultProgrammerId } = details; + const selectedProgrammer = findDefaultProgrammer( + programmers, + defaultProgrammerId + ); + const data = { + configOptions, + programmers, + ...(selectedProgrammer ? { selectedProgrammer } : {}), + ...(defaultProgrammerId ? { defaultProgrammerId } : {}), + }; + return data; +} + +export interface BoardsDataStoreChange { + readonly fqbn: string; + readonly data: BoardsDataStore.Data; +} + +function isBoardsDataStoreChange(arg: unknown): arg is BoardsDataStoreChange { + return ( + typeof arg === 'object' && + arg !== null && + typeof (arg).fqbn === 'string' && + BoardsDataStore.Data.is((arg).data) + ); +} + +export interface BoardsDataStoreChangeEvent { + readonly changes: readonly BoardsDataStoreChange[]; +} + +const USE_INHERITED_DATA: Command = { + id: 'arduino-use-inherited-boards-data', +}; diff --git a/arduino-ide-extension/src/browser/boards/boards-list-widget.ts b/arduino-ide-extension/src/browser/boards/boards-list-widget.ts index 8b7626720..7067225dc 100644 --- a/arduino-ide-extension/src/browser/boards/boards-list-widget.ts +++ b/arduino-ide-extension/src/browser/boards/boards-list-widget.ts @@ -30,7 +30,6 @@ export class BoardsListWidget extends ListWidget { searchable: service, installable: service, itemLabel: (item: BoardsPackage) => item.name, - itemDeprecated: (item: BoardsPackage) => item.deprecated, itemRenderer, filterRenderer, defaultSearchOptions: { query: '', type: 'All' }, diff --git a/arduino-ide-extension/src/browser/boards/boards-service-provider.ts b/arduino-ide-extension/src/browser/boards/boards-service-provider.ts index 0f0fbbea9..864bae190 100644 --- a/arduino-ide-extension/src/browser/boards/boards-service-provider.ts +++ b/arduino-ide-extension/src/browser/boards/boards-service-provider.ts @@ -1,372 +1,481 @@ -import { injectable, inject } from '@theia/core/shared/inversify'; +import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application-contribution'; +import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state'; +import { StorageService } from '@theia/core/lib/browser/storage-service'; +import { + Command, + CommandContribution, + CommandRegistry, + CommandService, +} from '@theia/core/lib/common/command'; +import type { Disposable } from '@theia/core/lib/common/disposable'; import { Emitter } from '@theia/core/lib/common/event'; import { ILogger } from '@theia/core/lib/common/logger'; -import { CommandService } from '@theia/core/lib/common/command'; import { MessageService } from '@theia/core/lib/common/message-service'; -import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application'; -import { RecursiveRequired } from '../../common/types'; +import { nls } from '@theia/core/lib/common/nls'; +import { deepClone } from '@theia/core/lib/common/objects'; +import { Deferred } from '@theia/core/lib/common/promise-util'; +import type { Mutable } from '@theia/core/lib/common/types'; +import { inject, injectable, optional } from '@theia/core/shared/inversify'; import { - Port, - Board, - BoardsService, - BoardsPackage, - AttachedBoardsChangeEvent, - BoardWithPackage, + OutputChannel, + OutputChannelManager, +} from '@theia/output/lib/browser/output-channel'; +import { + BoardIdentifier, BoardUserField, - AvailablePorts, + BoardWithPackage, + BoardsConfig, + BoardsConfigChangeEvent, + BoardsPackage, + BoardsService, + DetectedPorts, + Port, + PortIdentifier, + boardIdentifierEquals, + emptyBoardsConfig, + isBoardIdentifier, + isBoardIdentifierChangeEvent, + isPortIdentifier, + isPortIdentifierChangeEvent, + portIdentifierEquals, + sanitizeFqbn, + serializePlatformIdentifier, } from '../../common/protocol'; -import { BoardsConfig } from './boards-config'; -import { naturalCompare } from '../../common/utils'; +import { + BoardList, + BoardListHistory, + EditBoardsConfigActionParams, + SelectBoardsConfigActionParams, + createBoardList, + isBoardListHistory, +} from '../../common/protocol/board-list'; +import type { Defined } from '../../common/types'; +import type { + StartupTask, + StartupTaskProvider, +} from '../../electron-common/startup-task'; import { NotificationCenter } from '../notification-center'; -import { StorageWrapper } from '../storage-wrapper'; -import { nls } from '@theia/core/lib/common'; -import { Deferred } from '@theia/core/lib/common/promise-util'; -import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state'; -import { Unknown } from '../../common/nls'; + +const boardListHistoryStorageKey = 'arduino-ide:boardListHistory'; +const selectedPortStorageKey = 'arduino-ide:selectedPort'; +const selectedBoardStorageKey = 'arduino-ide:selectedBoard'; + +type UpdateBoardsConfigReason = + /** + * Restore previous state at IDE startup. + */ + | 'restore' + /** + * The board and the optional port were changed from the dialog. + */ + | 'dialog' + /** + * The board and the port were updated from the board select toolbar. + */ + | 'toolbar' + /** + * The board and port configuration was inherited from another window. + */ + | 'inherit'; + +interface RefreshBoardListParams { + detectedPorts?: DetectedPorts; + boardsConfig?: BoardsConfig; + boardListHistory?: BoardListHistory; +} + +export type UpdateBoardsConfigParams = + | BoardIdentifier + /** + * `'unset-board'` is special case when a non installed board is selected (no FQBN), the platform is installed, + * but there is no way to determine the FQBN from the previous partial data, and IDE2 unsets the board. + */ + | 'unset-board' + | PortIdentifier + | (Readonly> & + Readonly<{ reason?: UpdateBoardsConfigReason }>); + +type HistoryDidNotChange = undefined; +type HistoryDidDelete = Readonly<{ [portKey: string]: undefined }>; +type HistoryDidUpdate = Readonly<{ [portKey: string]: BoardIdentifier }>; +type BoardListHistoryUpdateResult = + | HistoryDidNotChange + | HistoryDidDelete + | HistoryDidUpdate; + +type BoardToSelect = BoardIdentifier | undefined | 'ignore-board'; +type PortToSelect = PortIdentifier | undefined | 'ignore-port'; + +function sanitizeBoardToSelectFQBN(board: BoardToSelect): BoardToSelect { + if (isBoardIdentifier(board)) { + return sanitizeBoardIdentifierFQBN(board); + } + return board; +} +function sanitizeBoardIdentifierFQBN(board: BoardIdentifier): BoardIdentifier { + if (board.fqbn) { + const copy: Mutable = deepClone(board); + copy.fqbn = sanitizeFqbn(board.fqbn); + return copy; + } + return board; +} + +interface UpdateBoardListHistoryParams { + readonly portToSelect: PortToSelect; + readonly boardToSelect: BoardToSelect; +} + +interface UpdateBoardsDataParams { + readonly boardToSelect: BoardToSelect; + readonly reason?: UpdateBoardsConfigReason; +} + +export interface SelectBoardsConfigAction { + (params: SelectBoardsConfigActionParams): void; +} + +export interface EditBoardsConfigAction { + (params?: EditBoardsConfigActionParams): void; +} + +export interface BoardListUIActions { + /** + * Sets the frontend's port and board configuration according to the params. + */ + readonly select: SelectBoardsConfigAction; + /** + * Opens up the boards config dialog with the port and (optional) board to select in the dialog. + * Calling this function does not immediately change the frontend's port and board config, but + * preselects items in the dialog. + */ + readonly edit: EditBoardsConfigAction; +} +export type BoardListUI = BoardList & BoardListUIActions; + +export type BoardsConfigChangeEventUI = BoardsConfigChangeEvent & + Readonly<{ reason?: UpdateBoardsConfigReason }>; @injectable() -export class BoardsServiceProvider implements FrontendApplicationContribution { - @inject(ILogger) - protected logger: ILogger; +export class BoardListDumper implements Disposable { + @inject(OutputChannelManager) + private readonly outputChannelManager: OutputChannelManager; - @inject(MessageService) - protected messageService: MessageService; + private outputChannel: OutputChannel | undefined; - @inject(BoardsService) - protected boardsService: BoardsService; + dump(boardList: BoardList): void { + if (!this.outputChannel) { + this.outputChannel = this.outputChannelManager.getChannel( + 'Developer (Arduino)' + ); + } + this.outputChannel.show({ preserveFocus: true }); + this.outputChannel.append(boardList.toString() + '\n'); + } - @inject(CommandService) - protected commandService: CommandService; + dispose(): void { + this.outputChannel?.dispose(); + } +} +@injectable() +export class BoardsServiceProvider + implements + FrontendApplicationContribution, + StartupTaskProvider, + CommandContribution +{ + @inject(ILogger) + private readonly logger: ILogger; + @inject(MessageService) + private readonly messageService: MessageService; + @inject(BoardsService) + private readonly boardsService: BoardsService; + @inject(CommandService) + private readonly commandService: CommandService; + @inject(StorageService) + private readonly storageService: StorageService; @inject(NotificationCenter) - protected notificationCenter: NotificationCenter; - + private readonly notificationCenter: NotificationCenter; @inject(FrontendApplicationStateService) private readonly appStateService: FrontendApplicationStateService; + @optional() + @inject(BoardListDumper) + private readonly boardListDumper?: BoardListDumper; - protected readonly onBoardsConfigChangedEmitter = - new Emitter(); - protected readonly onAvailableBoardsChangedEmitter = new Emitter< - AvailableBoard[] - >(); - protected readonly onAvailablePortsChangedEmitter = new Emitter(); + private _boardsConfig = emptyBoardsConfig(); + private _detectedPorts: DetectedPorts = {}; + private _boardList = this.createBoardListUI(createBoardList({})); + private _boardListHistory: Mutable = {}; + private _ready = new Deferred(); - /** - * Used for the auto-reconnecting. Sometimes, the attached board gets disconnected after uploading something to it. - * It happens with certain boards on Windows. For example, the `MKR1000` boards is selected on post `COM5` on Windows, - * perform an upload, the board automatically disconnects and reconnects, but on another port, `COM10`. - * We have to listen on such changes and auto-reconnect the same board on another port. - * See: https://arduino.slack.com/archives/CJJHJCJSJ/p1568645417013000?thread_ts=1568640504.009400&cid=CJJHJCJSJ - */ - protected latestValidBoardsConfig: - | RecursiveRequired - | undefined = undefined; - protected latestBoardsConfig: BoardsConfig.Config | undefined = undefined; - protected _boardsConfig: BoardsConfig.Config = {}; - protected _attachedBoards: Board[] = []; // This does not contain the `Unknown` boards. They're visible from the available ports only. - protected _availablePorts: Port[] = []; - protected _availableBoards: AvailableBoard[] = []; - - private lastBoardsConfigOnUpload: BoardsConfig.Config | undefined; - private lastAvailablePortsOnUpload: Port[] | undefined; - private boardConfigToAutoSelect: BoardsConfig.Config | undefined; + private readonly boardsConfigDidChangeEmitter = + new Emitter(); + readonly onBoardsConfigDidChange = this.boardsConfigDidChangeEmitter.event; + private readonly boardListDidChangeEmitter = new Emitter(); /** - * Unlike `onAttachedBoardsChanged` this event fires when the user modifies the selected board in the IDE.\ - * This event also fires, when the boards package was not available for the currently selected board, - * and the user installs the board package. Note: installing a board package will set the `fqbn` of the - * currently selected board. - * - * This event is also emitted when the board package for the currently selected board was uninstalled. + * Emits an event on board config (port or board) change, and when the discovery (`board list --watch`) detected any changes. */ - readonly onBoardsConfigChanged = this.onBoardsConfigChangedEmitter.event; - readonly onAvailableBoardsChanged = - this.onAvailableBoardsChangedEmitter.event; - readonly onAvailablePortsChanged = this.onAvailablePortsChangedEmitter.event; - - private readonly _reconciled = new Deferred(); + readonly onBoardListDidChange = this.boardListDidChangeEmitter.event; onStart(): void { - this.notificationCenter.onAttachedBoardsDidChange( - this.notifyAttachedBoardsChanged.bind(this) + this.notificationCenter.onDetectedPortsDidChange(({ detectedPorts }) => + this.refreshBoardList({ detectedPorts }) ); - this.notificationCenter.onPlatformDidInstall( - this.notifyPlatformInstalled.bind(this) + this.notificationCenter.onPlatformDidInstall((event) => + this.maybeUpdateSelectedBoard(event) ); - this.notificationCenter.onPlatformDidUninstall( - this.notifyPlatformUninstalled.bind(this) - ); - - this.appStateService.reachedState('ready').then(async () => { - const [state] = await Promise.all([ - this.boardsService.getState(), - this.loadState(), - ]); - const { boards: attachedBoards, ports: availablePorts } = - AvailablePorts.split(state); - this._attachedBoards = attachedBoards; - this._availablePorts = availablePorts; - this.onAvailablePortsChangedEmitter.fire(this._availablePorts); - - await this.reconcileAvailableBoards(); - - this.tryReconnect(); - this._reconciled.resolve(); - }); + this.appStateService + .reachedState('ready') + .then(async () => { + const [detectedPorts, storedState] = await Promise.all([ + this.boardsService.getDetectedPorts(), + this.restoreState(), + ]); + const { selectedBoard, selectedPort, boardListHistory } = storedState; + const options: RefreshBoardListParams = { + boardListHistory, + detectedPorts, + }; + // If either the port or the board is set, restore it. Otherwise, do not restore nothing. + // It might override the inherited boards config from the other window on File > New Sketch + if (selectedBoard || selectedPort) { + options.boardsConfig = { selectedBoard, selectedPort }; + } + this.refreshBoardList(options); + this._ready.resolve(); + }) + .finally(() => this._ready.resolve()); } - get reconciled(): Promise { - return this._reconciled.promise; + onStop(): void { + this.boardListDumper?.dispose(); } - snapshotBoardDiscoveryOnUpload(): void { - this.lastBoardsConfigOnUpload = this._boardsConfig; - this.lastAvailablePortsOnUpload = this._availablePorts; + registerCommands(registry: CommandRegistry): void { + registry.registerCommand(USE_INHERITED_CONFIG, { + execute: ( + boardsConfig: BoardsConfig, + boardListHistory: BoardListHistory + ) => { + if (boardListHistory) { + this._boardListHistory = boardListHistory; + } + this.update({ boardsConfig }, 'inherit'); + }, + }); + if (this.boardListDumper) { + registry.registerCommand(DUMP_BOARD_LIST, { + execute: () => this.boardListDumper?.dump(this._boardList), + }); + } + registry.registerCommand(CLEAR_BOARD_LIST_HISTORY, { + execute: () => { + this.refreshBoardList({ boardListHistory: {} }); + this.setData(boardListHistoryStorageKey, undefined); + }, + }); + registry.registerCommand(CLEAR_BOARDS_CONFIG, { + execute: () => { + this.refreshBoardList({ boardsConfig: emptyBoardsConfig() }); + Promise.all([ + this.setData(selectedPortStorageKey, undefined), + this.setData(selectedBoardStorageKey, undefined), + ]); + }, + }); } - clearBoardDiscoverySnapshot(): void { - this.lastBoardsConfigOnUpload = undefined; - this.lastAvailablePortsOnUpload = undefined; + tasks(): StartupTask[] { + return [ + { + command: USE_INHERITED_CONFIG.id, + args: [this._boardsConfig, this._boardListHistory], + }, + ]; } - private portToAutoSelectCanBeDerived(): boolean { - return Boolean( - this.lastBoardsConfigOnUpload && this.lastAvailablePortsOnUpload + private refreshBoardList(params?: RefreshBoardListParams): void { + if (params?.detectedPorts) { + this._detectedPorts = params.detectedPorts; + } + if (params?.boardsConfig) { + this._boardsConfig = params.boardsConfig; + } + if (params?.boardListHistory) { + this._boardListHistory = params.boardListHistory; + } + const boardList = createBoardList( + this._detectedPorts, + this._boardsConfig, + this._boardListHistory ); + this._boardList = this.createBoardListUI(boardList); + this.boardListDidChangeEmitter.fire(this._boardList); } - attemptPostUploadAutoSelect(): void { - setTimeout(() => { - if (this.portToAutoSelectCanBeDerived()) { - this.attemptAutoSelect({ - ports: this._availablePorts, - boards: this._availableBoards, - }); - } - }, 2000); // 2 second delay same as IDE 1.8 + private createBoardListUI(boardList: BoardList): BoardListUI { + return Object.assign(boardList, { + select: this.onBoardsConfigSelect.bind(this), + edit: this.onBoardsConfigEdit.bind(this), + }); } - private attemptAutoSelect( - newState: AttachedBoardsChangeEvent['newState'] - ): void { - this.deriveBoardConfigToAutoSelect(newState); - this.tryReconnect(); + private onBoardsConfigSelect(params: SelectBoardsConfigActionParams): void { + this.updateConfig({ ...params, reason: 'toolbar' }); + } + + private async onBoardsConfigEdit( + params?: EditBoardsConfigActionParams + ): Promise { + const boardsConfig = await this.commandService.executeCommand< + BoardsConfig | undefined + >('arduino-open-boards-dialog', params); + if (boardsConfig) { + this.update({ boardsConfig }, 'dialog'); + } } - private deriveBoardConfigToAutoSelect( - newState: AttachedBoardsChangeEvent['newState'] + private update( + params: RefreshBoardListParams, + reason?: UpdateBoardsConfigReason ): void { - if (!this.portToAutoSelectCanBeDerived()) { - this.boardConfigToAutoSelect = undefined; + const { boardsConfig } = params; + if (!boardsConfig) { return; } + const { selectedBoard, selectedPort } = boardsConfig; + if (selectedBoard && selectedPort) { + this.updateConfig({ + selectedBoard, + selectedPort, + reason, + }); + } else if (selectedBoard) { + this.updateConfig(selectedBoard); + } else if (selectedPort) { + this.updateConfig(selectedPort); + } + } - const oldPorts = this.lastAvailablePortsOnUpload!; - const { ports: newPorts, boards: newBoards } = newState; + updateConfig(params: UpdateBoardsConfigParams): boolean { + const previousSelectedBoard = this._boardsConfig.selectedBoard; + const previousSelectedPort = this._boardsConfig.selectedPort; + const boardToSelect = this.getBoardToSelect(params); + const portToSelect = this.getPortToSelect(params); + const reason = this.getUpdateReason(params); + + const boardDidChange = + boardToSelect !== 'ignore-board' && + !boardIdentifierEquals(boardToSelect, previousSelectedBoard); + const portDidChange = + portToSelect !== 'ignore-port' && + !portIdentifierEquals(portToSelect, previousSelectedPort); + const boardDidChangeEvent = boardDidChange + ? // The change event must always contain any custom board options. Hence the board to select is not sanitized. + { selectedBoard: boardToSelect, previousSelectedBoard } + : undefined; + const portDidChangeEvent = portDidChange + ? { selectedPort: portToSelect, previousSelectedPort } + : undefined; + + let event: BoardsConfigChangeEvent | undefined = boardDidChangeEvent; + if (portDidChangeEvent) { + if (event) { + event = { + ...event, + ...portDidChangeEvent, + }; + } else { + event = portDidChangeEvent; + } + } + if (!event) { + return false; + } - const appearedPorts = - oldPorts.length > 0 - ? newPorts.filter((newPort: Port) => - oldPorts.every((oldPort: Port) => !Port.sameAs(newPort, oldPort)) - ) - : newPorts; + // unlike for the board change event, every persistent state must not contain custom board config options in the FQBN + const sanitizedBoardToSelect = sanitizeBoardToSelectFQBN(boardToSelect); - for (const port of appearedPorts) { - const boardOnAppearedPort = newBoards.find((board: Board) => - Port.sameAs(board.port, port) - ); + this.maybeUpdateBoardListHistory({ + portToSelect, + boardToSelect: sanitizedBoardToSelect, + }); + this.maybeUpdateBoardsData({ + boardToSelect: sanitizedBoardToSelect, + reason, + }); - const lastBoardsConfigOnUpload = this.lastBoardsConfigOnUpload!; - - if ( - boardOnAppearedPort && - lastBoardsConfigOnUpload.selectedBoard && - Board.sameAs( - boardOnAppearedPort, - lastBoardsConfigOnUpload.selectedBoard - ) - ) { - this.clearBoardDiscoverySnapshot(); - - this.boardConfigToAutoSelect = { - selectedBoard: boardOnAppearedPort, - selectedPort: port, - }; - return; - } + if (isBoardIdentifierChangeEvent(event)) { + this._boardsConfig.selectedBoard = event.selectedBoard + ? sanitizeBoardIdentifierFQBN(event.selectedBoard) + : event.selectedBoard; + } + if (isPortIdentifierChangeEvent(event)) { + this._boardsConfig.selectedPort = event.selectedPort; } - } - protected notifyAttachedBoardsChanged( - event: AttachedBoardsChangeEvent - ): void { - if (!AttachedBoardsChangeEvent.isEmpty(event)) { - this.logger.info('Attached boards and available ports changed:'); - this.logger.info(AttachedBoardsChangeEvent.toString(event)); - this.logger.info('------------------------------------------'); + if (reason) { + event = Object.assign(event, { reason }); } - this._attachedBoards = event.newState.boards; - this._availablePorts = event.newState.ports; - this.onAvailablePortsChangedEmitter.fire(this._availablePorts); - this.reconcileAvailableBoards().then(() => { - const { uploadInProgress } = event; - // avoid attempting "auto-selection" while an - // upload is in progress - if (!uploadInProgress) { - this.attemptAutoSelect(event.newState); - } - }); + this.boardsConfigDidChangeEmitter.fire(event); + this.refreshBoardList(); + this.saveState(); + return true; } - protected notifyPlatformInstalled(event: { item: BoardsPackage }): void { - this.logger.info('Boards package installed: ', JSON.stringify(event)); - const { selectedBoard } = this.boardsConfig; - const { installedVersion, id } = event.item; - if (selectedBoard) { - const installedBoard = event.item.boards.find( - ({ name }) => name === selectedBoard.name - ); - if ( - installedBoard && - (!selectedBoard.fqbn || selectedBoard.fqbn === installedBoard.fqbn) - ) { - this.logger.info( - `Board package ${id}[${installedVersion}] was installed. Updating the FQBN of the currently selected ${selectedBoard.name} board. [FQBN: ${installedBoard.fqbn}]` - ); - this.boardsConfig = { - ...this.boardsConfig, - selectedBoard: installedBoard, - }; - return; - } - // The board name can change after install. - // This logic handles it "gracefully" by unselecting the board, so that we can avoid no FQBN is set error. - // https://github.com/arduino/arduino-cli/issues/620 - // https://github.com/arduino/arduino-pro-ide/issues/374 - if ( - BoardWithPackage.is(selectedBoard) && - selectedBoard.packageId === event.item.id && - !installedBoard - ) { - const yes = nls.localize('vscode/extensionsUtils/yes', 'Yes'); - this.messageService - .warn( - nls.localize( - 'arduino/board/couldNotFindPreviouslySelected', - "Could not find previously selected board '{0}' in installed platform '{1}'. Please manually reselect the board you want to use. Do you want to reselect it now?", - selectedBoard.name, - event.item.name - ), - nls.localize('arduino/board/reselectLater', 'Reselect later'), - yes - ) - .then(async (answer) => { - if (answer === yes) { - this.commandService.executeCommand( - 'arduino-open-boards-dialog', - selectedBoard.name - ); - } - }); - this.boardsConfig = {}; - return; - } - // Trigger a board re-set. See: https://github.com/arduino/arduino-cli/issues/954 - // E.g: install `adafruit:avr`, then select `adafruit:avr:adafruit32u4` board, and finally install the required `arduino:avr` - this.boardsConfig = this.boardsConfig; + private getBoardToSelect(params: UpdateBoardsConfigParams): BoardToSelect { + if (isPortIdentifier(params)) { + return 'ignore-board'; + } + if (params === 'unset-board') { + return undefined; } + return isBoardIdentifier(params) ? params : params.selectedBoard; } - protected notifyPlatformUninstalled(event: { item: BoardsPackage }): void { - this.logger.info('Boards package uninstalled: ', JSON.stringify(event)); - const { selectedBoard } = this.boardsConfig; - if (selectedBoard && selectedBoard.fqbn) { - const uninstalledBoard = event.item.boards.find( - ({ name }) => name === selectedBoard.name - ); - if (uninstalledBoard && uninstalledBoard.fqbn === selectedBoard.fqbn) { - // We should not unset the FQBN, if the selected board is an attached, recognized board. - // Attach Uno and install AVR, select Uno. Uninstall the AVR core while Uno is selected. We do not want to discard the FQBN of the Uno board. - // Dev note: We cannot assume the `selectedBoard` is a type of `AvailableBoard`. - // When the user selects an `AvailableBoard` it works, but between app start/stops, - // it is just a FQBN, so we need to find the `selected` board among the `AvailableBoards` - const selectedAvailableBoard = AvailableBoard.is(selectedBoard) - ? selectedBoard - : this._availableBoards.find((availableBoard) => - Board.sameAs(availableBoard, selectedBoard) - ); - if ( - selectedAvailableBoard && - selectedAvailableBoard.selected && - selectedAvailableBoard.state === AvailableBoard.State.recognized - ) { - return; - } - this.logger.info( - `Board package ${event.item.id} was uninstalled. Discarding the FQBN of the currently selected ${selectedBoard.name} board.` - ); - const selectedBoardWithoutFqbn = { - name: selectedBoard.name, - // No FQBN - }; - this.boardsConfig = { - ...this.boardsConfig, - selectedBoard: selectedBoardWithoutFqbn, - }; - } + private getPortToSelect( + params: UpdateBoardsConfigParams + ): Exclude { + if (isBoardIdentifier(params) || params === 'unset-board') { + return 'ignore-port'; } + return isPortIdentifier(params) ? params : params.selectedPort; } - protected tryReconnect(): boolean { - if (this.latestValidBoardsConfig && !this.canUploadTo(this.boardsConfig)) { - for (const board of this.availableBoards.filter( - ({ state }) => state !== AvailableBoard.State.incomplete - )) { - if ( - this.latestValidBoardsConfig.selectedBoard.fqbn === board.fqbn && - this.latestValidBoardsConfig.selectedBoard.name === board.name && - Port.sameAs(this.latestValidBoardsConfig.selectedPort, board.port) - ) { - this.boardsConfig = this.latestValidBoardsConfig; - return true; - } - } - - if (!this.boardConfigToAutoSelect) return false; - - this.boardsConfig = this.boardConfigToAutoSelect; - this.boardConfigToAutoSelect = undefined; - return true; + private getUpdateReason( + params: UpdateBoardsConfigParams + ): UpdateBoardsConfigReason | undefined { + if ( + isBoardIdentifier(params) || + isPortIdentifier(params) || + params === 'unset-board' + ) { + return undefined; } - return false; + return params.reason; } - set boardsConfig(config: BoardsConfig.Config) { - this.setBoardsConfig(config); - this.saveState().finally(() => - this.reconcileAvailableBoards().finally(() => - this.onBoardsConfigChangedEmitter.fire(this._boardsConfig) - ) - ); + get ready(): Promise { + return this._ready.promise; } - get boardsConfig(): BoardsConfig.Config { + get boardsConfig(): BoardsConfig { return this._boardsConfig; } - protected setBoardsConfig(config: BoardsConfig.Config): void { - this.logger.debug('Board config changed: ', JSON.stringify(config)); - this._boardsConfig = config; - this.latestBoardsConfig = this._boardsConfig; - if (this.canUploadTo(this._boardsConfig)) { - this.latestValidBoardsConfig = this._boardsConfig; - } + get boardList(): BoardListUI { + return this._boardList; + } + + get detectedPorts(): DetectedPorts { + return this._detectedPorts; } async searchBoards({ query, - cores, }: { query?: string; cores?: string[]; @@ -376,385 +485,212 @@ export class BoardsServiceProvider implements FrontendApplicationContribution { } async selectedBoardUserFields(): Promise { - if (!this._boardsConfig.selectedBoard || !this._boardsConfig.selectedPort) { + if (!this._boardsConfig.selectedBoard) { return []; } const fqbn = this._boardsConfig.selectedBoard.fqbn; if (!fqbn) { return []; } - const protocol = this._boardsConfig.selectedPort.protocol; + // Protocol must be set to `default` when uploading without a port selected: + // https://arduino.github.io/arduino-cli/dev/platform-specification/#sketch-upload-configuration + const protocol = this._boardsConfig.selectedPort?.protocol || 'default'; return await this.boardsService.getBoardUserFields({ fqbn, protocol }); } - /** - * `true` if the `config.selectedBoard` is defined; hence can compile against the board. Otherwise, `false`. - */ - canVerify( - config: BoardsConfig.Config | undefined = this.boardsConfig, - options: { silent: boolean } = { silent: true } - ): config is BoardsConfig.Config & { selectedBoard: Board } { - if (!config) { - return false; - } - - if (!config.selectedBoard) { - if (!options.silent) { - this.messageService.warn( - nls.localize('arduino/board/noneSelected', 'No boards selected.'), - { - timeout: 3000, - } - ); - } - return false; - } - - return true; - } - - /** - * `true` if `canVerify`, the board has an FQBN and the `config.selectedPort` is also set, hence can upload to board. Otherwise, `false`. - */ - canUploadTo( - config: BoardsConfig.Config | undefined = this.boardsConfig, - options: { silent: boolean } = { silent: true } - ): config is RecursiveRequired { - if (!this.canVerify(config, options)) { - return false; - } - - const { name } = config.selectedBoard; - if (!config.selectedPort) { - if (!options.silent) { - this.messageService.warn( - nls.localize( - 'arduino/board/noPortsSelected', - "No ports selected for board: '{0}'.", - name - ), - { - timeout: 3000, - } + private async maybeUpdateSelectedBoard(platformDidInstallEvent: { + item: BoardsPackage; + }): Promise { + const { selectedBoard } = this._boardsConfig; + if ( + selectedBoard && + !selectedBoard.fqbn && + BoardWithPackage.is(selectedBoard) + ) { + const selectedBoardPlatformId = serializePlatformIdentifier( + selectedBoard.packageId + ); + if (selectedBoardPlatformId === platformDidInstallEvent.item.id) { + const installedSelectedBoard = platformDidInstallEvent.item.boards.find( + (board) => board.name === selectedBoard.name ); - } - return false; - } - - if (!config.selectedBoard.fqbn) { - if (!options.silent) { - this.messageService.warn( - nls.localize( - 'arduino/board/noFQBN', - 'The FQBN is not available for the selected board "{0}". Do you have the corresponding core installed?', - name - ), - { timeout: 3000 } + // if the board can be found by its name after the install event select it. otherwise unselect it + // historical hint: https://github.com/arduino/arduino-ide/blob/144df893d0dafec64a26565cf912a98f32572da9/arduino-ide-extension/src/browser/boards/boards-service-provider.ts#L289-L320 + this.updateConfig( + installedSelectedBoard ? installedSelectedBoard : 'unset-board' ); + if (!installedSelectedBoard) { + const yes = nls.localize('vscode/extensionsUtils/yes', 'Yes'); + const answer = await this.messageService.warn( + nls.localize( + 'arduino/board/couldNotFindPreviouslySelected', + "Could not find previously selected board '{0}' in installed platform '{1}'. Please manually reselect the board you want to use. Do you want to reselect it now?", + selectedBoard.name, + platformDidInstallEvent.item.name + ), + nls.localize('arduino/board/reselectLater', 'Reselect later'), + yes + ); + if (answer === yes) { + this.onBoardsConfigEdit({ + query: selectedBoard.name, + portToSelect: this._boardsConfig.selectedPort, + }); + } + } } - return false; } - - return true; - } - - get availableBoards(): AvailableBoard[] { - return this._availableBoards; - } - - /** - * @deprecated Do not use this API, it will be removed. This is a hack to be able to set the missing port `properties` before an upload. - * - * See: https://github.com/arduino/arduino-ide/pull/1335#issuecomment-1224355236. - */ - // TODO: remove this API and fix the selected board config store/restore correctly. - get availablePorts(): Port[] { - return this._availablePorts.slice(); } - async waitUntilAvailable( - what: Board & { port: Port }, - timeout?: number - ): Promise { - const find = (needle: Board & { port: Port }, haystack: AvailableBoard[]) => - haystack.find( - (board) => - Board.equals(needle, board) && Port.sameAs(needle.port, board.port) - ); - const timeoutTask = - !!timeout && timeout > 0 - ? new Promise((_, reject) => - setTimeout( - () => reject(new Error(`Timeout after ${timeout} ms.`)), - timeout - ) - ) - : new Promise(() => { - /* never */ - }); - const waitUntilTask = new Promise((resolve) => { - let candidate = find(what, this.availableBoards); - if (candidate) { - resolve(); - return; - } - const disposable = this.onAvailableBoardsChanged((availableBoards) => { - candidate = find(what, availableBoards); - if (candidate) { - disposable.dispose(); - resolve(); - } - }); - }); - return await Promise.race([waitUntilTask, timeoutTask]); - } - - protected async reconcileAvailableBoards(): Promise { - const availablePorts = this._availablePorts; - // Unset the port on the user's config, if it is not available anymore. - if ( - this.boardsConfig.selectedPort && - !availablePorts.some((port) => - Port.sameAs(port, this.boardsConfig.selectedPort) - ) - ) { - this.setBoardsConfig({ - selectedBoard: this.boardsConfig.selectedBoard, - selectedPort: undefined, - }); - this.onBoardsConfigChangedEmitter.fire(this._boardsConfig); - } - const boardsConfig = this.boardsConfig; - const currentAvailableBoards = this._availableBoards; - const availableBoards: AvailableBoard[] = []; - const attachedBoards = this._attachedBoards.filter(({ port }) => !!port); - const availableBoardPorts = availablePorts.filter( - Port.visiblePorts(attachedBoards) - ); - - for (const boardPort of availableBoardPorts) { - const board = attachedBoards.find(({ port }) => - Port.sameAs(boardPort, port) - ); - // "board" will always be falsey for - // port that was originally mapped - // to unknown board and then selected - // manually by user - - const lastSelectedBoard = await this.getLastSelectedBoardOnPort( - boardPort + private maybeUpdateBoardListHistory( + params: UpdateBoardListHistoryParams + ): BoardListHistoryUpdateResult { + const { portToSelect, boardToSelect } = params; + const selectedPort = isPortIdentifier(portToSelect) + ? portToSelect + : portToSelect === 'ignore-port' + ? this._boardsConfig.selectedPort + : undefined; + const selectedBoard = isBoardIdentifier(boardToSelect) + ? boardToSelect + : boardToSelect === 'ignore-board' + ? this._boardsConfig.selectedBoard + : undefined; + if (selectedBoard && selectedPort) { + const match = this.boardList.items.find( + (item) => + portIdentifierEquals(item.port, selectedPort) && + item.board && + boardIdentifierEquals(item.board, selectedBoard) ); - - let availableBoard = {} as AvailableBoard; - if (board) { - availableBoard = { - ...board, - state: AvailableBoard.State.recognized, - selected: BoardsConfig.Config.sameAs(boardsConfig, board), - port: boardPort, - }; - } else if (lastSelectedBoard) { - // If the selected board is not recognized because it is a 3rd party board: https://github.com/arduino/arduino-cli/issues/623 - // We still want to show it without the red X in the boards toolbar: https://github.com/arduino/arduino-pro-ide/issues/198#issuecomment-599355836 - availableBoard = { - ...lastSelectedBoard, - state: AvailableBoard.State.guessed, - selected: - BoardsConfig.Config.sameAs(boardsConfig, lastSelectedBoard) && - Port.sameAs(boardPort, boardsConfig.selectedPort), // to avoid double selection - port: boardPort, - }; + const portKey = Port.keyOf(selectedPort); + if (match) { + // When board `B` is detected on port `P` and saving `B` on `P`, remove the entry instead! + delete this._boardListHistory[portKey]; } else { - availableBoard = { - name: Unknown, - port: boardPort, - state: AvailableBoard.State.incomplete, - }; + this._boardListHistory[portKey] = selectedBoard; + } + if (match) { + return { [portKey]: undefined }; } - availableBoards.push(availableBoard); + return { [portKey]: selectedBoard }; } + return undefined; + } + private maybeUpdateBoardsData(params: UpdateBoardsDataParams): void { + const { boardToSelect, reason } = params; if ( - boardsConfig.selectedBoard && - availableBoards.every(({ selected }) => !selected) + boardToSelect && + boardToSelect !== 'ignore-board' && + boardToSelect.fqbn && + (reason === 'toolbar' || reason === 'inherit') ) { - // If the selected board has the same port of an unknown board - // that is already in availableBoards we might get a duplicate port. - // So we remove the one already in the array and add the selected one. - const found = availableBoards.findIndex( - (board) => board.port?.address === boardsConfig.selectedPort?.address - ); - if (found >= 0) { - availableBoards.splice(found, 1); + const [, , , ...rest] = boardToSelect.fqbn.split(':'); + if (rest.length) { + // https://github.com/arduino/arduino-ide/pull/2113 + // TODO: save update data store if reason is toolbar and the FQBN has options } - availableBoards.push({ - ...boardsConfig.selectedBoard, - port: boardsConfig.selectedPort, - selected: true, - state: AvailableBoard.State.incomplete, - }); - } - - availableBoards.sort(AvailableBoard.compare); - - let hasChanged = availableBoards.length !== currentAvailableBoards.length; - for (let i = 0; !hasChanged && i < availableBoards.length; i++) { - const [left, right] = [availableBoards[i], currentAvailableBoards[i]]; - hasChanged = - left.fqbn !== right.fqbn || - !!AvailableBoard.compare(left, right) || - left.selected !== right.selected; - } - if (hasChanged) { - this._availableBoards = availableBoards; - this.onAvailableBoardsChangedEmitter.fire(this._availableBoards); } } - protected async getLastSelectedBoardOnPort( - port: Port - ): Promise { - const key = this.getLastSelectedBoardOnPortKey(port); - return this.getData(key); - } - - protected async saveState(): Promise { - // We save the port with the selected board name/FQBN, to be able to guess a better board name. - // Required when the attached board belongs to a 3rd party boards package, and neither the name, nor - // the FQBN can be retrieved with a `board list` command. - // https://github.com/arduino/arduino-cli/issues/623 + private async saveState(): Promise { const { selectedBoard, selectedPort } = this.boardsConfig; - if (selectedBoard && selectedPort) { - const key = this.getLastSelectedBoardOnPortKey(selectedPort); - await this.setData(key, selectedBoard); - } await Promise.all([ - this.setData('latest-valid-boards-config', this.latestValidBoardsConfig), - this.setData('latest-boards-config', this.latestBoardsConfig), + this.setData( + selectedBoardStorageKey, + selectedBoard ? JSON.stringify(selectedBoard) : undefined + ), + this.setData( + selectedPortStorageKey, + selectedPort ? JSON.stringify(selectedPort) : undefined + ), + this.setData( + boardListHistoryStorageKey, + JSON.stringify(this._boardListHistory) + ), ]); } - protected getLastSelectedBoardOnPortKey(port: Port | string): string { - // TODO: we lose the port's `protocol` info (`serial`, `network`, etc.) here if the `port` is a `string`. - return `last-selected-board-on-port:${ - typeof port === 'string' ? port : port.address - }`; + private async restoreState(): Promise< + Readonly & { boardListHistory: BoardListHistory | undefined } + > { + const [maybeSelectedBoard, maybeSelectedPort, maybeBoardHistory] = + await Promise.all([ + this.getData(selectedBoardStorageKey), + this.getData(selectedPortStorageKey), + this.getData(boardListHistoryStorageKey), + ]); + const selectedBoard = this.tryParse(maybeSelectedBoard, isBoardIdentifier); + const selectedPort = this.tryParse(maybeSelectedPort, isPortIdentifier); + const boardListHistory = this.tryParse( + maybeBoardHistory, + isBoardListHistory + ); + return { selectedBoard, selectedPort, boardListHistory }; } - protected async loadState(): Promise { - const storedLatestValidBoardsConfig = await this.getData< - RecursiveRequired - >('latest-valid-boards-config'); - if (storedLatestValidBoardsConfig) { - this.latestValidBoardsConfig = storedLatestValidBoardsConfig; - if (this.canUploadTo(this.latestValidBoardsConfig)) { - this.boardsConfig = this.latestValidBoardsConfig; - } - } else { - // If we could not restore the latest valid config, try to restore something, the board at least. - let storedLatestBoardsConfig = await this.getData< - BoardsConfig.Config | undefined - >('latest-boards-config'); - // Try to get from the URL if it was not persisted. - if (!storedLatestBoardsConfig) { - storedLatestBoardsConfig = BoardsConfig.Config.getConfig( - new URL(window.location.href) - ); - } - if (storedLatestBoardsConfig) { - this.latestBoardsConfig = storedLatestBoardsConfig; - this.boardsConfig = this.latestBoardsConfig; + private tryParse( + raw: string | undefined, + typeGuard: (object: unknown) => object is T + ): T | undefined { + if (!raw) { + return undefined; + } + try { + const object = JSON.parse(raw); + if (typeGuard(object)) { + return object; } + } catch { + this.logger.error(`Failed to parse raw: '${raw}'`); } + return undefined; } private setData(key: string, value: T): Promise { - return this.commandService.executeCommand( - StorageWrapper.Commands.SET_DATA.id, - key, - value - ); + return this.storageService.setData(key, value); } private getData(key: string): Promise { - return this.commandService.executeCommand( - StorageWrapper.Commands.GET_DATA.id, - key - ); + return this.storageService.getData(key); } } /** - * Representation of a ready-to-use board, either the user has configured it or was automatically recognized by the CLI. - * An available board was not necessarily recognized by the CLI (e.g.: it is a 3rd party board) or correctly configured but ready for `verify`. - * If it has the selected board and a associated port, it can be used for `upload`. We render an available board for the user - * when it has the `port` set. + * It should be neither visible nor called from outside. + * + * This service creates a startup task with the current board config and + * passes the task to the electron-main process so that the new window + * can inherit the boards config state of this service. + * + * Note that the state is always set, but new windows might ignore it. + * For example, the new window already has a valid boards config persisted to the local storage. */ -export interface AvailableBoard extends Board { - readonly state: AvailableBoard.State; - readonly selected?: boolean; - readonly port?: Port; -} - -export namespace AvailableBoard { - export enum State { - /** - * Retrieved from the CLI via the `board list` command. - */ - 'recognized', - /** - * Guessed the name/FQBN of the board from the available board ports (3rd party). - */ - 'guessed', - /** - * We do not know anything about this board, probably a 3rd party. The user has not selected a board for this port yet. - */ - 'incomplete', - } - - export function is(board: any): board is AvailableBoard { - return Board.is(board) && 'state' in board; - } - - export function hasPort( - board: AvailableBoard - ): board is AvailableBoard & { port: Port } { - return !!board.port; - } - - // Available boards must be sorted in this order: - // 1. Serial with recognized boards - // 2. Serial with guessed boards - // 3. Serial with incomplete boards - // 4. Network with recognized boards - // 5. Other protocols with recognized boards - export const compare = (left: AvailableBoard, right: AvailableBoard) => { - if (left.port?.protocol === 'serial' && right.port?.protocol !== 'serial') { - return -1; - } else if ( - left.port?.protocol !== 'serial' && - right.port?.protocol === 'serial' - ) { - return 1; - } else if ( - left.port?.protocol === 'network' && - right.port?.protocol !== 'network' - ) { - return -1; - } else if ( - left.port?.protocol !== 'network' && - right.port?.protocol === 'network' - ) { - return 1; - } else if (left.port?.protocol === right.port?.protocol) { - // We show all ports, including those that have guessed - // or unrecognized boards, so we must sort those too. - if (left.state < right.state) { - return -1; - } else if (left.state > right.state) { - return 1; - } - } - return naturalCompare(left.port?.address!, right.port?.address!); - }; -} +const USE_INHERITED_CONFIG: Command = { + id: 'arduino-use-inherited-boards-config', +}; + +const DUMP_BOARD_LIST: Command = { + id: 'arduino-dump-board-list', + label: nls.localize('arduino/developer/dumpBoardList', 'Dump the Board List'), + category: 'Developer (Arduino)', +}; + +const CLEAR_BOARD_LIST_HISTORY: Command = { + id: 'arduino-clear-board-list-history', + label: nls.localize( + 'arduino/developer/clearBoardList', + 'Clear the Board List History' + ), + category: 'Developer (Arduino)', +}; + +const CLEAR_BOARDS_CONFIG: Command = { + id: 'arduino-clear-boards-config', + label: nls.localize( + 'arduino/developer/clearBoardsConfig', + 'Clear the Board and Port Selection' + ), + category: 'Developer (Arduino)', +}; diff --git a/arduino-ide-extension/src/browser/boards/boards-toolbar-item.tsx b/arduino-ide-extension/src/browser/boards/boards-toolbar-item.tsx index 93a15a3c5..e2311fb1d 100644 --- a/arduino-ide-extension/src/browser/boards/boards-toolbar-item.tsx +++ b/arduino-ide-extension/src/browser/boards/boards-toolbar-item.tsx @@ -1,16 +1,21 @@ -import * as React from '@theia/core/shared/react'; -import * as ReactDOM from '@theia/core/shared/react-dom'; +import { TabBarToolbar } from '@theia/core/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar'; +import { codicon } from '@theia/core/lib/browser/widgets/widget'; import { CommandRegistry } from '@theia/core/lib/common/command'; -import { DisposableCollection } from '@theia/core/lib/common/disposable'; -import { Port } from '../../common/protocol'; -import { OpenBoardsConfig } from '../contributions/open-boards-config'; import { + Disposable, + DisposableCollection, +} from '@theia/core/lib/common/disposable'; +import { nls } from '@theia/core/lib/common/nls'; +import React from '@theia/core/shared/react'; +import ReactDOM from '@theia/core/shared/react-dom'; +import classNames from 'classnames'; +import { boardIdentifierLabel, Port } from '../../common/protocol'; +import { BoardListItemUI } from '../../common/protocol/board-list'; +import { assertUnreachable } from '../../common/utils'; +import type { + BoardListUI, BoardsServiceProvider, - AvailableBoard, } from './boards-service-provider'; -import { nls } from '@theia/core/lib/common'; -import classNames from 'classnames'; -import { BoardsConfig } from './boards-config'; export interface BoardsDropDownListCoords { readonly top: number; @@ -22,18 +27,18 @@ export interface BoardsDropDownListCoords { export namespace BoardsDropDown { export interface Props { readonly coords: BoardsDropDownListCoords | 'hidden'; - readonly items: Array void; port: Port }>; + readonly boardList: BoardListUI; readonly openBoardsConfig: () => void; + readonly hide: () => void; } } -export class BoardsDropDown extends React.Component { - protected dropdownElement: HTMLElement; +export class BoardListDropDown extends React.Component { + private dropdownElement: HTMLElement; private listRef: React.RefObject; constructor(props: BoardsDropDown.Props) { super(props); - this.listRef = React.createRef(); let list = document.getElementById('boards-dropdown-container'); if (!list) { @@ -51,11 +56,14 @@ export class BoardsDropDown extends React.Component { } override render(): React.ReactNode { - return ReactDOM.createPortal(this.renderNode(), this.dropdownElement); + return ReactDOM.createPortal( + this.renderBoardListItems(), + this.dropdownElement + ); } - protected renderNode(): React.ReactNode { - const { coords, items } = this.props; + private renderBoardListItems(): React.ReactNode { + const { coords, boardList } = this.props; if (coords === 'hidden') { return ''; } @@ -74,14 +82,12 @@ export class BoardsDropDown extends React.Component { tabIndex={0} >
- {items - .map(({ name, port, selected, onClick }) => ({ - boardLabel: name, - port, - selected, - onClick, - })) - .map(this.renderItem)} + {boardList.items.map((item, index) => + this.renderBoardListItem({ + item, + selected: index === boardList.selectedIndex, + }) + )}
{ ); } - protected renderItem({ - boardLabel, - port, + private readonly onDefaultAction = (item: BoardListItemUI): unknown => { + const { boardList, hide } = this.props; + const { type, params } = item.defaultAction; + hide(); + switch (type) { + case 'select-boards-config': { + return boardList.select(params); + } + case 'edit-boards-config': { + return boardList.edit(params); + } + default: + return assertUnreachable(type); + } + }; + + private renderBoardListItem({ + item, selected, - onClick, }: { - boardLabel: string; - port: Port; - selected?: boolean; - onClick: () => void; + item: BoardListItemUI; + selected: boolean; }): React.ReactNode { - const protocolIcon = iconNameFromProtocol(port.protocol); + const { boardLabel, portLabel, portProtocol, tooltip } = item.labels; + const port = item.port; const onKeyUp = (e: React.KeyboardEvent) => { if (e.key === 'Enter') { - onClick(); + this.onDefaultAction(item); } }; - return (
this.onDefaultAction(item)} onKeyUp={onKeyUp} tabIndex={0} > @@ -127,21 +145,81 @@ export class BoardsDropDown extends React.Component { className={classNames( 'arduino-boards-dropdown-item--protocol', 'fa', - protocolIcon + iconNameFromProtocol(portProtocol) )} /> -
-
- {boardLabel} +
+
+
+ {boardLabel} +
- {port.addressLabel} + {portLabel}
- {selected ?
: ''} + {this.renderActions(item)} +
+ ); + } + + private renderActions(item: BoardListItemUI): React.ReactNode { + const { boardList, hide } = this.props; + const { revert, edit } = item.otherActions; + if (!edit && !revert) { + return undefined; + } + const handleOnClick = ( + event: React.MouseEvent, + callback: () => void + ) => { + event.preventDefault(); + event.stopPropagation(); + hide(); + callback(); + }; + return ( +
+ {edit && ( +
+ { +
+ handleOnClick(event, () => boardList.edit(edit.params)) + } + /> + } +
+ )} + {revert && ( +
+ { +
+ handleOnClick(event, () => boardList.select(revert.params)) + } + /> + } +
+ )}
); } @@ -153,26 +231,27 @@ export class BoardsToolBarItem extends React.Component< > { static TOOLBAR_ID: 'boards-toolbar'; - protected readonly toDispose: DisposableCollection = - new DisposableCollection(); + private readonly toDispose: DisposableCollection; constructor(props: BoardsToolBarItem.Props) { super(props); - - const { availableBoards } = props.boardsServiceProvider; + const { boardList } = props.boardsServiceProvider; this.state = { - availableBoards, + boardList, coords: 'hidden', }; - - document.addEventListener('click', () => { - this.setState({ coords: 'hidden' }); - }); + const listener = () => this.setState({ coords: 'hidden' }); + document.addEventListener('click', listener); + this.toDispose = new DisposableCollection( + Disposable.create(() => document.removeEventListener('click', listener)) + ); } override componentDidMount(): void { - this.props.boardsServiceProvider.onAvailableBoardsChanged( - (availableBoards) => this.setState({ availableBoards }) + this.toDispose.push( + this.props.boardsServiceProvider.onBoardListDidChange((boardList) => + this.setState({ boardList }) + ) ); } @@ -180,7 +259,7 @@ export class BoardsToolBarItem extends React.Component< this.toDispose.dispose(); } - protected readonly show = (event: React.MouseEvent): void => { + private readonly show = (event: React.MouseEvent): void => { const { currentTarget: element } = event; if (element instanceof HTMLElement) { if (this.state.coords === 'hidden') { @@ -201,31 +280,26 @@ export class BoardsToolBarItem extends React.Component< event.nativeEvent.stopImmediatePropagation(); }; - override render(): React.ReactNode { - const { coords, availableBoards } = this.state; - const { selectedBoard, selectedPort } = - this.props.boardsServiceProvider.boardsConfig; - - const boardLabel = - selectedBoard?.name || - nls.localize('arduino/board/selectBoard', 'Select Board'); - const selectedPortLabel = portLabel(selectedPort?.address); + private readonly hide = () => { + this.setState({ coords: 'hidden' }); + }; - const isConnected = Boolean(selectedBoard && selectedPort); - const protocolIcon = isConnected - ? iconNameFromProtocol(selectedPort?.protocol || '') + override render(): React.ReactNode { + const { coords, boardList } = this.state; + const { boardLabel, selected, portProtocol, tooltip } = boardList.labels; + const protocolIcon = portProtocol + ? iconNameFromProtocol(portProtocol) : null; const protocolIconClassNames = classNames( 'arduino-boards-toolbar-item--protocol', 'fa', protocolIcon ); - return (
{protocolIcon &&
} @@ -234,57 +308,22 @@ export class BoardsToolBarItem extends React.Component< 'arduino-boards-toolbar-item--label', 'noWrapInfo', 'noselect', - { 'arduino-boards-toolbar-item--label-connected': isConnected } + { 'arduino-boards-toolbar-item--label-connected': selected } )} > {boardLabel}
- ({ - ...board, - onClick: () => { - if (!board.fqbn) { - const previousBoardConfig = - this.props.boardsServiceProvider.boardsConfig; - this.props.boardsServiceProvider.boardsConfig = { - selectedPort: board.port, - }; - this.openDialog(previousBoardConfig); - } else { - this.props.boardsServiceProvider.boardsConfig = { - selectedBoard: board, - selectedPort: board.port, - }; - } - this.setState({ coords: 'hidden' }); - }, - }))} - openBoardsConfig={this.openDialog} - > + boardList={boardList} + openBoardsConfig={() => boardList.edit({ query: '' })} + hide={this.hide} + /> ); } - - protected openDialog = async ( - previousBoardConfig?: BoardsConfig.Config - ): Promise => { - const selectedBoardConfig = - await this.props.commands.executeCommand( - OpenBoardsConfig.Commands.OPEN_DIALOG.id - ); - if ( - previousBoardConfig && - (!selectedBoardConfig?.selectedPort || - !selectedBoardConfig?.selectedBoard) - ) { - this.props.boardsServiceProvider.boardsConfig = previousBoardConfig; - } - }; } export namespace BoardsToolBarItem { export interface Props { @@ -293,7 +332,7 @@ export namespace BoardsToolBarItem { } export interface State { - availableBoards: AvailableBoard[]; + boardList: BoardListUI; coords: BoardsDropDownListCoords | 'hidden'; } } @@ -304,19 +343,10 @@ function iconNameFromProtocol(protocol: string): string { return 'fa-arduino-technology-usb'; case 'network': return 'fa-arduino-technology-connection'; - /* - Bluetooth ports are not listed yet from the CLI; - Not sure about the naming ('bluetooth'); make sure it's correct before uncommenting the following lines - */ - // case 'bluetooth': - // return 'fa-arduino-technology-bluetooth'; + // it is fine to assign dedicated icons to the protocols used by the official boards, + // but other than that it is best to avoid implementing any special handling + // for specific protocols in the IDE codebase. default: return 'fa-arduino-technology-3dimensionscube'; } } - -function portLabel(portName?: string): string { - return portName - ? nls.localize('arduino/board/portLabel', 'Port: {0}', portName) - : nls.localize('arduino/board/disconnected', 'Disconnected'); -} diff --git a/arduino-ide-extension/src/browser/boards/boards-widget-frontend-contribution.ts b/arduino-ide-extension/src/browser/boards/boards-widget-frontend-contribution.ts index a6e535d6f..c64d08690 100644 --- a/arduino-ide-extension/src/browser/boards/boards-widget-frontend-contribution.ts +++ b/arduino-ide-extension/src/browser/boards/boards-widget-frontend-contribution.ts @@ -1,10 +1,11 @@ import { injectable } from '@theia/core/shared/inversify'; -import { BoardsListWidget } from './boards-list-widget'; -import type { +import { BoardSearch, BoardsPackage, } from '../../common/protocol/boards-service'; +import { URI } from '../contributions/contribution'; import { ListWidgetFrontendContribution } from '../widgets/component-list/list-widget-frontend-contribution'; +import { BoardsListWidget } from './boards-list-widget'; @injectable() export class BoardsListWidgetFrontendContribution extends ListWidgetFrontendContribution< @@ -24,7 +25,16 @@ export class BoardsListWidgetFrontendContribution extends ListWidgetFrontendCont }); } - override async initializeLayout(): Promise { - this.openView(); + protected canParse(uri: URI): boolean { + try { + BoardSearch.UriParser.parse(uri); + return true; + } catch { + return false; + } + } + + protected parse(uri: URI): BoardSearch | undefined { + return BoardSearch.UriParser.parse(uri); } } diff --git a/arduino-ide-extension/src/browser/components/ProgressBar.tsx b/arduino-ide-extension/src/browser/components/ProgressBar.tsx index ea70508c3..c531cde7e 100644 --- a/arduino-ide-extension/src/browser/components/ProgressBar.tsx +++ b/arduino-ide-extension/src/browser/components/ProgressBar.tsx @@ -1,4 +1,4 @@ -import * as React from '@theia/core/shared/react'; +import React from '@theia/core/shared/react'; export type ProgressBarProps = { percent?: number; diff --git a/arduino-ide-extension/src/browser/config/config-service-client.ts b/arduino-ide-extension/src/browser/config/config-service-client.ts new file mode 100644 index 000000000..ff671da20 --- /dev/null +++ b/arduino-ide-extension/src/browser/config/config-service-client.ts @@ -0,0 +1,102 @@ +import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application-contribution'; +import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state'; +import { DisposableCollection } from '@theia/core/lib/common/disposable'; +import { Emitter, Event } from '@theia/core/lib/common/event'; +import { MessageService } from '@theia/core/lib/common/message-service'; +import { deepClone } from '@theia/core/lib/common/objects'; +import URI from '@theia/core/lib/common/uri'; +import { + inject, + injectable, + postConstruct, +} from '@theia/core/shared/inversify'; +import { ConfigService, ConfigState } from '../../common/protocol'; +import { NotificationCenter } from '../notification-center'; + +@injectable() +export class ConfigServiceClient implements FrontendApplicationContribution { + @inject(ConfigService) + private readonly delegate: ConfigService; + @inject(NotificationCenter) + private readonly notificationCenter: NotificationCenter; + @inject(FrontendApplicationStateService) + private readonly appStateService: FrontendApplicationStateService; + @inject(MessageService) + private readonly messageService: MessageService; + + private readonly didChangeSketchDirUriEmitter = new Emitter< + URI | undefined + >(); + private readonly didChangeDataDirUriEmitter = new Emitter(); + private readonly toDispose = new DisposableCollection( + this.didChangeSketchDirUriEmitter, + this.didChangeDataDirUriEmitter + ); + + private config: ConfigState | undefined; + + @postConstruct() + protected init(): void { + this.appStateService.reachedState('ready').then(async () => { + const config = await this.delegate.getConfiguration(); + this.use(config); + }); + } + + onStart(): void { + this.notificationCenter.onConfigDidChange((config) => this.use(config)); + } + + onStop(): void { + this.toDispose.dispose(); + } + + get onDidChangeSketchDirUri(): Event { + return this.didChangeSketchDirUriEmitter.event; + } + + get onDidChangeDataDirUri(): Event { + return this.didChangeDataDirUriEmitter.event; + } + + /** + * CLI config related error messages if any. + */ + tryGetMessages(): string[] | undefined { + return this.config?.messages; + } + + /** + * `directories.user` + */ + tryGetSketchDirUri(): URI | undefined { + return this.config?.config?.sketchDirUri + ? new URI(this.config?.config?.sketchDirUri) + : undefined; + } + + /** + * `directories.data` + */ + tryGetDataDirUri(): URI | undefined { + return this.config?.config?.dataDirUri + ? new URI(this.config?.config?.dataDirUri) + : undefined; + } + + private use(config: ConfigState): void { + const oldConfig = deepClone(this.config); + this.config = config; + if (oldConfig?.config?.sketchDirUri !== this.config?.config?.sketchDirUri) { + this.didChangeSketchDirUriEmitter.fire(this.tryGetSketchDirUri()); + } + if (oldConfig?.config?.dataDirUri !== this.config?.config?.dataDirUri) { + this.didChangeDataDirUriEmitter.fire(this.tryGetDataDirUri()); + } + if (this.config.messages?.length) { + const message = this.config.messages.join(' '); + // toast the error later otherwise it might not show up in IDE2 + setTimeout(() => this.messageService.error(message), 1_000); + } + } +} diff --git a/arduino-ide-extension/src/browser/contributions/about.ts b/arduino-ide-extension/src/browser/contributions/about.ts index f3a50fc54..201d13b41 100644 --- a/arduino-ide-extension/src/browser/contributions/about.ts +++ b/arduino-ide-extension/src/browser/contributions/about.ts @@ -1,26 +1,24 @@ -import { inject, injectable } from '@theia/core/shared/inversify'; -import * as moment from 'moment'; -import * as remote from '@theia/core/electron-shared/@electron/remote'; -import { isOSX, isWindows } from '@theia/core/lib/common/os'; import { ClipboardService } from '@theia/core/lib/browser/clipboard-service'; import { FrontendApplicationConfigProvider } from '@theia/core/lib/browser/frontend-application-config-provider'; +import { nls } from '@theia/core/lib/common/nls'; +import { isOSX, isWindows } from '@theia/core/lib/common/os'; +import { inject, injectable } from '@theia/core/shared/inversify'; +import moment from 'moment'; +import { AppService } from '../app-service'; +import { ArduinoMenus } from '../menu/arduino-menus'; import { - Contribution, Command, - MenuModelRegistry, CommandRegistry, + Contribution, + MenuModelRegistry, } from './contribution'; -import { ArduinoMenus } from '../menu/arduino-menus'; -import { ConfigService } from '../../common/protocol'; -import { nls } from '@theia/core/lib/common'; @injectable() export class About extends Contribution { @inject(ClipboardService) - protected readonly clipboardService: ClipboardService; - - @inject(ConfigService) - protected readonly configService: ConfigService; + private readonly clipboardService: ClipboardService; + @inject(AppService) + private readonly appService: AppService; override registerCommands(registry: CommandRegistry): void { registry.registerCommand(About.Commands.ABOUT_APP, { @@ -40,23 +38,18 @@ export class About extends Contribution { }); } - async showAbout(): Promise { - const { - version, - commit, - status: cliStatus, - } = await this.configService.getVersion(); - const buildDate = this.buildDate; + private async showAbout(): Promise { + const appInfo = await this.appService.info(); + const { appVersion, cliVersion, buildDate } = appInfo; + const detail = (showAll: boolean) => nls.localize( 'arduino/about/detail', - 'Version: {0}\nDate: {1}{2}\nCLI Version: {3}{4} [{5}]\n\n{6}', - remote.app.getVersion(), + 'Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}', + appVersion, buildDate ? buildDate : nls.localize('', 'dev build'), buildDate && showAll ? ` (${this.ago(buildDate)})` : '', - version, - cliStatus ? ` ${cliStatus}` : '', - commit, + cliVersion, nls.localize( 'arduino/about/copyright', 'Copyright © {0} Arduino SA', @@ -66,34 +59,27 @@ export class About extends Contribution { const ok = nls.localize('vscode/issueMainService/ok', 'OK'); const copy = nls.localize('vscode/textInputActions/copy', 'Copy'); const buttons = !isWindows && !isOSX ? [copy, ok] : [ok, copy]; - const { response } = await remote.dialog.showMessageBox( - remote.getCurrentWindow(), - { - message: `${this.applicationName}`, - title: `${this.applicationName}`, - type: 'info', - detail: detail(true), - buttons, - noLink: true, - defaultId: buttons.indexOf(ok), - cancelId: buttons.indexOf(ok), - } - ); + const { response } = await this.dialogService.showMessageBox({ + message: `${this.applicationName}`, + title: `${this.applicationName}`, + type: 'info', + detail: detail(true), + buttons, + noLink: true, + defaultId: buttons.indexOf(ok), + cancelId: buttons.indexOf(ok), + }); if (buttons[response] === copy) { await this.clipboardService.writeText(detail(false).trim()); } } - protected get applicationName(): string { + private get applicationName(): string { return FrontendApplicationConfigProvider.get().applicationName; } - protected get buildDate(): string | undefined { - return FrontendApplicationConfigProvider.get().buildDate; - } - - protected ago(isoTime: string): string { + private ago(isoTime: string): string { const now = moment(Date.now()); const other = moment(isoTime); let result = now.diff(other, 'minute'); diff --git a/arduino-ide-extension/src/browser/contributions/account.ts b/arduino-ide-extension/src/browser/contributions/account.ts new file mode 100644 index 000000000..a8f728de2 --- /dev/null +++ b/arduino-ide-extension/src/browser/contributions/account.ts @@ -0,0 +1,155 @@ +import { FrontendApplication } from '@theia/core/lib/browser/frontend-application'; +import { SidebarMenu } from '@theia/core/lib/browser/shell/sidebar-menu-widget'; +import { WindowService } from '@theia/core/lib/browser/window/window-service'; +import { DisposableCollection } from '@theia/core/lib/common/disposable'; +import { MenuPath } from '@theia/core/lib/common/menu'; +import { nls } from '@theia/core/lib/common/nls'; +import { inject, injectable } from '@theia/core/shared/inversify'; +import { CloudUserCommands, LEARN_MORE_URL } from '../auth/cloud-user-commands'; +import { CreateFeatures } from '../create/create-features'; +import { ArduinoMenus } from '../menu/arduino-menus'; +import { ApplicationConnectionStatusContribution } from '../theia/core/connection-status-service'; +import { + Command, + CommandRegistry, + Contribution, + MenuModelRegistry, +} from './contribution'; + +export const accountMenu: SidebarMenu = { + id: 'arduino-accounts-menu', + iconClass: 'codicon codicon-account', + title: nls.localize('arduino/account/menuTitle', 'Arduino Cloud'), + menuPath: ArduinoMenus.ARDUINO_ACCOUNT__CONTEXT, + order: 0, +}; + +@injectable() +export class Account extends Contribution { + @inject(WindowService) + private readonly windowService: WindowService; + @inject(CreateFeatures) + private readonly createFeatures: CreateFeatures; + @inject(ApplicationConnectionStatusContribution) + private readonly connectionStatus: ApplicationConnectionStatusContribution; + + private readonly toDispose = new DisposableCollection(); + private app: FrontendApplication; + + override onStart(app: FrontendApplication): void { + this.app = app; + this.updateSidebarCommand(); + this.toDispose.push( + this.createFeatures.onDidChangeEnabled((enabled) => + this.updateSidebarCommand(enabled) + ) + ); + } + + onStop(): void { + this.toDispose.dispose(); + } + + override registerCommands(registry: CommandRegistry): void { + const openExternal = (url: string) => + this.windowService.openNewWindow(url, { external: true }); + const loggedIn = () => Boolean(this.createFeatures.session); + const loggedInWithInternetConnection = () => + loggedIn() && this.connectionStatus.offlineStatus !== 'internet'; + registry.registerCommand(Account.Commands.LEARN_MORE, { + execute: () => openExternal(LEARN_MORE_URL), + isEnabled: () => !loggedIn(), + isVisible: () => !loggedIn(), + }); + registry.registerCommand(Account.Commands.GO_TO_PROFILE, { + execute: () => openExternal('https://id.arduino.cc/'), + isEnabled: () => loggedInWithInternetConnection(), + isVisible: () => loggedIn(), + }); + registry.registerCommand(Account.Commands.GO_TO_CLOUD_EDITOR, { + execute: () => openExternal('https://create.arduino.cc/editor'), + isEnabled: () => loggedInWithInternetConnection(), + isVisible: () => loggedIn(), + }); + registry.registerCommand(Account.Commands.GO_TO_IOT_CLOUD, { + execute: () => openExternal('https://create.arduino.cc/iot/'), + isEnabled: () => loggedInWithInternetConnection(), + isVisible: () => loggedIn(), + }); + } + + override registerMenus(registry: MenuModelRegistry): void { + const register = ( + menuPath: MenuPath, + ...commands: (Command | [command: Command, menuLabel: string])[] + ) => + commands.forEach((command, index) => { + const commandId = Array.isArray(command) ? command[0].id : command.id; + const label = Array.isArray(command) ? command[1] : command.label; + registry.registerMenuAction(menuPath, { + label, + commandId, + order: String(index), + }); + }); + + register(ArduinoMenus.ARDUINO_ACCOUNT__CONTEXT__SIGN_IN_GROUP, [ + CloudUserCommands.LOGIN, + nls.localize('arduino/cloud/signInToCloud', 'Sign in to Arduino Cloud'), + ]); + register(ArduinoMenus.ARDUINO_ACCOUNT__CONTEXT__LEARN_MORE_GROUP, [ + Account.Commands.LEARN_MORE, + nls.localize('arduino/cloud/learnMore', 'Learn more'), + ]); + register( + ArduinoMenus.ARDUINO_ACCOUNT__CONTEXT__GO_TO_GROUP, + [ + Account.Commands.GO_TO_PROFILE, + nls.localize('arduino/account/goToProfile', 'Go to Profile'), + ], + [ + Account.Commands.GO_TO_CLOUD_EDITOR, + nls.localize('arduino/account/goToCloudEditor', 'Go to Cloud Editor'), + ], + [ + Account.Commands.GO_TO_IOT_CLOUD, + nls.localize('arduino/account/goToIoTCloud', 'Go to IoT Cloud'), + ] + ); + register( + ArduinoMenus.ARDUINO_ACCOUNT__CONTEXT__SIGN_OUT_GROUP, + CloudUserCommands.LOGOUT + ); + } + + private updateSidebarCommand( + visible: boolean = this.preferences['arduino.cloud.enabled'] + ): void { + if (!this.app) { + return; + } + const handler = this.app.shell.leftPanelHandler; + if (visible) { + handler.addBottomMenu(accountMenu); + } else { + handler.removeBottomMenu(accountMenu.id); + } + } +} + +export namespace Account { + export namespace Commands { + export const GO_TO_PROFILE: Command = { + id: 'arduino-go-to-profile', + }; + export const GO_TO_CLOUD_EDITOR: Command = { + id: 'arduino-go-to-cloud-editor', + }; + export const GO_TO_IOT_CLOUD: Command = { + id: 'arduino-go-to-iot-cloud', + }; + export const LEARN_MORE: Command = { + id: 'arduino-learn-more', + }; + } +} diff --git a/arduino-ide-extension/src/browser/contributions/add-file.ts b/arduino-ide-extension/src/browser/contributions/add-file.ts index b7cb48f73..da1796048 100644 --- a/arduino-ide-extension/src/browser/contributions/add-file.ts +++ b/arduino-ide-extension/src/browser/contributions/add-file.ts @@ -1,21 +1,21 @@ +import { nls } from '@theia/core/lib/common/nls'; import { inject, injectable } from '@theia/core/shared/inversify'; -import * as remote from '@theia/core/electron-shared/@electron/remote'; +import { FileDialogService } from '@theia/filesystem/lib/browser'; import { ArduinoMenus } from '../menu/arduino-menus'; +import { CurrentSketch } from '../sketches-service-client-impl'; import { - SketchContribution, Command, CommandRegistry, MenuModelRegistry, + Sketch, + SketchContribution, URI, } from './contribution'; -import { FileDialogService } from '@theia/filesystem/lib/browser'; -import { nls } from '@theia/core/lib/common'; -import { CurrentSketch } from '../../common/protocol/sketches-service-client-impl'; @injectable() export class AddFile extends SketchContribution { @inject(FileDialogService) - protected readonly fileDialogService: FileDialogService; + private readonly fileDialogService: FileDialogService; // TODO: use dialogService override registerCommands(registry: CommandRegistry): void { registry.registerCommand(AddFile.Commands.ADD_FILE, { @@ -31,7 +31,7 @@ export class AddFile extends SketchContribution { }); } - protected async addFile(): Promise { + private async addFile(): Promise { const sketch = await this.sketchServiceClient.currentSketch(); if (!CurrentSketch.isValid(sketch)) { return; @@ -41,16 +41,15 @@ export class AddFile extends SketchContribution { canSelectFiles: true, canSelectFolders: false, canSelectMany: false, + modal: true, }); if (!toAddUri) { return; } - const sketchUri = new URI(sketch.uri); - const filename = toAddUri.path.base; - const targetUri = sketchUri.resolve('data').resolve(filename); + const { uri: targetUri, filename } = this.resolveTarget(sketch, toAddUri); const exists = await this.fileService.exists(targetUri); if (exists) { - const { response } = await remote.dialog.showMessageBox({ + const { response } = await this.dialogService.showMessageBox({ type: 'question', title: nls.localize('arduino/contributions/replaceTitle', 'Replace'), buttons: [ @@ -79,6 +78,22 @@ export class AddFile extends SketchContribution { } ); } + + // https://github.com/arduino/arduino-ide/issues/284#issuecomment-1364533662 + // File the file to add has one of the following extension, it goes to the sketch folder root: .ino, .h, .cpp, .c, .S + // Otherwise, the files goes to the `data` folder inside the sketch folder root. + private resolveTarget( + sketch: Sketch, + toAddUri: URI + ): { uri: URI; filename: string } { + const path = toAddUri.path; + const filename = path.base; + let root = new URI(sketch.uri); + if (!Sketch.Extensions.CODE_FILES.includes(path.ext)) { + root = root.resolve('data'); + } + return { uri: root.resolve(filename), filename: filename }; + } } export namespace AddFile { diff --git a/arduino-ide-extension/src/browser/contributions/add-zip-library.ts b/arduino-ide-extension/src/browser/contributions/add-zip-library.ts index d3d3dbd3a..b765f9681 100644 --- a/arduino-ide-extension/src/browser/contributions/add-zip-library.ts +++ b/arduino-ide-extension/src/browser/contributions/add-zip-library.ts @@ -1,8 +1,6 @@ import { inject, injectable } from '@theia/core/shared/inversify'; -import * as remote from '@theia/core/electron-shared/@electron/remote'; import URI from '@theia/core/lib/common/uri'; import { ConfirmDialog } from '@theia/core/lib/browser/dialogs'; -import { EnvVariablesServer } from '@theia/core/lib/common/env-variables'; import { ArduinoMenus } from '../menu/arduino-menus'; import { LibraryService, ResponseServiceClient } from '../../common/protocol'; import { ExecuteWithProgress } from '../../common/protocol/progressible'; @@ -16,14 +14,11 @@ import { nls } from '@theia/core/lib/common'; @injectable() export class AddZipLibrary extends SketchContribution { - @inject(EnvVariablesServer) - protected readonly envVariableServer: EnvVariablesServer; - @inject(ResponseServiceClient) - protected readonly responseService: ResponseServiceClient; + private readonly responseService: ResponseServiceClient; @inject(LibraryService) - protected readonly libraryService: LibraryService; + private readonly libraryService: LibraryService; override registerCommands(registry: CommandRegistry): void { registry.registerCommand(AddZipLibrary.Commands.ADD_ZIP_LIBRARY, { @@ -43,10 +38,10 @@ export class AddZipLibrary extends SketchContribution { }); } - async addZipLibrary(): Promise { + private async addZipLibrary(): Promise { const homeUri = await this.envVariableServer.getHomeDirUri(); const defaultPath = await this.fileService.fsPath(new URI(homeUri)); - const { canceled, filePaths } = await remote.dialog.showOpenDialog({ + const { canceled, filePaths } = await this.dialogService.showOpenDialog({ title: nls.localize( 'arduino/selectZip', "Select a zip file containing the library you'd like to add" diff --git a/arduino-ide-extension/src/browser/contributions/archive-sketch.ts b/arduino-ide-extension/src/browser/contributions/archive-sketch.ts index abe22d77f..f49f85caf 100644 --- a/arduino-ide-extension/src/browser/contributions/archive-sketch.ts +++ b/arduino-ide-extension/src/browser/contributions/archive-sketch.ts @@ -1,7 +1,5 @@ import { injectable } from '@theia/core/shared/inversify'; -import * as remote from '@theia/core/electron-shared/@electron/remote'; -import * as dateFormat from 'dateformat'; -import URI from '@theia/core/lib/common/uri'; +import dateFormat from 'dateformat'; import { ArduinoMenus } from '../menu/arduino-menus'; import { SketchContribution, @@ -10,7 +8,7 @@ import { MenuModelRegistry, } from './contribution'; import { nls } from '@theia/core/lib/common'; -import { CurrentSketch } from '../../common/protocol/sketches-service-client-impl'; +import { CurrentSketch } from '../sketches-service-client-impl'; @injectable() export class ArchiveSketch extends SketchContribution { @@ -28,11 +26,8 @@ export class ArchiveSketch extends SketchContribution { }); } - protected async archiveSketch(): Promise { - const [sketch, config] = await Promise.all([ - this.sketchServiceClient.currentSketch(), - this.configService.getConfiguration(), - ]); + private async archiveSketch(): Promise { + const sketch = await this.sketchServiceClient.currentSketch(); if (!CurrentSketch.isValid(sketch)) { return; } @@ -40,10 +35,10 @@ export class ArchiveSketch extends SketchContribution { new Date(), 'yymmdd' )}a.zip`; - const defaultPath = await this.fileService.fsPath( - new URI(config.sketchDirUri).resolve(archiveBasename) - ); - const { filePath, canceled } = await remote.dialog.showSaveDialog({ + const defaultContainerUri = await this.defaultUri(); + const defaultUri = defaultContainerUri.resolve(archiveBasename); + const defaultPath = await this.fileService.fsPath(defaultUri); + const { filePath, canceled } = await this.dialogService.showSaveDialog({ title: nls.localize( 'arduino/sketch/saveSketchAs', 'Save sketch folder as...' @@ -57,7 +52,7 @@ export class ArchiveSketch extends SketchContribution { if (!destinationUri) { return; } - await this.sketchService.archive(sketch, destinationUri.toString()); + await this.sketchesService.archive(sketch, destinationUri.toString()); this.messageService.info( nls.localize( 'arduino/sketch/createdArchive', diff --git a/arduino-ide-extension/src/browser/contributions/auto-select-programmer.ts b/arduino-ide-extension/src/browser/contributions/auto-select-programmer.ts new file mode 100644 index 000000000..0bf8e277e --- /dev/null +++ b/arduino-ide-extension/src/browser/contributions/auto-select-programmer.ts @@ -0,0 +1,123 @@ +import type { MaybePromise } from '@theia/core/lib/common/types'; +import { inject, injectable } from '@theia/core/shared/inversify'; +import { + BoardDetails, + Programmer, + isBoardIdentifierChangeEvent, +} from '../../common/protocol'; +import { + BoardsDataStore, + findDefaultProgrammer, + isEmptyData, +} from '../boards/boards-data-store'; +import { BoardsServiceProvider } from '../boards/boards-service-provider'; +import { Contribution } from './contribution'; + +/** + * Before CLI 0.35.0-rc.3, there was no `programmer#default` property in the `board details` response. + * This method does the programmer migration in the data store. If there is a programmer selected, it's a noop. + * If no programmer is selected, it forcefully reloads the details from the CLI and updates it in the local storage. + */ +@injectable() +export class AutoSelectProgrammer extends Contribution { + @inject(BoardsServiceProvider) + private readonly boardsServiceProvider: BoardsServiceProvider; + @inject(BoardsDataStore) + private readonly boardsDataStore: BoardsDataStore; + + override onStart(): void { + this.boardsServiceProvider.onBoardsConfigDidChange((event) => { + if (isBoardIdentifierChangeEvent(event)) { + this.ensureProgrammerIsSelected(); + } + }); + } + + override onReady(): void { + this.boardsServiceProvider.ready.then(() => + this.ensureProgrammerIsSelected() + ); + } + + private async ensureProgrammerIsSelected(): Promise { + return ensureProgrammerIsSelected({ + fqbn: this.boardsServiceProvider.boardsConfig.selectedBoard?.fqbn, + getData: (fqbn) => this.boardsDataStore.getData(fqbn), + loadBoardDetails: (fqbn) => this.boardsDataStore.loadBoardDetails(fqbn), + selectProgrammer: (arg) => this.boardsDataStore.selectProgrammer(arg), + }); + } +} + +interface EnsureProgrammerIsSelectedParams { + fqbn: string | undefined; + getData: (fqbn: string | undefined) => MaybePromise; + loadBoardDetails: (fqbn: string) => MaybePromise; + selectProgrammer(options: { + fqbn: string; + selectedProgrammer: Programmer; + }): MaybePromise; +} + +export async function ensureProgrammerIsSelected( + params: EnsureProgrammerIsSelectedParams +): Promise { + const { fqbn, getData, loadBoardDetails, selectProgrammer } = params; + if (!fqbn) { + return false; + } + console.debug(`Ensuring a programmer is selected for ${fqbn}...`); + const data = await getData(fqbn); + if (isEmptyData(data)) { + // For example, the platform is not installed. + console.debug(`Skipping. No boards data is available for ${fqbn}.`); + return false; + } + if (data.selectedProgrammer) { + console.debug( + `A programmer is already selected for ${fqbn}: '${data.selectedProgrammer.id}'.` + ); + return true; + } + let programmer = findDefaultProgrammer(data.programmers, data); + if (programmer) { + // select the programmer if the default info is available + const result = await selectProgrammer({ + fqbn, + selectedProgrammer: programmer, + }); + if (result) { + console.debug(`Selected '${programmer.id}' programmer for ${fqbn}.`); + return result; + } + } + console.debug(`Reloading board details for ${fqbn}...`); + const reloadedData = await loadBoardDetails(fqbn); + if (!reloadedData) { + console.debug(`Skipping. No board details found for ${fqbn}.`); + return false; + } + if (!reloadedData.programmers.length) { + console.debug(`Skipping. ${fqbn} does not have programmers.`); + return false; + } + programmer = findDefaultProgrammer(reloadedData.programmers, reloadedData); + if (!programmer) { + console.debug( + `Skipping. Could not find a default programmer for ${fqbn}. Programmers were: ` + ); + return false; + } + const result = await selectProgrammer({ + fqbn, + selectedProgrammer: programmer, + }); + if (result) { + console.debug(`Selected '${programmer.id}' programmer for ${fqbn}.`); + } else { + console.debug( + `Could not select '${programmer.id}' programmer for ${fqbn}.` + ); + } + return result; +} diff --git a/arduino-ide-extension/src/browser/contributions/board-selection.ts b/arduino-ide-extension/src/browser/contributions/board-selection.ts index 21acc221b..f9c2d2b36 100644 --- a/arduino-ide-extension/src/browser/contributions/board-selection.ts +++ b/arduino-ide-extension/src/browser/contributions/board-selection.ts @@ -1,134 +1,137 @@ -import { inject, injectable } from '@theia/core/shared/inversify'; -import * as remote from '@theia/core/electron-shared/@electron/remote'; -import { MenuModelRegistry } from '@theia/core/lib/common/menu'; import { - DisposableCollection, Disposable, + DisposableCollection, } from '@theia/core/lib/common/disposable'; -import { firstToUpperCase } from '../../common/utils'; -import { BoardsConfig } from '../boards/boards-config'; +import { MenuModelRegistry } from '@theia/core/lib/common/menu/menu-model-registry'; +import type { MenuPath } from '@theia/core/lib/common/menu/menu-types'; +import { nls } from '@theia/core/lib/common/nls'; +import { Deferred } from '@theia/core/lib/common/promise-util'; +import { inject, injectable } from '@theia/core/shared/inversify'; import { MainMenuManager } from '../../common/main-menu-manager'; +import { + BoardsService, + BoardWithPackage, + createPlatformIdentifier, + getBoardInfo, + InstalledBoardWithPackage, + platformIdentifierEquals, + Port, + serializePlatformIdentifier, +} from '../../common/protocol'; +import type { BoardList } from '../../common/protocol/board-list'; import { BoardsListWidget } from '../boards/boards-list-widget'; -import { NotificationCenter } from '../notification-center'; +import { BoardsDataStore } from '../boards/boards-data-store'; import { BoardsServiceProvider } from '../boards/boards-service-provider'; import { ArduinoMenus, PlaceholderMenuNode, unregisterSubmenu, } from '../menu/arduino-menus'; -import { - BoardsService, - InstalledBoardWithPackage, - AvailablePorts, - Port, -} from '../../common/protocol'; -import { SketchContribution, Command, CommandRegistry } from './contribution'; -import { nls } from '@theia/core/lib/common'; +import { NotificationCenter } from '../notification-center'; +import { Command, CommandRegistry, SketchContribution } from './contribution'; @injectable() export class BoardSelection extends SketchContribution { @inject(CommandRegistry) - protected readonly commandRegistry: CommandRegistry; - + private readonly commandRegistry: CommandRegistry; @inject(MainMenuManager) - protected readonly mainMenuManager: MainMenuManager; - + private readonly mainMenuManager: MainMenuManager; @inject(MenuModelRegistry) - protected readonly menuModelRegistry: MenuModelRegistry; - + private readonly menuModelRegistry: MenuModelRegistry; @inject(NotificationCenter) - protected readonly notificationCenter: NotificationCenter; - + private readonly notificationCenter: NotificationCenter; + @inject(BoardsDataStore) + private readonly boardsDataStore: BoardsDataStore; @inject(BoardsService) - protected readonly boardsService: BoardsService; - + private readonly boardsService: BoardsService; @inject(BoardsServiceProvider) - protected readonly boardsServiceProvider: BoardsServiceProvider; + private readonly boardsServiceProvider: BoardsServiceProvider; - protected readonly toDisposeBeforeMenuRebuild = new DisposableCollection(); + private readonly toDisposeBeforeMenuRebuild = new DisposableCollection(); + // do not query installed platforms on every change + private _installedBoards: Deferred | undefined; override registerCommands(registry: CommandRegistry): void { registry.registerCommand(BoardSelection.Commands.GET_BOARD_INFO, { execute: async () => { - const { selectedBoard, selectedPort } = - this.boardsServiceProvider.boardsConfig; - if (!selectedBoard) { - this.messageService.info( - nls.localize( - 'arduino/board/selectBoardForInfo', - 'Please select a board to obtain board info.' - ) - ); + const boardInfo = await getBoardInfo( + this.boardsServiceProvider.boardList + ); + if (typeof boardInfo === 'string') { + this.messageService.info(boardInfo); return; } - if (!selectedBoard.fqbn) { - this.messageService.info( - nls.localize( - 'arduino/board/platformMissing', - "The platform for the selected '{0}' board is not installed.", - selectedBoard.name - ) + const { BN, VID, PID, SN } = boardInfo; + const detail = ` +BN: ${BN} +VID: ${VID} +PID: ${PID} +SN: ${SN} +`.trim(); + await this.dialogService.showMessageBox({ + message: nls.localize('arduino/board/boardInfo', 'Board Info'), + title: nls.localize('arduino/board/boardInfo', 'Board Info'), + type: 'info', + detail, + buttons: [nls.localize('vscode/issueMainService/ok', 'OK')], + }); + }, + }); + + registry.registerCommand(BoardSelection.Commands.RELOAD_BOARD_DATA, { + execute: async () => { + const selectedFqbn = + this.boardsServiceProvider.boardList.boardsConfig.selectedBoard?.fqbn; + let message: string; + + if (selectedFqbn) { + await this.boardsDataStore.reloadBoardData(selectedFqbn); + message = nls.localize( + 'arduino/board/boardDataReloaded', + 'Board data reloaded.' ); - return; - } - if (!selectedPort) { - this.messageService.info( - nls.localize( - 'arduino/board/selectPortForInfo', - 'Please select a port to obtain board info.' - ) + } else { + message = nls.localize( + 'arduino/board/selectBoardToReload', + 'Please select a board first.' ); - return; - } - const boardDetails = await this.boardsService.getBoardDetails({ - fqbn: selectedBoard.fqbn, - }); - if (boardDetails) { - const { VID, PID } = boardDetails; - const detail = `BN: ${selectedBoard.name} -VID: ${VID} -PID: ${PID}`; - await remote.dialog.showMessageBox(remote.getCurrentWindow(), { - message: nls.localize('arduino/board/boardInfo', 'Board Info'), - title: nls.localize('arduino/board/boardInfo', 'Board Info'), - type: 'info', - detail, - buttons: [nls.localize('vscode/issueMainService/ok', 'OK')], - }); } + + this.messageService.info(message, { timeout: 2000 }); }, }); } override onStart(): void { - this.notificationCenter.onPlatformDidInstall(() => this.updateMenus()); - this.notificationCenter.onPlatformDidUninstall(() => this.updateMenus()); - this.boardsServiceProvider.onBoardsConfigChanged(() => this.updateMenus()); - this.boardsServiceProvider.onAvailableBoardsChanged(() => - this.updateMenus() - ); - this.boardsServiceProvider.onAvailablePortsChanged(() => - this.updateMenus() + this.notificationCenter.onPlatformDidInstall(() => this.updateMenus(true)); + this.notificationCenter.onPlatformDidUninstall(() => + this.updateMenus(true) ); + this.boardsServiceProvider.onBoardListDidChange(() => this.updateMenus()); } override async onReady(): Promise { this.updateMenus(); } - protected async updateMenus(): Promise { - const [installedBoards, availablePorts, config] = await Promise.all([ - this.installedBoards(), - this.boardsService.getState(), - this.boardsServiceProvider.boardsConfig, - ]); - this.rebuildMenus(installedBoards, availablePorts, config); + private async updateMenus(discardCache = false): Promise { + if (discardCache) { + this._installedBoards?.reject(); + this._installedBoards = undefined; + } + if (!this._installedBoards) { + this._installedBoards = new Deferred(); + this.installedBoards().then((installedBoards) => + this._installedBoards?.resolve(installedBoards) + ); + } + const installedBoards = await this._installedBoards.promise; + this.rebuildMenus(installedBoards, this.boardsServiceProvider.boardList); } - protected rebuildMenus( + private rebuildMenus( installedBoards: InstalledBoardWithPackage[], - availablePorts: AvailablePorts, - config: BoardsConfig.Config + boardList: BoardList ): void { this.toDisposeBeforeMenuRebuild.dispose(); @@ -137,7 +140,8 @@ PID: ${PID}`; ...ArduinoMenus.TOOLS__BOARD_SELECTION_GROUP, '1_boards', ]; - const boardsSubmenuLabel = config.selectedBoard?.name; + const { selectedBoard, selectedPort } = boardList.boardsConfig; + const boardsSubmenuLabel = selectedBoard?.name; // Note: The submenu order starts from `100` because `Auto Format`, `Serial Monitor`, etc starts from `0` index. // The board specific items, and the rest, have order with `z`. We needed something between `0` and `z` with natural-order. this.menuModelRegistry.registerSubmenu( @@ -156,11 +160,8 @@ PID: ${PID}`; ); // Ports submenu - const portsSubmenuPath = [ - ...ArduinoMenus.TOOLS__BOARD_SELECTION_GROUP, - '2_ports', - ]; - const portsSubmenuLabel = config.selectedPort?.address; + const portsSubmenuPath = ArduinoMenus.TOOLS__PORTS_SUBMENU; + const portsSubmenuLabel = selectedPort?.address; this.menuModelRegistry.registerSubmenu( portsSubmenuPath, nls.localize( @@ -176,6 +177,21 @@ PID: ${PID}`; ) ); + const reloadBoardData = { + commandId: BoardSelection.Commands.RELOAD_BOARD_DATA.id, + label: nls.localize('arduino/board/reloadBoardData', 'Reload Board Data'), + order: '102', + }; + this.menuModelRegistry.registerMenuAction( + ArduinoMenus.TOOLS__BOARD_SELECTION_GROUP, + reloadBoardData + ); + this.toDisposeBeforeMenuRebuild.push( + Disposable.create(() => + this.menuModelRegistry.unregisterMenuAction(reloadBoardData) + ) + ); + const getBoardInfo = { commandId: BoardSelection.Commands.GET_BOARD_INFO.id, label: nls.localize('arduino/board/getBoardInfo', 'Get Board Info'), @@ -199,64 +215,116 @@ PID: ${PID}`; label: `${BoardsListWidget.WIDGET_LABEL}...`, }); - // Installed boards + const selectedBoardPlatformId = selectedBoard + ? createPlatformIdentifier(selectedBoard) + : undefined; + + // Keys are the vendor IDs + type BoardsPerVendor = Record; + // Group boards by their platform names. The keys are the platform names as menu labels. + // If there is a platform name (menu label) collision, refine the menu label with the vendor ID. + const groupedBoards = new Map(); for (const board of installedBoards) { - const { packageId, packageName, fqbn, name, manuallyInstalled } = board; + const { packageId, packageName } = board; + const { vendorId } = packageId; + let boardsPerPackageName = groupedBoards.get(packageName); + if (!boardsPerPackageName) { + boardsPerPackageName = {} as BoardsPerVendor; + groupedBoards.set(packageName, boardsPerPackageName); + } + let boardPerVendor: BoardWithPackage[] | undefined = + boardsPerPackageName[vendorId]; + if (!boardPerVendor) { + boardPerVendor = []; + boardsPerPackageName[vendorId] = boardPerVendor; + } + boardPerVendor.push(board); + } - const packageLabel = - packageName + - `${manuallyInstalled - ? nls.localize('arduino/board/inSketchbook', ' (in Sketchbook)') - : '' - }`; - // Platform submenu - const platformMenuPath = [...boardsPackagesGroup, packageId]; - // Note: Registering the same submenu twice is a noop. No need to group the boards per platform. - this.menuModelRegistry.registerSubmenu(platformMenuPath, packageLabel, { - order: packageName.toLowerCase(), - }); + // Installed boards + Array.from(groupedBoards.entries()).forEach( + ([packageName, boardsPerPackage]) => { + const useVendorSuffix = Object.keys(boardsPerPackage).length > 1; + Object.entries(boardsPerPackage).forEach(([vendorId, boards]) => { + let platformMenuPath: MenuPath | undefined = undefined; + boards.forEach((board, index) => { + const { packageId, fqbn, name, manuallyInstalled } = board; + // create the platform submenu once. + // creating and registering the same submenu twice in Theia is a noop, though. + if (!platformMenuPath) { + let packageLabel = + packageName + + `${ + manuallyInstalled + ? nls.localize( + 'arduino/board/inSketchbook', + ' (in Sketchbook)' + ) + : '' + }`; + if ( + selectedBoardPlatformId && + platformIdentifierEquals(packageId, selectedBoardPlatformId) + ) { + packageLabel = `● ${packageLabel}`; + } + if (useVendorSuffix) { + packageLabel += ` (${vendorId})`; + } + // Platform submenu + platformMenuPath = [ + ...boardsPackagesGroup, + serializePlatformIdentifier(packageId), + ]; + this.menuModelRegistry.registerSubmenu( + platformMenuPath, + packageLabel, + { + order: packageName.toLowerCase(), + } + ); + } - const id = `arduino-select-board--${fqbn}`; - const command = { id }; - const handler = { - execute: () => { - if ( - fqbn !== this.boardsServiceProvider.boardsConfig.selectedBoard?.fqbn - ) { - this.boardsServiceProvider.boardsConfig = { - selectedBoard: { - name, - fqbn, - port: this.boardsServiceProvider.boardsConfig.selectedBoard - ?.port, // TODO: verify! - }, - selectedPort: - this.boardsServiceProvider.boardsConfig.selectedPort, + const id = `arduino-select-board--${fqbn}`; + const command = { id }; + const handler = { + execute: () => + this.boardsServiceProvider.updateConfig({ + name: name, + fqbn: fqbn, + }), + isToggled: () => fqbn === selectedBoard?.fqbn, }; - } - }, - isToggled: () => - fqbn === this.boardsServiceProvider.boardsConfig.selectedBoard?.fqbn, - }; - // Board menu - const menuAction = { commandId: id, label: name }; - this.commandRegistry.registerCommand(command, handler); - this.toDisposeBeforeMenuRebuild.push( - Disposable.create(() => this.commandRegistry.unregisterCommand(command)) - ); - this.menuModelRegistry.registerMenuAction(platformMenuPath, menuAction); - // Note: we do not dispose the menu actions individually. Calling `unregisterSubmenu` on the parent will wipe the children menu nodes recursively. - } + // Board menu + const menuAction = { + commandId: id, + label: name, + order: String(index).padStart(4), // pads with leading zeros for alphanumeric sort where order is 1, 2, 11, and NOT 1, 11, 2 + }; + this.commandRegistry.registerCommand(command, handler); + this.toDisposeBeforeMenuRebuild.push( + Disposable.create(() => + this.commandRegistry.unregisterCommand(command) + ) + ); + this.menuModelRegistry.registerMenuAction( + platformMenuPath, + menuAction + ); + // Note: we do not dispose the menu actions individually. Calling `unregisterSubmenu` on the parent will wipe the children menu nodes recursively. + }); + }); + } + ); - // Installed ports + // Detected ports const registerPorts = ( protocol: string, - protocolOrder: number, - ports: AvailablePorts + ports: ReturnType, + protocolOrder: number ) => { - const portIDs = Object.keys(ports); - if (!portIDs.length) { + if (!ports.length) { return; } @@ -267,8 +335,12 @@ PID: ${PID}`; ]; const placeholder = new PlaceholderMenuNode( menuPath, - `${firstToUpperCase(protocol)} ports`, - { order: protocolOrder.toString() } + nls.localize( + 'arduino/board/typeOfPorts', + '{0} ports', + Port.Protocols.protocolLabel(protocol) + ), + { order: protocolOrder.toString().padStart(4) } ); this.menuModelRegistry.registerMenuNode(menuPath, placeholder); this.toDisposeBeforeMenuRebuild.push( @@ -277,49 +349,31 @@ PID: ${PID}`; ) ); - // First we show addresses with recognized boards connected, - // then all the rest. - const sortedIDs = Object.keys(ports).sort((left: string, right: string): number => { - const [, leftBoards] = ports[left]; - const [, rightBoards] = ports[right]; - return rightBoards.length - leftBoards.length; - }); - - for (let i = 0; i < sortedIDs.length; i++) { - const portID = sortedIDs[i]; - const [port, boards] = ports[portID]; + for (let i = 0; i < ports.length; i++) { + const { port, boards } = ports[i]; + const portKey = Port.keyOf(port); let label = `${port.addressLabel}`; - if (boards.length) { + if (boards?.length) { const boardsList = boards.map((board) => board.name).join(', '); label = `${label} (${boardsList})`; } - const id = `arduino-select-port--${portID}`; + const id = `arduino-select-port--${portKey}`; const command = { id }; const handler = { execute: () => { - if ( - !Port.sameAs( - port, - this.boardsServiceProvider.boardsConfig.selectedPort - ) - ) { - this.boardsServiceProvider.boardsConfig = { - selectedBoard: - this.boardsServiceProvider.boardsConfig.selectedBoard, - selectedPort: port, - }; - } + this.boardsServiceProvider.updateConfig({ + protocol: port.protocol, + address: port.address, + }); + }, + isToggled: () => { + return i === ports.matchingIndex; }, - isToggled: () => - Port.sameAs( - port, - this.boardsServiceProvider.boardsConfig.selectedPort - ), }; const menuAction = { commandId: id, label, - order: `${protocolOrder + i + 1}`, + order: String(protocolOrder + i + 1).padStart(4), }; this.commandRegistry.registerCommand(command, handler); this.toDisposeBeforeMenuRebuild.push( @@ -331,32 +385,25 @@ PID: ${PID}`; } }; - const grouped = AvailablePorts.groupByProtocol(availablePorts); + const groupedPorts = boardList.portsGroupedByProtocol(); let protocolOrder = 100; - // We first show serial and network ports, then all the rest - ['serial', 'network'].forEach((protocol) => { - const ports = grouped.get(protocol); - if (ports) { - registerPorts(protocol, protocolOrder, ports); - grouped.delete(protocol); - protocolOrder = protocolOrder + 100; - } - }); - grouped.forEach((ports, protocol) => { - registerPorts(protocol, protocolOrder, ports); - protocolOrder = protocolOrder + 100; + Object.entries(groupedPorts).forEach(([protocol, ports]) => { + registerPorts(protocol, ports, protocolOrder); + protocolOrder += 100; }); - this.mainMenuManager.update(); } protected async installedBoards(): Promise { - const allBoards = await this.boardsService.searchBoards({}); + const allBoards = await this.boardsService.getInstalledBoards(); return allBoards.filter(InstalledBoardWithPackage.is); } } export namespace BoardSelection { export namespace Commands { export const GET_BOARD_INFO: Command = { id: 'arduino-get-board-info' }; + export const RELOAD_BOARD_DATA: Command = { + id: 'arduino-reload-board-data', + }; } } diff --git a/arduino-ide-extension/src/browser/boards/boards-data-menu-updater.ts b/arduino-ide-extension/src/browser/contributions/boards-data-menu-updater.ts similarity index 67% rename from arduino-ide-extension/src/browser/boards/boards-data-menu-updater.ts rename to arduino-ide-extension/src/browser/contributions/boards-data-menu-updater.ts index 5f1c42e51..382e0f2ef 100644 --- a/arduino-ide-extension/src/browser/boards/boards-data-menu-updater.ts +++ b/arduino-ide-extension/src/browser/contributions/boards-data-menu-updater.ts @@ -1,67 +1,66 @@ -import * as PQueue from 'p-queue'; -import { inject, injectable } from '@theia/core/shared/inversify'; -import { CommandRegistry } from '@theia/core/lib/common/command'; -import { MenuModelRegistry } from '@theia/core/lib/common/menu'; import { Disposable, DisposableCollection, } from '@theia/core/lib/common/disposable'; -import { BoardsServiceProvider } from './boards-service-provider'; -import { Board, ConfigOption, Programmer } from '../../common/protocol'; -import { FrontendApplicationContribution } from '@theia/core/lib/browser'; -import { BoardsDataStore } from './boards-data-store'; -import { MainMenuManager } from '../../common/main-menu-manager'; +import { nls } from '@theia/core/lib/common/nls'; +import { inject, injectable } from '@theia/core/shared/inversify'; +import PQueue from 'p-queue'; +import { + BoardIdentifier, + ConfigOption, + isBoardIdentifierChangeEvent, + Programmer, +} from '../../common/protocol'; +import { BoardsDataStore } from '../boards/boards-data-store'; +import { BoardsServiceProvider } from '../boards/boards-service-provider'; import { ArduinoMenus, unregisterSubmenu } from '../menu/arduino-menus'; -import { nls } from '@theia/core/lib/common'; -import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state'; +import { + CommandRegistry, + Contribution, + MenuModelRegistry, +} from './contribution'; @injectable() -export class BoardsDataMenuUpdater implements FrontendApplicationContribution { +export class BoardsDataMenuUpdater extends Contribution { @inject(CommandRegistry) - protected readonly commandRegistry: CommandRegistry; - + private readonly commandRegistry: CommandRegistry; @inject(MenuModelRegistry) - protected readonly menuRegistry: MenuModelRegistry; - - @inject(MainMenuManager) - protected readonly mainMenuManager: MainMenuManager; - + private readonly menuRegistry: MenuModelRegistry; @inject(BoardsDataStore) - protected readonly boardsDataStore: BoardsDataStore; - + private readonly boardsDataStore: BoardsDataStore; @inject(BoardsServiceProvider) - protected readonly boardsServiceClient: BoardsServiceProvider; + private readonly boardsServiceProvider: BoardsServiceProvider; - @inject(FrontendApplicationStateService) - private readonly appStateService: FrontendApplicationStateService; + private readonly queue = new PQueue({ autoStart: true, concurrency: 1 }); + private readonly toDisposeOnBoardChange = new DisposableCollection(); - protected readonly queue = new PQueue({ autoStart: true, concurrency: 1 }); - protected readonly toDisposeOnBoardChange = new DisposableCollection(); - - async onStart(): Promise { - this.appStateService - .reachedState('ready') - .then(() => - this.updateMenuActions( - this.boardsServiceClient.boardsConfig.selectedBoard - ) - ); - this.boardsDataStore.onChanged(() => + override onStart(): void { + this.boardsDataStore.onDidChange(() => this.updateMenuActions( - this.boardsServiceClient.boardsConfig.selectedBoard + this.boardsServiceProvider.boardsConfig.selectedBoard ) ); - this.boardsServiceClient.onBoardsConfigChanged(({ selectedBoard }) => - this.updateMenuActions(selectedBoard) + this.boardsServiceProvider.onBoardsConfigDidChange((event) => { + if (isBoardIdentifierChangeEvent(event)) { + this.updateMenuActions(event.selectedBoard); + } + }); + } + + override onReady(): void { + this.boardsServiceProvider.ready.then(() => + this.updateMenuActions( + this.boardsServiceProvider.boardsConfig.selectedBoard + ) ); } - protected async updateMenuActions( - selectedBoard: Board | undefined + private async updateMenuActions( + selectedBoard: BoardIdentifier | undefined ): Promise { return this.queue.add(async () => { this.toDisposeOnBoardChange.dispose(); - this.mainMenuManager.update(); + this.menuManager.update(); if (selectedBoard) { const { fqbn } = selectedBoard; if (fqbn) { @@ -80,16 +79,15 @@ export class BoardsDataMenuUpdater implements FrontendApplicationContribution { string, Disposable & { label: string } >(); + let selectedValue = ''; for (const value of values) { const id = `${fqbn}-${option}--${value.value}`; const command = { id }; - const selectedValue = value.value; const handler = { execute: () => this.boardsDataStore.selectConfigOption({ fqbn, - option, - selectedValue, + optionsToUpdate: [{ option, selectedValue: value.value }], }), isToggled: () => value.selected, }; @@ -100,8 +98,14 @@ export class BoardsDataMenuUpdater implements FrontendApplicationContribution { { label: value.label } ) ); + if (value.selected) { + selectedValue = value.label; + } } - this.menuRegistry.registerSubmenu(menuPath, label); + this.menuRegistry.registerSubmenu( + menuPath, + `${label}${selectedValue ? `: "${selectedValue}"` : ''}` + ); this.toDisposeOnBoardChange.pushAll([ ...commands.values(), Disposable.create(() => @@ -111,7 +115,7 @@ export class BoardsDataMenuUpdater implements FrontendApplicationContribution { const { label } = commands.get(commandId)!; this.menuRegistry.registerMenuAction(menuPath, { commandId, - order: `${i}`, + order: String(i).padStart(4), label, }); return Disposable.create(() => @@ -166,7 +170,7 @@ export class BoardsDataMenuUpdater implements FrontendApplicationContribution { ]); } } - this.mainMenuManager.update(); + this.menuManager.update(); } } }); diff --git a/arduino-ide-extension/src/browser/contributions/burn-bootloader.ts b/arduino-ide-extension/src/browser/contributions/burn-bootloader.ts index 2ad150784..e951ac2f9 100644 --- a/arduino-ide-extension/src/browser/contributions/burn-bootloader.ts +++ b/arduino-ide-extension/src/browser/contributions/burn-bootloader.ts @@ -37,11 +37,15 @@ export class BurnBootloader extends CoreServiceContribution { 'arduino/bootloader/burningBootloader', 'Burning bootloader...' ), - task: (progressId, coreService) => - coreService.burnBootloader({ - ...options, - progressId, - }), + task: (progressId, coreService, token) => + coreService.burnBootloader( + { + ...options, + progressId, + }, + token + ), + cancelable: true, }); this.messageService.info( nls.localize( diff --git a/arduino-ide-extension/src/browser/contributions/check-for-ide-updates.ts b/arduino-ide-extension/src/browser/contributions/check-for-ide-updates.ts index 14ba623bf..a2f76d15f 100644 --- a/arduino-ide-extension/src/browser/contributions/check-for-ide-updates.ts +++ b/arduino-ide-extension/src/browser/contributions/check-for-ide-updates.ts @@ -3,10 +3,14 @@ import { LocalStorageService } from '@theia/core/lib/browser/storage-service'; import { inject, injectable } from '@theia/core/shared/inversify'; import { IDEUpdater, + LAST_USED_IDE_VERSION, SKIP_IDE_VERSION, } from '../../common/protocol/ide-updater'; import { IDEUpdaterDialog } from '../dialogs/ide-updater/ide-updater-dialog'; import { Contribution } from './contribution'; +import { VersionWelcomeDialog } from '../dialogs/version-welcome-dialog'; +import { AppService } from '../app-service'; +import { SemVer } from 'semver'; @injectable() export class CheckForIDEUpdates extends Contribution { @@ -16,9 +20,15 @@ export class CheckForIDEUpdates extends Contribution { @inject(IDEUpdaterDialog) private readonly updaterDialog: IDEUpdaterDialog; + @inject(VersionWelcomeDialog) + private readonly versionWelcomeDialog: VersionWelcomeDialog; + @inject(LocalStorageService) private readonly localStorage: LocalStorageService; + @inject(AppService) + private readonly appService: AppService; + override onStart(): void { this.preferences.onPreferenceChanged( ({ preferenceName, newValue, oldValue }) => { @@ -36,24 +46,31 @@ export class CheckForIDEUpdates extends Contribution { ); } - override onReady(): void { - const checkForUpdates = this.preferences['arduino.checkForUpdates']; - if (!checkForUpdates) { - return; - } + override async onReady(): Promise { this.updater .init( this.preferences.get('arduino.ide.updateChannel'), this.preferences.get('arduino.ide.updateBaseUrl') ) - .then(() => this.updater.checkForUpdates(true)) + .then(() => { + if (!this.preferences['arduino.checkForUpdates']) { + return; + } + return this.updater.checkForUpdates(true); + }) .then(async (updateInfo) => { - if (!updateInfo) return; + if (!updateInfo) { + const isNewVersion = await this.isNewStableVersion(); + if (isNewVersion) { + this.versionWelcomeDialog.open(); + } + return; + } const versionToSkip = await this.localStorage.getData( SKIP_IDE_VERSION ); if (versionToSkip === updateInfo.version) return; - this.updaterDialog.open(updateInfo); + this.updaterDialog.open(true, updateInfo); }) .catch((e) => { this.messageService.error( @@ -63,6 +80,44 @@ export class CheckForIDEUpdates extends Contribution { e.message ) ); + }) + .finally(() => { + this.setCurrentIDEVersion(); }); } + + private async setCurrentIDEVersion(): Promise { + try { + const { appVersion } = await this.appService.info(); + const currSemVer = new SemVer(appVersion ?? ''); + this.localStorage.setData(LAST_USED_IDE_VERSION, currSemVer.format()); + } catch { + // ignore invalid versions + } + } + + /** + * Check if user is running a new IDE version for the first time. + * @returns true if the current IDE version is greater than the last used version + * and both are non-prerelease versions. + */ + private async isNewStableVersion(): Promise { + try { + const { appVersion } = await this.appService.info(); + const prevVersion = await this.localStorage.getData( + LAST_USED_IDE_VERSION + ); + + const prevSemVer = new SemVer(prevVersion ?? ''); + const currSemVer = new SemVer(appVersion ?? ''); + + if (prevSemVer.prerelease.length || currSemVer.prerelease.length) { + return false; + } + + return currSemVer.compare(prevSemVer) === 1; + } catch (e) { + return false; + } + } } diff --git a/arduino-ide-extension/src/browser/contributions/close.ts b/arduino-ide-extension/src/browser/contributions/close.ts index 033d02edd..93b4a62e4 100644 --- a/arduino-ide-extension/src/browser/contributions/close.ts +++ b/arduino-ide-extension/src/browser/contributions/close.ts @@ -1,26 +1,24 @@ -import { injectable } from '@theia/core/shared/inversify'; +import { Dialog } from '@theia/core/lib/browser/dialogs'; +import type { FrontendApplication } from '@theia/core/lib/browser/frontend-application'; +import type { OnWillStopAction } from '@theia/core/lib/browser/frontend-application-contribution'; +import { ApplicationShell } from '@theia/core/lib/browser/shell/application-shell'; +import { nls } from '@theia/core/lib/common/nls'; +import type { MaybePromise } from '@theia/core/lib/common/types'; import { toArray } from '@theia/core/shared/@phosphor/algorithm'; -import * as remote from '@theia/core/electron-shared/@electron/remote'; +import { inject, injectable } from '@theia/core/shared/inversify'; import { MonacoEditor } from '@theia/monaco/lib/browser/monaco-editor'; -import type { MaybePromise } from '@theia/core/lib/common/types'; -import type { - FrontendApplication, - OnWillStopAction, -} from '@theia/core/lib/browser/frontend-application'; -import { nls } from '@theia/core/lib/common/nls'; -import { ApplicationShell } from '@theia/core/lib/browser/shell/application-shell'; import { ArduinoMenus } from '../menu/arduino-menus'; +import { CurrentSketch } from '../sketches-service-client-impl'; +import { WindowServiceExt } from '../theia/core/window-service-ext'; import { - SketchContribution, Command, CommandRegistry, - MenuModelRegistry, KeybindingRegistry, + MenuModelRegistry, Sketch, + SketchContribution, URI, } from './contribution'; -import { Dialog } from '@theia/core/lib/browser/dialogs'; -import { CurrentSketch } from '../../common/protocol/sketches-service-client-impl'; import { SaveAsSketch } from './save-as-sketch'; /** @@ -28,6 +26,9 @@ import { SaveAsSketch } from './save-as-sketch'; */ @injectable() export class Close extends SketchContribution { + @inject(WindowServiceExt) + private readonly windowServiceExt: WindowServiceExt; + private shell: ApplicationShell | undefined; override onStart(app: FrontendApplication): MaybePromise { @@ -56,7 +57,7 @@ export class Close extends SketchContribution { } } } - return remote.getCurrentWindow().close(); + return this.windowServiceExt.close(); }, }); } @@ -65,7 +66,7 @@ export class Close extends SketchContribution { registry.registerMenuAction(ArduinoMenus.FILE__SKETCH_GROUP, { commandId: Close.Commands.CLOSE.id, label: nls.localize('vscode/editor.contribution/close', 'Close'), - order: '5', + order: '6', }); } @@ -150,26 +151,23 @@ export class Close extends SketchContribution { } private async prompt(isTemp: boolean): Promise { - const { response } = await remote.dialog.showMessageBox( - remote.getCurrentWindow(), - { - message: nls.localize( - 'arduino/sketch/saveSketch', - 'Save your sketch to open it again later.' - ), - title: nls.localize( - 'theia/core/quitTitle', - 'Are you sure you want to quit?' - ), - type: 'question', - buttons: [ - nls.localizeByDefault("Don't Save"), - Dialog.CANCEL, - nls.localizeByDefault(isTemp ? 'Save As...' : 'Save'), - ], - defaultId: 2, // `Save`/`Save As...` button index is the default. - } - ); + const { response } = await this.dialogService.showMessageBox({ + message: nls.localize( + 'arduino/sketch/saveSketch', + 'Save your sketch to open it again later.' + ), + title: nls.localize( + 'theia/core/quitTitle', + 'Are you sure you want to quit?' + ), + type: 'question', + buttons: [ + nls.localizeByDefault("Don't Save"), + Dialog.CANCEL, + nls.localizeByDefault(isTemp ? 'Save As...' : 'Save'), + ], + defaultId: 2, // `Save`/`Save As...` button index is the default. + }); switch (response) { case 0: return Prompt.DoNotSave; @@ -185,7 +183,7 @@ export class Close extends SketchContribution { private async isCurrentSketchTemp(): Promise { const currentSketch = await this.sketchServiceClient.currentSketch(); if (CurrentSketch.isValid(currentSketch)) { - const isTemp = await this.sketchService.isTemp(currentSketch); + const isTemp = await this.sketchesService.isTemp(currentSketch); if (isTemp) { return currentSketch; } diff --git a/arduino-ide-extension/src/browser/contributions/cloud-contribution.ts b/arduino-ide-extension/src/browser/contributions/cloud-contribution.ts new file mode 100644 index 000000000..47e14210d --- /dev/null +++ b/arduino-ide-extension/src/browser/contributions/cloud-contribution.ts @@ -0,0 +1,121 @@ +import { CompositeTreeNode } from '@theia/core/lib/browser/tree'; +import { nls } from '@theia/core/lib/common/nls'; +import { inject, injectable } from '@theia/core/shared/inversify'; +import { CreateApi } from '../create/create-api'; +import { CreateFeatures } from '../create/create-features'; +import { CreateUri } from '../create/create-uri'; +import { Create, isNotFound } from '../create/typings'; +import { CloudSketchbookTree } from '../widgets/cloud-sketchbook/cloud-sketchbook-tree'; +import { CloudSketchbookTreeModel } from '../widgets/cloud-sketchbook/cloud-sketchbook-tree-model'; +import { CloudSketchbookTreeWidget } from '../widgets/cloud-sketchbook/cloud-sketchbook-tree-widget'; +import { SketchbookWidget } from '../widgets/sketchbook/sketchbook-widget'; +import { SketchbookWidgetContribution } from '../widgets/sketchbook/sketchbook-widget-contribution'; +import { SketchContribution } from './contribution'; + +export function sketchAlreadyExists(input: string): string { + return nls.localize( + 'arduino/cloudSketch/alreadyExists', + "Cloud sketch '{0}' already exists.", + input + ); +} +export function sketchNotFound(input: string): string { + return nls.localize( + 'arduino/cloudSketch/notFound', + "Could not pull the cloud sketch '{0}'. It does not exist.", + input + ); +} +export const synchronizingSketchbook = nls.localize( + 'arduino/cloudSketch/synchronizingSketchbook', + 'Synchronizing sketchbook...' +); +export function pullingSketch(input: string): string { + return nls.localize( + 'arduino/cloudSketch/pulling', + "Synchronizing sketchbook, pulling '{0}'...", + input + ); +} +export function pushingSketch(input: string): string { + return nls.localize( + 'arduino/cloudSketch/pushing', + "Synchronizing sketchbook, pushing '{0}'...", + input + ); +} + +@injectable() +export abstract class CloudSketchContribution extends SketchContribution { + @inject(SketchbookWidgetContribution) + private readonly widgetContribution: SketchbookWidgetContribution; + @inject(CreateApi) + protected readonly createApi: CreateApi; + @inject(CreateFeatures) + protected readonly createFeatures: CreateFeatures; + + protected async treeModel(): Promise< + (CloudSketchbookTreeModel & { root: CompositeTreeNode }) | undefined + > { + const { enabled, session } = this.createFeatures; + if (enabled && session) { + const widget = await this.widgetContribution.widget; + const treeModel = this.treeModelFrom(widget); + if (treeModel) { + const root = treeModel.root; + if (CompositeTreeNode.is(root)) { + return treeModel as CloudSketchbookTreeModel & { + root: CompositeTreeNode; + }; + } + } + } + return undefined; + } + + protected async pull( + sketch: Create.Sketch + ): Promise { + const treeModel = await this.treeModel(); + if (!treeModel) { + return undefined; + } + const id = CreateUri.toUri(sketch).path.toString(); + const node = treeModel.getNode(id); + if (!node) { + throw new Error( + `Could not find cloud sketchbook tree node with ID: ${id}.` + ); + } + if (!CloudSketchbookTree.CloudSketchDirNode.is(node)) { + throw new Error( + `Cloud sketchbook tree node expected to represent a directory but it did not. Tree node ID: ${id}.` + ); + } + try { + await treeModel.sketchbookTree().pull({ node }, true); + return node; + } catch (err) { + if (isNotFound(err)) { + await treeModel.refresh(); + this.messageService.error(sketchNotFound(sketch.name)); + return undefined; + } + throw err; + } + } + + private treeModelFrom( + widget: SketchbookWidget + ): CloudSketchbookTreeModel | undefined { + for (const treeWidget of widget.getTreeWidgets()) { + if (treeWidget instanceof CloudSketchbookTreeWidget) { + const model = treeWidget.model; + if (model instanceof CloudSketchbookTreeModel) { + return model; + } + } + } + return undefined; + } +} diff --git a/arduino-ide-extension/src/browser/contributions/compiler-errors.ts b/arduino-ide-extension/src/browser/contributions/compiler-errors.ts index a689ea3df..19c322d21 100644 --- a/arduino-ide-extension/src/browser/contributions/compiler-errors.ts +++ b/arduino-ide-extension/src/browser/contributions/compiler-errors.ts @@ -779,7 +779,7 @@ export class CompilerErrors return undefined; } else { return this.editorManager - .getByUri(new URI(uriOrWidget)) + .getByUri(new URI(uriOrWidget.toString())) .then((editor) => { if (editor) { return this.monacoEditor(editor); diff --git a/arduino-ide-extension/src/browser/contributions/contribution.ts b/arduino-ide-extension/src/browser/contributions/contribution.ts index 920e4dfd9..781b832fc 100644 --- a/arduino-ide-extension/src/browser/contributions/contribution.ts +++ b/arduino-ide-extension/src/browser/contributions/contribution.ts @@ -1,75 +1,87 @@ +import { ClipboardService } from '@theia/core/lib/browser/clipboard-service'; +import { FrontendApplication } 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 { - inject, - injectable, - interfaces, - postConstruct, -} from '@theia/core/shared/inversify'; -import URI from '@theia/core/lib/common/uri'; -import { ILogger } from '@theia/core/lib/common/logger'; -import { Saveable } from '@theia/core/lib/browser/saveable'; -import { FileService } from '@theia/filesystem/lib/browser/file-service'; -import { MaybePromise } from '@theia/core/lib/common/types'; -import { LabelProvider } from '@theia/core/lib/browser/label-provider'; -import { EditorManager } from '@theia/editor/lib/browser/editor-manager'; -import { MessageService } from '@theia/core/lib/common/message-service'; -import { WorkspaceService } from '@theia/workspace/lib/browser/workspace-service'; -import { open, OpenerService } from '@theia/core/lib/browser/opener-service'; - -import { - MenuModelRegistry, - MenuContribution, -} from '@theia/core/lib/common/menu'; -import { - KeybindingRegistry, KeybindingContribution, + KeybindingRegistry, } from '@theia/core/lib/browser/keybinding'; +import { LabelProvider } from '@theia/core/lib/browser/label-provider'; +import { OpenerService, open } from '@theia/core/lib/browser/opener-service'; +import { Saveable } from '@theia/core/lib/browser/saveable'; +import { ApplicationShell } from '@theia/core/lib/browser/shell/application-shell'; import { TabBarToolbarContribution, TabBarToolbarRegistry, } from '@theia/core/lib/browser/shell/tab-bar-toolbar'; -import { - FrontendApplicationContribution, - FrontendApplication, -} from '@theia/core/lib/browser/frontend-application'; +import { CancellationToken } from '@theia/core/lib/common/cancellation'; import { Command, - CommandRegistry, CommandContribution, + CommandRegistry, CommandService, } from '@theia/core/lib/common/command'; -import { SettingsService } from '../dialogs/settings/settings'; import { - CurrentSketch, - SketchesServiceClientImpl, -} from '../../common/protocol/sketches-service-client-impl'; + Disposable, + DisposableCollection, +} from '@theia/core/lib/common/disposable'; +import { EnvVariablesServer } from '@theia/core/lib/common/env-variables'; +import { ILogger } from '@theia/core/lib/common/logger'; +import { + MenuContribution, + MenuModelRegistry, +} from '@theia/core/lib/common/menu'; +import { MessageService } from '@theia/core/lib/common/message-service'; +import { MessageType } from '@theia/core/lib/common/message-service-protocol'; +import { nls } from '@theia/core/lib/common/nls'; +import { MaybePromise, isObject } from '@theia/core/lib/common/types'; +import URI from '@theia/core/lib/common/uri'; +import { + inject, + injectable, + interfaces, + postConstruct, +} from '@theia/core/shared/inversify'; +import { EditorManager } from '@theia/editor/lib/browser/editor-manager'; +import { FileService } from '@theia/filesystem/lib/browser/file-service'; +import { NotificationManager } from '@theia/messages/lib/browser/notifications-manager'; +import { OutputChannelSeverity } from '@theia/output/lib/browser/output-channel'; +import { MainMenuManager } from '../../common/main-menu-manager'; +import { userAbort } from '../../common/nls'; import { - SketchesService, - ConfigService, - FileSystemExt, - Sketch, - CoreService, CoreError, + CoreService, + FileSystemExt, ResponseServiceClient, + Sketch, + SketchesService, } from '../../common/protocol'; +import { + ExecuteWithProgress, + UserAbortApplicationError, +} from '../../common/protocol/progressible'; import { ArduinoPreferences } from '../arduino-preferences'; -import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state'; -import { nls } from '@theia/core'; -import { OutputChannelManager } from '../theia/output/output-channel'; -import { ClipboardService } from '@theia/core/lib/browser/clipboard-service'; -import { ExecuteWithProgress } from '../../common/protocol/progressible'; -import { BoardsServiceProvider } from '../boards/boards-service-provider'; import { BoardsDataStore } from '../boards/boards-data-store'; -import { NotificationManager } from '../theia/messages/notifications-manager'; -import { MessageType } from '@theia/core/lib/common/message-service-protocol'; +import { BoardsServiceProvider } from '../boards/boards-service-provider'; +import { ConfigServiceClient } from '../config/config-service-client'; +import { DialogService } from '../dialog-service'; +import { SettingsService } from '../dialogs/settings/settings'; +import { + CurrentSketch, + SketchesServiceClientImpl, +} from '../sketches-service-client-impl'; +import { ApplicationConnectionStatusContribution } from '../theia/core/connection-status-service'; +import { OutputChannelManager } from '../theia/output/output-channel'; +import { WorkspaceService } from '../theia/workspace/workspace-service'; export { Command, CommandRegistry, - MenuModelRegistry, KeybindingRegistry, + MenuModelRegistry, + Sketch, TabBarToolbarRegistry, URI, - Sketch, open, }; @@ -106,6 +118,12 @@ export abstract class Contribution @inject(FrontendApplicationStateService) protected readonly appStateService: FrontendApplicationStateService; + @inject(MainMenuManager) + protected readonly menuManager: MainMenuManager; + + @inject(DialogService) + protected readonly dialogService: DialogService; + @postConstruct() protected init(): void { this.appStateService.reachedState('ready').then(() => this.onReady()); @@ -138,11 +156,11 @@ export abstract class SketchContribution extends Contribution { @inject(FileSystemExt) protected readonly fileSystemExt: FileSystemExt; - @inject(ConfigService) - protected readonly configService: ConfigService; + @inject(ConfigServiceClient) + protected readonly configService: ConfigServiceClient; @inject(SketchesService) - protected readonly sketchService: SketchesService; + protected readonly sketchesService: SketchesService; @inject(OpenerService) protected readonly openerService: OpenerService; @@ -156,6 +174,12 @@ export abstract class SketchContribution extends Contribution { @inject(OutputChannelManager) protected readonly outputChannelManager: OutputChannelManager; + @inject(EnvVariablesServer) + protected readonly envVariableServer: EnvVariablesServer; + + @inject(ApplicationConnectionStatusContribution) + protected readonly connectionStatusService: ApplicationConnectionStatusContribution; + protected async sourceOverride(): Promise> { const override: Record = {}; const sketch = await this.sketchServiceClient.currentSketch(); @@ -169,6 +193,25 @@ export abstract class SketchContribution extends Contribution { } return override; } + + /** + * Defaults to `directories.user` if defined and not CLI config errors were detected. + * Otherwise, the URI of the user home directory. + */ + protected async defaultUri(): Promise { + const errors = this.configService.tryGetMessages(); + let defaultUri = this.configService.tryGetSketchDirUri(); + if (!defaultUri || errors?.length) { + // Fall back to user home when the `directories.user` is not available or there are known CLI config errors + defaultUri = new URI(await this.envVariableServer.getHomeDirUri()); + } + return defaultUri; + } + + protected async defaultPath(): Promise { + const defaultUri = await this.defaultUri(); + return this.fileService.fsPath(defaultUri); + } } @injectable() @@ -191,6 +234,9 @@ export abstract class CoreServiceContribution extends SketchContribution { @inject(NotificationManager) private readonly notificationManager: NotificationManager; + @inject(ApplicationShell) + private readonly shell: ApplicationShell; + /** * This is the internal (Theia) ID of the notification that is currently visible. * It's stored here as a field to be able to close it before executing any new core command (such as verify, upload, etc.) @@ -205,6 +251,12 @@ export abstract class CoreServiceContribution extends SketchContribution { } protected handleError(error: unknown): void { + if (isObject(error) && UserAbortApplicationError.is(error)) { + this.outputChannelManager + .getChannel('Arduino') + .appendLine(userAbort, OutputChannelSeverity.Warning); + return; + } this.tryToastErrorMessage(error); } @@ -251,8 +303,17 @@ export abstract class CoreServiceContribution extends SketchContribution { protected async doWithProgress(options: { progressText: string; keepOutput?: boolean; - task: (progressId: string, coreService: CoreService) => Promise; + task: ( + progressId: string, + coreService: CoreService, + cancellationToken?: CancellationToken + ) => Promise; + // false by default + cancelable?: boolean; }): Promise { + const toDisposeOnComplete = new DisposableCollection( + this.maybeActivateMonitorWidget() + ); const { progressText, keepOutput, task } = options; this.outputChannelManager .getChannel('Arduino') @@ -261,14 +322,31 @@ export abstract class CoreServiceContribution extends SketchContribution { messageService: this.messageService, responseService: this.responseService, progressText, - run: ({ progressId }) => task(progressId, this.coreService), + run: ({ progressId, cancellationToken }) => + task(progressId, this.coreService, cancellationToken), keepOutput, + cancelable: options.cancelable, }); + toDisposeOnComplete.dispose(); return result; } + // TODO: cleanup! + // this dependency does not belong here + // support core command contribution handlers, the monitor-widget should implement it and register itself as a handler + // the monitor widget should reveal itself after a successful core command execution + private maybeActivateMonitorWidget(): Disposable { + const currentWidget = this.shell.bottomPanel.currentTitle?.owner; + if (currentWidget?.id === 'serial-monitor') { + return Disposable.create(() => + this.shell.bottomPanel.activateWidget(currentWidget) + ); + } + return Disposable.NULL; + } + private notificationId(message: string, ...actions: string[]): string { - return this.notificationManager.getMessageId({ + return this.notificationManager['getMessageId']({ text: message, actions, type: MessageType.Error, diff --git a/arduino-ide-extension/src/browser/contributions/create-cloud-copy.ts b/arduino-ide-extension/src/browser/contributions/create-cloud-copy.ts new file mode 100644 index 000000000..73b967f0f --- /dev/null +++ b/arduino-ide-extension/src/browser/contributions/create-cloud-copy.ts @@ -0,0 +1,118 @@ +import { FrontendApplication } from '@theia/core/lib/browser/frontend-application'; +import { ApplicationShell } from '@theia/core/lib/browser/shell'; +import type { Command, CommandRegistry } from '@theia/core/lib/common/command'; +import { Progress } from '@theia/core/lib/common/message-service-protocol'; +import { nls } from '@theia/core/lib/common/nls'; +import { inject, injectable } from '@theia/core/shared/inversify'; +import { Create } from '../create/typings'; +import { ApplicationConnectionStatusContribution } from '../theia/core/connection-status-service'; +import { CloudSketchbookTree } from '../widgets/cloud-sketchbook/cloud-sketchbook-tree'; +import { SketchbookTree } from '../widgets/sketchbook/sketchbook-tree'; +import { SketchbookTreeModel } from '../widgets/sketchbook/sketchbook-tree-model'; +import { CloudSketchContribution, pushingSketch } from './cloud-contribution'; +import { + CreateNewCloudSketchCallback, + NewCloudSketch, + NewCloudSketchParams, +} from './new-cloud-sketch'; +import { saveOntoCopiedSketch } from './save-as-sketch'; + +interface CreateCloudCopyParams { + readonly model: SketchbookTreeModel; + readonly node: SketchbookTree.SketchDirNode; +} +function isCreateCloudCopyParams(arg: unknown): arg is CreateCloudCopyParams { + return ( + typeof arg === 'object' && + (arg).model !== undefined && + (arg).model instanceof SketchbookTreeModel && + (arg).node !== undefined && + SketchbookTree.SketchDirNode.is((arg).node) + ); +} + +@injectable() +export class CreateCloudCopy extends CloudSketchContribution { + @inject(ApplicationConnectionStatusContribution) + private readonly connectionStatus: ApplicationConnectionStatusContribution; + + private shell: ApplicationShell; + + override onStart(app: FrontendApplication): void { + this.shell = app.shell; + } + + override registerCommands(registry: CommandRegistry): void { + registry.registerCommand(CreateCloudCopy.Commands.CREATE_CLOUD_COPY, { + execute: (args: CreateCloudCopyParams) => this.createCloudCopy(args), + isEnabled: (args: unknown) => + Boolean(this.createFeatures.session) && isCreateCloudCopyParams(args), + isVisible: (args: unknown) => + Boolean(this.createFeatures.enabled) && + Boolean(this.createFeatures.session) && + this.connectionStatus.offlineStatus !== 'internet' && + isCreateCloudCopyParams(args), + }); + } + + /** + * - creates new cloud sketch with the name of the params sketch, + * - pulls the cloud sketch, + * - copies files from params sketch to pulled cloud sketch in the cache folder, + * - pushes the cloud sketch, and + * - opens in new window. + */ + private async createCloudCopy(params: CreateCloudCopyParams): Promise { + const sketch = await this.sketchesService.loadSketch( + params.node.fileStat.resource.toString() + ); + const callback: CreateNewCloudSketchCallback = async ( + newSketch: Create.Sketch, + newNode: CloudSketchbookTree.CloudSketchDirNode, + progress: Progress + ) => { + const treeModel = await this.treeModel(); + if (!treeModel) { + throw new Error('Could not retrieve the cloud sketchbook tree model.'); + } + + progress.report({ + message: nls.localize( + 'arduino/createCloudCopy/copyingSketchFilesMessage', + 'Copying local sketch files...' + ), + }); + const localCacheFolderUri = newNode.uri.toString(); + await this.sketchesService.copy(sketch, { + destinationUri: localCacheFolderUri, + onlySketchFiles: true, + }); + await saveOntoCopiedSketch( + sketch, + localCacheFolderUri, + this.shell, + this.editorManager + ); + + progress.report({ message: pushingSketch(newSketch.name) }); + await treeModel.sketchbookTree().push(newNode, true, true); + }; + return this.commandService.executeCommand( + NewCloudSketch.Commands.NEW_CLOUD_SKETCH.id, + { + initialValue: params.node.fileStat.name, + callback, + skipShowErrorMessageOnOpen: false, + } + ); + } +} + +export namespace CreateCloudCopy { + export namespace Commands { + export const CREATE_CLOUD_COPY: Command = { + id: 'arduino-create-cloud-copy', + iconClass: 'fa fa-arduino-cloud-upload', + }; + } +} diff --git a/arduino-ide-extension/src/browser/contributions/debug.ts b/arduino-ide-extension/src/browser/contributions/debug.ts index b577d4167..93dd2aa51 100644 --- a/arduino-ide-extension/src/browser/contributions/debug.ts +++ b/arduino-ide-extension/src/browser/contributions/debug.ts @@ -1,101 +1,173 @@ +import { Emitter, Event } from '@theia/core/lib/common/event'; +import { MenuModelRegistry } from '@theia/core/lib/common/menu/menu-model-registry'; +import { nls } from '@theia/core/lib/common/nls'; +import { MaybePromise } from '@theia/core/lib/common/types'; import { inject, injectable } from '@theia/core/shared/inversify'; -import { Event, Emitter } from '@theia/core/lib/common/event'; -import { HostedPluginSupport } from '@theia/plugin-ext/lib/hosted/browser/hosted-plugin'; -import { ArduinoToolbar } from '../toolbar/arduino-toolbar'; -import { NotificationCenter } from '../notification-center'; -import { Board, BoardsService, ExecutableService } from '../../common/protocol'; +import { noBoardSelected } from '../../common/nls'; +import { + BoardDetails, + BoardIdentifier, + BoardsService, + CheckDebugEnabledParams, + ExecutableService, + SketchRef, + isBoardIdentifierChangeEvent, + isCompileSummary, +} from '../../common/protocol'; +import { BoardsDataStore } from '../boards/boards-data-store'; import { BoardsServiceProvider } from '../boards/boards-service-provider'; +import { HostedPluginSupport } from '../hosted/hosted-plugin-support'; +import { ArduinoMenus } from '../menu/arduino-menus'; +import { NotificationCenter } from '../notification-center'; +import { CurrentSketch } from '../sketches-service-client-impl'; +import { ArduinoToolbar } from '../toolbar/arduino-toolbar'; import { - URI, Command, CommandRegistry, SketchContribution, TabBarToolbarRegistry, + URI, } from './contribution'; -import { MaybePromise, MenuModelRegistry, nls } from '@theia/core/lib/common'; -import { CurrentSketch } from '../../common/protocol/sketches-service-client-impl'; -import { ArduinoMenus } from '../menu/arduino-menus'; - -import { MainMenuManager } from '../../common/main-menu-manager'; const COMPILE_FOR_DEBUG_KEY = 'arduino-compile-for-debug'; + +interface StartDebugParams { + /** + * Absolute filesystem path to the Arduino CLI executable. + */ + readonly cliPath: string; + /** + * The the board to debug. + */ + readonly board: Readonly<{ fqbn: string; name?: string }>; + /** + * Absolute filesystem path of the sketch to debug. + */ + readonly sketchPath: string; + /** + * Location where the `launch.json` will be created on the fly before starting every debug session. + * If not defined, it falls back to `sketchPath/.vscode/launch.json`. + */ + readonly launchConfigsDirPath?: string; + /** + * Absolute path to the `arduino-cli.yaml` file. If not specified, it falls back to `~/.arduinoIDE/arduino-cli.yaml`. + */ + readonly cliConfigPath?: string; + /** + * Programmer for the debugging. + */ + readonly programmer?: string; + /** + * Custom progress title to use when getting the debug information from the CLI. + */ + readonly title?: string; +} +type StartDebugResult = boolean; + +export const DebugDisabledStatusMessageSource = Symbol( + 'DebugDisabledStatusMessageSource' +); +export interface DebugDisabledStatusMessageSource { + /** + * `undefined` if debugging is enabled (for the currently selected board + programmer + config options). + * Otherwise, it's the human readable message why it's disabled. + */ + get message(): string | undefined; + /** + * Emits an event when {@link message} changes. + */ + get onDidChangeMessage(): Event; +} + @injectable() -export class Debug extends SketchContribution { +export class Debug + extends SketchContribution + implements DebugDisabledStatusMessageSource +{ @inject(HostedPluginSupport) private readonly hostedPluginSupport: HostedPluginSupport; - @inject(NotificationCenter) private readonly notificationCenter: NotificationCenter; - @inject(ExecutableService) private readonly executableService: ExecutableService; - @inject(BoardsService) private readonly boardService: BoardsService; - @inject(BoardsServiceProvider) private readonly boardsServiceProvider: BoardsServiceProvider; - - @inject(MainMenuManager) - private readonly mainMenuManager: MainMenuManager; + @inject(BoardsDataStore) + private readonly boardsDataStore: BoardsDataStore; /** - * If `undefined`, debugging is enabled. Otherwise, the reason why it's disabled. + * If `undefined`, debugging is enabled. Otherwise, the human-readable reason why it's disabled. */ - private _disabledMessages?: string = nls.localize( - 'arduino/common/noBoardSelected', - 'No board selected' - ); // Initial pessimism. - private disabledMessageDidChangeEmitter = new Emitter(); - private onDisabledMessageDidChange = - this.disabledMessageDidChangeEmitter.event; + private _message?: string = noBoardSelected; // Initial pessimism. + private readonly didChangeMessageEmitter = new Emitter(); + readonly onDidChangeMessage = this.didChangeMessageEmitter.event; - private get disabledMessage(): string | undefined { - return this._disabledMessages; + get message(): string | undefined { + return this._message; } - private set disabledMessage(message: string | undefined) { - this._disabledMessages = message; - this.disabledMessageDidChangeEmitter.fire(this._disabledMessages); + private set message(message: string | undefined) { + this._message = message; + this.didChangeMessageEmitter.fire(this._message); } private readonly debugToolbarItem = { id: Debug.Commands.START_DEBUGGING.id, command: Debug.Commands.START_DEBUGGING.id, tooltip: `${ - this.disabledMessage + this.message ? nls.localize( 'arduino/debug/debugWithMessage', 'Debug - {0}', - this.disabledMessage + this.message ) : Debug.Commands.START_DEBUGGING.label }`, priority: 3, - onDidChange: this.onDisabledMessageDidChange as Event, + onDidChange: this.onDidChangeMessage as Event, }; override onStart(): void { - this.onDisabledMessageDidChange( + this.onDidChangeMessage( () => (this.debugToolbarItem.tooltip = `${ - this.disabledMessage + this.message ? nls.localize( 'arduino/debug/debugWithMessage', 'Debug - {0}', - this.disabledMessage + this.message ) : Debug.Commands.START_DEBUGGING.label }`) ); - this.boardsServiceProvider.onBoardsConfigChanged(({ selectedBoard }) => - this.refreshState(selectedBoard) - ); - this.notificationCenter.onPlatformDidInstall(() => this.refreshState()); - this.notificationCenter.onPlatformDidUninstall(() => this.refreshState()); + this.boardsServiceProvider.onBoardsConfigDidChange((event) => { + if (isBoardIdentifierChangeEvent(event)) { + this.updateMessage(); + } + }); + this.notificationCenter.onPlatformDidInstall(() => this.updateMessage()); + this.notificationCenter.onPlatformDidUninstall(() => this.updateMessage()); + this.boardsDataStore.onDidChange((event) => { + const selectedFqbn = + this.boardsServiceProvider.boardsConfig.selectedBoard?.fqbn; + if (event.changes.find((change) => change.fqbn === selectedFqbn)) { + this.updateMessage(); + } + }); + this.commandService.onDidExecuteCommand((event) => { + const { commandId, args } = event; + if ( + commandId === 'arduino.languageserver.notifyBuildDidComplete' && + isCompileSummary(args[0]) + ) { + this.updateMessage(); + } + }); } - override onReady(): MaybePromise { - this.refreshState(); + override onReady(): void { + this.boardsServiceProvider.ready.then(() => this.updateMessage()); } override registerCommands(registry: CommandRegistry): void { @@ -103,7 +175,7 @@ export class Debug extends SketchContribution { execute: () => this.startDebug(), isVisible: (widget) => ArduinoToolbar.is(widget) && widget.side === 'left', - isEnabled: () => !this.disabledMessage, + isEnabled: () => !this.message, }); registry.registerCommand(Debug.Commands.TOGGLE_OPTIMIZE_FOR_DEBUG, { execute: () => this.toggleCompileForDebug(), @@ -126,96 +198,148 @@ export class Debug extends SketchContribution { }); } - private async refreshState( - board: Board | undefined = this.boardsServiceProvider.boardsConfig + private async updateMessage(): Promise { + try { + await this.isDebugEnabled(); + this.message = undefined; + } catch (err) { + let message = String(err); + if (err instanceof Error) { + message = err.message; + } + this.message = message; + } + } + + private async isDebugEnabled( + board: BoardIdentifier | undefined = this.boardsServiceProvider.boardsConfig .selectedBoard - ): Promise { - if (!board) { - this.disabledMessage = nls.localize( - 'arduino/common/noBoardSelected', - 'No board selected' - ); - return; + ): Promise { + const debugFqbn = await isDebugEnabled( + board, + (fqbn) => this.boardService.getBoardDetails({ fqbn }), + (fqbn) => this.boardsDataStore.getData(fqbn), + (fqbn) => this.boardsDataStore.appendConfigToFqbn(fqbn), + (params) => this.boardService.checkDebugEnabled(params) + ); + return debugFqbn; + } + + private async startDebug( + board: BoardIdentifier | undefined = this.boardsServiceProvider.boardsConfig + .selectedBoard, + sketch: + | CurrentSketch + | undefined = this.sketchServiceClient.tryGetCurrentSketch() + ): Promise { + if (!CurrentSketch.isValid(sketch)) { + return false; } - const fqbn = board.fqbn; - if (!fqbn) { - this.disabledMessage = nls.localize( - 'arduino/debug/noPlatformInstalledFor', - "Platform is not installed for '{0}'", - board.name - ); - return; + const params = await this.createStartDebugParams(board); + if (!params) { + return false; } - const details = await this.boardService.getBoardDetails({ fqbn }); - if (!details) { - this.disabledMessage = nls.localize( - 'arduino/debug/noPlatformInstalledFor', - "Platform is not installed for '{0}'", - board.name - ); - return; + await this.hostedPluginSupport.didStart; + try { + const result = await this.debug(params); + return Boolean(result); + } catch (err) { + if (await this.isSketchNotVerifiedError(err, sketch)) { + const yes = nls.localize('vscode/extensionsUtils/yes', 'Yes'); + const answer = await this.messageService.error( + sketchIsNotCompiled(sketch.name), + yes + ); + if (answer === yes) { + this.commandService.executeCommand('arduino-verify-sketch'); + } + } else { + this.messageService.error( + err instanceof Error ? err.message : String(err) + ); + } } - const { debuggingSupported } = details; - if (!debuggingSupported) { - this.disabledMessage = nls.localize( - 'arduino/debug/debuggingNotSupported', - "Debugging is not supported by '{0}'", - board.name - ); - } else { - this.disabledMessage = undefined; + return false; + } + + private async debug( + params: StartDebugParams + ): Promise { + return this.commandService.executeCommand( + 'arduino.debug.start', + params + ); + } + + get compileForDebug(): boolean { + const value = window.localStorage.getItem(COMPILE_FOR_DEBUG_KEY); + return value === 'true'; + } + + private toggleCompileForDebug(): void { + const oldState = this.compileForDebug; + const newState = !oldState; + window.localStorage.setItem(COMPILE_FOR_DEBUG_KEY, String(newState)); + this.menuManager.update(); + } + + private async isSketchNotVerifiedError( + err: unknown, + sketch: SketchRef + ): Promise { + if (err instanceof Error) { + try { + const buildPaths = await this.sketchesService.getBuildPath(sketch); + return buildPaths.some((tempBuildPath) => + err.message.includes(tempBuildPath) + ); + } catch { + return false; + } } + return false; } - private async startDebug( - board: Board | undefined = this.boardsServiceProvider.boardsConfig - .selectedBoard - ): Promise { - if (!board) { - return; + private async createStartDebugParams( + board: BoardIdentifier | undefined + ): Promise { + if (!board || !board.fqbn) { + return undefined; } - const { name, fqbn } = board; - if (!fqbn) { - return; + let debugFqbn: string | undefined = undefined; + try { + debugFqbn = await this.isDebugEnabled(board); + } catch {} + if (!debugFqbn) { + return undefined; } - await this.hostedPluginSupport.didStart; - const [sketch, executables] = await Promise.all([ + const [sketch, executables, boardsData] = await Promise.all([ this.sketchServiceClient.currentSketch(), this.executableService.list(), + this.boardsDataStore.getData(board.fqbn), ]); if (!CurrentSketch.isValid(sketch)) { - return; + return undefined; } - const ideTempFolderUri = await this.sketchService.getIdeTempFolderUri( + const ideTempFolderUri = await this.sketchesService.getIdeTempFolderUri( sketch ); - const [cliPath, sketchPath, configPath] = await Promise.all([ + const [cliPath, sketchPath, launchConfigsDirPath] = await Promise.all([ this.fileService.fsPath(new URI(executables.cliUri)), this.fileService.fsPath(new URI(sketch.uri)), this.fileService.fsPath(new URI(ideTempFolderUri)), ]); - const config = { + return { + board: { fqbn: debugFqbn, name: board.name }, cliPath, - board: { - fqbn, - name, - }, sketchPath, - configPath, + launchConfigsDirPath, + programmer: boardsData.selectedProgrammer?.id, + title: nls.localize( + 'arduino/debug/getDebugInfo', + 'Getting debug info...' + ), }; - return this.commandService.executeCommand('arduino.debug.start', config); - } - - get compileForDebug(): boolean { - const value = window.localStorage.getItem(COMPILE_FOR_DEBUG_KEY); - return value === 'true'; - } - - async toggleCompileForDebug(): Promise { - const oldState = this.compileForDebug; - const newState = !oldState; - window.localStorage.setItem(COMPILE_FOR_DEBUG_KEY, String(newState)); - this.mainMenuManager.update(); } } export namespace Debug { @@ -241,3 +365,78 @@ export namespace Debug { }; } } + +/** + * Resolves with the FQBN to use for the `debug --info --programmer p --fqbn $FQBN` command. Otherwise, rejects. + * + * (non-API) + */ +export async function isDebugEnabled( + board: BoardIdentifier | undefined, + getDetails: (fqbn: string) => MaybePromise, + getData: (fqbn: string) => MaybePromise, + appendConfigToFqbn: (fqbn: string) => MaybePromise, + checkDebugEnabled: (params: CheckDebugEnabledParams) => MaybePromise +): Promise { + if (!board) { + throw new Error(noBoardSelected); + } + const { fqbn } = board; + if (!fqbn) { + throw new Error(noPlatformInstalledFor(board.name)); + } + const [details, data, fqbnWithConfig] = await Promise.all([ + getDetails(fqbn), + getData(fqbn), + appendConfigToFqbn(fqbn), + ]); + if (!details) { + throw new Error(noPlatformInstalledFor(board.name)); + } + if (!fqbnWithConfig) { + throw new Error( + `Failed to append boards config to the FQBN. Original FQBN was: ${fqbn}` + ); + } + const params = { + fqbn: fqbnWithConfig, + programmer: data.selectedProgrammer?.id, + }; + try { + const debugFqbn = await checkDebugEnabled(params); + return debugFqbn; + } catch (err) { + throw new Error(debuggingNotSupported(board.name)); + } +} + +/** + * (non-API) + */ +export function sketchIsNotCompiled(sketchName: string): string { + return nls.localize( + 'arduino/debug/sketchIsNotCompiled', + "Sketch '{0}' must be verified before starting a debug session. Please verify the sketch and start debugging again. Do you want to verify the sketch now?", + sketchName + ); +} +/** + * (non-API) + */ +export function noPlatformInstalledFor(boardName: string): string { + return nls.localize( + 'arduino/debug/noPlatformInstalledFor', + "Platform is not installed for '{0}'", + boardName + ); +} +/** + * (non-API) + */ +export function debuggingNotSupported(boardName: string): string { + return nls.localize( + 'arduino/debug/debuggingNotSupported', + "Debugging is not supported by '{0}'", + boardName + ); +} diff --git a/arduino-ide-extension/src/browser/contributions/delete-sketch.ts b/arduino-ide-extension/src/browser/contributions/delete-sketch.ts new file mode 100644 index 000000000..08a72f690 --- /dev/null +++ b/arduino-ide-extension/src/browser/contributions/delete-sketch.ts @@ -0,0 +1,168 @@ +import { Dialog } from '@theia/core/lib/browser/dialogs'; +import { NavigatableWidget } from '@theia/core/lib/browser/navigatable-types'; +import { ApplicationShell } from '@theia/core/lib/browser/shell/application-shell'; +import { WindowService } from '@theia/core/lib/browser/window/window-service'; +import { nls } from '@theia/core/lib/common/nls'; +import type { MaybeArray } from '@theia/core/lib/common/types'; +import URI from '@theia/core/lib/common/uri'; +import type { Widget } from '@theia/core/shared/@phosphor/widgets'; +import { inject, injectable } from '@theia/core/shared/inversify'; +import { SketchesError } from '../../common/protocol'; +import { Sketch } from '../contributions/contribution'; +import { isNotFound } from '../create/typings'; +import { Command, CommandRegistry } from './contribution'; +import { CloudSketchContribution } from './cloud-contribution'; +import { AppService } from '../app-service'; + +export interface DeleteSketchParams { + /** + * Either the URI of the sketch folder or the sketch to delete. + */ + readonly toDelete: string | Sketch; + /** + * If `true`, the currently opened sketch is expected to be deleted. + * Hence, the editors must be closed, the sketch will be scheduled + * for deletion, and the browser window will close or navigate away. + * If `false`, the sketch will be scheduled for deletion, + * but the current window remains open. If `force`, the window will + * navigate away, but IDE2 won't open any confirmation dialogs. + */ + readonly willNavigateAway?: boolean | 'force'; +} + +@injectable() +export class DeleteSketch extends CloudSketchContribution { + @inject(ApplicationShell) + private readonly shell: ApplicationShell; + @inject(WindowService) + private readonly windowService: WindowService; + @inject(AppService) + private readonly appService: AppService; + + override registerCommands(registry: CommandRegistry): void { + registry.registerCommand(DeleteSketch.Commands.DELETE_SKETCH, { + execute: (params: DeleteSketchParams) => this.deleteSketch(params), + }); + } + + private async deleteSketch(params: DeleteSketchParams): Promise { + const { toDelete, willNavigateAway } = params; + let sketch: Sketch; + if (typeof toDelete === 'string') { + const resolvedSketch = await this.loadSketch(toDelete); + if (!resolvedSketch) { + console.info( + `Failed to load the sketch. It was not found at '${toDelete}'. Skipping deletion.` + ); + return; + } + sketch = resolvedSketch; + } else { + sketch = toDelete; + } + if (!willNavigateAway) { + this.scheduleDeletion(sketch); + return; + } + const cloudUri = this.createFeatures.cloudUri(sketch); + if (willNavigateAway !== 'force') { + const { response } = await this.dialogService.showMessageBox({ + title: nls.localizeByDefault('Delete'), + type: 'question', + buttons: [Dialog.CANCEL, Dialog.OK], + message: cloudUri + ? nls.localize( + 'theia/workspace/deleteCloudSketch', + "The cloud sketch '{0}' will be permanently deleted from the Arduino servers and the local caches. This action is irreversible. Do you want to delete the current sketch?", + sketch.name + ) + : nls.localize( + 'theia/workspace/deleteCurrentSketch', + "The sketch '{0}' will be permanently deleted. This action is irreversible. Do you want to delete the current sketch?", + sketch.name + ), + }); + // cancel + if (response === 0) { + return; + } + } + if (cloudUri) { + const posixPath = cloudUri.path.toString(); + const cloudSketch = this.createApi.sketchCache.getSketch(posixPath); + if (!cloudSketch) { + throw new Error( + `Cloud sketch with path '${posixPath}' was not cached. Cache: ${this.createApi.sketchCache.toString()}` + ); + } + try { + // IDE2 cannot use DELETE directory as the server responses with HTTP 500 if it's missing. + // https://github.com/arduino/arduino-ide/issues/1825#issuecomment-1406301406 + await this.createApi.deleteSketch(cloudSketch.path); + } catch (err) { + if (!isNotFound(err)) { + throw err; + } else { + console.info( + `Could not delete the cloud sketch with path '${posixPath}'. It does not exist.` + ); + } + } + } + await Promise.all([ + ...Sketch.uris(sketch).map((uri) => + this.closeWithoutSaving(new URI(uri)) + ), + ]); + this.windowService.setSafeToShutDown(); + this.scheduleDeletion(sketch); + return window.close(); + } + + private scheduleDeletion(sketch: Sketch): void { + this.appService.scheduleDeletion(sketch); + } + + private async loadSketch(uri: string): Promise { + try { + const sketch = await this.sketchesService.loadSketch(uri); + return sketch; + } catch (err) { + if (SketchesError.NotFound.is(err)) { + return undefined; + } + throw err; + } + } + + // fix: https://github.com/eclipse-theia/theia/issues/12107 + private async closeWithoutSaving(uri: URI): Promise { + const affected = getAffected(this.shell.widgets, uri); + const toClose = [...affected].map(([, widget]) => widget); + await this.shell.closeMany(toClose, { save: false }); + } +} +export namespace DeleteSketch { + export namespace Commands { + export const DELETE_SKETCH: Command = { + id: 'arduino-delete-sketch', + }; + } +} + +function getAffected( + widgets: Iterable, + context: MaybeArray +): [URI, T & NavigatableWidget][] { + const uris = Array.isArray(context) ? context : [context]; + const result: [URI, T & NavigatableWidget][] = []; + for (const widget of widgets) { + if (NavigatableWidget.is(widget)) { + const resourceUri = widget.getResourceUri(); + if (resourceUri && uris.some((uri) => uri.isEqualOrParent(resourceUri))) { + result.push([resourceUri, widget]); + } + } + } + return result; +} diff --git a/arduino-ide-extension/src/browser/contributions/edit-contributions.ts b/arduino-ide-extension/src/browser/contributions/edit-contributions.ts index 7c75c7225..1e6414a34 100644 --- a/arduino-ide-extension/src/browser/contributions/edit-contributions.ts +++ b/arduino-ide-extension/src/browser/contributions/edit-contributions.ts @@ -1,7 +1,11 @@ +import { nls } from '@theia/core/lib/common'; import { inject, injectable } from '@theia/core/shared/inversify'; import { CommonCommands } from '@theia/core/lib/browser/common-frontend-contribution'; 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 { Contribution, Command, @@ -10,17 +14,11 @@ import { CommandRegistry, } from './contribution'; 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 // Depends on https://github.com/eclipse-theia/theia/pull/7964 @injectable() export class EditContributions extends Contribution { - @inject(MonacoEditorService) - private readonly codeEditorService: MonacoEditorService; - @inject(ClipboardService) private readonly clipboardService: ClipboardService; @@ -49,30 +47,6 @@ export class EditContributions extends Contribution { registry.registerCommand(EditContributions.Commands.USE_FOR_FIND, { execute: () => this.run('editor.action.previousSelectionMatchFindAction'), }); - registry.registerCommand(EditContributions.Commands.INCREASE_FONT_SIZE, { - execute: async () => { - const settings = await this.settingsService.settings(); - if (settings.autoScaleInterface) { - settings.interfaceScale = settings.interfaceScale + 1; - } else { - settings.editorFontSize = settings.editorFontSize + 1; - } - await this.settingsService.update(settings); - await this.settingsService.save(); - }, - }); - registry.registerCommand(EditContributions.Commands.DECREASE_FONT_SIZE, { - execute: async () => { - const settings = await this.settingsService.settings(); - if (settings.autoScaleInterface) { - settings.interfaceScale = settings.interfaceScale - 1; - } else { - settings.editorFontSize = settings.editorFontSize - 1; - } - await this.settingsService.update(settings); - await this.settingsService.save(); - }, - }); /* Tools */ registry.registerCommand( EditContributions.Commands.AUTO_FORMAT, { execute: () => this.run('editor.action.formatDocument') } @@ -81,9 +55,11 @@ export class EditContributions extends Contribution { execute: async () => { const value = await this.currentValue(); if (value !== undefined) { - this.clipboardService.writeText(`\`\`\`cpp + this.clipboardService.writeText(` +\`\`\`cpp ${value} -\`\`\``); +\`\`\` +`); } }, }); @@ -147,23 +123,6 @@ ${value} order: '3', }); - registry.registerMenuAction(ArduinoMenus.EDIT__FONT_CONTROL_GROUP, { - commandId: EditContributions.Commands.INCREASE_FONT_SIZE.id, - label: nls.localize( - 'arduino/editor/increaseFontSize', - 'Increase Font Size' - ), - order: '0', - }); - registry.registerMenuAction(ArduinoMenus.EDIT__FONT_CONTROL_GROUP, { - commandId: EditContributions.Commands.DECREASE_FONT_SIZE.id, - label: nls.localize( - 'arduino/editor/decreaseFontSize', - 'Decrease Font Size' - ), - order: '1', - }); - registry.registerMenuAction(ArduinoMenus.EDIT__FIND_GROUP, { commandId: EditContributions.Commands.FIND.id, label: nls.localize('vscode/findController/startFindAction', 'Find'), @@ -220,15 +179,6 @@ ${value} when: 'editorFocus', }); - registry.registerKeybinding({ - command: EditContributions.Commands.INCREASE_FONT_SIZE.id, - keybinding: 'CtrlCmd+=', - }); - registry.registerKeybinding({ - command: EditContributions.Commands.DECREASE_FONT_SIZE.id, - keybinding: 'CtrlCmd+-', - }); - registry.registerKeybinding({ command: EditContributions.Commands.FIND.id, keybinding: 'CtrlCmd+F', @@ -256,9 +206,10 @@ ${value} protected async current(): Promise< ICodeEditor | StandaloneCodeEditor | undefined > { + const codeEditorService = StandaloneServices.get(ICodeEditorService); return ( - this.codeEditorService.getFocusedCodeEditor() || - this.codeEditorService.getActiveCodeEditor() || + codeEditorService.getFocusedCodeEditor() || + codeEditorService.getActiveCodeEditor() || undefined ); } @@ -315,12 +266,6 @@ export namespace EditContributions { export const USE_FOR_FIND: Command = { id: 'arduino-for-find', }; - export const INCREASE_FONT_SIZE: Command = { - id: 'arduino-increase-font-size', - }; - export const DECREASE_FONT_SIZE: Command = { - id: 'arduino-decrease-font-size', - }; export const AUTO_FORMAT: Command = { id: 'arduino-auto-format', // `Auto Format` should belong to `Tool`. }; diff --git a/arduino-ide-extension/src/browser/contributions/examples.ts b/arduino-ide-extension/src/browser/contributions/examples.ts index d7185178b..9bb2cbd56 100644 --- a/arduino-ide-extension/src/browser/contributions/examples.ts +++ b/arduino-ide-extension/src/browser/contributions/examples.ts @@ -1,18 +1,17 @@ -import * as PQueue from 'p-queue'; +import PQueue from 'p-queue'; import { inject, injectable } from '@theia/core/shared/inversify'; -import { CommandHandler } from '@theia/core/lib/common/command'; -import { - MenuPath, - CompositeMenuNode, - SubMenuOptions, -} from '@theia/core/lib/common/menu'; +import { CommandHandler, CommandService } from '@theia/core/lib/common/command'; +import { MenuPath, SubMenuOptions } from '@theia/core/lib/common/menu'; import { Disposable, DisposableCollection, } from '@theia/core/lib/common/disposable'; import { OpenSketch } from './open-sketch'; -import { ArduinoMenus, PlaceholderMenuNode } from '../menu/arduino-menus'; -import { MainMenuManager } from '../../common/main-menu-manager'; +import { + ArduinoMenus, + examplesLabel, + PlaceholderMenuNode, +} from '../menu/arduino-menus'; import { BoardsServiceProvider } from '../boards/boards-service-provider'; import { ExamplesService } from '../../common/protocol/examples-service'; import { @@ -21,58 +20,134 @@ import { MenuModelRegistry, } from './contribution'; import { NotificationCenter } from '../notification-center'; -import { Board, SketchRef, SketchContainer } from '../../common/protocol'; -import { nls } from '@theia/core/lib/common'; +import { + Board, + SketchRef, + SketchContainer, + SketchesError, + CoreService, + SketchesService, + Sketch, + isBoardIdentifierChangeEvent, + BoardIdentifier, +} from '../../common/protocol'; +import { nls } from '@theia/core/lib/common/nls'; +import { unregisterSubmenu } from '../menu/arduino-menus'; +import { MaybePromise } from '@theia/core/lib/common/types'; +import { ApplicationError } from '@theia/core/lib/common/application-error'; + +/** + * Creates a cloned copy of the example sketch and opens it in a new window. + */ +export async function openClonedExample( + uri: string, + services: { + sketchesService: SketchesService; + commandService: CommandService; + }, + onError: { + onDidFailClone?: ( + err: ApplicationError< + number, + { + uri: string; + } + >, + uri: string + ) => MaybePromise; + onDidFailOpen?: ( + err: ApplicationError< + number, + { + uri: string; + } + >, + sketch: Sketch + ) => MaybePromise; + } = {} +): Promise { + const { sketchesService, commandService } = services; + const { onDidFailClone, onDidFailOpen } = onError; + try { + const sketch = await sketchesService.cloneExample(uri); + try { + await commandService.executeCommand( + OpenSketch.Commands.OPEN_SKETCH.id, + sketch + ); + } catch (openError) { + if (SketchesError.NotFound.is(openError)) { + if (onDidFailOpen) { + await onDidFailOpen(openError, sketch); + return; + } + } + throw openError; + } + } catch (cloneError) { + if (SketchesError.NotFound.is(cloneError)) { + if (onDidFailClone) { + await onDidFailClone(cloneError, uri); + return; + } + } + throw cloneError; + } +} @injectable() export abstract class Examples extends SketchContribution { @inject(CommandRegistry) - protected readonly commandRegistry: CommandRegistry; + private readonly commandRegistry: CommandRegistry; @inject(MenuModelRegistry) protected readonly menuRegistry: MenuModelRegistry; - @inject(MainMenuManager) - protected readonly menuManager: MainMenuManager; - @inject(ExamplesService) protected readonly examplesService: ExamplesService; + @inject(CoreService) + protected readonly coreService: CoreService; + @inject(BoardsServiceProvider) - protected readonly boardsServiceClient: BoardsServiceProvider; + protected readonly boardsServiceProvider: BoardsServiceProvider; + + @inject(NotificationCenter) + protected readonly notificationCenter: NotificationCenter; protected readonly toDispose = new DisposableCollection(); protected override init(): void { super.init(); - this.boardsServiceClient.onBoardsConfigChanged(({ selectedBoard }) => - this.handleBoardChanged(selectedBoard) + this.boardsServiceProvider.onBoardsConfigDidChange((event) => { + if (isBoardIdentifierChangeEvent(event)) { + this.handleBoardChanged(event.selectedBoard); + } + }); + this.notificationCenter.onDidReinitialize(() => + this.update({ + board: this.boardsServiceProvider.boardsConfig.selectedBoard, + // No force refresh. The core client was already refreshed. + }) ); } + // eslint-disable-next-line @typescript-eslint/no-unused-vars, unused-imports/no-unused-vars protected handleBoardChanged(board: Board | undefined): void { // NOOP } + protected abstract update(options?: { + board?: BoardIdentifier | undefined; + forceRefresh?: boolean; + }): void; + override registerMenus(registry: MenuModelRegistry): void { - try { - // This is a hack the ensures the desired menu ordering! We cannot use https://github.com/eclipse-theia/theia/pull/8377 due to ATL-222. - const index = ArduinoMenus.FILE__EXAMPLES_SUBMENU.length - 1; - const menuId = ArduinoMenus.FILE__EXAMPLES_SUBMENU[index]; - const groupPath = - index === 0 ? [] : ArduinoMenus.FILE__EXAMPLES_SUBMENU.slice(0, index); - const parent: CompositeMenuNode = (registry as any).findGroup(groupPath); - const examples = new CompositeMenuNode(menuId, '', { order: '4' }); - parent.addNode(examples); - } catch (e) { - console.error(e); - console.warn('Could not patch menu ordering.'); - } // Registering the same submenu multiple times has no side-effect. // TODO: unregister submenu? https://github.com/eclipse-theia/theia/issues/7300 registry.registerSubmenu( ArduinoMenus.FILE__EXAMPLES_SUBMENU, - nls.localize('arduino/examples/menu', 'Examples'), + examplesLabel, { order: '4', } @@ -108,6 +183,11 @@ export abstract class Examples extends SketchContribution { const { label } = sketchContainerOrPlaceholder; submenuPath = [...menuPath, label]; this.menuRegistry.registerSubmenu(submenuPath, label, subMenuOptions); + this.toDispose.push( + Disposable.create(() => + unregisterSubmenu(submenuPath, this.menuRegistry) + ) + ); sketches.push(...sketchContainerOrPlaceholder.sketches); children.push(...sketchContainerOrPlaceholder.children); } else { @@ -147,12 +227,29 @@ export abstract class Examples extends SketchContribution { } protected createHandler(uri: string): CommandHandler { + const forceUpdate = () => + this.update({ + board: this.boardsServiceProvider.boardsConfig.selectedBoard, + forceRefresh: true, + }); return { execute: async () => { - const sketch = await this.sketchService.cloneExample(uri); - return this.commandService.executeCommand( - OpenSketch.Commands.OPEN_SKETCH.id, - sketch + await openClonedExample( + uri, + { + sketchesService: this.sketchesService, + commandService: this.commandRegistry, + }, + { + onDidFailClone: () => { + // Do not toast the error message. It's handled by the `Open Sketch` command. + forceUpdate(); + }, + onDidFailOpen: (err) => { + this.messageService.error(err.message); + forceUpdate(); + }, + } ); }, }; @@ -162,10 +259,10 @@ export abstract class Examples extends SketchContribution { @injectable() export class BuiltInExamples extends Examples { override async onReady(): Promise { - this.register(); // no `await` + this.update(); // no `await` } - protected async register(): Promise { + protected override async update(): Promise { let sketchContainers: SketchContainer[] | undefined; try { sketchContainers = await this.examplesService.builtIns(); @@ -196,30 +293,32 @@ export class BuiltInExamples extends Examples { @injectable() export class LibraryExamples extends Examples { - @inject(NotificationCenter) - protected readonly notificationCenter: NotificationCenter; - - protected readonly queue = new PQueue({ autoStart: true, concurrency: 1 }); + private readonly queue = new PQueue({ autoStart: true, concurrency: 1 }); override onStart(): void { - this.notificationCenter.onLibraryDidInstall(() => this.register()); - this.notificationCenter.onLibraryDidUninstall(() => this.register()); + this.notificationCenter.onLibraryDidInstall(() => this.update()); + this.notificationCenter.onLibraryDidUninstall(() => this.update()); } - override async onReady(): Promise { - this.register(); // no `await` + override onReady(): void { + this.boardsServiceProvider.ready.then(() => this.update()); } protected override handleBoardChanged(board: Board | undefined): void { - this.register(board); + this.update({ board }); } - protected async register( - board: Board | undefined = this.boardsServiceClient.boardsConfig - .selectedBoard + protected override async update( + options: { board?: Board; forceRefresh?: boolean } = { + board: this.boardsServiceProvider.boardsConfig.selectedBoard, + } ): Promise { + const { board, forceRefresh } = options; return this.queue.add(async () => { this.toDispose.dispose(); + if (forceRefresh) { + await this.coreService.refresh(); + } const fqbn = board?.fqbn; const name = board?.name; // Shows all examples when no board is selected, or the platform of the currently selected board is not installed. diff --git a/arduino-ide-extension/src/browser/contributions/first-startup-installer.ts b/arduino-ide-extension/src/browser/contributions/first-startup-installer.ts index f564bec2d..f55c4fe1e 100644 --- a/arduino-ide-extension/src/browser/contributions/first-startup-installer.ts +++ b/arduino-ide-extension/src/browser/contributions/first-startup-installer.ts @@ -7,6 +7,8 @@ import { } from '../../common/protocol'; import { Contribution } from './contribution'; +const Arduino_BuiltIn = 'Arduino_BuiltIn'; + @injectable() export class FirstStartupInstaller extends Contribution { @inject(LocalStorageService) @@ -25,8 +27,8 @@ export class FirstStartupInstaller extends Contribution { id: 'arduino:avr', }); const builtInLibrary = ( - await this.libraryService.search({ query: 'Arduino_BuiltIn' }) - )[0]; + await this.libraryService.search({ query: Arduino_BuiltIn }) + ).find(({ name }) => name === Arduino_BuiltIn); // Filter by `name` to ensure "exact match". See: https://github.com/arduino/arduino-ide/issues/1526. let avrPackageError: Error | undefined; let builtInLibraryError: Error | undefined; @@ -84,7 +86,7 @@ export class FirstStartupInstaller extends Contribution { } if (builtInLibraryError) { this.messageService.error( - `Could not install ${builtInLibrary.name} library: ${builtInLibraryError}` + `Could not install ${Arduino_BuiltIn} library: ${builtInLibraryError}` ); } diff --git a/arduino-ide-extension/src/browser/contributions/include-library.ts b/arduino-ide-extension/src/browser/contributions/include-library.ts index 19853c7ff..9b2a45101 100644 --- a/arduino-ide-extension/src/browser/contributions/include-library.ts +++ b/arduino-ide-extension/src/browser/contributions/include-library.ts @@ -1,8 +1,7 @@ -import * as PQueue from 'p-queue'; +import PQueue from 'p-queue'; import { inject, injectable } from '@theia/core/shared/inversify'; import URI from '@theia/core/lib/common/uri'; import { MonacoEditor } from '@theia/monaco/lib/browser/monaco-editor'; -import { EditorManager } from '@theia/editor/lib/browser'; import { MenuModelRegistry, MenuPath } from '@theia/core/lib/common/menu'; import { Disposable, @@ -17,46 +16,44 @@ import { SketchContribution, Command, CommandRegistry } from './contribution'; import { NotificationCenter } from '../notification-center'; import { nls } from '@theia/core/lib/common'; import * as monaco from '@theia/monaco-editor-core'; -import { CurrentSketch } from '../../common/protocol/sketches-service-client-impl'; +import { CurrentSketch } from '../sketches-service-client-impl'; @injectable() export class IncludeLibrary extends SketchContribution { @inject(CommandRegistry) - protected readonly commandRegistry: CommandRegistry; + private readonly commandRegistry: CommandRegistry; @inject(MenuModelRegistry) - protected readonly menuRegistry: MenuModelRegistry; + private readonly menuRegistry: MenuModelRegistry; @inject(MainMenuManager) - protected readonly mainMenuManager: MainMenuManager; - - @inject(EditorManager) - protected override readonly editorManager: EditorManager; + private readonly mainMenuManager: MainMenuManager; @inject(NotificationCenter) - protected readonly notificationCenter: NotificationCenter; + private readonly notificationCenter: NotificationCenter; @inject(BoardsServiceProvider) - protected readonly boardsServiceClient: BoardsServiceProvider; + private readonly boardsServiceProvider: BoardsServiceProvider; @inject(LibraryService) - protected readonly libraryService: LibraryService; + private readonly libraryService: LibraryService; - protected readonly queue = new PQueue({ autoStart: true, concurrency: 1 }); - protected readonly toDispose = new DisposableCollection(); + private readonly queue = new PQueue({ autoStart: true, concurrency: 1 }); + private readonly toDispose = new DisposableCollection(); override onStart(): void { - this.boardsServiceClient.onBoardsConfigChanged(() => + this.boardsServiceProvider.onBoardsConfigDidChange(() => this.updateMenuActions() ); this.notificationCenter.onLibraryDidInstall(() => this.updateMenuActions()); this.notificationCenter.onLibraryDidUninstall(() => this.updateMenuActions() ); + this.notificationCenter.onDidReinitialize(() => this.updateMenuActions()); } - override async onReady(): Promise { - this.updateMenuActions(); + override onReady(): void { + this.boardsServiceProvider.ready.then(() => this.updateMenuActions()); } override registerMenus(registry: MenuModelRegistry): void { @@ -92,12 +89,12 @@ export class IncludeLibrary extends SketchContribution { }); } - protected async updateMenuActions(): Promise { + private async updateMenuActions(): Promise { return this.queue.add(async () => { this.toDispose.dispose(); this.mainMenuManager.update(); const libraries: LibraryPackage[] = []; - const fqbn = this.boardsServiceClient.boardsConfig.selectedBoard?.fqbn; + const fqbn = this.boardsServiceProvider.boardsConfig.selectedBoard?.fqbn; // Show all libraries, when no board is selected. // Otherwise, show libraries only for the selected board. libraries.push(...(await this.libraryService.list({ fqbn }))); @@ -138,7 +135,7 @@ export class IncludeLibrary extends SketchContribution { }); } - protected registerLibrary( + private registerLibrary( libraryOrPlaceholder: LibraryPackage | string, menuPath: MenuPath ): Disposable { @@ -171,7 +168,7 @@ export class IncludeLibrary extends SketchContribution { ); } - protected async includeLibrary(library: LibraryPackage): Promise { + private async includeLibrary(library: LibraryPackage): Promise { const sketch = await this.sketchServiceClient.currentSketch(); if (!CurrentSketch.isValid(sketch)) { return; diff --git a/arduino-ide-extension/src/browser/contributions/indexes-update-progress.ts b/arduino-ide-extension/src/browser/contributions/indexes-update-progress.ts index d8762b841..a2c87fee0 100644 --- a/arduino-ide-extension/src/browser/contributions/indexes-update-progress.ts +++ b/arduino-ide-extension/src/browser/contributions/indexes-update-progress.ts @@ -16,7 +16,7 @@ export class IndexesUpdateProgress extends Contribution { | undefined; override onStart(): void { - this.notificationCenter.onIndexWillUpdate((progressId) => + this.notificationCenter.onIndexUpdateWillStart(({ progressId }) => this.getOrCreateProgress(progressId) ); this.notificationCenter.onIndexUpdateDidProgress((progress) => { @@ -24,7 +24,7 @@ export class IndexesUpdateProgress extends Contribution { delegate.report(progress) ); }); - this.notificationCenter.onIndexDidUpdate((progressId) => { + this.notificationCenter.onIndexUpdateDidComplete(({ progressId }) => { this.cancelProgress(progressId); }); this.notificationCenter.onIndexUpdateDidFail(({ progressId, message }) => { diff --git a/arduino-ide-extension/src/browser/contributions/ino-language.ts b/arduino-ide-extension/src/browser/contributions/ino-language.ts index c9b4d2b9f..4f42d399c 100644 --- a/arduino-ide-extension/src/browser/contributions/ino-language.ts +++ b/arduino-ide-extension/src/browser/contributions/ino-language.ts @@ -1,39 +1,124 @@ -import { Mutex } from 'async-mutex'; +import { + Disposable, + DisposableCollection, +} from '@theia/core/lib/common/disposable'; import { inject, injectable } from '@theia/core/shared/inversify'; +import { Mutex } from 'async-mutex'; import { ArduinoDaemon, + BoardIdentifier, BoardsService, + CompileSummary, ExecutableService, + isBoardIdentifierChangeEvent, + sanitizeFqbn, } from '../../common/protocol'; -import { HostedPluginEvents } from '../hosted-plugin-events'; -import { SketchContribution, URI } from './contribution'; -import { CurrentSketch } from '../../common/protocol/sketches-service-client-impl'; -import { BoardsConfig } from '../boards/boards-config'; +import { + defaultAsyncWorkers, + maxAsyncWorkers, + minAsyncWorkers, +} from '../arduino-preferences'; +import { BoardsDataStore } from '../boards/boards-data-store'; import { BoardsServiceProvider } from '../boards/boards-service-provider'; +import { HostedPluginEvents } from '../hosted/hosted-plugin-events'; +import { NotificationCenter } from '../notification-center'; +import { CurrentSketch } from '../sketches-service-client-impl'; +import { SketchContribution, URI } from './contribution'; +import { CompileSummaryProvider } from './verify-sketch'; + +interface DaemonAddress { + /** + * The host where the Arduino CLI daemon is available. + */ + readonly hostname: string; + /** + * The port where the Arduino CLI daemon is listening. + */ + readonly port: number; + /** + * The [id](https://arduino.github.io/arduino-cli/latest/rpc/commands/#instance) of the initialized core Arduino client instance. + */ + readonly instance: number; +} + +interface StartLanguageServerParams { + /** + * Absolute filesystem path to the Arduino Language Server executable. + */ + readonly lsPath: string; + /** + * The hostname and the port for the gRPC channel connecting to the Arduino CLI daemon. + * The `instance` number is for the initialized core Arduino client. + */ + readonly daemonAddress: DaemonAddress; + /** + * Absolute filesystem path to [`clangd`](https://clangd.llvm.org/). + */ + readonly clangdPath: string; + /** + * The board is relevant to start a specific "flavor" of the language. + */ + readonly board: { fqbn: string; name?: string }; + /** + * `true` if the LS should generate the log files into the default location. The default location is the `cwd` of the process. + * It's very often the same as the workspace root of the IDE, aka the sketch folder. + * When it is a string, it is the absolute filesystem path to the folder to generate the log files. + * If `string`, but the path is inaccessible, the log files will be generated into the default location. + */ + readonly log?: boolean | string; + /** + * Optional `env` for the language server process. + */ + readonly env?: NodeJS.ProcessEnv; + /** + * Additional flags for the Arduino Language server process. + */ + readonly flags?: readonly string[]; + /** + * Set to `true`, to enable `Diagnostics`. + */ + readonly realTimeDiagnostics?: boolean; + /** + * If `true`, the logging is not forwarded to the _Output_ view via the language client. + */ + readonly silentOutput?: boolean; + /** + * Number of async workers used by `clangd`. Background index also uses this many workers. If `0`, `clangd` uses all available cores. It's `0` by default. + */ + readonly jobs?: number; +} + +/** + * The FQBN the language server runs with or `undefined` if it could not start. + */ +type StartLanguageServerResult = string | undefined; @injectable() export class InoLanguage extends SketchContribution { @inject(HostedPluginEvents) private readonly hostedPluginEvents: HostedPluginEvents; - @inject(ExecutableService) private readonly executableService: ExecutableService; - @inject(ArduinoDaemon) private readonly daemon: ArduinoDaemon; - @inject(BoardsService) private readonly boardsService: BoardsService; - @inject(BoardsServiceProvider) private readonly boardsServiceProvider: BoardsServiceProvider; + @inject(NotificationCenter) + private readonly notificationCenter: NotificationCenter; + @inject(BoardsDataStore) + private readonly boardDataStore: BoardsDataStore; + @inject(CompileSummaryProvider) + private readonly compileSummaryProvider: CompileSummaryProvider; + private readonly toDispose = new DisposableCollection(); + private readonly languageServerStartMutex = new Mutex(); private languageServerFqbn?: string; - private languageServerStartMutex = new Mutex(); override onReady(): void { const start = ( - { selectedBoard }: BoardsConfig.Config, + selectedBoard: BoardIdentifier | undefined, forceStart = false ) => { if (selectedBoard) { @@ -43,25 +128,73 @@ export class InoLanguage extends SketchContribution { } } }; - this.boardsServiceProvider.onBoardsConfigChanged(start); - this.hostedPluginEvents.onPluginsDidStart(() => - start(this.boardsServiceProvider.boardsConfig) - ); - this.hostedPluginEvents.onPluginsWillUnload( - () => (this.languageServerFqbn = undefined) - ); - this.preferences.onPreferenceChanged( - ({ preferenceName, oldValue, newValue }) => { - if (oldValue !== newValue) { - switch (preferenceName) { - case 'arduino.language.log': - case 'arduino.language.realTimeDiagnostics': - start(this.boardsServiceProvider.boardsConfig, true); + const forceRestart = () => { + start(this.boardsServiceProvider.boardsConfig.selectedBoard, true); + }; + this.toDispose.pushAll([ + this.boardsServiceProvider.onBoardsConfigDidChange((event) => { + if (isBoardIdentifierChangeEvent(event)) { + start(event.selectedBoard); + } + }), + this.hostedPluginEvents.onPluginsDidStart(() => + start(this.boardsServiceProvider.boardsConfig.selectedBoard) + ), + this.hostedPluginEvents.onPluginsWillUnload( + () => (this.languageServerFqbn = undefined) + ), + this.preferences.onPreferenceChanged( + ({ preferenceName, oldValue, newValue }) => { + if (oldValue !== newValue) { + switch (preferenceName) { + case 'arduino.language.log': + case 'arduino.language.realTimeDiagnostics': + case 'arduino.language.asyncWorkers': + forceRestart(); + } } } - } - ); - start(this.boardsServiceProvider.boardsConfig); + ), + this.notificationCenter.onLibraryDidInstall(() => forceRestart()), + this.notificationCenter.onLibraryDidUninstall(() => forceRestart()), + this.notificationCenter.onPlatformDidInstall(() => forceRestart()), + this.notificationCenter.onPlatformDidUninstall(() => forceRestart()), + this.notificationCenter.onDidReinitialize(() => forceRestart()), + this.boardDataStore.onDidChange((event) => { + if (this.languageServerFqbn) { + const sanitizedFQBN = sanitizeFqbn(this.languageServerFqbn); + // The incoming FQBNs might contain custom boards configs, sanitize them before the comparison. + // https://github.com/arduino/arduino-ide/pull/2113#pullrequestreview-1499998328 + const matchingChange = event.changes.find( + (change) => sanitizedFQBN === sanitizeFqbn(change.fqbn) + ); + const { boardsConfig } = this.boardsServiceProvider; + if ( + matchingChange && + boardsConfig.selectedBoard?.fqbn === matchingChange.fqbn + ) { + start(boardsConfig.selectedBoard); + } + } + }), + this.compileSummaryProvider.onDidChangeCompileSummary( + (compileSummary) => { + if (compileSummary) { + this.fireBuildDidComplete(compileSummary); + } + } + ), + ]); + Promise.all([ + this.boardsServiceProvider.ready, + this.preferences.ready, + ]).then(() => { + start(this.boardsServiceProvider.boardsConfig.selectedBoard); + }); + } + + onStop(): void { + this.toDispose.dispose(); } private async startLanguageServer( @@ -70,10 +203,11 @@ export class InoLanguage extends SketchContribution { forceStart = false ): Promise { const port = await this.daemon.tryGetPort(); - if (!port) { + if (typeof port !== 'number') { return; } const release = await this.languageServerStartMutex.acquire(); + const toDisposeOnRelease = new DisposableCollection(); try { await this.hostedPluginEvents.didStart; const details = await this.boardsService.getBoardDetails({ fqbn }); @@ -101,15 +235,26 @@ export class InoLanguage extends SketchContribution { } return; } - if (!forceStart && fqbn === this.languageServerFqbn) { + const fqbnWithConfig = await this.boardDataStore.appendConfigToFqbn(fqbn); + if (!fqbnWithConfig) { + throw new Error( + `Failed to append boards config to the FQBN. Original FQBN was: ${fqbn}` + ); + } + if (!forceStart && fqbnWithConfig === this.languageServerFqbn) { // NOOP return; } - this.logger.info(`Starting language server: ${fqbn}`); const log = this.preferences.get('arduino.language.log'); const realTimeDiagnostics = this.preferences.get( 'arduino.language.realTimeDiagnostics' ); + const jobs = this.getAsyncWorkersPreferenceSafe(); + this.logger.info( + `Starting language server: ${fqbnWithConfig}${ + jobs ? ` (async worker count: ${jobs})` : '' + }` + ); let currentSketchPath: string | undefined = undefined; if (log) { const currentSketch = await this.sketchServiceClient.currentSketch(); @@ -126,34 +271,89 @@ export class InoLanguage extends SketchContribution { ]); this.languageServerFqbn = await Promise.race([ - new Promise((_, reject) => - setTimeout( + new Promise((_, reject) => { + const timer = setTimeout( () => reject(new Error(`Timeout after ${20_000} ms.`)), 20_000 - ) - ), - this.commandService.executeCommand( - 'arduino.languageserver.start', - { - lsPath, - cliDaemonAddr: `localhost:${port}`, - clangdPath, - log: currentSketchPath ? currentSketchPath : log, - cliDaemonInstance: '1', - board: { - fqbn, - name: name ? `"${name}"` : undefined, - }, - realTimeDiagnostics, - silentOutput: true, - } - ), + ); + toDisposeOnRelease.push(Disposable.create(() => clearTimeout(timer))); + }), + this.start({ + lsPath, + daemonAddress: { + hostname: 'localhost', + port, + instance: 1, // TODO: get it from the backend + }, + clangdPath, + log: currentSketchPath ? currentSketchPath : log, + board: { + fqbn: fqbnWithConfig, + name, + }, + realTimeDiagnostics, + silentOutput: true, + jobs, + }), ]); } catch (e) { - console.log(`Failed to start language server for ${fqbn}`, e); + console.log(`Failed to start language server. Original FQBN: ${fqbn}`, e); this.languageServerFqbn = undefined; } finally { + toDisposeOnRelease.dispose(); release(); } } + // The Theia preference UI validation is bogus. + // To restrict the number of jobs to a valid value. + private getAsyncWorkersPreferenceSafe(): number { + const jobs = this.preferences.get( + 'arduino.language.asyncWorkers', + defaultAsyncWorkers + ); + if (jobs < minAsyncWorkers) { + return minAsyncWorkers; + } + if (jobs > maxAsyncWorkers) { + return maxAsyncWorkers; + } + return jobs; + } + + private async start( + params: StartLanguageServerParams + ): Promise { + return this.commandService.executeCommand( + 'arduino.languageserver.start', + 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 { + 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 + ); + } + } } diff --git a/arduino-ide-extension/src/browser/contributions/interface-scale.ts b/arduino-ide-extension/src/browser/contributions/interface-scale.ts new file mode 100644 index 000000000..6db578f1d --- /dev/null +++ b/arduino-ide-extension/src/browser/contributions/interface-scale.ts @@ -0,0 +1,173 @@ +import { injectable } from '@theia/core/shared/inversify'; +import { + Contribution, + Command, + MenuModelRegistry, + KeybindingRegistry, +} from './contribution'; +import { ArduinoMenus } from '../menu/arduino-menus'; +import { CommandRegistry, MaybePromise, nls } from '@theia/core/lib/common'; +import { Settings } from '../dialogs/settings/settings'; +import debounce from 'lodash.debounce'; + +@injectable() +export class InterfaceScale extends Contribution { + private fontScalingEnabled: InterfaceScale.FontScalingEnabled = { + increase: true, + decrease: true, + }; + + private currentSettings: Settings; + private updateSettingsDebounced = debounce( + async () => { + await this.settingsService.update(this.currentSettings); + await this.settingsService.save(); + }, + 100, + { maxWait: 200 } + ); + + override onStart(): MaybePromise { + const updateCurrent = (settings: Settings) => { + this.currentSettings = settings; + this.updateFontScalingEnabled(); + }; + this.settingsService.onDidChange((settings) => updateCurrent(settings)); + this.settingsService.settings().then((settings) => updateCurrent(settings)); + } + + override registerCommands(registry: CommandRegistry): void { + registry.registerCommand(InterfaceScale.Commands.INCREASE_FONT_SIZE, { + execute: () => this.updateFontSize('increase'), + isEnabled: () => this.fontScalingEnabled.increase, + }); + registry.registerCommand(InterfaceScale.Commands.DECREASE_FONT_SIZE, { + execute: () => this.updateFontSize('decrease'), + isEnabled: () => this.fontScalingEnabled.decrease, + }); + } + + override registerMenus(registry: MenuModelRegistry): void { + registry.registerMenuAction(ArduinoMenus.EDIT__FONT_CONTROL_GROUP, { + commandId: InterfaceScale.Commands.INCREASE_FONT_SIZE.id, + label: nls.localize( + 'arduino/editor/increaseFontSize', + 'Increase Font Size' + ), + order: '0', + }); + registry.registerMenuAction(ArduinoMenus.EDIT__FONT_CONTROL_GROUP, { + commandId: InterfaceScale.Commands.DECREASE_FONT_SIZE.id, + label: nls.localize( + 'arduino/editor/decreaseFontSize', + 'Decrease Font Size' + ), + order: '1', + }); + } + + private updateFontScalingEnabled(): void { + let fontScalingEnabled = { + increase: true, + decrease: true, + }; + + if (this.currentSettings.autoScaleInterface) { + fontScalingEnabled = { + increase: + this.currentSettings.interfaceScale + InterfaceScale.ZoomLevel.STEP <= + InterfaceScale.ZoomLevel.MAX, + decrease: + this.currentSettings.interfaceScale - InterfaceScale.ZoomLevel.STEP >= + InterfaceScale.ZoomLevel.MIN, + }; + } else { + fontScalingEnabled = { + increase: + this.currentSettings.editorFontSize + InterfaceScale.FontSize.STEP <= + InterfaceScale.FontSize.MAX, + decrease: + this.currentSettings.editorFontSize - InterfaceScale.FontSize.STEP >= + InterfaceScale.FontSize.MIN, + }; + } + + const isChanged = Object.keys(fontScalingEnabled).some( + (key: keyof InterfaceScale.FontScalingEnabled) => + fontScalingEnabled[key] !== this.fontScalingEnabled[key] + ); + if (isChanged) { + this.fontScalingEnabled = fontScalingEnabled; + this.menuManager.update(); + } + } + + private updateFontSize(mode: 'increase' | 'decrease'): void { + if (this.currentSettings.autoScaleInterface) { + mode === 'increase' + ? (this.currentSettings.interfaceScale += InterfaceScale.ZoomLevel.STEP) + : (this.currentSettings.interfaceScale -= + InterfaceScale.ZoomLevel.STEP); + } else { + mode === 'increase' + ? (this.currentSettings.editorFontSize += InterfaceScale.FontSize.STEP) + : (this.currentSettings.editorFontSize -= InterfaceScale.FontSize.STEP); + } + this.updateFontScalingEnabled(); + this.updateSettingsDebounced(); + } + + override registerKeybindings(registry: KeybindingRegistry): void { + registry.registerKeybinding({ + command: InterfaceScale.Commands.INCREASE_FONT_SIZE.id, + keybinding: 'CtrlCmd+=', + }); + registry.registerKeybinding({ + command: InterfaceScale.Commands.DECREASE_FONT_SIZE.id, + keybinding: 'CtrlCmd+-', + }); + } +} + +export namespace InterfaceScale { + export namespace Commands { + export const INCREASE_FONT_SIZE: Command = { + id: 'arduino-increase-font-size', + }; + export const DECREASE_FONT_SIZE: Command = { + id: 'arduino-decrease-font-size', + }; + } + + export namespace ZoomLevel { + export const MIN = -8; + export const MAX = 9; + export const STEP = 1; + + export function toPercentage(scale: number): number { + return scale * 20 + 100; + } + export function fromPercentage(percentage: number): number { + return (percentage - 100) / 20; + } + export namespace Step { + export function toPercentage(step: number): number { + return step * 20; + } + export function fromPercentage(percentage: number): number { + return percentage / 20; + } + } + } + + export namespace FontSize { + export const MIN = 8; + export const MAX = 72; + export const STEP = 2; + } + + export interface FontScalingEnabled { + increase: boolean; + decrease: boolean; + } +} diff --git a/arduino-ide-extension/src/browser/contributions/new-cloud-sketch.ts b/arduino-ide-extension/src/browser/contributions/new-cloud-sketch.ts new file mode 100644 index 000000000..d165c4779 --- /dev/null +++ b/arduino-ide-extension/src/browser/contributions/new-cloud-sketch.ts @@ -0,0 +1,204 @@ +import { KeybindingRegistry } from '@theia/core/lib/browser/keybinding'; +import { CompositeTreeNode } from '@theia/core/lib/browser/tree'; +import { DisposableCollection } from '@theia/core/lib/common/disposable'; +import { MenuModelRegistry } from '@theia/core/lib/common/menu'; +import { Progress } from '@theia/core/lib/common/message-service-protocol'; +import { nls } from '@theia/core/lib/common/nls'; +import { injectable } from '@theia/core/shared/inversify'; +import { CreateUri } from '../create/create-uri'; +import { Create, isConflict } from '../create/typings'; +import { ArduinoMenus } from '../menu/arduino-menus'; +import { + TaskFactoryImpl, + WorkspaceInputDialogWithProgress, +} from '../theia/workspace/workspace-input-dialog'; +import { CloudSketchbookTree } from '../widgets/cloud-sketchbook/cloud-sketchbook-tree'; +import { CloudSketchbookTreeModel } from '../widgets/cloud-sketchbook/cloud-sketchbook-tree-model'; +import { SketchbookCommands } from '../widgets/sketchbook/sketchbook-commands'; +import { + CloudSketchContribution, + pullingSketch, + sketchAlreadyExists, + synchronizingSketchbook, +} from './cloud-contribution'; +import { Command, CommandRegistry, Sketch } from './contribution'; + +export interface CreateNewCloudSketchCallback { + ( + newSketch: Create.Sketch, + newNode: CloudSketchbookTree.CloudSketchDirNode, + progress: Progress + ): Promise; +} + +export interface NewCloudSketchParams { + /** + * Value to populate the dialog `` when it opens. + */ + readonly initialValue?: string | undefined; + /** + * Additional callback to call when the new cloud sketch has been created. + */ + readonly callback?: CreateNewCloudSketchCallback; + /** + * If `true`, the validation error message will not be visible in the input dialog, but the `OK` button will be disabled. Defaults to `true`. + */ + readonly skipShowErrorMessageOnOpen?: boolean; +} + +@injectable() +export class NewCloudSketch extends CloudSketchContribution { + private readonly toDispose = new DisposableCollection(); + + override onReady(): void { + this.toDispose.pushAll([ + this.createFeatures.onDidChangeEnabled(() => this.menuManager.update()), + this.createFeatures.onDidChangeSession(() => this.menuManager.update()), + ]); + if (this.createFeatures.session) { + this.menuManager.update(); + } + } + + onStop(): void { + this.toDispose.dispose(); + } + + override registerCommands(registry: CommandRegistry): void { + registry.registerCommand(NewCloudSketch.Commands.NEW_CLOUD_SKETCH, { + execute: (params: NewCloudSketchParams) => + this.createNewSketch( + params?.skipShowErrorMessageOnOpen === false ? false : true, + params?.initialValue, + params?.callback + ), + isEnabled: () => Boolean(this.createFeatures.session), + isVisible: () => this.createFeatures.enabled, + }); + } + + override registerMenus(registry: MenuModelRegistry): void { + registry.registerMenuAction(ArduinoMenus.FILE__SKETCH_GROUP, { + commandId: NewCloudSketch.Commands.NEW_CLOUD_SKETCH.id, + label: nls.localize('arduino/cloudSketch/new', 'New Cloud Sketch'), + order: '1', + }); + } + + override registerKeybindings(registry: KeybindingRegistry): void { + registry.registerKeybinding({ + command: NewCloudSketch.Commands.NEW_CLOUD_SKETCH.id, + keybinding: 'CtrlCmd+Alt+N', + }); + } + + private async createNewSketch( + skipShowErrorMessageOnOpen: boolean, + initialValue?: string | undefined, + callback?: CreateNewCloudSketchCallback + ): Promise { + const treeModel = await this.treeModel(); + if (treeModel) { + const rootNode = treeModel.root; + return this.openWizard( + rootNode, + treeModel, + skipShowErrorMessageOnOpen, + initialValue, + callback + ); + } + } + + private async openWizard( + rootNode: CompositeTreeNode, + treeModel: CloudSketchbookTreeModel, + skipShowErrorMessageOnOpen: boolean, + initialValue?: string | undefined, + callback?: CreateNewCloudSketchCallback + ): Promise { + const existingNames = rootNode.children + .filter(CloudSketchbookTree.CloudSketchDirNode.is) + .map(({ fileStat }) => fileStat.name); + const taskFactory = new TaskFactoryImpl((value) => + this.createNewSketchWithProgress(treeModel, value, callback) + ); + try { + const dialog = new WorkspaceInputDialogWithProgress( + { + title: nls.localize( + 'arduino/newCloudSketch/newSketchTitle', + 'Name of the new Cloud Sketch' + ), + parentUri: CreateUri.root, + initialValue, + validate: (input) => { + if (existingNames.includes(input)) { + return sketchAlreadyExists(input); + } + return Sketch.validateCloudSketchFolderName(input) ?? ''; + }, + }, + this.labelProvider, + taskFactory + ); + await dialog.open(skipShowErrorMessageOnOpen); + if (dialog.taskResult) { + this.openInNewWindow(dialog.taskResult); + } + } catch (err) { + if (isConflict(err)) { + await treeModel.refresh(); + return this.createNewSketch( + false, + taskFactory.value ?? initialValue, + callback + ); + } + throw err; + } + } + + private createNewSketchWithProgress( + treeModel: CloudSketchbookTreeModel, + value: string, + callback?: CreateNewCloudSketchCallback + ): ( + progress: Progress + ) => Promise { + return async (progress: Progress) => { + progress.report({ + message: nls.localize( + 'arduino/cloudSketch/creating', + "Creating cloud sketch '{0}'...", + value + ), + }); + const sketch = await this.createApi.createSketch(value); + progress.report({ message: synchronizingSketchbook }); + await treeModel.refresh(); + progress.report({ message: pullingSketch(sketch.name) }); + const node = await this.pull(sketch); + if (callback && node) { + await callback(sketch, node, progress); + } + return node; + }; + } + + private openInNewWindow( + node: CloudSketchbookTree.CloudSketchDirNode + ): Promise { + return this.commandService.executeCommand( + SketchbookCommands.OPEN_NEW_WINDOW.id, + { node, treeWidgetId: 'cloud-sketchbook-composite-widget' } + ); + } +} +export namespace NewCloudSketch { + export namespace Commands { + export const NEW_CLOUD_SKETCH: Command = { + id: 'arduino-new-cloud-sketch', + }; + } +} diff --git a/arduino-ide-extension/src/browser/contributions/new-sketch.ts b/arduino-ide-extension/src/browser/contributions/new-sketch.ts index c43e15505..e026d552d 100644 --- a/arduino-ide-extension/src/browser/contributions/new-sketch.ts +++ b/arduino-ide-extension/src/browser/contributions/new-sketch.ts @@ -1,7 +1,6 @@ import { nls } from '@theia/core/lib/common'; import { injectable } from '@theia/core/shared/inversify'; import { ArduinoMenus } from '../menu/arduino-menus'; -import { ArduinoToolbar } from '../toolbar/arduino-toolbar'; import { SketchContribution, URI, @@ -17,17 +16,12 @@ export class NewSketch extends SketchContribution { registry.registerCommand(NewSketch.Commands.NEW_SKETCH, { execute: () => this.newSketch(), }); - registry.registerCommand(NewSketch.Commands.NEW_SKETCH__TOOLBAR, { - isVisible: (widget) => - ArduinoToolbar.is(widget) && widget.side === 'left', - execute: () => registry.executeCommand(NewSketch.Commands.NEW_SKETCH.id), - }); } override registerMenus(registry: MenuModelRegistry): void { registry.registerMenuAction(ArduinoMenus.FILE__SKETCH_GROUP, { commandId: NewSketch.Commands.NEW_SKETCH.id, - label: nls.localize('arduino/sketch/new', 'New'), + label: nls.localize('arduino/sketch/new', 'New Sketch'), order: '0', }); } @@ -41,7 +35,7 @@ export class NewSketch extends SketchContribution { async newSketch(): Promise { try { - const sketch = await this.sketchService.createNewSketch(); + const sketch = await this.sketchesService.createNewSketch(); this.workspaceService.open(new URI(sketch.uri)); } catch (e) { await this.messageService.error(e.toString()); @@ -54,8 +48,5 @@ export namespace NewSketch { export const NEW_SKETCH: Command = { id: 'arduino-new-sketch', }; - export const NEW_SKETCH__TOOLBAR: Command = { - id: 'arduino-new-sketch--toolbar', - }; } } diff --git a/arduino-ide-extension/src/browser/contributions/open-boards-config.ts b/arduino-ide-extension/src/browser/contributions/open-boards-config.ts index 8feffc14f..90210b5fa 100644 --- a/arduino-ide-extension/src/browser/contributions/open-boards-config.ts +++ b/arduino-ide-extension/src/browser/contributions/open-boards-config.ts @@ -1,25 +1,18 @@ -import { CommandRegistry } from '@theia/core'; +import type { Command, CommandRegistry } from '@theia/core/lib/common/command'; import { inject, injectable } from '@theia/core/shared/inversify'; +import type { EditBoardsConfigActionParams } from '../../common/protocol/board-list'; import { BoardsConfigDialog } from '../boards/boards-config-dialog'; -import { BoardsServiceProvider } from '../boards/boards-service-provider'; -import { Contribution, Command } from './contribution'; +import { Contribution } from './contribution'; @injectable() export class OpenBoardsConfig extends Contribution { - @inject(BoardsServiceProvider) - private readonly boardsServiceProvider: BoardsServiceProvider; - @inject(BoardsConfigDialog) private readonly boardsConfigDialog: BoardsConfigDialog; override registerCommands(registry: CommandRegistry): void { registry.registerCommand(OpenBoardsConfig.Commands.OPEN_DIALOG, { - execute: async (query?: string | undefined) => { - const boardsConfig = await this.boardsConfigDialog.open(query); - if (boardsConfig) { - return (this.boardsServiceProvider.boardsConfig = boardsConfig); - } - }, + execute: async (params?: EditBoardsConfigActionParams) => + this.boardsConfigDialog.open(true, params), }); } } diff --git a/arduino-ide-extension/src/browser/contributions/open-recent-sketch.ts b/arduino-ide-extension/src/browser/contributions/open-recent-sketch.ts index 1c1f384ac..a14d6a541 100644 --- a/arduino-ide-extension/src/browser/contributions/open-recent-sketch.ts +++ b/arduino-ide-extension/src/browser/contributions/open-recent-sketch.ts @@ -15,6 +15,7 @@ import { MainMenuManager } from '../../common/main-menu-manager'; import { OpenSketch } from './open-sketch'; import { NotificationCenter } from '../notification-center'; import { nls } from '@theia/core/lib/common'; +import { SketchesError } from '../../common/protocol'; @injectable() export class OpenRecentSketch extends SketchContribution { @@ -33,7 +34,7 @@ export class OpenRecentSketch extends SketchContribution { @inject(NotificationCenter) protected readonly notificationCenter: NotificationCenter; - protected toDisposeBeforeRegister = new Map(); + protected toDispose = new DisposableCollection(); override onStart(): void { this.notificationCenter.onRecentSketchesDidChange(({ sketches }) => @@ -42,8 +43,12 @@ export class OpenRecentSketch extends SketchContribution { } override async onReady(): Promise { - this.sketchService - .recentlyOpenedSketches() + this.update(); + } + + private update(forceUpdate?: boolean): void { + this.sketchesService + .recentlyOpenedSketches(forceUpdate) .then((sketches) => this.refreshMenu(sketches)); } @@ -62,19 +67,25 @@ export class OpenRecentSketch extends SketchContribution { protected register(sketches: Sketch[]): void { const order = 0; + this.toDispose.dispose(); for (const sketch of sketches) { const { uri } = sketch; - const toDispose = this.toDisposeBeforeRegister.get(uri); - if (toDispose) { - toDispose.dispose(); - } const command = { id: `arduino-open-recent--${uri}` }; const handler = { - execute: () => - this.commandRegistry.executeCommand( - OpenSketch.Commands.OPEN_SKETCH.id, - sketch - ), + execute: async () => { + try { + await this.commandRegistry.executeCommand( + OpenSketch.Commands.OPEN_SKETCH.id, + sketch + ); + } catch (err) { + if (SketchesError.NotFound.is(err)) { + this.update(true); + } else { + throw err; + } + } + }, }; this.commandRegistry.registerCommand(command, handler); this.menuRegistry.registerMenuAction( @@ -85,8 +96,7 @@ export class OpenRecentSketch extends SketchContribution { order: String(order), } ); - this.toDisposeBeforeRegister.set( - sketch.uri, + this.toDispose.pushAll([ new DisposableCollection( Disposable.create(() => this.commandRegistry.unregisterCommand(command) @@ -94,8 +104,8 @@ export class OpenRecentSketch extends SketchContribution { Disposable.create(() => this.menuRegistry.unregisterMenuAction(command) ) - ) - ); + ), + ]); } } } diff --git a/arduino-ide-extension/src/browser/contributions/settings.ts b/arduino-ide-extension/src/browser/contributions/open-settings.ts similarity index 75% rename from arduino-ide-extension/src/browser/contributions/settings.ts rename to arduino-ide-extension/src/browser/contributions/open-settings.ts index bb7c83f00..e3dff44df 100644 --- a/arduino-ide-extension/src/browser/contributions/settings.ts +++ b/arduino-ide-extension/src/browser/contributions/open-settings.ts @@ -1,32 +1,34 @@ +import { nls } from '@theia/core/lib/common/nls'; import { inject, injectable } from '@theia/core/shared/inversify'; +import type { Settings } from '../dialogs/settings/settings'; +import { SettingsDialog } from '../dialogs/settings/settings-dialog'; +import { ArduinoMenus } from '../menu/arduino-menus'; import { Command, - MenuModelRegistry, CommandRegistry, - SketchContribution, KeybindingRegistry, + MenuModelRegistry, + SketchContribution, } from './contribution'; -import { ArduinoMenus } from '../menu/arduino-menus'; -import { Settings as Preferences } from '../dialogs/settings/settings'; -import { SettingsDialog } from '../dialogs/settings/settings-dialog'; -import { nls } from '@theia/core/lib/common'; @injectable() -export class Settings extends SketchContribution { +export class OpenSettings extends SketchContribution { @inject(SettingsDialog) - protected readonly settingsDialog: SettingsDialog; + private readonly settingsDialog: SettingsDialog; - protected settingsOpened = false; + private settingsOpened = false; override registerCommands(registry: CommandRegistry): void { - registry.registerCommand(Settings.Commands.OPEN, { + registry.registerCommand(OpenSettings.Commands.OPEN, { execute: async () => { - let settings: Preferences | undefined = undefined; + let settings: Settings | undefined = undefined; try { this.settingsOpened = true; + this.menuManager.update(); settings = await this.settingsDialog.open(); } finally { this.settingsOpened = false; + this.menuManager.update(); } if (settings) { await this.settingsService.update(settings); @@ -41,7 +43,7 @@ export class Settings extends SketchContribution { override registerMenus(registry: MenuModelRegistry): void { registry.registerMenuAction(ArduinoMenus.FILE__PREFERENCES_GROUP, { - commandId: Settings.Commands.OPEN.id, + commandId: OpenSettings.Commands.OPEN.id, label: nls.localize( 'vscode/preferences.contribution/preferences', @@ -57,13 +59,13 @@ export class Settings extends SketchContribution { override registerKeybindings(registry: KeybindingRegistry): void { registry.registerKeybinding({ - command: Settings.Commands.OPEN.id, + command: OpenSettings.Commands.OPEN.id, keybinding: 'CtrlCmd+,', }); } } -export namespace Settings { +export namespace OpenSettings { export namespace Commands { export const OPEN: Command = { id: 'arduino-settings-open', diff --git a/arduino-ide-extension/src/browser/contributions/open-sketch-external.ts b/arduino-ide-extension/src/browser/contributions/open-sketch-external.ts index 03207126f..af47c7c28 100644 --- a/arduino-ide-extension/src/browser/contributions/open-sketch-external.ts +++ b/arduino-ide-extension/src/browser/contributions/open-sketch-external.ts @@ -1,5 +1,4 @@ import { injectable } from '@theia/core/shared/inversify'; -import * as remote from '@theia/core/electron-shared/@electron/remote'; import URI from '@theia/core/lib/common/uri'; import { ArduinoMenus } from '../menu/arduino-menus'; import { @@ -9,7 +8,7 @@ import { MenuModelRegistry, KeybindingRegistry, } from './contribution'; -import { nls } from '@theia/core/lib/common'; +import { nls } from '@theia/core/lib/common/nls'; @injectable() export class OpenSketchExternal extends SketchContribution { @@ -41,7 +40,7 @@ export class OpenSketchExternal extends SketchContribution { if (exists) { const fsPath = await this.fileService.fsPath(new URI(uri)); if (fsPath) { - remote.shell.showItemInFolder(fsPath); + window.electronTheiaCore.showItemInFolder(fsPath); } } } diff --git a/arduino-ide-extension/src/browser/contributions/open-sketch-files.ts b/arduino-ide-extension/src/browser/contributions/open-sketch-files.ts index 63cea8ca4..e69d8b0b6 100644 --- a/arduino-ide-extension/src/browser/contributions/open-sketch-files.ts +++ b/arduino-ide-extension/src/browser/contributions/open-sketch-files.ts @@ -2,7 +2,7 @@ import { nls } from '@theia/core/lib/common/nls'; import { injectable } from '@theia/core/shared/inversify'; import type { EditorOpenerOptions } from '@theia/editor/lib/browser/editor-manager'; import { Later } from '../../common/nls'; -import { SketchesError } from '../../common/protocol'; +import { Sketch, SketchesError } from '../../common/protocol'; import { Command, CommandRegistry, @@ -10,12 +10,18 @@ import { URI, } from './contribution'; import { SaveAsSketch } from './save-as-sketch'; +import { promptMoveSketch } from './open-sketch'; +import { ApplicationError } from '@theia/core/lib/common/application-error'; +import { Deferred, wait } from '@theia/core/lib/common/promise-util'; +import { EditorWidget } from '@theia/editor/lib/browser/editor-widget'; +import { DisposableCollection } from '@theia/core/lib/common/disposable'; @injectable() export class OpenSketchFiles extends SketchContribution { override registerCommands(registry: CommandRegistry): void { registry.registerCommand(OpenSketchFiles.Commands.OPEN_SKETCH_FILES, { - execute: (uri: URI) => this.openSketchFiles(uri), + execute: (uri: URI, focusMainSketchFile) => + this.openSketchFiles(uri, focusMainSketchFile), }); registry.registerCommand(OpenSketchFiles.Commands.ENSURE_OPENED, { execute: ( @@ -28,13 +34,23 @@ export class OpenSketchFiles extends SketchContribution { }); } - private async openSketchFiles(uri: URI): Promise { + private async openSketchFiles( + uri: URI, + focusMainSketchFile = false + ): Promise { try { - const sketch = await this.sketchService.loadSketch(uri.toString()); + const sketch = await this.sketchesService.loadSketch(uri.toString()); const { mainFileUri, rootFolderFileUris } = sketch; for (const uri of [mainFileUri, ...rootFolderFileUris]) { await this.ensureOpened(uri); } + if (focusMainSketchFile) { + await this.ensureOpened(mainFileUri, true, { + mode: 'activate', + preview: false, + counter: 0, + }); + } if (mainFileUri.endsWith('.pde')) { const message = nls.localize( 'arduino/common/oldFormat', @@ -55,9 +71,25 @@ export class OpenSketchFiles extends SketchContribution { } }); } + const { workspaceError } = this.workspaceService; + // This happens when the IDE2 has been started (from either a terminal or clicking on an `ino` file) with a /path/to/invalid/sketch. (#964) + if (SketchesError.InvalidName.is(workspaceError)) { + await this.promptMove(workspaceError); + } } catch (err) { + // This happens when the user gracefully closed IDE2, all went well + // but the main sketch file was renamed outside of IDE2 and when the user restarts the IDE2 + // the workspace path still exists, but the sketch path is not valid anymore. (#964) + if (SketchesError.InvalidName.is(err)) { + const movedSketch = await this.promptMove(err); + if (!movedSketch) { + // If user did not accept the move, or move was not possible, force reload with a fallback. + return this.openFallbackSketch(); + } + } + if (SketchesError.NotFound.is(err)) { - this.openFallbackSketch(); + return this.openFallbackSketch(); } else { console.error(err); const message = @@ -71,8 +103,34 @@ export class OpenSketchFiles extends SketchContribution { } } + private async promptMove( + err: ApplicationError< + number, + { + invalidMainSketchUri: string; + } + > + ): Promise { + const { invalidMainSketchUri } = err.data; + requestAnimationFrame(() => this.messageService.error(err.message)); + await wait(250); // let IDE2 open the editor and toast the error message, then open the modal dialog + const movedSketch = await promptMoveSketch(invalidMainSketchUri, { + fileService: this.fileService, + sketchesService: this.sketchesService, + labelProvider: this.labelProvider, + dialogService: this.dialogService, + }); + if (movedSketch) { + this.workspaceService.open(new URI(movedSketch.uri), { + preserveWindow: true, + }); + return movedSketch; + } + return undefined; + } + private async openFallbackSketch(): Promise { - const sketch = await this.sketchService.createNewSketch(); + const sketch = await this.sketchesService.createNewSketch(); this.workspaceService.open(new URI(sketch.uri), { preserveWindow: true }); } @@ -80,20 +138,84 @@ export class OpenSketchFiles extends SketchContribution { uri: string, forceOpen = false, options?: EditorOpenerOptions - ): Promise { + ): Promise { const widget = this.editorManager.all.find( (widget) => widget.editor.uri.toString() === uri ); - if (!widget || forceOpen) { - return this.editorManager.open( + if (widget && !forceOpen) { + return widget; + } + + const disposables = new DisposableCollection(); + const deferred = new Deferred(); + // An editor can be in two primary states: + // - The editor is not yet opened. The `widget` is `undefined`. With `editorManager#open`, Theia will create an editor and fire an `editorManager#onCreated` event. + // - The editor is opened. Can be active, current, or open. + // - If the editor has the focus (the cursor blinks in the editor): it's the active editor. + // - If the editor does not have the focus (the focus is on a different widget or the context menu is opened in the editor): it's the current editor. + // - If the editor is not the top editor in the main area, it's opened. + if (!widget) { + // If the widget is `undefined`, IDE2 expects one `onCreate` event. Subscribe to the `onCreated` event + // and resolve the promise with the editor only when the new editor's visibility changes. + disposables.push( + this.editorManager.onCreated((editor) => { + if (editor.editor.uri.toString() === uri) { + if (editor.isAttached && editor.isVisible) { + deferred.resolve(editor); + } else { + disposables.push( + editor.onDidChangeVisibility((visible) => { + if (visible) { + // wait an animation frame. although the visible and attached props are true the editor is not there. + // let the browser render the widget + setTimeout( + () => + requestAnimationFrame(() => deferred.resolve(editor)), + 0 + ); + } + }) + ); + } + } + }) + ); + } + + this.editorManager + .open( new URI(uri), options ?? { mode: 'reveal', preview: false, counter: 0, } + ) + .then((editorWidget) => { + // If the widget was defined, it was already opened. + // The editor is expected to be attached to the shell and visible in the UI. + // The deferred promise does not have to wait for the `editorManager#onCreated` event. + // It can resolve earlier. + if (widget) { + deferred.resolve(editorWidget); + } + }); + + const timeout = 5_000; // number of ms IDE2 waits for the editor to show up in the UI + const result: EditorWidget | undefined | 'timeout' = await Promise.race([ + deferred.promise, + wait(timeout).then(() => { + disposables.dispose(); + return 'timeout' as const; + }), + ]); + if (result === 'timeout') { + console.warn( + `Timeout after ${timeout} millis. The editor has not shown up in time. URI: ${uri}` ); + return undefined; } + return result; } } export namespace OpenSketchFiles { diff --git a/arduino-ide-extension/src/browser/contributions/open-sketch.ts b/arduino-ide-extension/src/browser/contributions/open-sketch.ts index abb667c91..93f1b6108 100644 --- a/arduino-ide-extension/src/browser/contributions/open-sketch.ts +++ b/arduino-ide-extension/src/browser/contributions/open-sketch.ts @@ -1,115 +1,50 @@ -import { inject, injectable } from '@theia/core/shared/inversify'; -import * as remote from '@theia/core/electron-shared/@electron/remote'; -import { MaybePromise } from '@theia/core/lib/common/types'; -import { Widget, ContextMenuRenderer } from '@theia/core/lib/browser'; +import { nls } from '@theia/core/lib/common/nls'; +import { injectable } from '@theia/core/shared/inversify'; +import { FileService } from '@theia/filesystem/lib/browser/file-service'; +import { LabelProvider } from '@theia/core/lib/browser/label-provider'; import { - Disposable, - DisposableCollection, -} from '@theia/core/lib/common/disposable'; + SketchesError, + SketchesService, + SketchRef, +} from '../../common/protocol'; import { ArduinoMenus } from '../menu/arduino-menus'; -import { ArduinoToolbar } from '../toolbar/arduino-toolbar'; import { - SketchContribution, - Sketch, - URI, Command, CommandRegistry, - MenuModelRegistry, KeybindingRegistry, + MenuModelRegistry, + Sketch, + SketchContribution, + URI, } from './contribution'; -import { ExamplesService } from '../../common/protocol/examples-service'; -import { BuiltInExamples } from './examples'; -import { Sketchbook } from './sketchbook'; -import { SketchContainer } from '../../common/protocol'; -import { nls } from '@theia/core/lib/common'; +import { DialogService } from '../dialog-service'; + +export type SketchLocation = string | URI | SketchRef; +export namespace SketchLocation { + export function toUri(location: SketchLocation): URI { + if (typeof location === 'string') { + return new URI(location); + } else if (SketchRef.is(location)) { + return toUri(location.uri); + } else { + return location; + } + } + export function is(arg: unknown): arg is SketchLocation { + return typeof arg === 'string' || arg instanceof URI || SketchRef.is(arg); + } +} @injectable() export class OpenSketch extends SketchContribution { - @inject(MenuModelRegistry) - protected readonly menuRegistry: MenuModelRegistry; - - @inject(ContextMenuRenderer) - protected readonly contextMenuRenderer: ContextMenuRenderer; - - @inject(BuiltInExamples) - protected readonly builtInExamples: BuiltInExamples; - - @inject(ExamplesService) - protected readonly examplesService: ExamplesService; - - @inject(Sketchbook) - protected readonly sketchbook: Sketchbook; - - protected readonly toDispose = new DisposableCollection(); - override registerCommands(registry: CommandRegistry): void { registry.registerCommand(OpenSketch.Commands.OPEN_SKETCH, { - execute: (arg) => - Sketch.is(arg) ? this.openSketch(arg) : this.openSketch(), - }); - registry.registerCommand(OpenSketch.Commands.OPEN_SKETCH__TOOLBAR, { - isVisible: (widget) => - ArduinoToolbar.is(widget) && widget.side === 'left', - execute: async (_: Widget, target: EventTarget) => { - const container = await this.sketchService.getSketches({ - exclude: ['**/hardware/**'], - }); - if (SketchContainer.isEmpty(container)) { - this.openSketch(); - } else { - this.toDispose.dispose(); - if (!(target instanceof HTMLElement)) { - return; - } - const { parentElement } = target; - if (!parentElement) { - return; - } - - this.menuRegistry.registerMenuAction( - ArduinoMenus.OPEN_SKETCH__CONTEXT__OPEN_GROUP, - { - commandId: OpenSketch.Commands.OPEN_SKETCH.id, - label: nls.localize( - 'vscode/workspaceActions/openFileFolder', - 'Open...' - ), - } - ); - this.toDispose.push( - Disposable.create(() => - this.menuRegistry.unregisterMenuAction( - OpenSketch.Commands.OPEN_SKETCH - ) - ) - ); - this.sketchbook.registerRecursively( - [...container.children, ...container.sketches], - ArduinoMenus.OPEN_SKETCH__CONTEXT__RECENT_GROUP, - this.toDispose - ); - try { - const containers = await this.examplesService.builtIns(); - for (const container of containers) { - this.builtInExamples.registerRecursively( - container, - ArduinoMenus.OPEN_SKETCH__CONTEXT__EXAMPLES_GROUP, - this.toDispose - ); - } - } catch (e) { - console.error('Error when collecting built-in examples.', e); - } - const options = { - menuPath: ArduinoMenus.OPEN_SKETCH__CONTEXT, - anchor: { - x: parentElement.getBoundingClientRect().left, - y: - parentElement.getBoundingClientRect().top + - parentElement.offsetHeight, - }, - }; - this.contextMenuRenderer.render(options); + execute: async (arg) => { + const toOpen = !SketchLocation.is(arg) + ? await this.selectSketch() + : arg; + if (toOpen) { + return this.openSketch(toOpen); } }, }); @@ -119,7 +54,7 @@ export class OpenSketch extends SketchContribution { registry.registerMenuAction(ArduinoMenus.FILE__SKETCH_GROUP, { commandId: OpenSketch.Commands.OPEN_SKETCH.id, label: nls.localize('vscode/workspaceActions/openFileFolder', 'Open...'), - order: '1', + order: '2', }); } @@ -130,21 +65,25 @@ export class OpenSketch extends SketchContribution { }); } - async openSketch( - toOpen: MaybePromise = this.selectSketch() - ): Promise { - const sketch = await toOpen; - if (sketch) { - this.workspaceService.open(new URI(sketch.uri)); + private async openSketch(toOpen: SketchLocation | undefined): Promise { + if (!toOpen) { + return; + } + const uri = SketchLocation.toUri(toOpen); + try { + await this.sketchesService.loadSketch(uri.toString()); + } catch (err) { + if (SketchesError.NotFound.is(err)) { + this.messageService.error(err.message); + } + throw err; } + this.workspaceService.open(uri); } - protected async selectSketch(): Promise { - const config = await this.configService.getConfiguration(); - const defaultPath = await this.fileService.fsPath( - new URI(config.sketchDirUri) - ); - const { filePaths } = await remote.dialog.showOpenDialog({ + private async selectSketch(): Promise { + const defaultPath = await this.defaultPath(); + const { filePaths } = await this.dialogService.showOpenDialog({ defaultPath, properties: ['createDirectory', 'openFile'], filters: [ @@ -164,50 +103,17 @@ export class OpenSketch extends SketchContribution { } const sketchFilePath = filePaths[0]; const sketchFileUri = await this.fileSystemExt.getUri(sketchFilePath); - const sketch = await this.sketchService.getSketchFolder(sketchFileUri); + const sketch = await this.sketchesService.getSketchFolder(sketchFileUri); if (sketch) { return sketch; } if (Sketch.isSketchFile(sketchFileUri)) { - const name = new URI(sketchFileUri).path.name; - const nameWithExt = this.labelProvider.getName(new URI(sketchFileUri)); - const { response } = await remote.dialog.showMessageBox({ - title: nls.localize('arduino/sketch/moving', 'Moving'), - type: 'question', - buttons: [ - nls.localize('vscode/issueMainService/cancel', 'Cancel'), - nls.localize('vscode/issueMainService/ok', 'OK'), - ], - message: nls.localize( - 'arduino/sketch/movingMsg', - 'The file "{0}" needs to be inside a sketch folder named "{1}".\nCreate this folder, move the file, and continue?', - nameWithExt, - name - ), + return promptMoveSketch(sketchFileUri, { + fileService: this.fileService, + sketchesService: this.sketchesService, + labelProvider: this.labelProvider, + dialogService: this.dialogService, }); - if (response === 1) { - // OK - const newSketchUri = new URI(sketchFileUri).parent.resolve(name); - const exists = await this.fileService.exists(newSketchUri); - if (exists) { - await remote.dialog.showMessageBox({ - type: 'error', - title: nls.localize('vscode/dialog/dialogErrorMessage', 'Error'), - message: nls.localize( - 'arduino/sketch/cantOpen', - 'A folder named "{0}" already exists. Can\'t open sketch.', - name - ), - }); - return undefined; - } - await this.fileService.createFolder(newSketchUri); - await this.fileService.move( - new URI(sketchFileUri), - new URI(newSketchUri.resolve(nameWithExt).toString()) - ); - return this.sketchService.getSketchFolder(newSketchUri.toString()); - } } } } @@ -217,8 +123,59 @@ export namespace OpenSketch { export const OPEN_SKETCH: Command = { id: 'arduino-open-sketch', }; - export const OPEN_SKETCH__TOOLBAR: Command = { - id: 'arduino-open-sketch--toolbar', - }; + } +} + +export async function promptMoveSketch( + sketchFileUri: string | URI, + options: { + fileService: FileService; + sketchesService: SketchesService; + labelProvider: LabelProvider; + dialogService: DialogService; + } +): Promise { + const { fileService, sketchesService, labelProvider, dialogService } = + options; + const uri = + sketchFileUri instanceof URI ? sketchFileUri : new URI(sketchFileUri); + const name = uri.path.name; + const nameWithExt = labelProvider.getName(uri); + const { response } = await dialogService.showMessageBox({ + title: nls.localize('arduino/sketch/moving', 'Moving'), + type: 'question', + buttons: [ + nls.localize('vscode/issueMainService/cancel', 'Cancel'), + nls.localize('vscode/issueMainService/ok', 'OK'), + ], + message: nls.localize( + 'arduino/sketch/movingMsg', + 'The file "{0}" needs to be inside a sketch folder named "{1}".\nCreate this folder, move the file, and continue?', + nameWithExt, + name + ), + }); + if (response === 1) { + // OK + const newSketchUri = uri.parent.resolve(name); + const exists = await fileService.exists(newSketchUri); + if (exists) { + await dialogService.showMessageBox({ + type: 'error', + title: nls.localize('vscode/dialog/dialogErrorMessage', 'Error'), + message: nls.localize( + 'arduino/sketch/cantOpen', + 'A folder named "{0}" already exists. Can\'t open sketch.', + name + ), + }); + return undefined; + } + await fileService.createFolder(newSketchUri); + await fileService.move( + uri, + new URI(newSketchUri.resolve(nameWithExt).toString()) + ); + return sketchesService.getSketchFolder(newSketchUri.toString()); } } diff --git a/arduino-ide-extension/src/browser/contributions/quit-app.ts b/arduino-ide-extension/src/browser/contributions/quit-app.ts index 17a7874dd..1563b00f1 100644 --- a/arduino-ide-extension/src/browser/contributions/quit-app.ts +++ b/arduino-ide-extension/src/browser/contributions/quit-app.ts @@ -1,5 +1,4 @@ -import { injectable } from '@theia/core/shared/inversify'; -import * as remote from '@theia/core/electron-shared/@electron/remote'; +import { inject, injectable } from '@theia/core/shared/inversify'; import { isOSX } from '@theia/core/lib/common/os'; import { Contribution, @@ -9,14 +8,18 @@ import { CommandRegistry, } from './contribution'; import { ArduinoMenus } from '../menu/arduino-menus'; -import { nls } from '@theia/core/lib/common'; +import { nls } from '@theia/core/lib/common/nls'; +import { AppService } from '../app-service'; @injectable() export class QuitApp extends Contribution { + @inject(AppService) + private readonly appService: AppService; + override registerCommands(registry: CommandRegistry): void { if (!isOSX) { registry.registerCommand(QuitApp.Commands.QUIT_APP, { - execute: () => remote.app.quit(), + execute: () => this.appService.quit(), }); } } diff --git a/arduino-ide-extension/src/browser/contributions/rename-cloud-sketch.ts b/arduino-ide-extension/src/browser/contributions/rename-cloud-sketch.ts new file mode 100644 index 000000000..5cee63f0e --- /dev/null +++ b/arduino-ide-extension/src/browser/contributions/rename-cloud-sketch.ts @@ -0,0 +1,166 @@ +import { CompositeTreeNode } from '@theia/core/lib/browser/tree'; +import { Progress } from '@theia/core/lib/common/message-service-protocol'; +import { nls } from '@theia/core/lib/common/nls'; +import { injectable } from '@theia/core/shared/inversify'; +import { CreateUri } from '../create/create-uri'; +import { isConflict } from '../create/typings'; +import { + TaskFactoryImpl, + WorkspaceInputDialogWithProgress, +} from '../theia/workspace/workspace-input-dialog'; +import { CloudSketchbookTree } from '../widgets/cloud-sketchbook/cloud-sketchbook-tree'; +import { CloudSketchbookTreeModel } from '../widgets/cloud-sketchbook/cloud-sketchbook-tree-model'; +import { + CloudSketchContribution, + pullingSketch, + pushingSketch, + sketchAlreadyExists, + synchronizingSketchbook, +} from './cloud-contribution'; +import { Command, CommandRegistry, Sketch, URI } from './contribution'; + +export interface RenameCloudSketchParams { + readonly cloudUri: URI; + readonly sketch: Sketch; +} + +@injectable() +export class RenameCloudSketch extends CloudSketchContribution { + override registerCommands(registry: CommandRegistry): void { + registry.registerCommand(RenameCloudSketch.Commands.RENAME_CLOUD_SKETCH, { + execute: (params: RenameCloudSketchParams) => + this.renameSketch(params, true), + }); + } + + private async renameSketch( + params: RenameCloudSketchParams, + skipShowErrorMessageOnOpen: boolean, + initValue: string = params.sketch.name + ): Promise { + const treeModel = await this.treeModel(); + if (treeModel) { + const posixPath = params.cloudUri.path.toString(); + const node = treeModel.getNode(posixPath); + const parentNode = node?.parent; + if ( + CloudSketchbookTree.CloudSketchDirNode.is(node) && + CompositeTreeNode.is(parentNode) + ) { + return this.openWizard( + params, + node, + parentNode, + treeModel, + skipShowErrorMessageOnOpen, + initValue + ); + } + } + return undefined; + } + + private async openWizard( + params: RenameCloudSketchParams, + node: CloudSketchbookTree.CloudSketchDirNode, + parentNode: CompositeTreeNode, + treeModel: CloudSketchbookTreeModel, + skipShowErrorMessageOnOpen: boolean, + initialValue?: string | undefined + ): Promise { + const parentUri = CloudSketchbookTree.CloudSketchDirNode.is(parentNode) + ? parentNode.uri + : CreateUri.root; + const existingNames = parentNode.children + .filter(CloudSketchbookTree.CloudSketchDirNode.is) + .map(({ fileStat }) => fileStat.name); + const taskFactory = new TaskFactoryImpl((value) => + this.renameSketchWithProgress(params, node, treeModel, value) + ); + try { + const dialog = new WorkspaceInputDialogWithProgress( + { + title: nls.localize( + 'arduino/renameCloudSketch/renameSketchTitle', + 'New name of the Cloud Sketch' + ), + parentUri, + initialValue, + validate: (input) => { + if (existingNames.includes(input)) { + return sketchAlreadyExists(input); + } + return Sketch.validateCloudSketchFolderName(input) ?? ''; + }, + }, + this.labelProvider, + taskFactory + ); + await dialog.open(skipShowErrorMessageOnOpen); + return dialog.taskResult; + } catch (err) { + if (isConflict(err)) { + await treeModel.refresh(); + return this.renameSketch( + params, + false, + taskFactory.value ?? initialValue + ); + } + throw err; + } + } + + private renameSketchWithProgress( + params: RenameCloudSketchParams, + node: CloudSketchbookTree.CloudSketchDirNode, + treeModel: CloudSketchbookTreeModel, + value: string + ): (progress: Progress) => Promise { + return async (progress: Progress) => { + const fromName = params.cloudUri.path.name; + const fromPosixPath = params.cloudUri.path.toString(); + const toPosixPath = params.cloudUri.parent.resolve(value).path.toString(); + // push + progress.report({ message: pushingSketch(params.sketch.name) }); + await treeModel.sketchbookTree().push(node, true); + + // rename + progress.report({ + message: nls.localize( + 'arduino/cloudSketch/renaming', + "Renaming cloud sketch from '{0}' to '{1}'...", + fromName, + value + ), + }); + await this.createApi.rename(fromPosixPath, toPosixPath); + + // sync + progress.report({ + message: synchronizingSketchbook, + }); + this.createApi.sketchCache.init(); // invalidate the cache + await this.createApi.sketches(); // IDE2 must pull all sketches to find the new one + const sketch = this.createApi.sketchCache.getSketch(toPosixPath); + if (!sketch) { + return undefined; + } + await treeModel.refresh(); + + // pull + progress.report({ message: pullingSketch(sketch.name) }); + const pulledNode = await this.pull(sketch); + return pulledNode + ? node.uri.parent.resolve(sketch.name).toString() + : undefined; + }; + } +} +export namespace RenameCloudSketch { + export namespace Commands { + export const RENAME_CLOUD_SKETCH: Command = { + id: 'arduino-rename-cloud-sketch', + }; + } +} diff --git a/arduino-ide-extension/src/browser/contributions/save-as-sketch.ts b/arduino-ide-extension/src/browser/contributions/save-as-sketch.ts index 2954a6038..1c4747225 100644 --- a/arduino-ide-extension/src/browser/contributions/save-as-sketch.ts +++ b/arduino-ide-extension/src/browser/contributions/save-as-sketch.ts @@ -1,43 +1,72 @@ +import { Dialog } from '@theia/core/lib/browser/dialogs'; +import { NavigatableWidget } from '@theia/core/lib/browser/navigatable'; +import { Saveable } from '@theia/core/lib/browser/saveable'; +import { ApplicationShell } from '@theia/core/lib/browser/shell/application-shell'; +import { WindowService } from '@theia/core/lib/browser/window/window-service'; +import { ApplicationError } from '@theia/core/lib/common/application-error'; +import { nls } from '@theia/core/lib/common/nls'; import { inject, injectable } from '@theia/core/shared/inversify'; -import * as remote from '@theia/core/electron-shared/@electron/remote'; -import * as dateFormat from 'dateformat'; +import { EditorManager } from '@theia/editor/lib/browser/editor-manager'; +import { WorkspaceInput } from '@theia/workspace/lib/browser/workspace-service'; +import { SketchesError } from '../../common/protocol'; +import { StartupTasks } from '../../electron-common/startup-task'; import { ArduinoMenus } from '../menu/arduino-menus'; +import { CurrentSketch } from '../sketches-service-client-impl'; +import { CloudSketchContribution } from './cloud-contribution'; import { - SketchContribution, - URI, Command, CommandRegistry, - MenuModelRegistry, KeybindingRegistry, + MenuModelRegistry, + Sketch, + URI, } from './contribution'; -import { nls } from '@theia/core/lib/common'; -import { ApplicationShell, NavigatableWidget, Saveable } from '@theia/core/lib/browser'; -import { EditorManager } from '@theia/editor/lib/browser'; -import { WindowService } from '@theia/core/lib/browser/window/window-service'; -import { CurrentSketch } from '../../common/protocol/sketches-service-client-impl'; +import { DeleteSketch } from './delete-sketch'; +import { + RenameCloudSketch, + RenameCloudSketchParams, +} from './rename-cloud-sketch'; +import { assertConnectedToBackend } from './save-sketch'; @injectable() -export class SaveAsSketch extends SketchContribution { - +export class SaveAsSketch extends CloudSketchContribution { @inject(ApplicationShell) - protected readonly applicationShell: ApplicationShell; - - @inject(EditorManager) - protected override readonly editorManager: EditorManager; - + private readonly shell: ApplicationShell; @inject(WindowService) - protected readonly windowService: WindowService; + private readonly windowService: WindowService; override registerCommands(registry: CommandRegistry): void { registry.registerCommand(SaveAsSketch.Commands.SAVE_AS_SKETCH, { - execute: (args) => this.saveAs(args), + execute: async (args) => { + try { + return await this.saveAs(args); + } catch (err) { + let message = String(err); + if (ApplicationError.is(err)) { + if (SketchesError.SketchAlreadyContainsThisFile.is(err)) { + message = nls.localize( + 'arduino/sketch/sketchAlreadyContainsThisFileMessage', + 'Failed to save sketch "{0}" as "{1}". {2}', + err.data.sourceSketchName, + err.data.targetSketchName, + err.message + ); + } else { + message = err.message; + } + } else if (err instanceof Error) { + message = err.message; + } + this.messageService.error(message); + } + }, }); } override registerMenus(registry: MenuModelRegistry): void { registry.registerMenuAction(ArduinoMenus.FILE__SKETCH_GROUP, { commandId: SaveAsSketch.Commands.SAVE_AS_SKETCH.id, - label: nls.localize('vscode/fileCommands/saveAs', 'Save As...'), + label: nls.localizeByDefault('Save As...'), order: '7', }); } @@ -52,116 +81,198 @@ export class SaveAsSketch extends SketchContribution { /** * Resolves `true` if the sketch was successfully saved as something. */ - async saveAs( - { + private async saveAs( + params = SaveAsSketch.Options.DEFAULT + ): Promise { + const { execOnlyIfTemp, openAfterMove, wipeOriginal, markAsRecentlyOpened, - }: SaveAsSketch.Options = SaveAsSketch.Options.DEFAULT - ): Promise { + } = params; + assertConnectedToBackend({ + connectionStatusService: this.connectionStatusService, + messageService: this.messageService, + }); const sketch = await this.sketchServiceClient.currentSketch(); if (!CurrentSketch.isValid(sketch)) { return false; } - const isTemp = await this.sketchService.isTemp(sketch); - if (!isTemp && !!execOnlyIfTemp) { - return false; + let destinationUri: string | undefined; + const cloudUri = this.createFeatures.cloudUri(sketch); + if (cloudUri) { + destinationUri = await this.createCloudCopy({ cloudUri, sketch }); + } else { + destinationUri = await this.createLocalCopy(sketch, execOnlyIfTemp); } - - // If target does not exist, propose a `directories.user`/${sketch.name} path - // If target exists, propose `directories.user`/${sketch.name}_copy_${yyyymmddHHMMss} - const sketchDirUri = new URI( - (await this.configService.getConfiguration()).sketchDirUri - ); - const exists = await this.fileService.exists( - sketchDirUri.resolve(sketch.name) - ); - const defaultUri = sketchDirUri.resolve( - exists - ? `${sketch.name}_copy_${dateFormat(new Date(), 'yyyymmddHHMMss')}` - : sketch.name - ); - const defaultPath = await this.fileService.fsPath(defaultUri); - const { filePath, canceled } = await remote.dialog.showSaveDialog({ - title: nls.localize( - 'arduino/sketch/saveFolderAs', - 'Save sketch folder as...' - ), - defaultPath, - }); - if (!filePath || canceled) { - return false; - } - const destinationUri = await this.fileSystemExt.getUri(filePath); if (!destinationUri) { return false; } - const workspaceUri = await this.sketchService.copy(sketch, { + + const copiedSketch = await this.sketchesService.copy(sketch, { destinationUri, }); - if (workspaceUri) { - await this.saveOntoCopiedSketch(sketch.mainFileUri, sketch.uri, workspaceUri); - if (markAsRecentlyOpened) { - this.sketchService.markAsRecentlyOpened(workspaceUri); - } + const newWorkspaceUri = copiedSketch.uri; + + await saveOntoCopiedSketch( + sketch, + newWorkspaceUri, + this.shell, + this.editorManager + ); + if (markAsRecentlyOpened) { + this.sketchesService.markAsRecentlyOpened(newWorkspaceUri); } - if (workspaceUri && openAfterMove) { + const options: WorkspaceInput & StartupTasks = { + preserveWindow: true, + tasks: [], + }; + if (openAfterMove) { this.windowService.setSafeToShutDown(); if (wipeOriginal || (openAfterMove && execOnlyIfTemp)) { - // This window will navigate away. - // Explicitly stop the contribution to dispose the file watcher before deleting the temp sketch. - // Otherwise, users might see irrelevant _Unable to watch for file changes in this large workspace._ notification. - // https://github.com/arduino/arduino-ide/issues/39. - this.sketchServiceClient.onStop(); - // TODO: consider implementing the temp sketch deletion the following way: - // Open the other sketch with a `delete the temp sketch` startup-task. - this.sketchService.notifyDeleteSketch(sketch); // This is a notification and will execute on the backend. + options.tasks.push({ + command: DeleteSketch.Commands.DELETE_SKETCH.id, + args: [{ toDelete: sketch.uri }], + }); } - this.workspaceService.open(new URI(workspaceUri), { - preserveWindow: true, - }); + this.workspaceService.open(new URI(newWorkspaceUri), options); } - return !!workspaceUri; + return !!newWorkspaceUri; + } + + private async createCloudCopy( + params: RenameCloudSketchParams + ): Promise { + return this.commandService.executeCommand( + RenameCloudSketch.Commands.RENAME_CLOUD_SKETCH.id, + params + ); } - private async saveOntoCopiedSketch(mainFileUri: string, sketchUri: string, newSketchUri: string): Promise { - const widgets = this.applicationShell.widgets; - const snapshots = new Map(); - for (const widget of widgets) { - const saveable = Saveable.getDirty(widget); - const uri = NavigatableWidget.getUri(widget); - const uriString = uri?.toString(); - let relativePath: string; - if (uri && uriString!.includes(sketchUri) && saveable && saveable.createSnapshot) { - // The main file will change its name during the copy process - // We need to store the new name in the map - if (mainFileUri === uriString) { - const lastPart = new URI(newSketchUri).path.base + uri.path.ext; - relativePath = '/' + lastPart; - } else { - relativePath = uri.toString().substring(sketchUri.length); + private async createLocalCopy( + sketch: Sketch, + execOnlyIfTemp?: boolean + ): Promise { + const isTemp = await this.sketchesService.isTemp(sketch); + if (!isTemp && !!execOnlyIfTemp) { + return undefined; + } + + const sketchUri = new URI(sketch.uri); + const sketchbookDirUri = await this.defaultUri(); + // If the sketch is temp, IDE2 proposes the default sketchbook folder URI. + // If the sketch is not temp, but not contained in the default sketchbook folder, IDE2 proposes the default location. + // Otherwise, it proposes the parent folder of the current sketch. + const containerDirUri = isTemp + ? sketchbookDirUri + : !sketchbookDirUri.isEqualOrParent(sketchUri) + ? sketchbookDirUri + : sketchUri.parent; + const exists = await this.fileService.exists( + containerDirUri.resolve(sketch.name) + ); + + // If target does not exist, propose a `directories.user`/${sketch.name} path + // If target exists, propose `directories.user`/${sketch.name}_copy_${yyyymmddHHMMss} + // IDE2 must never prompt an invalid sketch folder name (https://github.com/arduino/arduino-ide/pull/1833#issuecomment-1412569252) + const defaultUri = containerDirUri.resolve( + Sketch.toValidSketchFolderName(sketch.name, exists) + ); + const defaultPath = await this.fileService.fsPath(defaultUri); + return await this.promptLocalSketchFolderDestination(sketch, defaultPath); + } + + /** + * Prompts for the new sketch folder name until a valid one is give, + * then resolves with the destination sketch folder URI string, + * or `undefined` if the operation was canceled. + */ + private async promptLocalSketchFolderDestination( + sketch: Sketch, + defaultPath: string + ): Promise { + let sketchFolderDestinationUri: string | undefined; + while (!sketchFolderDestinationUri) { + const { filePath } = await this.dialogService.showSaveDialog({ + title: nls.localize( + 'arduino/sketch/saveFolderAs', + 'Save sketch folder as...' + ), + defaultPath, + }); + if (!filePath) { + return undefined; + } + const destinationUri = await this.fileSystemExt.getUri(filePath); + // The new location of the sketch cannot be inside the location of current sketch. + // https://github.com/arduino/arduino-ide/issues/1882 + let dialogContent: InvalidSketchFolderDialogContent | undefined; + if (new URI(sketch.uri).isEqualOrParent(new URI(destinationUri))) { + dialogContent = { + message: nls.localize( + 'arduino/sketch/invalidSketchFolderLocationMessage', + "Invalid sketch folder location: '{0}'", + filePath + ), + details: nls.localize( + 'arduino/sketch/invalidSketchFolderLocationDetails', + 'You cannot save a sketch into a folder inside itself.' + ), + question: nls.localize( + 'arduino/sketch/editInvalidSketchFolderLocationQuestion', + 'Do you want to try saving the sketch to a different location?' + ), + }; + } + if (!dialogContent) { + const sketchFolderName = new URI(destinationUri).path.base; + const errorMessage = Sketch.validateSketchFolderName(sketchFolderName); + if (errorMessage) { + dialogContent = { + message: nls.localize( + 'arduino/sketch/invalidSketchFolderNameMessage', + "Invalid sketch folder name: '{0}'", + sketchFolderName + ), + details: errorMessage, + question: nls.localize( + 'arduino/sketch/editInvalidSketchFolderQuestion', + 'Do you want to try saving the sketch with a different name?' + ), + }; } - snapshots.set(relativePath, saveable.createSnapshot()); } - } - await Promise.all(Array.from(snapshots.entries()).map(async ([path, snapshot]) => { - const widgetUri = new URI(newSketchUri + path); - try { - const widget = await this.editorManager.getOrCreateByUri(widgetUri); - const saveable = Saveable.get(widget); - if (saveable && saveable.applySnapshot) { - saveable.applySnapshot(snapshot); - await saveable.save(); + if (dialogContent) { + const message = ` +${dialogContent.message} + +${dialogContent.details} + +${dialogContent.question}`.trim(); + defaultPath = filePath; + const { response } = await this.dialogService.showMessageBox({ + message, + buttons: [Dialog.CANCEL, Dialog.YES], + }); + // cancel + if (response === 0) { + return undefined; } - } catch (e) { - console.error(e); + } else { + sketchFolderDestinationUri = destinationUri; } - })); + } + return sketchFolderDestinationUri; } } +interface InvalidSketchFolderDialogContent { + readonly message: string; + readonly details: string; + readonly question: string; +} + export namespace SaveAsSketch { export namespace Commands { export const SAVE_AS_SKETCH: Command = { @@ -186,3 +297,48 @@ export namespace SaveAsSketch { }; } } + +export async function saveOntoCopiedSketch( + sketch: Sketch, + newSketchFolderUri: string, + shell: ApplicationShell, + editorManager: EditorManager +): Promise { + const widgets = shell.widgets; + const snapshots = new Map(); + for (const widget of widgets) { + const saveable = Saveable.getDirty(widget); + const uri = NavigatableWidget.getUri(widget); + if (!uri) { + continue; + } + const uriString = uri.toString(); + let relativePath: string; + if (uriString.includes(sketch.uri) && saveable && saveable.createSnapshot) { + // The main file will change its name during the copy process + // We need to store the new name in the map + if (sketch.mainFileUri === uriString) { + const lastPart = new URI(newSketchFolderUri).path.base + uri.path.ext; + relativePath = '/' + lastPart; + } else { + relativePath = uri.toString().substring(sketch.uri.length); + } + snapshots.set(relativePath, saveable.createSnapshot()); + } + } + await Promise.all( + Array.from(snapshots.entries()).map(async ([path, snapshot]) => { + const widgetUri = new URI(newSketchFolderUri + path); + try { + const widget = await editorManager.getOrCreateByUri(widgetUri); + const saveable = Saveable.get(widget); + if (saveable && saveable.applySnapshot) { + saveable.applySnapshot(snapshot); + await saveable.save(); + } + } catch (e) { + console.error(e); + } + }) + ); +} diff --git a/arduino-ide-extension/src/browser/contributions/save-sketch.ts b/arduino-ide-extension/src/browser/contributions/save-sketch.ts index dce6405c3..ac20d8aa6 100644 --- a/arduino-ide-extension/src/browser/contributions/save-sketch.ts +++ b/arduino-ide-extension/src/browser/contributions/save-sketch.ts @@ -1,17 +1,18 @@ -import { injectable } from '@theia/core/shared/inversify'; import { CommonCommands } from '@theia/core/lib/browser/common-frontend-contribution'; +import { MessageService } from '@theia/core/lib/common/message-service'; +import { nls } from '@theia/core/lib/common/nls'; +import { injectable } from '@theia/core/shared/inversify'; import { ArduinoMenus } from '../menu/arduino-menus'; -import { ArduinoToolbar } from '../toolbar/arduino-toolbar'; -import { SaveAsSketch } from './save-as-sketch'; +import { CurrentSketch } from '../sketches-service-client-impl'; +import { ApplicationConnectionStatusContribution } from '../theia/core/connection-status-service'; import { - SketchContribution, Command, CommandRegistry, - MenuModelRegistry, KeybindingRegistry, + MenuModelRegistry, + SketchContribution, } from './contribution'; -import { nls } from '@theia/core/lib/common'; -import { CurrentSketch } from '../../common/protocol/sketches-service-client-impl'; +import { SaveAsSketch } from './save-as-sketch'; @injectable() export class SaveSketch extends SketchContribution { @@ -19,19 +20,13 @@ export class SaveSketch extends SketchContribution { registry.registerCommand(SaveSketch.Commands.SAVE_SKETCH, { execute: () => this.saveSketch(), }); - registry.registerCommand(SaveSketch.Commands.SAVE_SKETCH__TOOLBAR, { - isVisible: (widget) => - ArduinoToolbar.is(widget) && widget.side === 'left', - execute: () => - registry.executeCommand(SaveSketch.Commands.SAVE_SKETCH.id), - }); } override registerMenus(registry: MenuModelRegistry): void { registry.registerMenuAction(ArduinoMenus.FILE__SKETCH_GROUP, { commandId: SaveSketch.Commands.SAVE_SKETCH.id, label: nls.localize('vscode/fileCommands/save', 'Save'), - order: '6', + order: '7', }); } @@ -43,11 +38,15 @@ export class SaveSketch extends SketchContribution { } async saveSketch(): Promise { + assertConnectedToBackend({ + connectionStatusService: this.connectionStatusService, + messageService: this.messageService, + }); const sketch = await this.sketchServiceClient.currentSketch(); if (!CurrentSketch.isValid(sketch)) { return; } - const isTemp = await this.sketchService.isTemp(sketch); + const isTemp = await this.sketchesService.isTemp(sketch); if (isTemp) { return this.commandService.executeCommand( SaveAsSketch.Commands.SAVE_AS_SKETCH.id, @@ -68,8 +67,20 @@ export namespace SaveSketch { export const SAVE_SKETCH: Command = { id: 'arduino-save-sketch', }; - export const SAVE_SKETCH__TOOLBAR: Command = { - id: 'arduino-save-sketch--toolbar', - }; + } +} + +// https://github.com/arduino/arduino-ide/issues/2081 +export function assertConnectedToBackend(param: { + connectionStatusService: ApplicationConnectionStatusContribution; + messageService: MessageService; +}): void { + if (param.connectionStatusService.offlineStatus === 'backend') { + const message = nls.localize( + 'theia/core/couldNotSave', + 'Could not save the sketch. Please copy your unsaved work into your favorite text editor, and restart the IDE.' + ); + param.messageService.error(message); + throw new Error(message); } } diff --git a/arduino-ide-extension/src/browser/contributions/selected-board.ts b/arduino-ide-extension/src/browser/contributions/selected-board.ts index bf8a84ae8..00fbba575 100644 --- a/arduino-ide-extension/src/browser/contributions/selected-board.ts +++ b/arduino-ide-extension/src/browser/contributions/selected-board.ts @@ -4,7 +4,10 @@ import { } from '@theia/core/lib/browser/status-bar/status-bar'; import { nls } from '@theia/core/lib/common/nls'; import { inject, injectable } from '@theia/core/shared/inversify'; -import { BoardsConfig } from '../boards/boards-config'; +import type { + BoardList, + BoardListItem, +} from '../../common/protocol/board-list'; import { BoardsServiceProvider } from '../boards/boards-service-provider'; import { Contribution } from './contribution'; @@ -12,21 +15,23 @@ import { Contribution } from './contribution'; export class SelectedBoard extends Contribution { @inject(StatusBar) private readonly statusBar: StatusBar; - @inject(BoardsServiceProvider) private readonly boardsServiceProvider: BoardsServiceProvider; override onStart(): void { - this.boardsServiceProvider.onBoardsConfigChanged((config) => - this.update(config) + this.boardsServiceProvider.onBoardListDidChange((boardList) => + this.update(boardList) ); } override onReady(): void { - this.update(this.boardsServiceProvider.boardsConfig); + this.boardsServiceProvider.ready.then(() => this.update()); } - private update({ selectedBoard, selectedPort }: BoardsConfig.Config): void { + private update( + boardList: BoardList = this.boardsServiceProvider.boardList + ): void { + const { selectedBoard, selectedPort } = boardList.boardsConfig; this.statusBar.setElement('arduino-selected-board', { alignment: StatusBarAlignment.RIGHT, text: selectedBoard @@ -38,17 +43,30 @@ export class SelectedBoard extends Contribution { className: 'arduino-selected-board', }); if (selectedBoard) { + const notConnectedLabel = nls.localize( + 'arduino/common/notConnected', + '[not connected]' + ); + let portLabel = notConnectedLabel; + if (selectedPort) { + portLabel = nls.localize( + 'arduino/common/selectedOn', + 'on {0}', + selectedPort.address + ); + const selectedItem: BoardListItem | undefined = + boardList.items[boardList.selectedIndex]; + if (!selectedItem) { + portLabel += ` ${notConnectedLabel}`; // append ` [not connected]` when the port is selected but it's not detected by the CLI + } + } this.statusBar.setElement('arduino-selected-port', { alignment: StatusBarAlignment.RIGHT, - text: selectedPort - ? nls.localize( - 'arduino/common/selectedOn', - 'on {0}', - selectedPort.address - ) - : nls.localize('arduino/common/notConnected', '[not connected]'), + text: portLabel, className: 'arduino-selected-port', }); + } else { + this.statusBar.removeElement('arduino-selected-port'); } } } diff --git a/arduino-ide-extension/src/browser/contributions/sketch-control.ts b/arduino-ide-extension/src/browser/contributions/sketch-control.ts index f5cc85334..64bbb1ce9 100644 --- a/arduino-ide-extension/src/browser/contributions/sketch-control.ts +++ b/arduino-ide-extension/src/browser/contributions/sketch-control.ts @@ -1,50 +1,34 @@ -import { inject, injectable } from '@theia/core/shared/inversify'; import { CommonCommands } from '@theia/core/lib/browser/common-frontend-contribution'; -import { ApplicationShell } from '@theia/core/lib/browser/shell/application-shell'; -import { WorkspaceCommands } from '@theia/workspace/lib/browser'; import { ContextMenuRenderer } from '@theia/core/lib/browser/context-menu-renderer'; +import { ApplicationShell } from '@theia/core/lib/browser/shell/application-shell'; import { Disposable, DisposableCollection, } from '@theia/core/lib/common/disposable'; +import { nls } from '@theia/core/lib/common/nls'; +import { inject, injectable } from '@theia/core/shared/inversify'; +import { WorkspaceCommands } from '@theia/workspace/lib/browser/workspace-commands'; +import { ArduinoMenus } from '../menu/arduino-menus'; +import { CurrentSketch } from '../sketches-service-client-impl'; import { - URI, - SketchContribution, Command, CommandRegistry, - MenuModelRegistry, KeybindingRegistry, - TabBarToolbarRegistry, + MenuModelRegistry, open, + SketchContribution, + TabBarToolbarRegistry, + URI, } from './contribution'; -import { ArduinoMenus, PlaceholderMenuNode } from '../menu/arduino-menus'; -import { EditorManager } from '@theia/editor/lib/browser/editor-manager'; -import { - CurrentSketch, - SketchesServiceClientImpl, -} from '../../common/protocol/sketches-service-client-impl'; -import { LocalCacheFsProvider } from '../local-cache/local-cache-fs-provider'; -import { nls } from '@theia/core/lib/common'; @injectable() export class SketchControl extends SketchContribution { @inject(ApplicationShell) - protected readonly shell: ApplicationShell; - + private readonly shell: ApplicationShell; @inject(MenuModelRegistry) - protected readonly menuRegistry: MenuModelRegistry; - + private readonly menuRegistry: MenuModelRegistry; @inject(ContextMenuRenderer) - protected readonly contextMenuRenderer: ContextMenuRenderer; - - @inject(EditorManager) - protected override readonly editorManager: EditorManager; - - @inject(SketchesServiceClientImpl) - protected readonly sketchesServiceClient: SketchesServiceClientImpl; - - @inject(LocalCacheFsProvider) - protected readonly localCacheFsProvider: LocalCacheFsProvider; + private readonly contextMenuRenderer: ContextMenuRenderer; protected readonly toDisposeBeforeCreateNewContextMenu = new DisposableCollection(); @@ -57,107 +41,57 @@ export class SketchControl extends SketchContribution { this.shell.getWidgets('main').indexOf(widget) !== -1, execute: async () => { this.toDisposeBeforeCreateNewContextMenu.dispose(); - const sketch = await this.sketchServiceClient.currentSketch(); - if (!CurrentSketch.isValid(sketch)) { - return; - } + let parentElement: HTMLElement | undefined = undefined; const target = document.getElementById( SketchControl.Commands.OPEN_SKETCH_CONTROL__TOOLBAR.id ); - if (!(target instanceof HTMLElement)) { - return; + if (target instanceof HTMLElement) { + parentElement = target.parentElement ?? undefined; } - const { parentElement } = target; if (!parentElement) { return; } - const { mainFileUri, rootFolderFileUris } = sketch; - const uris = [mainFileUri, ...rootFolderFileUris]; + const sketch = await this.sketchServiceClient.currentSketch(); + if (!CurrentSketch.isValid(sketch)) { + return; + } - const parentSketchUri = this.editorManager.currentEditor - ?.getResourceUri() - ?.toString(); - const parentSketch = await this.sketchService.getSketchFolder( - parentSketchUri || '' + this.menuRegistry.registerMenuAction( + ArduinoMenus.SKETCH_CONTROL__CONTEXT__MAIN_GROUP, + { + commandId: WorkspaceCommands.FILE_RENAME.id, + label: nls.localize('vscode/fileActions/rename', 'Rename'), + order: '1', + } ); - - // if the current file is in the current opened sketch, show extra menus - if ( - sketch && - parentSketch && - parentSketch.uri === sketch.uri && - this.allowRename(parentSketch.uri) - ) { - this.menuRegistry.registerMenuAction( - ArduinoMenus.SKETCH_CONTROL__CONTEXT__MAIN_GROUP, - { - commandId: WorkspaceCommands.FILE_RENAME.id, - label: nls.localize('vscode/fileActions/rename', 'Rename'), - order: '1', - } - ); - this.toDisposeBeforeCreateNewContextMenu.push( - Disposable.create(() => - this.menuRegistry.unregisterMenuAction( - WorkspaceCommands.FILE_RENAME - ) + this.toDisposeBeforeCreateNewContextMenu.push( + Disposable.create(() => + this.menuRegistry.unregisterMenuAction( + WorkspaceCommands.FILE_RENAME ) - ); - } else { - const renamePlaceholder = new PlaceholderMenuNode( - ArduinoMenus.SKETCH_CONTROL__CONTEXT__MAIN_GROUP, - nls.localize('vscode/fileActions/rename', 'Rename') - ); - this.menuRegistry.registerMenuNode( - ArduinoMenus.SKETCH_CONTROL__CONTEXT__MAIN_GROUP, - renamePlaceholder - ); - this.toDisposeBeforeCreateNewContextMenu.push( - Disposable.create(() => - this.menuRegistry.unregisterMenuNode(renamePlaceholder.id) - ) - ); - } + ) + ); - if ( - sketch && - parentSketch && - parentSketch.uri === sketch.uri && - this.allowDelete(parentSketch.uri) - ) { - this.menuRegistry.registerMenuAction( - ArduinoMenus.SKETCH_CONTROL__CONTEXT__MAIN_GROUP, - { - commandId: WorkspaceCommands.FILE_DELETE.id, // TODO: customize delete. Wipe sketch if deleting main file. Close window. - label: nls.localize('vscode/fileActions/delete', 'Delete'), - order: '2', - } - ); - this.toDisposeBeforeCreateNewContextMenu.push( - Disposable.create(() => - this.menuRegistry.unregisterMenuAction( - WorkspaceCommands.FILE_DELETE - ) - ) - ); - } else { - const deletePlaceholder = new PlaceholderMenuNode( - ArduinoMenus.SKETCH_CONTROL__CONTEXT__MAIN_GROUP, - nls.localize('vscode/fileActions/delete', 'Delete') - ); - this.menuRegistry.registerMenuNode( - ArduinoMenus.SKETCH_CONTROL__CONTEXT__MAIN_GROUP, - deletePlaceholder - ); - this.toDisposeBeforeCreateNewContextMenu.push( - Disposable.create(() => - this.menuRegistry.unregisterMenuNode(deletePlaceholder.id) + this.menuRegistry.registerMenuAction( + ArduinoMenus.SKETCH_CONTROL__CONTEXT__MAIN_GROUP, + { + commandId: WorkspaceCommands.FILE_DELETE.id, + label: nls.localize('vscode/fileActions/delete', 'Delete'), + order: '2', + } + ); + this.toDisposeBeforeCreateNewContextMenu.push( + Disposable.create(() => + this.menuRegistry.unregisterMenuAction( + WorkspaceCommands.FILE_DELETE ) - ); - } + ) + ); + const { mainFileUri, rootFolderFileUris } = sketch; + const uris = [mainFileUri, ...rootFolderFileUris]; for (let i = 0; i < uris.length; i++) { const uri = new URI(uris[i]); @@ -176,7 +110,7 @@ export class SketchControl extends SketchContribution { { commandId: command.id, label: this.labelProvider.getName(uri), - order: `${i}`, + order: String(i).padStart(4), } ); this.toDisposeBeforeCreateNewContextMenu.push( @@ -193,6 +127,7 @@ export class SketchControl extends SketchContribution { parentElement.getBoundingClientRect().top + parentElement.offsetHeight, }, + showDisabled: true, }; this.contextMenuRenderer.render(options); }, @@ -235,7 +170,7 @@ export class SketchControl extends SketchContribution { }); registry.registerKeybinding({ command: CommonCommands.PREVIOUS_TAB.id, - keybinding: 'CtrlCmd+Alt+Left', // TODO: check why electron does not show the keybindings in the UI. + keybinding: 'CtrlCmd+Alt+Left', }); registry.registerKeybinding({ command: CommonCommands.NEXT_TAB.id, @@ -249,27 +184,6 @@ export class SketchControl extends SketchContribution { command: SketchControl.Commands.OPEN_SKETCH_CONTROL__TOOLBAR.id, }); } - - protected isCloudSketch(uri: string): boolean { - try { - const cloudCacheLocation = this.localCacheFsProvider.from(new URI(uri)); - - if (cloudCacheLocation) { - return true; - } - return false; - } catch { - return false; - } - } - - protected allowRename(uri: string): boolean { - return !this.isCloudSketch(uri); - } - - protected allowDelete(uri: string): boolean { - return !this.isCloudSketch(uri); - } } export namespace SketchControl { diff --git a/arduino-ide-extension/src/browser/contributions/sketch-files-tracker.ts b/arduino-ide-extension/src/browser/contributions/sketch-files-tracker.ts index fcd07cb67..d7c1c68d6 100644 --- a/arduino-ide-extension/src/browser/contributions/sketch-files-tracker.ts +++ b/arduino-ide-extension/src/browser/contributions/sketch-files-tracker.ts @@ -3,8 +3,8 @@ import { DisposableCollection } from '@theia/core/lib/common/disposable'; import { inject, injectable } from '@theia/core/shared/inversify'; import { FileSystemFrontendContribution } from '@theia/filesystem/lib/browser/filesystem-frontend-contribution'; import { FileChangeType } from '@theia/filesystem/lib/common/files'; -import { CurrentSketch } from '../../common/protocol/sketches-service-client-impl'; -import { Sketch, SketchContribution, URI } from './contribution'; +import { CurrentSketch } from '../sketches-service-client-impl'; +import { Sketch, SketchContribution } from './contribution'; import { OpenSketchFiles } from './open-sketch-files'; @injectable() @@ -31,7 +31,6 @@ export class SketchFilesTracker extends SketchContribution { override onReady(): void { this.sketchServiceClient.currentSketch().then(async (sketch) => { if (CurrentSketch.isValid(sketch)) { - this.toDisposeOnStop.push(this.fileService.watch(new URI(sketch.uri))); this.toDisposeOnStop.push( this.fileService.onDidFilesChange(async (event) => { for (const { type, resource } of event.changes) { @@ -39,7 +38,7 @@ export class SketchFilesTracker extends SketchContribution { type === FileChangeType.ADDED && resource.parent.toString() === sketch.uri ) { - const reloadedSketch = await this.sketchService.loadSketch( + const reloadedSketch = await this.sketchesService.loadSketch( sketch.uri ); if (Sketch.isInSketch(resource, reloadedSketch)) { diff --git a/arduino-ide-extension/src/browser/contributions/sketchbook.ts b/arduino-ide-extension/src/browser/contributions/sketchbook.ts index fdac918b7..3e6bca2ec 100644 --- a/arduino-ide-extension/src/browser/contributions/sketchbook.ts +++ b/arduino-ide-extension/src/browser/contributions/sketchbook.ts @@ -1,44 +1,27 @@ -import { inject, injectable } from '@theia/core/shared/inversify'; +import { injectable } from '@theia/core/shared/inversify'; import { CommandHandler } from '@theia/core/lib/common/command'; -import { CommandRegistry, MenuModelRegistry } from './contribution'; +import { MenuModelRegistry } from './contribution'; import { ArduinoMenus } from '../menu/arduino-menus'; -import { MainMenuManager } from '../../common/main-menu-manager'; -import { NotificationCenter } from '../notification-center'; import { Examples } from './examples'; -import { - SketchContainer, - SketchesError, - SketchRef, -} from '../../common/protocol'; +import { SketchContainer, SketchesError } from '../../common/protocol'; import { OpenSketch } from './open-sketch'; -import { nls } from '@theia/core/lib/common'; +import { nls } from '@theia/core/lib/common/nls'; @injectable() export class Sketchbook extends Examples { - @inject(CommandRegistry) - protected override readonly commandRegistry: CommandRegistry; - - @inject(MenuModelRegistry) - protected override readonly menuRegistry: MenuModelRegistry; - - @inject(MainMenuManager) - protected readonly mainMenuManager: MainMenuManager; - - @inject(NotificationCenter) - protected readonly notificationCenter: NotificationCenter; - override onStart(): void { this.sketchServiceClient.onSketchbookDidChange(() => this.update()); + this.configService.onDidChangeSketchDirUri(() => this.update()); } override async onReady(): Promise { this.update(); } - private update() { - this.sketchService.getSketches({}).then((container) => { + protected override update(): void { + this.sketchesService.getSketches({}).then((container) => { this.register(container); - this.mainMenuManager.update(); + this.menuManager.update(); }); } @@ -50,7 +33,7 @@ export class Sketchbook extends Examples { ); } - protected register(container: SketchContainer): void { + private register(container: SketchContainer): void { this.toDispose.dispose(); this.registerRecursively( [...container.children, ...container.sketches], @@ -62,24 +45,19 @@ export class Sketchbook extends Examples { protected override createHandler(uri: string): CommandHandler { return { execute: async () => { - let sketch: SketchRef | undefined = undefined; try { - sketch = await this.sketchService.loadSketch(uri); + await this.commandService.executeCommand( + OpenSketch.Commands.OPEN_SKETCH.id, + uri + ); } catch (err) { if (SketchesError.NotFound.is(err)) { - // To handle the following: - // Open IDE2, delete a sketch from sketchbook, click on File > Sketchbook > the deleted sketch. - // Filesystem watcher misses out delete events on macOS; hence IDE2 has no chance to update the menu items. - this.messageService.error(err.message); + // Force update the menu items to remove the absent sketch. this.update(); + } else { + throw err; } } - if (sketch) { - await this.commandService.executeCommand( - OpenSketch.Commands.OPEN_SKETCH.id, - sketch - ); - } }, }; } diff --git a/arduino-ide-extension/src/browser/contributions/startup-tasks-executor.ts b/arduino-ide-extension/src/browser/contributions/startup-tasks-executor.ts new file mode 100644 index 000000000..6c1836012 --- /dev/null +++ b/arduino-ide-extension/src/browser/contributions/startup-tasks-executor.ts @@ -0,0 +1,65 @@ +import { DisposableCollection } from '@theia/core/lib/common/disposable'; +import { + inject, + injectable, + postConstruct, +} from '@theia/core/shared/inversify'; +import { + hasStartupTasks, + StartupTasks, +} from '../../electron-common/startup-task'; +import { AppService } from '../app-service'; +import { Contribution } from './contribution'; + +@injectable() +export class StartupTasksExecutor extends Contribution { + @inject(AppService) + private readonly appService: AppService; + + private readonly toDispose = new DisposableCollection(); + + @postConstruct() + protected override init(): void { + super.init(); + this.toDispose.push( + this.appService.registerStartupTasksHandler((tasks) => + this.handleStartupTasks(tasks) + ) + ); + } + + onStop(): void { + this.toDispose.dispose(); + } + + private async handleStartupTasks(tasks: StartupTasks): Promise { + console.debug( + `Received the startup tasks from the electron main process. Args: ${JSON.stringify( + tasks + )}` + ); + if (!hasStartupTasks(tasks)) { + console.warn(`Could not detect 'tasks' from the signal. Skipping.`); + return; + } + await this.appStateService.reachedState('ready'); + console.log(`Executing startup tasks:`); + tasks.tasks.forEach(({ command, args = [] }) => { + console.log( + ` - '${command}' ${ + args.length ? `, args: ${JSON.stringify(args)}` : '' + }` + ); + this.commandService + .executeCommand(command, ...args) + .catch((err) => + console.error( + `Error occurred when executing the startup task '${command}'${ + args?.length ? ` with args: '${JSON.stringify(args)}` : '' + }.`, + err + ) + ); + }); + } +} diff --git a/arduino-ide-extension/src/browser/contributions/survey-notification.ts b/arduino-ide-extension/src/browser/contributions/survey-notification.ts deleted file mode 100644 index e1a4817a6..000000000 --- a/arduino-ide-extension/src/browser/contributions/survey-notification.ts +++ /dev/null @@ -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}`; - } -} diff --git a/arduino-ide-extension/src/browser/contributions/update-arduino-state.ts b/arduino-ide-extension/src/browser/contributions/update-arduino-state.ts new file mode 100644 index 000000000..bce3fa850 --- /dev/null +++ b/arduino-ide-extension/src/browser/contributions/update-arduino-state.ts @@ -0,0 +1,189 @@ +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 type { ArduinoState } from 'vscode-arduino-api'; +import { + BoardsConfig, + BoardsService, + CompileSummary, + PortIdentifier, + resolveDetectedPort, +} from '../../common/protocol'; +import { + toApiBoardDetails, + toApiCompileSummary, + toApiPort, +} from '../../common/protocol/arduino-context-mapper'; +import { BoardsDataStore } from '../boards/boards-data-store'; +import { BoardsServiceProvider } from '../boards/boards-service-provider'; +import { HostedPluginSupport } from '../hosted/hosted-plugin-support'; +import { CurrentSketch } from '../sketches-service-client-impl'; +import { SketchContribution } from './contribution'; +import { CompileSummaryProvider } from './verify-sketch'; + +/** + * (non-API) exported for tests + */ +export interface UpdateStateParams { + readonly key: keyof T; + readonly value: T[keyof T]; +} + +/** + * Contribution for updating the Arduino state, such as the FQBN, selected port, and sketch path changes via commands, so other VS Code extensions can access it. + * See [`vscode-arduino-api`](https://github.com/dankeboy36/vscode-arduino-api#api) for more details. + */ +@injectable() +export class UpdateArduinoState extends SketchContribution { + @inject(BoardsService) + private readonly boardsService: BoardsService; + @inject(BoardsServiceProvider) + private readonly boardsServiceProvider: BoardsServiceProvider; + @inject(BoardsDataStore) + private readonly boardsDataStore: BoardsDataStore; + @inject(HostedPluginSupport) + private readonly hostedPluginSupport: HostedPluginSupport; + @inject(CompileSummaryProvider) + private readonly compileSummaryProvider: CompileSummaryProvider; + + private readonly toDispose = new DisposableCollection(); + + override onStart(): void { + this.toDispose.pushAll([ + this.boardsServiceProvider.onBoardsConfigDidChange(() => + this.updateBoardsConfig(this.boardsServiceProvider.boardsConfig) + ), + this.sketchServiceClient.onCurrentSketchDidChange((sketch) => + this.updateSketchPath(sketch) + ), + this.configService.onDidChangeDataDirUri((dataDirUri) => + this.updateDataDirPath(dataDirUri) + ), + this.configService.onDidChangeSketchDirUri((userDirUri) => + this.updateUserDirPath(userDirUri) + ), + this.compileSummaryProvider.onDidChangeCompileSummary( + (compilerSummary) => { + if (compilerSummary) { + this.updateCompileSummary(compilerSummary); + } + } + ), + this.boardsDataStore.onDidChange((event) => { + const selectedFqbn = + this.boardsServiceProvider.boardsConfig.selectedBoard?.fqbn; + if ( + selectedFqbn && + event.changes.find((change) => change.fqbn === selectedFqbn) + ) { + this.updateBoardDetails(selectedFqbn); + } + }), + ]); + } + + override onReady(): void { + this.boardsServiceProvider.ready.then(() => { + this.updateBoardsConfig(this.boardsServiceProvider.boardsConfig); + }); + this.updateSketchPath(this.sketchServiceClient.tryGetCurrentSketch()); + this.updateUserDirPath(this.configService.tryGetSketchDirUri()); + this.updateDataDirPath(this.configService.tryGetDataDirUri()); + const { compileSummary } = this.compileSummaryProvider; + if (compileSummary) { + this.updateCompileSummary(compileSummary); + } + } + + onStop(): void { + this.toDispose.dispose(); + } + + private async updateSketchPath( + sketch: CurrentSketch | undefined + ): Promise { + const sketchPath = CurrentSketch.isValid(sketch) + ? new URI(sketch.uri).path.fsPath() + : undefined; + return this.updateState({ key: 'sketchPath', value: sketchPath }); + } + + private async updateCompileSummary( + compileSummary: CompileSummary + ): Promise { + const apiCompileSummary = toApiCompileSummary(compileSummary); + return this.updateState({ + key: 'compileSummary', + value: apiCompileSummary, + }); + } + + private async updateBoardsConfig(boardsConfig: BoardsConfig): Promise { + const fqbn = boardsConfig.selectedBoard?.fqbn; + const port = boardsConfig.selectedPort; + await this.updateFqbn(fqbn); + await this.updateBoardDetails(fqbn); + await this.updatePort(port); + } + + private async updateFqbn(fqbn: string | undefined): Promise { + await this.updateState({ key: 'fqbn', value: fqbn }); + } + + private async updateBoardDetails(fqbn: string | undefined): Promise { + const unset = () => + this.updateState({ key: 'boardDetails', value: undefined }); + if (!fqbn) { + return unset(); + } + const [details, persistedData] = await Promise.all([ + this.boardsService.getBoardDetails({ fqbn }), + this.boardsDataStore.getData(fqbn), + ]); + if (!details) { + return unset(); + } + const apiBoardDetails = toApiBoardDetails({ + ...details, + configOptions: + BoardsDataStore.Data.EMPTY === persistedData + ? details.configOptions + : persistedData.configOptions.slice(), + }); + return this.updateState({ + key: 'boardDetails', + value: apiBoardDetails, + }); + } + + private async updatePort(port: PortIdentifier | undefined): Promise { + const resolvedPort = + port && + resolveDetectedPort(port, this.boardsServiceProvider.detectedPorts); + const apiPort = resolvedPort && toApiPort(resolvedPort); + return this.updateState({ key: 'port', value: apiPort }); + } + + private async updateUserDirPath(userDirUri: URI | undefined): Promise { + const userDirPath = userDirUri?.path.fsPath(); + return this.updateState({ + key: 'userDirPath', + value: userDirPath, + }); + } + + private async updateDataDirPath(dataDirUri: URI | undefined): Promise { + const dataDirPath = dataDirUri?.path.fsPath(); + return this.updateState({ + key: 'dataDirPath', + value: dataDirPath, + }); + } + + private async updateState( + params: UpdateStateParams + ): Promise { + await this.hostedPluginSupport.didStart; + return this.commandService.executeCommand('arduinoAPI.updateState', params); + } +} diff --git a/arduino-ide-extension/src/browser/contributions/update-indexes.ts b/arduino-ide-extension/src/browser/contributions/update-indexes.ts new file mode 100644 index 000000000..fc4e6d078 --- /dev/null +++ b/arduino-ide-extension/src/browser/contributions/update-indexes.ts @@ -0,0 +1,193 @@ +import { LocalStorageService } from '@theia/core/lib/browser/storage-service'; +import { nls } from '@theia/core/lib/common/nls'; +import { inject, injectable } from '@theia/core/shared/inversify'; +import { CoreService, IndexType } from '../../common/protocol'; +import { NotificationCenter } from '../notification-center'; +import { WindowServiceExt } from '../theia/core/window-service-ext'; +import { Command, CommandRegistry, Contribution } from './contribution'; + +@injectable() +export class UpdateIndexes extends Contribution { + @inject(WindowServiceExt) + private readonly windowService: WindowServiceExt; + @inject(LocalStorageService) + private readonly localStorage: LocalStorageService; + @inject(CoreService) + private readonly coreService: CoreService; + @inject(NotificationCenter) + private readonly notificationCenter: NotificationCenter; + + protected override init(): void { + super.init(); + this.notificationCenter.onIndexUpdateDidComplete(({ summary }) => + Promise.all( + Object.entries(summary).map(([type, updatedAt]) => + this.setLastUpdateDateTime(type as IndexType, updatedAt) + ) + ) + ); + } + + override onReady(): void { + this.checkForUpdates(); + } + + override registerCommands(registry: CommandRegistry): void { + registry.registerCommand(UpdateIndexes.Commands.UPDATE_INDEXES, { + execute: () => this.updateIndexes(IndexType.All, true), + }); + registry.registerCommand(UpdateIndexes.Commands.UPDATE_PLATFORM_INDEX, { + execute: () => this.updateIndexes(['platform'], true), + }); + registry.registerCommand(UpdateIndexes.Commands.UPDATE_LIBRARY_INDEX, { + execute: () => this.updateIndexes(['library'], true), + }); + } + + private async checkForUpdates(): Promise { + const checkForUpdates = this.preferences['arduino.checkForUpdates']; + if (!checkForUpdates) { + console.debug( + '[update-indexes]: `arduino.checkForUpdates` is `false`. Skipping updating the indexes.' + ); + return; + } + + if (await this.windowService.isFirstWindow()) { + const summary = await this.coreService.indexUpdateSummaryBeforeInit(); + if (summary.message) { + this.messageService.error(summary.message); + } + const typesToCheck = IndexType.All.filter((type) => !(type in summary)); + if (Object.keys(summary).length) { + console.debug( + `[update-indexes]: Detected an index update summary before the core gRPC client initialization. Updating local storage with ${JSON.stringify( + summary + )}` + ); + } else { + console.debug( + '[update-indexes]: No index update summary was available before the core gRPC client initialization. Checking the status of the all the index types.' + ); + } + await Promise.allSettled([ + ...Object.entries(summary).map(([type, updatedAt]) => + this.setLastUpdateDateTime(type as IndexType, updatedAt) + ), + this.updateIndexes(typesToCheck), + ]); + } + } + + private async updateIndexes( + types: IndexType[], + force = false + ): Promise { + const updatedAt = new Date().toISOString(); + return Promise.all( + types.map((type) => this.needsIndexUpdate(type, updatedAt, force)) + ).then((needsIndexUpdateResults) => { + const typesToUpdate = needsIndexUpdateResults.filter(IndexType.is); + if (typesToUpdate.length) { + console.debug( + `[update-indexes]: Requesting the index update of type: ${JSON.stringify( + typesToUpdate + )} with date time: ${updatedAt}.` + ); + return this.coreService.updateIndex({ types: typesToUpdate }); + } + }); + } + + private async needsIndexUpdate( + type: IndexType, + now: string, + force = false + ): Promise { + if (force) { + console.debug( + `[update-indexes]: Update for index type: '${type}' was forcefully requested.` + ); + return type; + } + const lastUpdateIsoDateTime = await this.getLastUpdateDateTime(type); + if (!lastUpdateIsoDateTime) { + console.debug( + `[update-indexes]: No last update date time was persisted for index type: '${type}'. Index update is required.` + ); + return type; + } + const lastUpdateDateTime = Date.parse(lastUpdateIsoDateTime); + if (Number.isNaN(lastUpdateDateTime)) { + console.debug( + `[update-indexes]: Invalid last update date time was persisted for index type: '${type}'. Last update date time was: ${lastUpdateDateTime}. Index update is required.` + ); + return type; + } + const diff = new Date(now).getTime() - lastUpdateDateTime; + const needsIndexUpdate = diff >= this.threshold; + console.debug( + `[update-indexes]: Update for index type '${type}' is ${ + needsIndexUpdate ? '' : 'not ' + }required. Now: ${now}, Last index update date time: ${new Date( + lastUpdateDateTime + ).toISOString()}, diff: ${diff} ms, threshold: ${this.threshold} ms.` + ); + return needsIndexUpdate ? type : false; + } + + private async getLastUpdateDateTime( + type: IndexType + ): Promise { + const key = this.storageKeyOf(type); + return this.localStorage.getData(key); + } + + private async setLastUpdateDateTime( + type: IndexType, + updatedAt: string + ): Promise { + const key = this.storageKeyOf(type); + return this.localStorage.setData(key, updatedAt).finally(() => { + console.debug( + `[update-indexes]: Updated the last index update date time of '${type}' to ${updatedAt}.` + ); + }); + } + + private storageKeyOf(type: IndexType): string { + return `index-last-update-time--${type}`; + } + + private get threshold(): number { + return 4 * 60 * 60 * 1_000; // four hours in millis + } +} +export namespace UpdateIndexes { + export namespace Commands { + export const UPDATE_INDEXES: Command & { label: string } = { + id: 'arduino-update-indexes', + label: nls.localize( + 'arduino/updateIndexes/updateIndexes', + 'Update Indexes' + ), + category: 'Arduino', + }; + export const UPDATE_PLATFORM_INDEX: Command & { label: string } = { + id: 'arduino-update-package-index', + label: nls.localize( + 'arduino/updateIndexes/updatePackageIndex', + 'Update Package Index' + ), + category: 'Arduino', + }; + export const UPDATE_LIBRARY_INDEX: Command & { label: string } = { + id: 'arduino-update-library-index', + label: nls.localize( + 'arduino/updateIndexes/updateLibraryIndex', + 'Update Library Index' + ), + category: 'Arduino', + }; + } +} diff --git a/arduino-ide-extension/src/browser/contributions/upload-certificate.ts b/arduino-ide-extension/src/browser/contributions/upload-certificate.ts index 91292eb49..a6385cb2a 100644 --- a/arduino-ide-extension/src/browser/contributions/upload-certificate.ts +++ b/arduino-ide-extension/src/browser/contributions/upload-certificate.ts @@ -12,12 +12,14 @@ import { PreferenceScope, PreferenceService, } from '@theia/core/lib/browser/preferences/preference-service'; -import { ArduinoPreferences } from '../arduino-preferences'; import { arduinoCert, certificateList, } from '../dialogs/certificate-uploader/utils'; -import { ArduinoFirmwareUploader } from '../../common/protocol/arduino-firmware-uploader'; +import { + ArduinoFirmwareUploader, + UploadCertificateParams, +} from '../../common/protocol/arduino-firmware-uploader'; import { nls } from '@theia/core/lib/common'; @injectable() @@ -31,22 +33,29 @@ export class UploadCertificate extends Contribution { @inject(PreferenceService) protected readonly preferenceService: PreferenceService; - @inject(ArduinoPreferences) - protected readonly arduinoPreferences: ArduinoPreferences; - @inject(ArduinoFirmwareUploader) protected readonly arduinoFirmwareUploader: ArduinoFirmwareUploader; protected dialogOpened = false; + override onStart(): void { + this.preferences.onPreferenceChanged(({ preferenceName }) => { + if (preferenceName === 'arduino.board.certificates') { + this.menuManager.update(); + } + }); + } + override registerCommands(registry: CommandRegistry): void { registry.registerCommand(UploadCertificate.Commands.OPEN, { execute: async () => { try { this.dialogOpened = true; + this.menuManager.update(); await this.dialog.open(); } finally { this.dialogOpened = false; + this.menuManager.update(); } }, isEnabled: () => !this.dialogOpened, @@ -54,7 +63,7 @@ export class UploadCertificate extends Contribution { registry.registerCommand(UploadCertificate.Commands.REMOVE_CERT, { execute: async (certToRemove) => { - const certs = this.arduinoPreferences.get('arduino.board.certificates'); + const certs = this.preferences.get('arduino.board.certificates'); this.preferenceService.set( 'arduino.board.certificates', @@ -68,14 +77,9 @@ export class UploadCertificate extends Contribution { }); registry.registerCommand(UploadCertificate.Commands.UPLOAD_CERT, { - execute: async ({ fqbn, address, urls }) => { - return this.arduinoFirmwareUploader.uploadCertificates( - `-b ${fqbn} -a ${address} ${urls - .map((url: string) => `-u ${url}`) - .join(' ')}` - ); + execute: async (params: UploadCertificateParams) => { + return this.arduinoFirmwareUploader.uploadCertificates(params); }, - isEnabled: () => true, }); registry.registerCommand(UploadCertificate.Commands.OPEN_CERT_CONTEXT, { @@ -89,7 +93,6 @@ export class UploadCertificate extends Contribution { args: [args.cert], }); }, - isEnabled: () => true, }); } diff --git a/arduino-ide-extension/src/browser/contributions/upload-firmware.ts b/arduino-ide-extension/src/browser/contributions/upload-firmware.ts index 6fc566904..7ed85c996 100644 --- a/arduino-ide-extension/src/browser/contributions/upload-firmware.ts +++ b/arduino-ide-extension/src/browser/contributions/upload-firmware.ts @@ -21,9 +21,11 @@ export class UploadFirmware extends Contribution { execute: async () => { try { this.dialogOpened = true; + this.menuManager.update(); await this.dialog.open(); } finally { this.dialogOpened = false; + this.menuManager.update(); } }, isEnabled: () => !this.dialogOpened, @@ -43,10 +45,7 @@ export namespace UploadFirmware { export namespace Commands { export const OPEN: Command = { id: 'arduino-upload-firmware-open', - label: nls.localize( - 'arduino/firmware/updater', - 'WiFi101 / WiFiNINA Firmware Updater' - ), + label: nls.localize('arduino/firmware/updater', 'Firmware Updater'), category: 'Arduino', }; } diff --git a/arduino-ide-extension/src/browser/contributions/upload-sketch.ts b/arduino-ide-extension/src/browser/contributions/upload-sketch.ts index 5d6135cec..0c2418797 100644 --- a/arduino-ide-extension/src/browser/contributions/upload-sketch.ts +++ b/arduino-ide-extension/src/browser/contributions/upload-sketch.ts @@ -1,106 +1,47 @@ -import { inject, injectable } from '@theia/core/shared/inversify'; import { Emitter } from '@theia/core/lib/common/event'; -import { BoardUserField, CoreService, Port } from '../../common/protocol'; -import { ArduinoMenus, PlaceholderMenuNode } from '../menu/arduino-menus'; +import { nls } from '@theia/core/lib/common/nls'; +import { inject, injectable } from '@theia/core/shared/inversify'; +import { FQBN } from 'fqbn'; +import { CoreService } from '../../common/protocol'; +import { ArduinoMenus } from '../menu/arduino-menus'; +import { CurrentSketch } from '../sketches-service-client-impl'; import { ArduinoToolbar } from '../toolbar/arduino-toolbar'; import { Command, CommandRegistry, - MenuModelRegistry, + CoreServiceContribution, KeybindingRegistry, + MenuModelRegistry, TabBarToolbarRegistry, - CoreServiceContribution, } from './contribution'; -import { UserFieldsDialog } from '../dialogs/user-fields/user-fields-dialog'; -import { deepClone, DisposableCollection, nls } from '@theia/core/lib/common'; -import { CurrentSketch } from '../../common/protocol/sketches-service-client-impl'; +import { UserFields } from './user-fields'; import type { VerifySketchParams } from './verify-sketch'; @injectable() export class UploadSketch extends CoreServiceContribution { - @inject(MenuModelRegistry) - private readonly menuRegistry: MenuModelRegistry; - - @inject(UserFieldsDialog) - private readonly userFieldsDialog: UserFieldsDialog; - - private boardRequiresUserFields = false; - private readonly cachedUserFields: Map = new Map(); - private readonly menuActionsDisposables = new DisposableCollection(); + @inject(UserFields) + private readonly userFields: UserFields; private readonly onDidChangeEmitter = new Emitter(); private readonly onDidChange = this.onDidChangeEmitter.event; private uploadInProgress = false; - protected override init(): void { - super.init(); - this.boardsServiceProvider.onBoardsConfigChanged(async () => { - const userFields = - await this.boardsServiceProvider.selectedBoardUserFields(); - this.boardRequiresUserFields = userFields.length > 0; - this.registerMenus(this.menuRegistry); - }); - } - - private selectedFqbnAddress(): string { - const { boardsConfig } = this.boardsServiceProvider; - const fqbn = boardsConfig.selectedBoard?.fqbn; - if (!fqbn) { - return ''; - } - const address = - boardsConfig.selectedBoard?.port?.address || - boardsConfig.selectedPort?.address; - if (!address) { - return ''; - } - return fqbn + '|' + address; - } - override registerCommands(registry: CommandRegistry): void { registry.registerCommand(UploadSketch.Commands.UPLOAD_SKETCH, { execute: async () => { - const key = this.selectedFqbnAddress(); - if ( - this.boardRequiresUserFields && - key && - !this.cachedUserFields.has(key) - ) { - // Deep clone the array of board fields to avoid editing the cached ones - this.userFieldsDialog.value = ( - await this.boardsServiceProvider.selectedBoardUserFields() - ).map((f) => ({ ...f })); - const result = await this.userFieldsDialog.open(); - if (!result) { - return; - } - this.cachedUserFields.set(key, result); + if (await this.userFields.checkUserFieldsDialog()) { + this.uploadSketch(); } - this.uploadSketch(); }, isEnabled: () => !this.uploadInProgress, }); registry.registerCommand(UploadSketch.Commands.UPLOAD_WITH_CONFIGURATION, { execute: async () => { - const key = this.selectedFqbnAddress(); - if (!key) { - return; - } - - const cached = this.cachedUserFields.get(key); - // Deep clone the array of board fields to avoid editing the cached ones - this.userFieldsDialog.value = ( - cached ?? (await this.boardsServiceProvider.selectedBoardUserFields()) - ).map((f) => ({ ...f })); - - const result = await this.userFieldsDialog.open(); - if (!result) { - return; + if (await this.userFields.checkUserFieldsDialog(true)) { + this.uploadSketch(); } - this.cachedUserFields.set(key, result); - this.uploadSketch(); }, - isEnabled: () => !this.uploadInProgress && this.boardRequiresUserFields, + isEnabled: () => !this.uploadInProgress && this.userFields.isRequired(), }); registry.registerCommand( UploadSketch.Commands.UPLOAD_SKETCH_USING_PROGRAMMER, @@ -120,45 +61,20 @@ export class UploadSketch extends CoreServiceContribution { } override registerMenus(registry: MenuModelRegistry): void { - this.menuActionsDisposables.dispose(); - this.menuActionsDisposables.push( - registry.registerMenuAction(ArduinoMenus.SKETCH__MAIN_GROUP, { - commandId: UploadSketch.Commands.UPLOAD_SKETCH.id, - label: nls.localize('arduino/sketch/upload', 'Upload'), - order: '1', - }) - ); - if (this.boardRequiresUserFields) { - this.menuActionsDisposables.push( - registry.registerMenuAction(ArduinoMenus.SKETCH__MAIN_GROUP, { - commandId: UploadSketch.Commands.UPLOAD_WITH_CONFIGURATION.id, - label: UploadSketch.Commands.UPLOAD_WITH_CONFIGURATION.label, - order: '2', - }) - ); - } else { - this.menuActionsDisposables.push( - registry.registerMenuNode( - ArduinoMenus.SKETCH__MAIN_GROUP, - new PlaceholderMenuNode( - ArduinoMenus.SKETCH__MAIN_GROUP, - // commandId: UploadSketch.Commands.UPLOAD_WITH_CONFIGURATION.id, - UploadSketch.Commands.UPLOAD_WITH_CONFIGURATION.label, - { order: '2' } - ) - ) - ); - } - this.menuActionsDisposables.push( - registry.registerMenuAction(ArduinoMenus.SKETCH__MAIN_GROUP, { - commandId: UploadSketch.Commands.UPLOAD_SKETCH_USING_PROGRAMMER.id, - label: nls.localize( - 'arduino/sketch/uploadUsingProgrammer', - 'Upload Using Programmer' - ), - order: '3', - }) - ); + registry.registerMenuAction(ArduinoMenus.SKETCH__MAIN_GROUP, { + commandId: UploadSketch.Commands.UPLOAD_SKETCH.id, + label: nls.localize('arduino/sketch/upload', 'Upload'), + order: '1', + }); + + registry.registerMenuAction(ArduinoMenus.SKETCH__MAIN_GROUP, { + commandId: UploadSketch.Commands.UPLOAD_SKETCH_USING_PROGRAMMER.id, + label: nls.localize( + 'arduino/sketch/uploadUsingProgrammer', + 'Upload Using Programmer' + ), + order: '3', + }); } override registerKeybindings(registry: KeybindingRegistry): void { @@ -188,10 +104,11 @@ export class UploadSketch extends CoreServiceContribution { } try { + const autoVerify = this.preferences['arduino.upload.autoVerify']; // toggle the toolbar button and menu item state. // uploadInProgress will be set to false whether the upload fails or not this.uploadInProgress = true; - this.boardsServiceProvider.snapshotBoardDiscoveryOnUpload(); + this.menuManager.update(); this.onDidChangeEmitter.fire(); this.clearVisibleNotification(); @@ -200,7 +117,7 @@ export class UploadSketch extends CoreServiceContribution { 'arduino-verify-sketch', { exportBinaries: false, - silent: true, + mode: autoVerify ? 'auto' : 'dry-run', } ); if (!verifyOptions) { @@ -211,41 +128,63 @@ export class UploadSketch extends CoreServiceContribution { usingProgrammer, verifyOptions ); + if (!uploadOptions) { return; } - // TODO: This does not belong here. - // IDE2 should not do any preliminary checks but let the CLI fail and then toast a user consumable error message. - if ( - uploadOptions.userFields.length === 0 && - this.boardRequiresUserFields - ) { - this.messageService.error( - nls.localize( - 'arduino/sketch/userFieldsNotFoundError', - "Can't find user fields for connected board" - ) - ); + if (!this.userFields.checkUserFieldsForUpload()) { return; } - await this.doWithProgress({ + const uploadResponse = await this.doWithProgress({ progressText: nls.localize('arduino/sketch/uploading', 'Uploading...'), - task: (progressId, coreService) => - coreService.upload({ ...uploadOptions, progressId }), + task: async (progressId, coreService, token) => { + try { + return await coreService.upload( + { ...uploadOptions, progressId }, + token + ); + } catch (err) { + if (err.code === 4005) { + const uploadWithProgrammerOptions = await this.uploadOptions( + true, + verifyOptions + ); + if (uploadWithProgrammerOptions) { + return coreService.upload( + { ...uploadWithProgrammerOptions, progressId }, + token + ); + } + } else { + throw err; + } + } + }, keepOutput: true, + cancelable: true, }); + if (!uploadResponse) { + return; + } + + // the port update is NOOP if nothing has changed + this.boardsServiceProvider.updateConfig(uploadResponse.portAfterUpload); + this.messageService.info( nls.localize('arduino/sketch/doneUploading', 'Done uploading.'), { timeout: 3000 } ); } catch (e) { + this.userFields.notifyFailedWithError(e); this.handleError(e); } finally { + // TODO: here comes the port change if happened during the upload + // https://github.com/arduino/arduino-cli/issues/2245 this.uploadInProgress = false; - this.boardsServiceProvider.attemptPostUploadAutoSelect(); + this.menuManager.update(); this.onDidChangeEmitter.fire(); } } @@ -258,16 +197,20 @@ export class UploadSketch extends CoreServiceContribution { if (!CurrentSketch.isValid(sketch)) { return undefined; } - const userFields = this.userFields(); + const userFields = this.userFields.getUserFields(); const { boardsConfig } = this.boardsServiceProvider; const [fqbn, { selectedProgrammer: programmer }, verify, verbose] = await Promise.all([ verifyOptions.fqbn, // already decorated FQBN - this.boardsDataStore.getData(this.sanitizeFqbn(verifyOptions.fqbn)), + this.boardsDataStore.getData( + verifyOptions.fqbn + ? new FQBN(verifyOptions.fqbn).toString(true) + : undefined + ), this.preferences.get('arduino.upload.verify'), this.preferences.get('arduino.upload.verbose'), ]); - const port = this.maybeUpdatePortProperties(boardsConfig.selectedPort); + const port = boardsConfig.selectedPort; return { sketch, fqbn, @@ -278,45 +221,6 @@ export class UploadSketch extends CoreServiceContribution { userFields, }; } - - /** - * This is a hack to ensure that the port object has the `properties` when uploading.(https://github.com/arduino/arduino-ide/issues/740) - * This method works around a bug when restoring a `port` persisted by an older version of IDE2. See the bug [here](https://github.com/arduino/arduino-ide/pull/1335#issuecomment-1224355236). - * - * Before the upload, this method checks the available ports and makes sure that the `properties` of an available port, and the port selected by the user have the same `properties`. - * This method does not update any state (for example, the `BoardsConfig.Config`) but uses the correct `properties` for the `upload`. - */ - private maybeUpdatePortProperties(port: Port | undefined): Port | undefined { - if (port) { - const key = Port.keyOf(port); - for (const candidate of this.boardsServiceProvider.availablePorts) { - if (key === Port.keyOf(candidate) && candidate.properties) { - return { - ...port, - properties: deepClone(candidate.properties), - }; - } - } - } - return port; - } - - private userFields(): BoardUserField[] { - return this.cachedUserFields.get(this.selectedFqbnAddress()) ?? []; - } - - /** - * Converts the `VENDOR:ARCHITECTURE:BOARD_ID[:MENU_ID=OPTION_ID[,MENU2_ID=OPTION_ID ...]]` FQBN to - * `VENDOR:ARCHITECTURE:BOARD_ID` format. - * See the details of the `{build.fqbn}` entry in the [specs](https://arduino.github.io/arduino-cli/latest/platform-specification/#global-predefined-properties). - */ - private sanitizeFqbn(fqbn: string | undefined): string | undefined { - if (!fqbn) { - return undefined; - } - const [vendor, arch, id] = fqbn.split(':'); - return `${vendor}:${arch}:${id}`; - } } export namespace UploadSketch { @@ -328,7 +232,7 @@ export namespace UploadSketch { id: 'arduino-upload-with-configuration-sketch', label: nls.localize( 'arduino/sketch/configureAndUpload', - 'Configure And Upload' + 'Configure and Upload' ), category: 'Arduino', }; diff --git a/arduino-ide-extension/src/browser/contributions/user-fields.ts b/arduino-ide-extension/src/browser/contributions/user-fields.ts new file mode 100644 index 000000000..00f2817c6 --- /dev/null +++ b/arduino-ide-extension/src/browser/contributions/user-fields.ts @@ -0,0 +1,129 @@ +import { nls } from '@theia/core/lib/common/nls'; +import { inject, injectable } from '@theia/core/shared/inversify'; +import { BoardUserField, CoreError } from '../../common/protocol'; +import { BoardsServiceProvider } from '../boards/boards-service-provider'; +import { UserFieldsDialog } from '../dialogs/user-fields/user-fields-dialog'; +import { ArduinoMenus } from '../menu/arduino-menus'; +import { Contribution, MenuModelRegistry } from './contribution'; +import { UploadSketch } from './upload-sketch'; + +@injectable() +export class UserFields extends Contribution { + private boardRequiresUserFields = false; + private userFieldsSet = false; + private readonly cachedUserFields: Map = new Map(); + + @inject(UserFieldsDialog) + private readonly userFieldsDialog: UserFieldsDialog; + + @inject(BoardsServiceProvider) + private readonly boardsServiceProvider: BoardsServiceProvider; + + protected override init(): void { + super.init(); + this.boardsServiceProvider.onBoardsConfigDidChange(() => this.refresh()); + } + + override onReady(): void { + this.boardsServiceProvider.ready.then(() => this.refresh()); + } + + override registerMenus(registry: MenuModelRegistry): void { + registry.registerMenuAction(ArduinoMenus.SKETCH__MAIN_GROUP, { + commandId: UploadSketch.Commands.UPLOAD_WITH_CONFIGURATION.id, + label: UploadSketch.Commands.UPLOAD_WITH_CONFIGURATION.label, + order: '2', + }); + } + + private async refresh(): Promise { + const userFields = + await this.boardsServiceProvider.selectedBoardUserFields(); + this.boardRequiresUserFields = userFields.length > 0; + this.menuManager.update(); + } + + private selectedFqbnAddress(): string | undefined { + const { boardsConfig } = this.boardsServiceProvider; + const fqbn = boardsConfig.selectedBoard?.fqbn; + if (!fqbn) { + return undefined; + } + const address = boardsConfig.selectedPort?.address || ''; + return fqbn + '|' + address; + } + + private async showUserFieldsDialog( + key: string + ): Promise { + const cached = this.cachedUserFields.get(key); + // Deep clone the array of board fields to avoid editing the cached ones + this.userFieldsDialog.value = cached + ? cached.slice() + : await this.boardsServiceProvider.selectedBoardUserFields(); + const result = await this.userFieldsDialog.open(); + if (!result) { + return; + } + + this.userFieldsSet = true; + this.cachedUserFields.set(key, result); + return result; + } + + async checkUserFieldsDialog(forceOpen = false): Promise { + const key = this.selectedFqbnAddress(); + if (!key) { + return false; + } + /* + If the board requires to be configured with user fields, we want + to show the user fields dialog, but only if they weren't already + filled in or if they were filled in, but the previous upload failed. + */ + if ( + !forceOpen && + (!this.boardRequiresUserFields || + (this.cachedUserFields.has(key) && this.userFieldsSet)) + ) { + return true; + } + const userFieldsFilledIn = Boolean(await this.showUserFieldsDialog(key)); + return userFieldsFilledIn; + } + + checkUserFieldsForUpload(): boolean { + // TODO: This does not belong here. + // IDE2 should not do any preliminary checks but let the CLI fail and then toast a user consumable error message. + if (!this.boardRequiresUserFields || this.getUserFields().length > 0) { + this.userFieldsSet = true; + return true; + } + this.messageService.error( + nls.localize( + 'arduino/sketch/userFieldsNotFoundError', + "Can't find user fields for connected board" + ) + ); + this.userFieldsSet = false; + return false; + } + + getUserFields(): BoardUserField[] { + const fqbnAddress = this.selectedFqbnAddress(); + if (!fqbnAddress) { + return []; + } + return this.cachedUserFields.get(fqbnAddress) ?? []; + } + + isRequired(): boolean { + return this.boardRequiresUserFields; + } + + notifyFailedWithError(e: Error): void { + if (this.boardRequiresUserFields && CoreError.UploadFailed.is(e)) { + this.userFieldsSet = false; + } + } +} diff --git a/arduino-ide-extension/src/browser/contributions/validate-sketch.ts b/arduino-ide-extension/src/browser/contributions/validate-sketch.ts new file mode 100644 index 000000000..fb7de55f1 --- /dev/null +++ b/arduino-ide-extension/src/browser/contributions/validate-sketch.ts @@ -0,0 +1,198 @@ +import { Dialog } from '@theia/core/lib/browser/dialogs'; +import { nls } from '@theia/core/lib/common/nls'; +import { Deferred, waitForEvent } from '@theia/core/lib/common/promise-util'; +import { injectable } from '@theia/core/shared/inversify'; +import { WorkspaceCommands } from '@theia/workspace/lib/browser/workspace-commands'; +import { CurrentSketch } from '../sketches-service-client-impl'; +import { CloudSketchContribution } from './cloud-contribution'; +import { Sketch, URI } from './contribution'; +import { SaveAsSketch } from './save-as-sketch'; + +@injectable() +export class ValidateSketch extends CloudSketchContribution { + override onReady(): void { + this.validate(); + } + + private async validate(): Promise { + const result = await this.promptFixActions(); + if (!result) { + const yes = await this.prompt( + nls.localize('arduino/validateSketch/abortFixTitle', 'Invalid sketch'), + nls.localize( + 'arduino/validateSketch/abortFixMessage', + "The sketch is still invalid. Do you want to fix the remaining problems? By clicking '{0}', a new sketch will open.", + Dialog.NO + ), + [Dialog.NO, Dialog.YES] + ); + if (yes) { + return this.validate(); + } + const sketch = await this.sketchesService.createNewSketch(); + this.workspaceService.open(new URI(sketch.uri), { + preserveWindow: true, + }); + } + } + + /** + * Returns with an array of actions the user has to perform to fix the invalid sketch. + */ + private validateSketch( + sketch: Sketch, + dataDirUri: URI | undefined + ): FixAction[] { + // sketch code file validation errors first as they do not require window reload + const actions = Sketch.uris(sketch) + .filter((uri) => uri !== sketch.mainFileUri) + .map((uri) => new URI(uri)) + .filter((uri) => Sketch.Extensions.CODE_FILES.includes(uri.path.ext)) + .map((uri) => ({ + uri, + error: this.doValidate(sketch, dataDirUri, uri.path.name), + })) + .filter(({ error }) => Boolean(error)) + .map((object) => <{ uri: URI; error: string }>object) + .map(({ uri, error }) => ({ + execute: async () => { + const unknown = + (await this.promptRenameSketchFile(uri, error)) && + (await this.commandService.executeCommand( + WorkspaceCommands.FILE_RENAME.id, + uri + )); + return !!unknown; + }, + })); + + // sketch folder + main sketch file last as it requires a `Save as...` and the window reload + const sketchFolderName = new URI(sketch.uri).path.base; + const sketchFolderNameError = this.doValidate( + sketch, + dataDirUri, + sketchFolderName + ); + if (sketchFolderNameError) { + actions.push({ + execute: async () => { + const unknown = + (await this.promptRenameSketch(sketch, sketchFolderNameError)) && + (await this.commandService.executeCommand( + SaveAsSketch.Commands.SAVE_AS_SKETCH.id, + { + markAsRecentlyOpened: true, + openAfterMove: true, + wipeOriginal: true, + } + )); + return !!unknown; + }, + }); + } + return actions; + } + + private doValidate( + sketch: Sketch, + dataDirUri: URI | undefined, + toValidate: string + ): string | undefined { + const cloudUri = this.createFeatures.isCloud(sketch, dataDirUri); + return cloudUri + ? Sketch.validateCloudSketchFolderName(toValidate) + : Sketch.validateSketchFolderName(toValidate); + } + + private async currentSketch(): Promise { + const sketch = this.sketchServiceClient.tryGetCurrentSketch(); + if (CurrentSketch.isValid(sketch)) { + return sketch; + } + const deferred = new Deferred(); + const disposable = this.sketchServiceClient.onCurrentSketchDidChange( + (sketch) => { + if (CurrentSketch.isValid(sketch)) { + disposable.dispose(); + deferred.resolve(sketch); + } + } + ); + return deferred.promise; + } + + private async promptFixActions(): Promise { + const maybeDataDirUri = this.configService.tryGetDataDirUri(); + const [sketch, dataDirUri] = await Promise.all([ + this.currentSketch(), + maybeDataDirUri ?? + waitForEvent(this.configService.onDidChangeDataDirUri, 5_000), + ]); + const fixActions = this.validateSketch(sketch, dataDirUri); + for (const fixAction of fixActions) { + const result = await fixAction.execute(); + if (!result) { + return false; + } + } + return true; + } + + private async promptRenameSketch( + sketch: Sketch, + error: string + ): Promise { + return this.prompt( + nls.localize( + 'arduino/validateSketch/renameSketchFolderTitle', + 'Invalid sketch name' + ), + nls.localize( + 'arduino/validateSketch/renameSketchFolderMessage', + "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", + sketch.name, + error + ) + ); + } + + private async promptRenameSketchFile( + uri: URI, + error: string + ): Promise { + return this.prompt( + nls.localize( + 'arduino/validateSketch/renameSketchFileTitle', + 'Invalid sketch filename' + ), + nls.localize( + 'arduino/validateSketch/renameSketchFileMessage', + "The sketch file '{0}' cannot be used. {1} Do you want to rename the sketch file now?", + uri.path.base, + error + ) + ); + } + + private async prompt( + title: string, + message: string, + buttons: string[] = [Dialog.CANCEL, Dialog.OK] + ): Promise { + const { response } = await this.dialogService.showMessageBox({ + title, + message, + type: 'warning', + buttons, + }); + // cancel + if (response === 0) { + return false; + } + return true; + } +} + +interface FixAction { + execute(): Promise; +} diff --git a/arduino-ide-extension/src/browser/contributions/verify-sketch.ts b/arduino-ide-extension/src/browser/contributions/verify-sketch.ts index fe4de6f6a..22693085e 100644 --- a/arduino-ide-extension/src/browser/contributions/verify-sketch.ts +++ b/arduino-ide-extension/src/browser/contributions/verify-sketch.ts @@ -1,54 +1,88 @@ +import { Emitter, Event } from '@theia/core/lib/common/event'; +import { nls } from '@theia/core/lib/common/nls'; import { inject, injectable } from '@theia/core/shared/inversify'; -import { Emitter } from '@theia/core/lib/common/event'; +import type { CompileSummary, CoreService } from '../../common/protocol'; import { ArduinoMenus } from '../menu/arduino-menus'; +import { CurrentSketch } from '../sketches-service-client-impl'; import { ArduinoToolbar } from '../toolbar/arduino-toolbar'; import { - CoreServiceContribution, Command, CommandRegistry, - MenuModelRegistry, + CoreServiceContribution, KeybindingRegistry, + MenuModelRegistry, TabBarToolbarRegistry, } from './contribution'; -import { nls } from '@theia/core/lib/common'; -import { CurrentSketch } from '../../common/protocol/sketches-service-client-impl'; -import { CoreService } from '../../common/protocol'; import { CoreErrorHandler } from './core-error-handler'; +export const CompileSummaryProvider = Symbol('CompileSummaryProvider'); +export interface CompileSummaryProvider { + readonly compileSummary: CompileSummary | undefined; + readonly onDidChangeCompileSummary: Event; +} + +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. + */ + | 'explicit' + /** + * When the verify phase automatically runs as part of the upload but there is no UI indication of the command: the toolbar items do not update. + */ + | 'auto' + /** + * The verify does not run. There is no UI indication of the command. For example, when the user decides to disable the auto verify (`'arduino.upload.autoVerify'`) to skips the code recompilation phase. + */ + | 'dry-run'; + export interface VerifySketchParams { /** * Same as `CoreService.Options.Compile#exportBinaries` */ readonly exportBinaries?: boolean; /** - * If `true`, there won't be any UI indication of the verify command. It's `false` by default. + * The mode specifying how verify should run. It's `'explicit'` by default. */ - readonly silent?: boolean; + readonly mode?: VerifySketchMode; } +/** + * - `"idle"` when neither verify, nor upload is running + */ +type VerifyProgress = 'idle' | VerifySketchMode; + @injectable() -export class VerifySketch extends CoreServiceContribution { +export class VerifySketch + extends CoreServiceContribution + implements CompileSummaryProvider +{ @inject(CoreErrorHandler) private readonly coreErrorHandler: CoreErrorHandler; private readonly onDidChangeEmitter = new Emitter(); private readonly onDidChange = this.onDidChangeEmitter.event; - private verifyInProgress = false; + private readonly onDidChangeCompileSummaryEmitter = new Emitter< + CompileSummary | undefined + >(); + private verifyProgress: VerifyProgress = 'idle'; + private _compileSummary: CompileSummary | undefined; override registerCommands(registry: CommandRegistry): void { registry.registerCommand(VerifySketch.Commands.VERIFY_SKETCH, { execute: (params?: VerifySketchParams) => this.verifySketch(params), - isEnabled: () => !this.verifyInProgress, + isEnabled: () => this.verifyProgress === 'idle', }); registry.registerCommand(VerifySketch.Commands.EXPORT_BINARIES, { execute: () => this.verifySketch({ exportBinaries: true }), - isEnabled: () => !this.verifyInProgress, + isEnabled: () => this.verifyProgress === 'idle', }); registry.registerCommand(VerifySketch.Commands.VERIFY_SKETCH_TOOLBAR, { isVisible: (widget) => ArduinoToolbar.is(widget) && widget.side === 'left', - isEnabled: () => !this.verifyInProgress, - isToggled: () => this.verifyInProgress, + isEnabled: () => this.verifyProgress !== 'explicit', + // toggled only when verify is running, but not toggled when automatic verify is running before the upload + // https://github.com/arduino/arduino-ide/pull/1750#pullrequestreview-1214762975 + isToggled: () => this.verifyProgress === 'explicit', execute: () => registry.executeCommand(VerifySketch.Commands.VERIFY_SKETCH.id), }); @@ -96,41 +130,67 @@ export class VerifySketch extends CoreServiceContribution { 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 { + return this.onDidChangeCompileSummaryEmitter.event; + } + private async verifySketch( params?: VerifySketchParams ): Promise { - if (this.verifyInProgress) { + if (this.verifyProgress !== 'idle') { return undefined; } try { - if (!params?.silent) { - this.verifyInProgress = true; - this.onDidChangeEmitter.fire(); - } + this.verifyProgress = params?.mode ?? 'explicit'; + this.onDidChangeEmitter.fire(); + this.menuManager.update(); this.clearVisibleNotification(); this.coreErrorHandler.reset(); + const dryRun = this.verifyProgress === 'dry-run'; const options = await this.options(params?.exportBinaries); if (!options) { return undefined; } - await this.doWithProgress({ + if (dryRun) { + return options; + } + + const compileSummary = await this.doWithProgress({ progressText: nls.localize( 'arduino/sketch/compile', 'Compiling sketch...' ), - task: (progressId, coreService) => - coreService.compile({ - ...options, - progressId, - }), + task: (progressId, coreService, token) => + coreService.compile( + { + ...options, + progressId, + }, + token + ), + cancelable: true, }); this.messageService.info( nls.localize('arduino/sketch/doneCompiling', 'Done compiling.'), { timeout: 3000 } ); + + this.updateCompileSummary(compileSummary); + // Returns with the used options for the compilation // 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. @@ -139,10 +199,9 @@ export class VerifySketch extends CoreServiceContribution { this.handleError(e); return undefined; } finally { - this.verifyInProgress = false; - if (!params?.silent) { - this.onDidChangeEmitter.fire(); - } + this.verifyProgress = 'idle'; + this.onDidChangeEmitter.fire(); + this.menuManager.update(); } } diff --git a/arduino-ide-extension/src/browser/create/create-api.ts b/arduino-ide-extension/src/browser/create/create-api.ts index 1faf05754..db777b35a 100644 --- a/arduino-ide-extension/src/browser/create/create-api.ts +++ b/arduino-ide-extension/src/browser/create/create-api.ts @@ -1,80 +1,37 @@ -import { injectable, inject } from '@theia/core/shared/inversify'; -import * as createPaths from './create-paths'; -import { posix } from './create-paths'; -import { AuthenticationClientService } from '../auth/authentication-client-service'; +import { MaybePromise } from '@theia/core/lib/common/types'; +import { inject, injectable } from '@theia/core/shared/inversify'; +import { fetch } from 'cross-fetch'; +import { SketchesService } from '../../common/protocol'; +import { uint8ArrayToString } from '../../common/utils'; import { ArduinoPreferences } from '../arduino-preferences'; +import { AuthenticationClientService } from '../auth/authentication-client-service'; import { SketchCache } from '../widgets/cloud-sketchbook/cloud-sketch-cache'; +import * as createPaths from './create-paths'; +import { posix } from './create-paths'; import { Create, CreateError } from './typings'; -export interface ResponseResultProvider { +interface ResponseResultProvider { + // eslint-disable-next-line @typescript-eslint/no-explicit-any (response: Response): Promise; } -export namespace ResponseResultProvider { +namespace ResponseResultProvider { export const NOOP: ResponseResultProvider = async () => undefined; export const TEXT: ResponseResultProvider = (response) => response.text(); export const JSON: ResponseResultProvider = (response) => response.json(); } -export function Utf8ArrayToStr(array: Uint8Array): string { - let out, i, c; - let char2, char3; - - out = ''; - const len = array.length; - i = 0; - while (i < len) { - c = array[i++]; - switch (c >> 4) { - case 0: - case 1: - case 2: - case 3: - case 4: - case 5: - case 6: - case 7: - // 0xxxxxxx - out += String.fromCharCode(c); - break; - case 12: - case 13: - // 110x xxxx 10xx xxxx - char2 = array[i++]; - out += String.fromCharCode(((c & 0x1f) << 6) | (char2 & 0x3f)); - break; - case 14: - // 1110 xxxx 10xx xxxx 10xx xxxx - char2 = array[i++]; - char3 = array[i++]; - out += String.fromCharCode( - ((c & 0x0f) << 12) | ((char2 & 0x3f) << 6) | ((char3 & 0x3f) << 0) - ); - break; - } - } - - return out; -} - type ResourceType = 'f' | 'd'; @injectable() export class CreateApi { @inject(SketchCache) - protected sketchCache: SketchCache; - - protected authenticationService: AuthenticationClientService; - protected arduinoPreferences: ArduinoPreferences; - - public init( - authenticationService: AuthenticationClientService, - arduinoPreferences: ArduinoPreferences - ): CreateApi { - this.authenticationService = authenticationService; - this.arduinoPreferences = arduinoPreferences; - - return this; - } + readonly sketchCache: SketchCache; + @inject(AuthenticationClientService) + private readonly authenticationService: AuthenticationClientService; + @inject(ArduinoPreferences) + private readonly arduinoPreferences: ArduinoPreferences; + @inject(SketchesService) + private readonly sketchesService: SketchesService; getSketchSecretStat(sketch: Create.Sketch): Create.Resource { return { @@ -100,43 +57,74 @@ export class CreateApi { return result; } + /** + * `sketchPath` is not the POSIX path but the path with the user UUID, username, etc. + * See [Create.Resource#path](./typings.ts). If `cache` is `true` and a sketch exists with the path, + * the cache will be updated with the new state of the sketch. + */ + // TODO: no nulls in API + async sketchByPath( + sketchPath: string, + cache = false + ): Promise { + const url = new URL(`${this.domain()}/sketches/byPath/${sketchPath}`); + const headers = await this.headers(); + const sketch = await this.run(url, { + method: 'GET', + headers, + }); + if (sketch && cache) { + this.sketchCache.addSketch(sketch); + const posixPath = createPaths.toPosixPath(sketch.path); + this.sketchCache.purgeByPath(posixPath); + } + return sketch; + } + async sketches(limit = 50): Promise { const url = new URL(`${this.domain()}/sketches`); url.searchParams.set('user_id', 'me'); url.searchParams.set('limit', limit.toString()); const headers = await this.headers(); - const result: { sketches: Create.Sketch[] } = { sketches: [] }; - - let partialSketches: Create.Sketch[] = []; + const allSketches: Create.Sketch[] = []; let currentOffset = 0; - do { + while (true) { url.searchParams.set('offset', currentOffset.toString()); - partialSketches = ( - await this.run<{ sketches: Create.Sketch[] }>(url, { - method: 'GET', - headers, - }) - ).sketches; - if (partialSketches.length !== 0) { - result.sketches = result.sketches.concat(partialSketches); + const { sketches } = await this.run<{ sketches: Create.Sketch[] }>(url, { + method: 'GET', + headers, + }); + allSketches.push(...sketches); + if (sketches.length < limit) { + break; } - currentOffset = currentOffset + limit; - } while (partialSketches.length !== 0); - - result.sketches.forEach((sketch) => this.sketchCache.addSketch(sketch)); - return result.sketches; + currentOffset += limit; + // The create API doc show that there is `next` and `prev` pages, but it does not work + // https://api2.arduino.cc/create/docs#!/sketches95v2/sketches_v2_search + // IF sketchCount mod limit === 0, an extra fetch must happen to detect the end of the pagination. + } + allSketches.forEach((sketch) => this.sketchCache.addSketch(sketch)); + return allSketches; } async createSketch( posixPath: string, - content: string = CreateApi.defaultInoContent + contentProvider: MaybePromise = this.sketchesService.defaultInoContent(), + payloadOverride: Record< + string, + string | boolean | number | Record + > = {} ): Promise { const url = new URL(`${this.domain()}/sketches`); - const headers = await this.headers(); + const [headers, content] = await Promise.all([ + this.headers(), + contentProvider, + ]); const payload = { ino: btoa(content), path: posixPath, user_id: 'me', + ...payloadOverride, }; const init = { method: 'PUT', @@ -191,7 +179,8 @@ export class CreateApi { ); }) .catch((reason) => { - if (reason?.status === 404) return [] as Create.Resource[]; + if (reason?.status === 404) + return [] as Create.Resource[]; // TODO: must not swallow 404 else throw reason; }); } @@ -252,7 +241,17 @@ export class CreateApi { return data; } - const sketch = this.sketchCache.getSketch(createPaths.parentPosix(path)); + const posixPath = createPaths.parentPosix(path); + let sketch = this.sketchCache.getSketch(posixPath); + // Workaround for https://github.com/arduino/arduino-ide/issues/1999. + if (!sketch) { + // Convert the ordinary sketch POSIX path to the Create path. + // For example, `/sketch_apr6a` will be transformed to `8a694e4b83878cc53472bd75ee928053:kittaakos/sketches_v2/sketch_apr6a`. + const createPathPrefix = this.sketchCache.createPathPrefix; + if (createPathPrefix) { + sketch = await this.sketchByPath(createPathPrefix + posixPath, true); + } + } if ( sketch && @@ -291,7 +290,7 @@ export class CreateApi { this.sketchCache.addSketch(sketch); let file = ''; - if (sketch && sketch.secrets) { + if (sketch.secrets) { for (const item of sketch.secrets) { file += `#define ${item.name} "${item.value}"\r\n`; } @@ -328,10 +327,9 @@ export class CreateApi { if (sketch) { const url = new URL(`${this.domain()}/sketches/${sketch.id}`); const headers = await this.headers(); - // parse the secret file const secrets = ( - typeof content === 'string' ? content : Utf8ArrayToStr(content) + typeof content === 'string' ? content : uint8ArrayToString(content) ) .split(/\r?\n/) .reduce((prev, curr) => { @@ -381,7 +379,7 @@ export class CreateApi { return; } - // do not upload "do_not_sync" files/directoris and their descendants + // do not upload "do_not_sync" files/directories and their descendants const segments = posixPath.split(posix.sep) || []; if ( segments.some((segment) => Create.do_not_sync_files.includes(segment)) @@ -395,7 +393,7 @@ export class CreateApi { const headers = await this.headers(); let data: string = - typeof content === 'string' ? content : Utf8ArrayToStr(content); + typeof content === 'string' ? content : uint8ArrayToString(content); data = await this.toggleSecretsInclude(posixPath, data, 'remove'); const payload = { data: btoa(data) }; @@ -415,6 +413,21 @@ export class CreateApi { await this.delete(posixPath, 'd'); } + /** + * `sketchPath` is not the POSIX path but the path with the user UUID, username, etc. + * See [Create.Resource#path](./typings.ts). Unlike other endpoints, it does not support the `$HOME` + * variable substitution. The DELETE directory endpoint is bogus and responses with HTTP 500 + * instead of 404 when deleting a non-existing resource. + */ + async deleteSketch(sketchPath: string): Promise { + const url = new URL(`${this.domain()}/sketches/byPath/${sketchPath}`); + const headers = await this.headers(); + await this.run(url, { + method: 'DELETE', + headers, + }); + } + private async delete(posixPath: string, type: ResourceType): Promise { const url = new URL( `${this.domain()}/files/${type}/$HOME/sketches_v2${posixPath}` @@ -475,14 +488,11 @@ export class CreateApi { } private async run( - requestInfo: RequestInfo | URL, + requestInfo: URL, init: RequestInit | undefined, resultProvider: ResponseResultProvider = ResponseResultProvider.JSON ): Promise { - const response = await fetch( - requestInfo instanceof URL ? requestInfo.toString() : requestInfo, - init - ); + const response = await fetch(requestInfo.toString(), init); if (!response.ok) { let details: string | undefined = undefined; try { @@ -499,11 +509,19 @@ export class CreateApi { private async headers(): Promise> { const token = await this.token(); - return { + const headers: Record = { 'content-type': 'application/json', accept: 'application/json', authorization: `Bearer ${token}`, }; + + const sharedSpaceID = + this.arduinoPreferences['arduino.cloud.sharedSpaceID']; + if (sharedSpaceID) { + headers['x-organization'] = sharedSpaceID; + } + + return headers; } private domain(apiVersion = 'v2'): string { @@ -516,19 +534,3 @@ export class CreateApi { return this.authenticationService.session?.accessToken || ''; } } - -export namespace CreateApi { - export const defaultInoContent = `/* - -*/ - -void setup() { - -} - -void loop() { - -} - -`; -} diff --git a/arduino-ide-extension/src/browser/create/create-features.ts b/arduino-ide-extension/src/browser/create/create-features.ts new file mode 100644 index 000000000..e49b3c576 --- /dev/null +++ b/arduino-ide-extension/src/browser/create/create-features.ts @@ -0,0 +1,146 @@ +import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application-contribution'; +import { DisposableCollection } from '@theia/core/lib/common/disposable'; +import { Emitter, Event } from '@theia/core/lib/common/event'; +import URI from '@theia/core/lib/common/uri'; +import { inject, injectable } from '@theia/core/shared/inversify'; +import { Sketch } from '../../common/protocol'; +import { AuthenticationSession } from '../../common/protocol/authentication-service'; +import { ArduinoPreferences } from '../arduino-preferences'; +import { AuthenticationClientService } from '../auth/authentication-client-service'; +import { LocalCacheFsProvider } from '../local-cache/local-cache-fs-provider'; +import { + ARDUINO_CLOUD_FOLDER, + REMOTE_SKETCHBOOK_FOLDER, +} from '../utils/constants'; +import { CreateUri } from './create-uri'; + +export type CloudSketchState = 'push' | 'pull'; + +@injectable() +export class CreateFeatures implements FrontendApplicationContribution { + @inject(ArduinoPreferences) + private readonly preferences: ArduinoPreferences; + @inject(AuthenticationClientService) + private readonly authenticationService: AuthenticationClientService; + @inject(LocalCacheFsProvider) + private readonly localCacheFsProvider: LocalCacheFsProvider; + + /** + * The keys are the Create URI of the sketches. + */ + private readonly _cloudSketchStates = new Map(); + private readonly onDidChangeSessionEmitter = new Emitter< + AuthenticationSession | undefined + >(); + private readonly onDidChangeEnabledEmitter = new Emitter(); + private readonly onDidChangeCloudSketchStateEmitter = new Emitter<{ + uri: URI; + state: CloudSketchState | undefined; + }>(); + private readonly toDispose = new DisposableCollection( + this.onDidChangeSessionEmitter, + this.onDidChangeEnabledEmitter, + this.onDidChangeCloudSketchStateEmitter + ); + private _enabled: boolean; + private _session: AuthenticationSession | undefined; + + onStart(): void { + this.toDispose.pushAll([ + this.authenticationService.onSessionDidChange((session) => { + const oldSession = this._session; + this._session = session; + if (!!oldSession !== !!this._session) { + this.onDidChangeSessionEmitter.fire(this._session); + } + }), + this.preferences.onPreferenceChanged(({ preferenceName, newValue }) => { + if (preferenceName === 'arduino.cloud.enabled') { + const oldEnabled = this._enabled; + this._enabled = Boolean(newValue); + if (this._enabled !== oldEnabled) { + this.onDidChangeEnabledEmitter.fire(this._enabled); + } + } + }), + ]); + this._enabled = this.preferences['arduino.cloud.enabled']; + this._session = this.authenticationService.session; + } + + onStop(): void { + this.toDispose.dispose(); + } + + get onDidChangeSession(): Event { + return this.onDidChangeSessionEmitter.event; + } + + get onDidChangeEnabled(): Event { + return this.onDidChangeEnabledEmitter.event; + } + + get onDidChangeCloudSketchState(): Event<{ + uri: URI; + state: CloudSketchState | undefined; + }> { + return this.onDidChangeCloudSketchStateEmitter.event; + } + + get session(): AuthenticationSession | undefined { + return this._session; + } + + get enabled(): boolean { + return this._enabled; + } + + cloudSketchState(uri: URI): CloudSketchState | undefined { + return this._cloudSketchStates.get(uri.toString()); + } + + setCloudSketchState(uri: URI, state: CloudSketchState | undefined): void { + if (uri.scheme !== CreateUri.scheme) { + throw new Error( + `Expected a URI with '${uri.scheme}' scheme. Got: ${uri.toString()}` + ); + } + const key = uri.toString(); + if (!state) { + if (!this._cloudSketchStates.delete(key)) { + console.warn( + `Could not reset the cloud sketch state of ${key}. No state existed for the the cloud sketch.` + ); + } else { + this.onDidChangeCloudSketchStateEmitter.fire({ uri, state: undefined }); + } + } else { + this._cloudSketchStates.set(key, state); + this.onDidChangeCloudSketchStateEmitter.fire({ uri, state }); + } + } + + /** + * `true` if the sketch is under `directories.data/RemoteSketchbook`. Otherwise, `false`. + * Returns with `undefined` if `dataDirUri` is `undefined`. + */ + isCloud(sketch: Sketch, dataDirUri: URI | undefined): boolean | undefined { + if (!dataDirUri) { + console.warn( + `Could not decide whether the sketch ${sketch.uri} is cloud or local. The 'directories.data' location was not available from the CLI config.` + ); + return undefined; + } + return dataDirUri + .resolve(REMOTE_SKETCHBOOK_FOLDER) + .resolve(ARDUINO_CLOUD_FOLDER) + .isEqualOrParent(new URI(sketch.uri)); + } + + cloudUri(sketch: Sketch): URI | undefined { + if (!this.session) { + return undefined; + } + return this.localCacheFsProvider.from(new URI(sketch.uri)); + } +} diff --git a/arduino-ide-extension/src/browser/create/create-fs-provider.ts b/arduino-ide-extension/src/browser/create/create-fs-provider.ts index 0d0d1ecb3..1deaa9d6c 100644 --- a/arduino-ide-extension/src/browser/create/create-fs-provider.ts +++ b/arduino-ide-extension/src/browser/create/create-fs-provider.ts @@ -5,7 +5,7 @@ import { Disposable, 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 { Stat, FileType, @@ -29,6 +29,7 @@ import { CreateUri } from './create-uri'; import { SketchesService } from '../../common/protocol'; import { ArduinoPreferences } from '../arduino-preferences'; import { Create } from './typings'; +import { stringToUint8Array } from '../../common/utils'; @injectable() export class CreateFsProvider @@ -154,7 +155,7 @@ export class CreateFsProvider async readFile(uri: URI): Promise { const content = await this.getCreateApi.readFile(uri.path.toString()); - return new TextEncoder().encode(content); + return stringToUint8Array(content); } async writeFile( @@ -189,10 +190,6 @@ export class CreateFsProvider FileSystemProviderErrorCode.NoPermissions ); } - - return this.createApi.init( - this.authenticationService, - this.arduinoPreferences - ); + return this.createApi; } } diff --git a/arduino-ide-extension/src/browser/create/create-uri.ts b/arduino-ide-extension/src/browser/create/create-uri.ts index 1d60ffff2..be1a30e9c 100644 --- a/arduino-ide-extension/src/browser/create/create-uri.ts +++ b/arduino-ide-extension/src/browser/create/create-uri.ts @@ -1,4 +1,4 @@ -import { URI as Uri } from 'vscode-uri'; +import { URI as Uri } from '@theia/core/shared/vscode-uri'; import URI from '@theia/core/lib/common/uri'; import { toPosixPath, parentPosix, posix } from './create-paths'; import { Create } from './typings'; @@ -7,7 +7,9 @@ export namespace CreateUri { export const scheme = 'arduino-create'; export const root = toUri(posix.sep); - export function toUri(posixPathOrResource: string | Create.Resource): URI { + export function toUri( + posixPathOrResource: string | Create.Resource | Create.Sketch + ): URI { const posixPath = typeof posixPathOrResource === 'string' ? posixPathOrResource diff --git a/arduino-ide-extension/src/browser/create/typings.ts b/arduino-ide-extension/src/browser/create/typings.ts index b5fb0e2d3..b5dcf6f59 100644 --- a/arduino-ide-extension/src/browser/create/typings.ts +++ b/arduino-ide-extension/src/browser/create/typings.ts @@ -71,3 +71,30 @@ export class CreateError extends Error { Object.setPrototypeOf(this, CreateError.prototype); } } + +export type ConflictError = CreateError & { status: 409 }; +export function isConflict(err: unknown): err is ConflictError { + return isErrorWithStatusOf(err, 409); +} + +export type NotFoundError = CreateError & { status: 404 }; +export function isNotFound(err: unknown): err is NotFoundError { + return isErrorWithStatusOf(err, 404); +} + +export type UnprocessableContentError = CreateError & { status: 422 }; +export function isUnprocessableContent( + err: unknown +): err is UnprocessableContentError { + return isErrorWithStatusOf(err, 422); +} + +function isErrorWithStatusOf( + err: unknown, + status: number +): err is CreateError & { status: number } { + if (err instanceof CreateError) { + return err.status === status; + } + return false; +} diff --git a/arduino-ide-extension/src/browser/data/dark.color-theme.json b/arduino-ide-extension/src/browser/data/dark.color-theme.json index a633dd457..9e9d15718 100644 --- a/arduino-ide-extension/src/browser/data/dark.color-theme.json +++ b/arduino-ide-extension/src/browser/data/dark.color-theme.json @@ -14,7 +14,7 @@ "editor.foreground": "#dae3e3", "editor.lineHighlightBackground": "#434f5410", "editor.selectionBackground": "#00818480", - "editorCursor.foreground": "#434f54", + "editorCursor.foreground": "#dae3e3", "editorWhitespace.foreground": "#bfbfbf", "editorWidget.background": "#171e21", "editorWidget.foreground": "#dae3e3", @@ -67,7 +67,8 @@ "tree.indentGuidesStroke": "#374146", "tab.unfocusedActiveForeground": "#dae3e3", "tab.inactiveBackground": "#171e21", - "textLink.foreground": "#0ca1a6" + "textLink.foreground": "#0ca1a6", + "errorForeground": "#df7365" }, "tokenColors": [ { diff --git a/arduino-ide-extension/src/browser/data/default.color-theme.json b/arduino-ide-extension/src/browser/data/default.color-theme.json index e15de4ea1..e81e4baa0 100644 --- a/arduino-ide-extension/src/browser/data/default.color-theme.json +++ b/arduino-ide-extension/src/browser/data/default.color-theme.json @@ -14,7 +14,7 @@ "editor.foreground": "#4e5b61", "editor.lineHighlightBackground": "#434f5410", "editor.selectionBackground": "#7fcbcdb3", - "editorCursor.foreground": "#434f54", + "editorCursor.foreground": "#4e5b61", "editorWhitespace.foreground": "#bfbfbf", "editorWidget.background": "#f7f9f9", "editorWidget.foreground": "#4e5b61", @@ -67,7 +67,8 @@ "tree.indentGuidesStroke": "#dae3e3", "tab.unfocusedActiveForeground": "#4e5b61", "tab.inactiveBackground": "#ecf1f1", - "textLink.foreground": "#008184" + "textLink.foreground": "#008184", + "errorForeground": "#df7365" }, "tokenColors": [ { diff --git a/arduino-ide-extension/src/browser/dialog-service.ts b/arduino-ide-extension/src/browser/dialog-service.ts new file mode 100644 index 000000000..f5c8aa593 --- /dev/null +++ b/arduino-ide-extension/src/browser/dialog-service.ts @@ -0,0 +1,15 @@ +import type { + MessageBoxOptions, + MessageBoxReturnValue, + OpenDialogOptions, + OpenDialogReturnValue, + SaveDialogOptions, + SaveDialogReturnValue, +} from '../electron-common/electron-arduino'; + +export const DialogService = Symbol('DialogService'); +export interface DialogService { + showMessageBox(options: MessageBoxOptions): Promise; + showOpenDialog(options: OpenDialogOptions): Promise; + showSaveDialog(options: SaveDialogOptions): Promise; +} diff --git a/arduino-ide-extension/src/browser/dialogs/certificate-uploader/certificate-add-new.tsx b/arduino-ide-extension/src/browser/dialogs/certificate-uploader/certificate-add-new.tsx index e1084e17a..6a06d36b5 100644 --- a/arduino-ide-extension/src/browser/dialogs/certificate-uploader/certificate-add-new.tsx +++ b/arduino-ide-extension/src/browser/dialogs/certificate-uploader/certificate-add-new.tsx @@ -1,5 +1,5 @@ import { nls } from '@theia/core/lib/common'; -import * as React from '@theia/core/shared/react'; +import React from '@theia/core/shared/react'; export const CertificateAddComponent = ({ addCertificate, diff --git a/arduino-ide-extension/src/browser/dialogs/certificate-uploader/certificate-list.tsx b/arduino-ide-extension/src/browser/dialogs/certificate-uploader/certificate-list.tsx index c136010d0..283f97a0a 100644 --- a/arduino-ide-extension/src/browser/dialogs/certificate-uploader/certificate-list.tsx +++ b/arduino-ide-extension/src/browser/dialogs/certificate-uploader/certificate-list.tsx @@ -1,4 +1,4 @@ -import * as React from '@theia/core/shared/react'; +import React from '@theia/core/shared/react'; export const CertificateListComponent = ({ certificates, diff --git a/arduino-ide-extension/src/browser/dialogs/certificate-uploader/certificate-uploader-component.tsx b/arduino-ide-extension/src/browser/dialogs/certificate-uploader/certificate-uploader-component.tsx index 528e7ec95..0429ff487 100644 --- a/arduino-ide-extension/src/browser/dialogs/certificate-uploader/certificate-uploader-component.tsx +++ b/arduino-ide-extension/src/browser/dialogs/certificate-uploader/certificate-uploader-component.tsx @@ -1,20 +1,27 @@ -import * as React from '@theia/core/shared/react'; +import { nls } from '@theia/core/lib/common/nls'; +import React from '@theia/core/shared/react'; import Tippy from '@tippyjs/react'; -import { AvailableBoard } from '../../boards/boards-service-provider'; -import { CertificateListComponent } from './certificate-list'; -import { SelectBoardComponent } from './select-board-components'; +import type { BoardList } from '../../../common/protocol/board-list'; +import { + boardIdentifierEquals, + portIdentifierEquals, +} from '../../../common/protocol/boards-service'; import { CertificateAddComponent } from './certificate-add-new'; -import { nls } from '@theia/core/lib/common'; +import { CertificateListComponent } from './certificate-list'; +import { + BoardOptionValue, + SelectBoardComponent, +} from './select-board-components'; export const CertificateUploaderComponent = ({ - availableBoards, + boardList, certificates, addCertificate, updatableFqbns, uploadCertificates, openContextMenu, }: { - availableBoards: AvailableBoard[]; + boardList: BoardList; certificates: string[]; addCertificate: (cert: string) => void; updatableFqbns: string[]; @@ -33,11 +40,15 @@ export const CertificateUploaderComponent = ({ const [selectedCerts, setSelectedCerts] = React.useState([]); - const [selectedBoard, setSelectedBoard] = - React.useState(null); + const [selectedItem, setSelectedItem] = + React.useState(null); const installCertificates = async () => { - if (!selectedBoard || !selectedBoard.fqbn || !selectedBoard.port) { + if (!selectedItem) { + return; + } + const board = selectedItem.board; + if (!board.fqbn) { return; } @@ -45,8 +56,8 @@ export const CertificateUploaderComponent = ({ try { await uploadCertificates( - selectedBoard.fqbn, - selectedBoard.port.address, + board.fqbn, + selectedItem.port.address, selectedCerts ); setInstallFeedback('ok'); @@ -55,17 +66,26 @@ export const CertificateUploaderComponent = ({ } }; - const onBoardSelect = React.useCallback( - (board: AvailableBoard) => { - const newFqbn = (board && board.fqbn) || null; - const prevFqbn = (selectedBoard && selectedBoard.fqbn) || null; + const onItemSelect = React.useCallback( + (item: BoardOptionValue | null) => { + if (!item) { + setSelectedItem(null); + return; + } + const board = item.board; + const port = item.port; + const selectedBoard = selectedItem?.board; + const selectedPort = selectedItem?.port; - if (newFqbn !== prevFqbn) { + if ( + !boardIdentifierEquals(board, selectedBoard) || + !portIdentifierEquals(port, selectedPort) + ) { setInstallFeedback(null); - setSelectedBoard(board); + setSelectedItem(item); } }, - [selectedBoard] + [selectedItem] ); return ( @@ -125,10 +145,10 @@ export const CertificateUploaderComponent = ({
@@ -167,7 +187,7 @@ export const CertificateUploaderComponent = ({ type="button" className="theia-button primary install-cert-btn" onClick={installCertificates} - disabled={selectedCerts.length === 0 || !selectedBoard} + disabled={selectedCerts.length === 0 || !selectedItem} > {nls.localize('arduino/certificate/upload', 'Upload')} diff --git a/arduino-ide-extension/src/browser/dialogs/certificate-uploader/certificate-uploader-dialog.tsx b/arduino-ide-extension/src/browser/dialogs/certificate-uploader/certificate-uploader-dialog.tsx index 336a7b657..921807d6f 100644 --- a/arduino-ide-extension/src/browser/dialogs/certificate-uploader/certificate-uploader-dialog.tsx +++ b/arduino-ide-extension/src/browser/dialogs/certificate-uploader/certificate-uploader-dialog.tsx @@ -1,62 +1,51 @@ -import * as React from '@theia/core/shared/react'; +import { DialogProps } from '@theia/core/lib/browser/dialogs'; +import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state'; +import { + PreferenceScope, + PreferenceService, +} from '@theia/core/lib/browser/preferences/preference-service'; +import { ReactWidget } from '@theia/core/lib/browser/widgets/react-widget'; +import { CommandRegistry } from '@theia/core/lib/common/command'; +import { nls } from '@theia/core/lib/common/nls'; +import type { Message } from '@theia/core/shared/@phosphor/messaging'; +import { Widget } from '@theia/core/shared/@phosphor/widgets'; import { inject, injectable, postConstruct, } from '@theia/core/shared/inversify'; -import { DialogProps } from '@theia/core/lib/browser/dialogs'; +import React from '@theia/core/shared/react'; +import { ArduinoFirmwareUploader } from '../../../common/protocol/arduino-firmware-uploader'; +import { createBoardList } from '../../../common/protocol/board-list'; +import { ArduinoPreferences } from '../../arduino-preferences'; +import { BoardsServiceProvider } from '../../boards/boards-service-provider'; import { AbstractDialog } from '../../theia/dialogs/dialogs'; -import { Widget } from '@theia/core/shared/@phosphor/widgets'; -import { Message } from '@theia/core/shared/@phosphor/messaging'; -import { ReactWidget } from '@theia/core/lib/browser/widgets/react-widget'; -import { - AvailableBoard, - BoardsServiceProvider, -} from '../../boards/boards-service-provider'; import { CertificateUploaderComponent } from './certificate-uploader-component'; -import { ArduinoPreferences } from '../../arduino-preferences'; -import { - PreferenceScope, - PreferenceService, -} from '@theia/core/lib/browser/preferences/preference-service'; -import { CommandRegistry } from '@theia/core/lib/common/command'; import { certificateList, sanifyCertString } from './utils'; -import { ArduinoFirmwareUploader } from '../../../common/protocol/arduino-firmware-uploader'; -import { nls } from '@theia/core/lib/common'; -import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state'; @injectable() export class UploadCertificateDialogWidget extends ReactWidget { @inject(BoardsServiceProvider) - protected readonly boardsServiceClient: BoardsServiceProvider; - + private readonly boardsServiceProvider: BoardsServiceProvider; @inject(ArduinoPreferences) - protected readonly arduinoPreferences: ArduinoPreferences; - + private readonly arduinoPreferences: ArduinoPreferences; @inject(PreferenceService) - protected readonly preferenceService: PreferenceService; - + private readonly preferenceService: PreferenceService; @inject(CommandRegistry) - protected readonly commandRegistry: CommandRegistry; - + private readonly commandRegistry: CommandRegistry; @inject(ArduinoFirmwareUploader) - protected readonly arduinoFirmwareUploader: ArduinoFirmwareUploader; - + private readonly arduinoFirmwareUploader: ArduinoFirmwareUploader; @inject(FrontendApplicationStateService) private readonly appStateService: FrontendApplicationStateService; - protected certificates: string[] = []; - protected updatableFqbns: string[] = []; - protected availableBoards: AvailableBoard[] = []; + private certificates: string[] = []; + private updatableFqbns: string[] = []; + private boardList = createBoardList({}); - public busyCallback = (busy: boolean) => { + busyCallback = (busy: boolean) => { return; }; - constructor() { - super(); - } - @postConstruct() protected init(): void { this.arduinoPreferences.ready.then(() => { @@ -81,8 +70,8 @@ export class UploadCertificateDialogWidget extends ReactWidget { }) ); - this.boardsServiceClient.onAvailableBoardsChanged((availableBoards) => { - this.availableBoards = availableBoards; + this.boardsServiceProvider.onBoardListDidChange((boardList) => { + this.boardList = boardList; this.update(); }); } @@ -126,7 +115,7 @@ export class UploadCertificateDialogWidget extends ReactWidget { protected render(): React.ReactNode { return ( { @inject(UploadCertificateDialogWidget) - protected readonly widget: UploadCertificateDialogWidget; + private readonly widget: UploadCertificateDialogWidget; private busy = false; @@ -171,6 +160,9 @@ export class UploadCertificateDialog extends AbstractDialog { Widget.detach(this.widget); } Widget.attach(this.widget, this.contentNode); + const firstButton = this.widget.node.querySelector('button'); + firstButton?.focus(); + this.widget.busyCallback = this.busyCallback.bind(this); super.onAfterAttach(msg); this.update(); diff --git a/arduino-ide-extension/src/browser/dialogs/certificate-uploader/select-board-components.tsx b/arduino-ide-extension/src/browser/dialogs/certificate-uploader/select-board-components.tsx index 285f136c3..d20bf1f87 100644 --- a/arduino-ide-extension/src/browser/dialogs/certificate-uploader/select-board-components.tsx +++ b/arduino-ide-extension/src/browser/dialogs/certificate-uploader/select-board-components.tsx @@ -1,37 +1,37 @@ import { nls } from '@theia/core/lib/common'; -import * as React from '@theia/core/shared/react'; -import { AvailableBoard } from '../../boards/boards-service-provider'; +import React from '@theia/core/shared/react'; +import { + boardListItemEquals, + type BoardList, + type BoardListItemWithBoard, +} from '../../../common/protocol/board-list'; import { ArduinoSelect } from '../../widgets/arduino-select'; -type BoardOption = { value: string; label: string }; +export type BoardOptionValue = BoardListItemWithBoard; +type BoardOption = { value: BoardOptionValue | undefined; label: string }; export const SelectBoardComponent = ({ - availableBoards, + boardList, updatableFqbns, - onBoardSelect, - selectedBoard, + onItemSelect, + selectedItem, busy, }: { - availableBoards: AvailableBoard[]; + boardList: BoardList; updatableFqbns: string[]; - onBoardSelect: (board: AvailableBoard | null) => void; - selectedBoard: AvailableBoard | null; + onItemSelect: (item: BoardOptionValue | null) => void; + selectedItem: BoardOptionValue | null; busy: boolean; }): React.ReactElement => { const [selectOptions, setSelectOptions] = React.useState([]); - const [selectBoardPlaceholder, setSelectBoardPlaceholder] = - React.useState(''); + const [selectItemPlaceholder, setSelectBoardPlaceholder] = React.useState(''); const selectOption = React.useCallback( - (boardOpt: BoardOption) => { - onBoardSelect( - (boardOpt && - availableBoards.find((board) => board.fqbn === boardOpt.value)) || - null - ); + (boardOpt: BoardOption | null) => { + onItemSelect(boardOpt?.value ?? null); }, - [availableBoards, onBoardSelect] + [onItemSelect] ); React.useEffect(() => { @@ -44,26 +44,28 @@ export const SelectBoardComponent = ({ 'arduino/certificate/selectBoard', 'Select a board...' ); + const updatableBoards = boardList.boards.filter((item) => { + const fqbn = item.board.fqbn; + return fqbn && updatableFqbns.includes(fqbn); + }); let selBoard = -1; - const updatableBoards = availableBoards.filter( - (board) => board.port && board.fqbn && updatableFqbns.includes(board.fqbn) - ); - const boardsList: BoardOption[] = updatableBoards.map((board, i) => { - if (board.selected) { + + const boardOptions: BoardOption[] = updatableBoards.map((item, i) => { + if (selectedItem === item) { selBoard = i; } return { label: nls.localize( 'arduino/certificate/boardAtPort', '{0} at {1}', - board.name, - board.port?.address ?? '' + item.board.name, + item.port.address ?? '' ), - value: board.fqbn || '', + value: item, }; }); - if (boardsList.length === 0) { + if (boardOptions.length === 0) { placeholderTxt = nls.localize( 'arduino/certificate/noSupportedBoardConnected', 'No supported board connected' @@ -71,32 +73,31 @@ export const SelectBoardComponent = ({ } setSelectBoardPlaceholder(placeholderTxt); - setSelectOptions(boardsList); + setSelectOptions(boardOptions); - if (selectedBoard) { - selBoard = boardsList - .map((boardOpt) => boardOpt.value) - .indexOf(selectedBoard.fqbn || ''); + if (selectedItem) { + selBoard = updatableBoards.findIndex((board) => + boardListItemEquals(board, selectedItem) + ); } - selectOption(boardsList[selBoard] || null); - }, [busy, availableBoards, selectOption, updatableFqbns, selectedBoard]); - + selectOption(boardOptions[selBoard] || null); + }, [busy, boardList, selectOption, updatableFqbns, selectedItem]); return ( MaybePromise; }): React.ReactElement => { - const [loading, setloading] = React.useState(false); + const [loading, setLoading] = React.useState(false); const radioChangeHandler = async (event: React.BaseSyntheticEvent) => { - setloading(true); + setLoading(true); const sketch = await createApi.editSketch({ id: treeNode.sketchId, params: { @@ -52,7 +57,7 @@ export const ShareSketchComponent = ({ }); // setPublicVisibility(sketch.is_public); treeNode.isPublic = sketch.is_public; - setloading(false); + setLoading(false); }; const sketchLink = `${domain}/editor/_/${treeNode.sketchId}/preview`; @@ -100,7 +105,7 @@ export const ShareSketchComponent = ({ className="theia-input" />
diff --git a/arduino-ide-extension/src/browser/dialogs/user-fields/user-fields-dialog.tsx b/arduino-ide-extension/src/browser/dialogs/user-fields/user-fields-dialog.tsx index 8835fd355..d6a3e9130 100644 --- a/arduino-ide-extension/src/browser/dialogs/user-fields/user-fields-dialog.tsx +++ b/arduino-ide-extension/src/browser/dialogs/user-fields/user-fields-dialog.tsx @@ -1,63 +1,18 @@ -import * as React from '@theia/core/shared/react'; +import React from '@theia/core/shared/react'; import { inject, injectable } from '@theia/core/shared/inversify'; -import { - AbstractDialog, - DialogProps, - ReactWidget, -} from '@theia/core/lib/browser'; -import { Widget } from '@theia/core/shared/@phosphor/widgets'; +import { DialogProps } from '@theia/core/lib/browser/dialogs'; import { Message } from '@theia/core/shared/@phosphor/messaging'; import { UploadSketch } from '../../contributions/upload-sketch'; import { UserFieldsComponent } from './user-fields-component'; import { BoardUserField } from '../../../common/protocol'; - -@injectable() -export class UserFieldsDialogWidget extends ReactWidget { - protected _currentUserFields: BoardUserField[] = []; - - constructor(private cancel: () => void, private accept: () => Promise) { - super(); - } - - set currentUserFields(userFields: BoardUserField[]) { - this.setUserFields(userFields); - } - - get currentUserFields(): BoardUserField[] { - return this._currentUserFields; - } - - resetUserFieldsValue(): void { - this._currentUserFields = this._currentUserFields.map((field) => { - field.value = ''; - return field; - }); - } - - protected setUserFields(userFields: BoardUserField[]): void { - this._currentUserFields = userFields; - } - - protected render(): React.ReactNode { - return ( -
- - - ); - } -} +import { ReactDialog } from '../../theia/dialogs/dialogs'; @injectable() export class UserFieldsDialogProps extends DialogProps {} @injectable() -export class UserFieldsDialog extends AbstractDialog { - protected readonly widget: UserFieldsDialogWidget; +export class UserFieldsDialog extends ReactDialog { + private _currentUserFields: BoardUserField[] = []; constructor( @inject(UserFieldsDialogProps) @@ -69,39 +24,36 @@ export class UserFieldsDialog extends AbstractDialog { this.titleNode.classList.add('user-fields-dialog-title'); this.contentNode.classList.add('user-fields-dialog-content'); this.acceptButton = undefined; - this.widget = new UserFieldsDialogWidget( - this.close.bind(this), - this.accept.bind(this) - ); + } + + get value(): BoardUserField[] { + return this._currentUserFields; } set value(userFields: BoardUserField[]) { - this.widget.currentUserFields = userFields; + this._currentUserFields = userFields; } - get value(): BoardUserField[] { - return this.widget.currentUserFields; + protected override render(): React.ReactNode { + return ( +
+
+ + +
+ ); } protected override onAfterAttach(msg: Message): void { - if (this.widget.isAttached) { - Widget.detach(this.widget); - } - Widget.attach(this.widget, this.contentNode); super.onAfterAttach(msg); this.update(); } - protected override onUpdateRequest(msg: Message): void { - super.onUpdateRequest(msg); - this.widget.update(); - } - - protected override onActivateRequest(msg: Message): void { - super.onActivateRequest(msg); - this.widget.activate(); - } - protected override async accept(): Promise { // If the user presses enter and at least // a field is empty don't accept the input @@ -114,8 +66,21 @@ export class UserFieldsDialog extends AbstractDialog { } override close(): void { - this.widget.resetUserFieldsValue(); - this.widget.close(); + this.resetUserFieldsValue(); super.close(); } + + private resetUserFieldsValue(): void { + this.value = this.value.map((field) => { + field.value = ''; + return field; + }); + } + + private readonly doCancel: () => void = () => this.close(); + private readonly doAccept: () => Promise = () => this.accept(); + private readonly doUpdateUserFields: (userFields: BoardUserField[]) => void = + (userFields: BoardUserField[]) => { + this.value = userFields; + }; } diff --git a/arduino-ide-extension/src/browser/dialogs/version-welcome-dialog.tsx b/arduino-ide-extension/src/browser/dialogs/version-welcome-dialog.tsx new file mode 100644 index 000000000..380d980df --- /dev/null +++ b/arduino-ide-extension/src/browser/dialogs/version-welcome-dialog.tsx @@ -0,0 +1,107 @@ +import React from '@theia/core/shared/react'; +import { inject, injectable } from '@theia/core/shared/inversify'; +import { Message } from '@theia/core/shared/@phosphor/messaging'; +import { ReactDialog } from '../theia/dialogs/dialogs'; +import { nls } from '@theia/core'; +import { DialogProps } from '@theia/core/lib/browser'; +import { WindowService } from '@theia/core/lib/browser/window/window-service'; +import { AppService } from '../app-service'; +import { sanitize } from 'dompurify'; + +@injectable() +export class VersionWelcomeDialogProps extends DialogProps {} + +@injectable() +export class VersionWelcomeDialog extends ReactDialog { + @inject(AppService) + private readonly appService: AppService; + + @inject(WindowService) + private readonly windowService: WindowService; + + constructor( + @inject(VersionWelcomeDialogProps) + protected override readonly props: VersionWelcomeDialogProps + ) { + super({ + title: nls.localize( + 'arduino/versionWelcome/title', + 'Welcome to a new version of the Arduino IDE!' + ), + }); + this.node.id = 'version-welcome-dialog-container'; + this.contentNode.classList.add('version-welcome-dialog'); + } + + protected render(): React.ReactNode { + return ( +
+

+ {nls.localize( + 'arduino/versionWelcome/donateMessage', + 'Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.' + )} +

+

+ {nls.localize( + 'arduino/versionWelcome/donateMessage2', + 'Please consider supporting our work on the free open source Arduino IDE.' + )} +

+
+ ); + } + + override get value(): void { + return; + } + + private appendButtons(): void { + const cancelButton = this.createButton( + nls.localize('arduino/versionWelcome/cancelButton', 'Maybe later') + ); + cancelButton.classList.add('secondary'); + cancelButton.classList.add('cancel-button'); + this.addAction(cancelButton, this.close.bind(this), 'click'); + this.controlPanel.appendChild(cancelButton); + + const donateButton = this.createButton( + nls.localize('arduino/versionWelcome/donateButton', 'Donate now') + ); + this.addAction(donateButton, this.onDonateButtonClick.bind(this), 'click'); + this.controlPanel.appendChild(donateButton); + donateButton.focus(); + } + + private onDonateButtonClick(): void { + this.openDonationPage(); + this.close(); + } + + private readonly openDonationPage = () => { + const url = 'https://www.arduino.cc/en/donate'; + this.windowService.openNewWindow(url, { external: true }); + }; + + private async updateTitleVersion(): Promise { + const appInfo = await this.appService.info(); + const { appVersion } = appInfo; + + if (appVersion) { + this.titleNode.innerText = sanitize( + nls.localize( + 'arduino/versionWelcome/titleWithVersion', + 'Welcome to the new Arduino IDE {0}!', + appVersion + ) + ); + } + } + + protected override onAfterAttach(msg: Message): void { + this.update(); + this.appendButtons(); + this.updateTitleVersion(); + super.onAfterAttach(msg); + } +} diff --git a/arduino-ide-extension/src/browser/hosted-plugin-events.ts b/arduino-ide-extension/src/browser/hosted/hosted-plugin-events.ts similarity index 97% rename from arduino-ide-extension/src/browser/hosted-plugin-events.ts rename to arduino-ide-extension/src/browser/hosted/hosted-plugin-events.ts index ac7b1fe0d..35dbdbe4c 100644 --- a/arduino-ide-extension/src/browser/hosted-plugin-events.ts +++ b/arduino-ide-extension/src/browser/hosted/hosted-plugin-events.ts @@ -1,7 +1,7 @@ import { DisposableCollection, Emitter, Event } from '@theia/core'; import { FrontendApplicationContribution } from '@theia/core/lib/browser'; import { inject, injectable } from '@theia/core/shared/inversify'; -import { HostedPluginSupport } from './theia/plugin-ext/hosted-plugin'; +import { HostedPluginSupport } from './hosted-plugin-support'; /** * Frontend contribution to watch VS Code extension start/stop events from Theia. diff --git a/arduino-ide-extension/src/browser/hosted/hosted-plugin-support.ts b/arduino-ide-extension/src/browser/hosted/hosted-plugin-support.ts new file mode 100644 index 000000000..b0d11c86a --- /dev/null +++ b/arduino-ide-extension/src/browser/hosted/hosted-plugin-support.ts @@ -0,0 +1,14 @@ +import type { Event } from '@theia/core/lib/common/event'; + +/* +This implementation hides the default HostedPluginSupport implementation from Theia to be able to test it. +Otherwise, the default implementation fails at require time due to the `import.meta` in the Theia plugin worker code. +https://github.com/eclipse-theia/theia/blob/964f69ca3b3a5fb87ffa0177fb300b74ba0ca39f/packages/plugin-ext/src/hosted/browser/plugin-worker.ts#L30-L32 +*/ + +export const HostedPluginSupport = Symbol('HostedPluginSupport'); +export interface HostedPluginSupport { + readonly didStart: Promise; + readonly onDidLoad: Event; + readonly onDidCloseConnection: Event; +} diff --git a/arduino-ide-extension/src/browser/style/pull-sketch-icon.svg b/arduino-ide-extension/src/browser/icons/arduino-cloud-download.svg similarity index 100% rename from arduino-ide-extension/src/browser/style/pull-sketch-icon.svg rename to arduino-ide-extension/src/browser/icons/arduino-cloud-download.svg diff --git a/arduino-ide-extension/src/browser/icons/arduino-cloud-filled-offline.svg b/arduino-ide-extension/src/browser/icons/arduino-cloud-filled-offline.svg new file mode 100644 index 000000000..b86bb5209 --- /dev/null +++ b/arduino-ide-extension/src/browser/icons/arduino-cloud-filled-offline.svg @@ -0,0 +1,4 @@ + + + + diff --git a/arduino-ide-extension/src/browser/icons/arduino-cloud-filled.svg b/arduino-ide-extension/src/browser/icons/arduino-cloud-filled.svg new file mode 100644 index 000000000..e51c12063 --- /dev/null +++ b/arduino-ide-extension/src/browser/icons/arduino-cloud-filled.svg @@ -0,0 +1,3 @@ + + + diff --git a/arduino-ide-extension/src/browser/icons/arduino-cloud-offline.svg b/arduino-ide-extension/src/browser/icons/arduino-cloud-offline.svg new file mode 100644 index 000000000..26a284adc --- /dev/null +++ b/arduino-ide-extension/src/browser/icons/arduino-cloud-offline.svg @@ -0,0 +1,4 @@ + + + + diff --git a/arduino-ide-extension/src/browser/style/push-sketch-icon.svg b/arduino-ide-extension/src/browser/icons/arduino-cloud-upload.svg similarity index 100% rename from arduino-ide-extension/src/browser/style/push-sketch-icon.svg rename to arduino-ide-extension/src/browser/icons/arduino-cloud-upload.svg diff --git a/arduino-ide-extension/src/browser/icons/arduino-cloud.svg b/arduino-ide-extension/src/browser/icons/arduino-cloud.svg new file mode 100644 index 000000000..4d23d15ae --- /dev/null +++ b/arduino-ide-extension/src/browser/icons/arduino-cloud.svg @@ -0,0 +1,3 @@ + + + diff --git a/arduino-ide-extension/src/browser/icons/link-open-icon.svg b/arduino-ide-extension/src/browser/icons/link-open-icon.svg new file mode 100644 index 000000000..21136c806 --- /dev/null +++ b/arduino-ide-extension/src/browser/icons/link-open-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/arduino-ide-extension/src/browser/icons/loading-dark.svg b/arduino-ide-extension/src/browser/icons/loading-dark.svg new file mode 100644 index 000000000..d886fd06f --- /dev/null +++ b/arduino-ide-extension/src/browser/icons/loading-dark.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/arduino-ide-extension/src/browser/icons/loading-light.svg b/arduino-ide-extension/src/browser/icons/loading-light.svg new file mode 100644 index 000000000..d46f25880 --- /dev/null +++ b/arduino-ide-extension/src/browser/icons/loading-light.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/arduino-ide-extension/src/browser/ide-updater/ide-updater-commands.ts b/arduino-ide-extension/src/browser/ide-updater/ide-updater-commands.ts index 167c83120..7e9c2c75f 100644 --- a/arduino-ide-extension/src/browser/ide-updater/ide-updater-commands.ts +++ b/arduino-ide-extension/src/browser/ide-updater/ide-updater-commands.ts @@ -30,7 +30,7 @@ export class IDEUpdaterCommands implements CommandContribution { try { const updateInfo = await this.updater.checkForUpdates(initialCheck); if (!!updateInfo) { - this.updaterDialog.open(updateInfo); + this.updaterDialog.open(true, updateInfo); } else { this.messageService.info( nls.localize( diff --git a/arduino-ide-extension/src/browser/library/library-list-widget.ts b/arduino-ide-extension/src/browser/library/library-list-widget.ts index 5c654b615..660bcec06 100644 --- a/arduino-ide-extension/src/browser/library/library-list-widget.ts +++ b/arduino-ide-extension/src/browser/library/library-list-widget.ts @@ -17,6 +17,8 @@ import { Installable } from '../../common/protocol'; import { ListItemRenderer } from '../widgets/component-list/list-item-renderer'; import { nls } from '@theia/core/lib/common'; import { LibraryFilterRenderer } from '../widgets/component-list/filter-renderer'; +import { findChildTheiaButton, splitByBoldTag } from '../utils/dom'; +import { UserAbortError } from '../../common/protocol/progressible'; @injectable() export class LibraryListWidget extends ListWidget< @@ -41,7 +43,6 @@ export class LibraryListWidget extends ListWidget< searchable: service, installable: service, itemLabel: (item: LibraryPackage) => item.name, - itemDeprecated: (item: LibraryPackage) => item.deprecated, itemRenderer, filterRenderer, defaultSearchOptions: { query: '', type: 'All', topic: 'All' }, @@ -78,7 +79,7 @@ export class LibraryListWidget extends ListWidget< let installDependencies: boolean | undefined = undefined; if (dependencies.length) { const message = document.createElement('div'); - message.innerHTML = + const textContent = dependencies.length === 1 ? nls.localize( 'arduino/library/needsOneDependency', @@ -92,6 +93,22 @@ export class LibraryListWidget extends ListWidget< item.name, version ); + const segments = splitByBoldTag(textContent); + if (!segments) { + message.textContent = textContent; + } else { + segments.map((segment) => { + const span = document.createElement('span'); + if (typeof segment === 'string') { + span.textContent = segment; + } else { + const bold = document.createElement('b'); + bold.textContent = segment.textContent; + span.appendChild(bold); + } + message.appendChild(span); + }); + } const listContainer = document.createElement('div'); listContainer.style.maxHeight = '300px'; listContainer.style.overflowY = 'auto'; @@ -119,20 +136,16 @@ export class LibraryListWidget extends ListWidget< message.appendChild(question); const result = await new MessageBoxDialog({ title: nls.localize( - 'arduino/library/dependenciesForLibrary', - 'Dependencies for library {0}:{1}', - item.name, - version + 'arduino/library/installLibraryDependencies', + 'Install library dependencies' ), message, buttons: [ - nls.localize('arduino/library/installAll', 'Install all'), nls.localize( - 'arduino/library/installOnly', - 'Install {0} only', - item.name + 'arduino/library/installWithoutDependencies', + 'Install without dependencies' ), - nls.localize('vscode/issueMainService/cancel', 'Cancel'), + nls.localize('arduino/library/installAll', 'Install All'), ], maxWidth: 740, // Aligned with `settings-dialog.css`. }).open(); @@ -140,12 +153,14 @@ export class LibraryListWidget extends ListWidget< if (result) { const { response } = result; if (response === 0) { - // All - installDependencies = true; - } else if (response === 1) { // Current only installDependencies = false; + } else if (response === 1) { + // All + installDependencies = true; } + } else { + throw new UserAbortError(); } } else { // The lib does not have any dependencies. @@ -201,7 +216,13 @@ class MessageBoxDialog extends AbstractDialog { options.buttons || [nls.localize('vscode/issueMainService/ok', 'OK')] ).forEach((text, index) => { const button = this.createButton(text); - button.classList.add(index === 0 ? 'main' : 'secondary'); + const isPrimaryButton = + index === (options.buttons ? options.buttons.length - 1 : 0); + button.title = text; + button.classList.add( + isPrimaryButton ? 'main' : 'secondary', + 'message-box-dialog-button' + ); this.controlPanel.appendChild(button); this.toDisposeOnDetach.push( addEventListener(button, 'click', () => { @@ -234,6 +255,11 @@ class MessageBoxDialog extends AbstractDialog { this.response = 0; super.handleEnter(event); } + + protected override onAfterAttach(message: Message): void { + super.onAfterAttach(message); + findChildTheiaButton(this.controlPanel)?.focus(); + } } export namespace MessageBoxDialog { export interface Options extends DialogProps { diff --git a/arduino-ide-extension/src/browser/library/library-widget-frontend-contribution.ts b/arduino-ide-extension/src/browser/library/library-widget-frontend-contribution.ts index 37a3b0679..74d5de4a4 100644 --- a/arduino-ide-extension/src/browser/library/library-widget-frontend-contribution.ts +++ b/arduino-ide-extension/src/browser/library/library-widget-frontend-contribution.ts @@ -1,16 +1,17 @@ +import { nls } from '@theia/core/lib/common'; +import { MenuModelRegistry } from '@theia/core/lib/common/menu'; import { injectable } from '@theia/core/shared/inversify'; -import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application'; -import { AbstractViewContribution } from '@theia/core/lib/browser/shell/view-contribution'; -import { MenuModelRegistry } from '@theia/core'; -import { LibraryListWidget } from './library-list-widget'; +import { LibraryPackage, LibrarySearch } from '../../common/protocol'; +import { URI } from '../contributions/contribution'; import { ArduinoMenus } from '../menu/arduino-menus'; -import { nls } from '@theia/core/lib/common'; +import { ListWidgetFrontendContribution } from '../widgets/component-list/list-widget-frontend-contribution'; +import { LibraryListWidget } from './library-list-widget'; @injectable() -export class LibraryListWidgetFrontendContribution - extends AbstractViewContribution - implements FrontendApplicationContribution -{ +export class LibraryListWidgetFrontendContribution extends ListWidgetFrontendContribution< + LibraryPackage, + LibrarySearch +> { constructor() { super({ widgetId: LibraryListWidget.WIDGET_ID, @@ -24,10 +25,6 @@ export class LibraryListWidgetFrontendContribution }); } - async initializeLayout(): Promise { - this.openView(); - } - override registerMenus(menus: MenuModelRegistry): void { if (this.toggleCommand) { menus.registerMenuAction(ArduinoMenus.TOOLS__MAIN_GROUP, { @@ -40,4 +37,17 @@ export class LibraryListWidgetFrontendContribution }); } } + + protected canParse(uri: URI): boolean { + try { + LibrarySearch.UriParser.parse(uri); + return true; + } catch { + return false; + } + } + + protected parse(uri: URI): LibrarySearch | undefined { + return LibrarySearch.UriParser.parse(uri); + } } diff --git a/arduino-ide-extension/src/browser/local-cache/local-cache-fs-provider.ts b/arduino-ide-extension/src/browser/local-cache/local-cache-fs-provider.ts index 96264378a..3bfefeccf 100644 --- a/arduino-ide-extension/src/browser/local-cache/local-cache-fs-provider.ts +++ b/arduino-ide-extension/src/browser/local-cache/local-cache-fs-provider.ts @@ -1,5 +1,5 @@ import { inject, injectable } from '@theia/core/shared/inversify'; -import { URI as Uri } from 'vscode-uri'; +import { URI as Uri } from '@theia/core/shared/vscode-uri'; import URI from '@theia/core/lib/common/uri'; import { Deferred } from '@theia/core/lib/common/promise-util'; import { @@ -16,6 +16,10 @@ import { import { AuthenticationClientService } from '../auth/authentication-client-service'; import { AuthenticationSession } from '../../common/protocol/authentication-service'; import { ConfigService } from '../../common/protocol'; +import { + ARDUINO_CLOUD_FOLDER, + REMOTE_SKETCHBOOK_FOLDER, +} from '../utils/constants'; export namespace LocalCacheUri { export const scheme = 'arduino-local-cache'; @@ -34,7 +38,6 @@ export class LocalCacheFsProvider @inject(AuthenticationClientService) protected readonly authenticationService: AuthenticationClientService; - // TODO: do we need this? Cannot we `await` on the `init` call from `registerFileSystemProviders`? readonly ready = new Deferred(); private _localCacheRoot: URI; @@ -89,9 +92,26 @@ export class LocalCacheFsProvider } protected async init(fileService: FileService): Promise { - const config = await this.configService.getConfiguration(); - this._localCacheRoot = new URI(config.dataDirUri); - for (const segment of ['RemoteSketchbook', 'ArduinoCloud']) { + const { config } = await this.configService.getConfiguration(); + // Any possible CLI config errors are ignored here. IDE2 does not verify the `directories.data` folder. + // If the data dir is accessible, IDE2 creates the cache folder for the cloud sketches. Otherwise, it does not. + // The data folder can be configured outside of the IDE2, and the new data folder will be picked up with a + // subsequent IDE2 start. + if (!config?.dataDirUri) { + return; // the deferred promise will never resolve + } + const localCacheUri = new URI(config.dataDirUri); + try { + await fileService.access(localCacheUri); + } catch (err) { + console.error( + `'directories.data' location is inaccessible at ${config.dataDirUri}`, + err + ); + return; + } + this._localCacheRoot = localCacheUri; + for (const segment of [REMOTE_SKETCHBOOK_FOLDER, ARDUINO_CLOUD_FOLDER]) { this._localCacheRoot = this._localCacheRoot.resolve(segment); await fileService.createFolder(this._localCacheRoot); } @@ -153,7 +173,7 @@ export class LocalCacheFsProvider return uri; } - private toUri(session: AuthenticationSession): URI { + toUri(session: AuthenticationSession): URI { // Hack: instead of getting the UUID only, we get `auth0|UUID` after the authentication. `|` cannot be part of filesystem path or filename. return this._localCacheRoot.resolve(session.id.split('|')[1]); } diff --git a/arduino-ide-extension/src/browser/menu/arduino-menus.ts b/arduino-ide-extension/src/browser/menu/arduino-menus.ts index 500bdf124..9ecfec550 100644 --- a/arduino-ide-extension/src/browser/menu/arduino-menus.ts +++ b/arduino-ide-extension/src/browser/menu/arduino-menus.ts @@ -1,4 +1,3 @@ -import { isOSX } from '@theia/core/lib/common/os'; import { CommonMenus } from '@theia/core/lib/browser/common-frontend-contribution'; import { MAIN_MENU_BAR, @@ -7,6 +6,8 @@ import { MenuPath, SubMenuOptions, } from '@theia/core/lib/common/menu'; +import { nls } from '@theia/core/lib/common/nls'; +import { isOSX } from '@theia/core/lib/common/os'; export namespace ArduinoMenus { // Main menu @@ -97,6 +98,11 @@ export namespace ArduinoMenus { export const TOOLS__BOARD_SELECTION_GROUP = [...TOOLS, '2_board_selection']; // Core settings, such as `Processor` and `Programmers` for the board and `Burn Bootloader` export const TOOLS__BOARD_SETTINGS_GROUP = [...TOOLS, '3_board_settings']; + // `Tool` > `Ports` (always visible https://github.com/arduino/arduino-ide/issues/655) + export const TOOLS__PORTS_SUBMENU = [ + ...ArduinoMenus.TOOLS__BOARD_SELECTION_GROUP, + '2_ports', + ]; // -- Help // `Getting Started`, `Environment`, `Troubleshooting`, etc. @@ -149,6 +155,36 @@ export namespace ArduinoMenus { '2_resources', ]; + // -- Account + export const ARDUINO_ACCOUNT__CONTEXT = ['arduino-account--context']; + export const ARDUINO_ACCOUNT__CONTEXT__SIGN_IN_GROUP = [ + ...ARDUINO_ACCOUNT__CONTEXT, + '0_sign_in', + ]; + export const ARDUINO_ACCOUNT__CONTEXT__LEARN_MORE_GROUP = [ + ...ARDUINO_ACCOUNT__CONTEXT, + '1_learn_more', + ]; + export const ARDUINO_ACCOUNT__CONTEXT__GO_TO_GROUP = [ + ...ARDUINO_ACCOUNT__CONTEXT, + '2_go_to', + ]; + export const ARDUINO_ACCOUNT__CONTEXT__SIGN_OUT_GROUP = [ + ...ARDUINO_ACCOUNT__CONTEXT, + '3_sign_out', + ]; + + // Context menu from the library and boards manager widget + export const ARDUINO_COMPONENT__CONTEXT = ['arduino-component--context']; + export const ARDUINO_COMPONENT__CONTEXT__INFO_GROUP = [ + ...ARDUINO_COMPONENT__CONTEXT, + '0_info', + ]; + export const ARDUINO_COMPONENT__CONTEXT__ACTION_GROUP = [ + ...ARDUINO_COMPONENT__CONTEXT, + '1_action', + ]; + // -- ROOT SSL CERTIFICATES export const ROOT_CERTIFICATES__CONTEXT = [ 'arduino-root-certificates--context', @@ -206,3 +242,5 @@ export class PlaceholderMenuNode implements MenuNode { return [...this.menuPath, 'placeholder'].join('-'); } } + +export const examplesLabel = nls.localize('arduino/examples/menu', 'Examples'); diff --git a/arduino-ide-extension/src/browser/monitor-manager-proxy-client-impl.ts b/arduino-ide-extension/src/browser/monitor-manager-proxy-client-impl.ts index 94ab4d0f5..c6f7faeb1 100644 --- a/arduino-ide-extension/src/browser/monitor-manager-proxy-client-impl.ts +++ b/arduino-ide-extension/src/browser/monitor-manager-proxy-client-impl.ts @@ -1,79 +1,79 @@ -import { - CommandRegistry, - Disposable, - Emitter, - MessageService, - nls, -} from '@theia/core'; +import { ApplicationError } from '@theia/core/lib/common/application-error'; +import { Disposable } from '@theia/core/lib/common/disposable'; +import { Emitter } from '@theia/core/lib/common/event'; +import { MessageService } from '@theia/core/lib/common/message-service'; +import { MessageType } from '@theia/core/lib/common/message-service-protocol'; +import { nls } from '@theia/core/lib/common/nls'; +import { Deferred } from '@theia/core/lib/common/promise-util'; import { inject, injectable } from '@theia/core/shared/inversify'; -import { Board, Port } from '../common/protocol'; +import { NotificationManager } from '@theia/messages/lib/browser/notifications-manager'; +import { BoardIdentifier, PortIdentifier } from '../common/protocol'; +import { + BoardListItem, + boardListItemEquals, + getInferredBoardOrBoard, +} from '../common/protocol/board-list'; import { Monitor, MonitorManagerProxyClient, MonitorManagerProxyFactory, -} from '../common/protocol/monitor-service'; -import { - PluggableMonitorSettings, MonitorSettings, -} from '../node/monitor-settings/monitor-settings-provider'; -import { BoardsConfig } from './boards/boards-config'; + PluggableMonitorSettings, +} from '../common/protocol/monitor-service'; import { BoardsServiceProvider } from './boards/boards-service-provider'; @injectable() export class MonitorManagerProxyClientImpl implements MonitorManagerProxyClient { + @inject(MessageService) + private readonly messageService: MessageService; + // This is necessary to call the backend methods from the frontend + @inject(MonitorManagerProxyFactory) + private readonly server: MonitorManagerProxyFactory; + @inject(BoardsServiceProvider) + private readonly boardsServiceProvider: BoardsServiceProvider; + @inject(NotificationManager) + private readonly notificationManager: NotificationManager; + // When pluggable monitor messages are received from the backend // this event is triggered. // Ideally a frontend component is connected to this event // to update the UI. - protected readonly onMessagesReceivedEmitter = new Emitter<{ + private readonly onMessagesReceivedEmitter = new Emitter<{ messages: string[]; }>(); readonly onMessagesReceived = this.onMessagesReceivedEmitter.event; - protected readonly onMonitorSettingsDidChangeEmitter = + private readonly onMonitorSettingsDidChangeEmitter = new Emitter(); readonly onMonitorSettingsDidChange = this.onMonitorSettingsDidChangeEmitter.event; - protected readonly onMonitorShouldResetEmitter = new Emitter(); + private readonly onMonitorShouldResetEmitter = new Emitter(); readonly onMonitorShouldReset = this.onMonitorShouldResetEmitter.event; // WebSocket used to handle pluggable monitor communication between // frontend and backend. private webSocket?: WebSocket; private wsPort?: number; - private lastConnectedBoard: BoardsConfig.Config; - private onBoardsConfigChanged: Disposable | undefined; + private lastConnectedBoard: BoardListItem | undefined; + private onBoardListDidChange: Disposable | undefined; getWebSocketPort(): number | undefined { return this.wsPort; } - constructor( - @inject(MessageService) - protected messageService: MessageService, - - // This is necessary to call the backend methods from the frontend - @inject(MonitorManagerProxyFactory) - protected server: MonitorManagerProxyFactory, - - @inject(CommandRegistry) - protected readonly commandRegistry: CommandRegistry, - - @inject(BoardsServiceProvider) - protected readonly boardsServiceProvider: BoardsServiceProvider - ) {} - /** * Connects a localhost WebSocket using the specified port. * @param addressPort port of the WebSocket */ async connect(addressPort: number): Promise { - if (!!this.webSocket) { - if (this.wsPort === addressPort) return; - else this.disconnect(); + if (this.webSocket) { + if (this.wsPort === addressPort) { + return; + } + this.disconnect(); } try { this.webSocket = new WebSocket(`ws://localhost:${addressPort}`); @@ -87,6 +87,9 @@ export class MonitorManagerProxyClientImpl return; } + const opened = new Deferred(); + this.webSocket.onopen = () => opened.resolve(); + this.webSocket.onerror = () => opened.reject(); this.webSocket.onmessage = (message) => { const parsedMessage = JSON.parse(message.data); if (Array.isArray(parsedMessage)) @@ -99,19 +102,26 @@ export class MonitorManagerProxyClientImpl } }; this.wsPort = addressPort; + return opened.promise; } /** * Disconnects the WebSocket if connected. */ disconnect(): void { - if (!this.webSocket) return; - this.onBoardsConfigChanged?.dispose(); - this.onBoardsConfigChanged = undefined; + if (!this.webSocket) { + return; + } + this.onBoardListDidChange?.dispose(); + this.onBoardListDidChange = undefined; try { - this.webSocket?.close(); + this.webSocket.close(); this.webSocket = undefined; - } catch { + } catch (err) { + console.error( + 'Could not close the websocket connection for the monitor.', + err + ); this.messageService.error( nls.localize( 'arduino/monitor/unableToCloseWebSocket', @@ -126,51 +136,63 @@ export class MonitorManagerProxyClientImpl } async startMonitor(settings?: PluggableMonitorSettings): Promise { - this.lastConnectedBoard = { - selectedBoard: this.boardsServiceProvider.boardsConfig.selectedBoard, - selectedPort: this.boardsServiceProvider.boardsConfig.selectedPort, - }; - - if (!this.onBoardsConfigChanged) { - this.onBoardsConfigChanged = - this.boardsServiceProvider.onBoardsConfigChanged( - async ({ selectedBoard, selectedPort }) => { - if ( - typeof selectedBoard === 'undefined' || - typeof selectedPort === 'undefined' - ) + const { boardList } = this.boardsServiceProvider; + this.lastConnectedBoard = boardList.items[boardList.selectedIndex]; + if (!this.onBoardListDidChange) { + this.onBoardListDidChange = + this.boardsServiceProvider.onBoardListDidChange( + async (newBoardList) => { + const currentConnectedBoard = + newBoardList.items[newBoardList.selectedIndex]; + if (!currentConnectedBoard) { return; + } - // a board is plugged and it's different from the old connected board if ( - selectedBoard?.fqbn !== - this.lastConnectedBoard?.selectedBoard?.fqbn || - Port.keyOf(selectedPort) !== - (this.lastConnectedBoard.selectedPort - ? Port.keyOf(this.lastConnectedBoard.selectedPort) - : undefined) + !this.lastConnectedBoard || + boardListItemEquals( + currentConnectedBoard, + this.lastConnectedBoard + ) ) { - this.onMonitorShouldResetEmitter.fire(null); - this.lastConnectedBoard = { - selectedBoard: selectedBoard, - selectedPort: selectedPort, - }; - } else { // a board is plugged and it's the same as prev, rerun "this.startMonitor" to // recreate the listener callback this.startMonitor(); + } else { + // a board is plugged and it's different from the old connected board + this.lastConnectedBoard = currentConnectedBoard; + this.onMonitorShouldResetEmitter.fire(); } } ); } - const { selectedBoard, selectedPort } = - this.boardsServiceProvider.boardsConfig; - if (!selectedBoard || !selectedBoard.fqbn || !selectedPort) return; - await this.server().startMonitor(selectedBoard, selectedPort, settings); + if (!this.lastConnectedBoard) { + return; + } + + const board = getInferredBoardOrBoard(this.lastConnectedBoard); + if (!board) { + return; + } + try { + this.clearVisibleNotification(); + await this.server().startMonitor( + board, + this.lastConnectedBoard.port, + settings + ); + } catch (err) { + const message = ApplicationError.is(err) ? err.message : String(err); + this.previousNotificationId = this.notificationId(message); + this.messageService.error(message); + } } - getCurrentSettings(board: Board, port: Port): Promise { + getCurrentSettings( + board: BoardIdentifier, + port: PortIdentifier + ): Promise { return this.server().getCurrentSettings(board, port); } @@ -199,4 +221,24 @@ export class MonitorManagerProxyClientImpl }) ); } + + /** + * This is the internal (Theia) ID of the notification that is currently visible. + * It's stored here as a field to be able to close it before starting a new monitor connection. It's a hack. + */ + private previousNotificationId: string | undefined; + private clearVisibleNotification(): void { + if (this.previousNotificationId) { + this.notificationManager.clear(this.previousNotificationId); + this.previousNotificationId = undefined; + } + } + + private notificationId(message: string, ...actions: string[]): string { + return this.notificationManager['getMessageId']({ + text: message, + actions, + type: MessageType.Error, + }); + } } diff --git a/arduino-ide-extension/src/browser/monitor-model.ts b/arduino-ide-extension/src/browser/monitor-model.ts index 3ebea1819..d2d285272 100644 --- a/arduino-ide-extension/src/browser/monitor-model.ts +++ b/arduino-ide-extension/src/browser/monitor-model.ts @@ -4,9 +4,16 @@ import { LocalStorageService, } from '@theia/core/lib/browser'; import { inject, injectable } from '@theia/core/shared/inversify'; -import { MonitorManagerProxyClient } from '../common/protocol'; +import { + isMonitorConnected, + MonitorConnectionStatus, + monitorConnectionStatusEquals, + MonitorEOL, + MonitorManagerProxyClient, + MonitorSettings, + MonitorState, +} from '../common/protocol'; import { isNullOrUndefined } from '../common/utils'; -import { MonitorSettings } from '../node/monitor-settings/monitor-settings-provider'; @injectable() export class MonitorModel implements FrontendApplicationContribution { @@ -19,36 +26,36 @@ export class MonitorModel implements FrontendApplicationContribution { protected readonly monitorManagerProxy: MonitorManagerProxyClient; protected readonly onChangeEmitter: Emitter< - MonitorModel.State.Change + MonitorState.Change >; protected _autoscroll: boolean; protected _timestamp: boolean; - protected _lineEnding: MonitorModel.EOL; + protected _lineEnding: MonitorEOL; protected _interpolate: boolean; protected _darkTheme: boolean; protected _wsPort: number; protected _serialPort: string; - protected _connected: boolean; + protected _connectionStatus: MonitorConnectionStatus; constructor() { this._autoscroll = true; this._timestamp = false; this._interpolate = false; - this._lineEnding = MonitorModel.EOL.DEFAULT; + this._lineEnding = MonitorEOL.DEFAULT; this._darkTheme = false; this._wsPort = 0; this._serialPort = ''; - this._connected = true; + this._connectionStatus = 'not-connected'; this.onChangeEmitter = new Emitter< - MonitorModel.State.Change + MonitorState.Change >(); } onStart(): void { this.localStorageService - .getData(MonitorModel.STORAGE_ID) + .getData(MonitorModel.STORAGE_ID) .then(this.restoreState.bind(this)); this.monitorManagerProxy.onMonitorSettingsDidChange( @@ -56,11 +63,11 @@ export class MonitorModel implements FrontendApplicationContribution { ); } - get onChange(): Event> { + get onChange(): Event> { return this.onChangeEmitter.event; } - protected restoreState(state: MonitorModel.State): void { + protected restoreState(state: MonitorState): void { if (!state) { return; } @@ -125,11 +132,11 @@ export class MonitorModel implements FrontendApplicationContribution { this.timestamp = !this._timestamp; } - get lineEnding(): MonitorModel.EOL { + get lineEnding(): MonitorEOL { return this._lineEnding; } - set lineEnding(lineEnding: MonitorModel.EOL) { + set lineEnding(lineEnding: MonitorEOL) { if (lineEnding === this._lineEnding) return; this._lineEnding = lineEnding; this.monitorManagerProxy.changeSettings({ @@ -211,19 +218,26 @@ export class MonitorModel implements FrontendApplicationContribution { ); } - get connected(): boolean { - return this._connected; + get connectionStatus(): MonitorConnectionStatus { + return this._connectionStatus; } - set connected(connected: boolean) { - if (connected === this._connected) return; - this._connected = connected; + set connectionStatus(connectionStatus: MonitorConnectionStatus) { + if ( + monitorConnectionStatusEquals(connectionStatus, this.connectionStatus) + ) { + return; + } + this._connectionStatus = connectionStatus; this.monitorManagerProxy.changeSettings({ - monitorUISettings: { connected }, + monitorUISettings: { + connectionStatus, + connected: isMonitorConnected(connectionStatus), + }, }); this.onChangeEmitter.fire({ - property: 'connected', - value: this._connected, + property: 'connectionStatus', + value: this._connectionStatus, }); } @@ -238,7 +252,7 @@ export class MonitorModel implements FrontendApplicationContribution { darkTheme, wsPort, serialPort, - connected, + connectionStatus, } = monitorUISettings; if (!isNullOrUndefined(autoscroll)) this.autoscroll = autoscroll; @@ -248,31 +262,7 @@ export class MonitorModel implements FrontendApplicationContribution { if (!isNullOrUndefined(darkTheme)) this.darkTheme = darkTheme; if (!isNullOrUndefined(wsPort)) this.wsPort = wsPort; if (!isNullOrUndefined(serialPort)) this.serialPort = serialPort; - if (!isNullOrUndefined(connected)) this.connected = connected; + if (!isNullOrUndefined(connectionStatus)) + this.connectionStatus = connectionStatus; }; } - -// TODO: Move this to /common -export namespace MonitorModel { - export interface State { - autoscroll: boolean; - timestamp: boolean; - lineEnding: EOL; - interpolate: boolean; - darkTheme: boolean; - wsPort: number; - serialPort: string; - connected: boolean; - } - export namespace State { - export interface Change { - readonly property: K; - readonly value: State[K]; - } - } - - export type EOL = '' | '\n' | '\r' | '\r\n'; - export namespace EOL { - export const DEFAULT: EOL = '\n'; - } -} diff --git a/arduino-ide-extension/src/browser/notification-center.ts b/arduino-ide-extension/src/browser/notification-center.ts index b17853d0a..f74ee3cf2 100644 --- a/arduino-ide-extension/src/browser/notification-center.ts +++ b/arduino-ide-extension/src/browser/notification-center.ts @@ -6,18 +6,21 @@ import { import { Emitter } from '@theia/core/lib/common/event'; import { JsonRpcProxy } from '@theia/core/lib/common/messaging/proxy-factory'; 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 { + IndexUpdateDidCompleteParams, + IndexUpdateDidFailParams, + IndexUpdateWillStartParams, NotificationServiceClient, NotificationServiceServer, } from '../common/protocol/notification-service'; -import { - AttachedBoardsChangeEvent, +import type { BoardsPackage, LibraryPackage, - Config, + ConfigState, Sketch, ProgressMessage, + DetectedPorts, } from '../common/protocol'; import { FrontendApplicationStateService, @@ -29,48 +32,49 @@ export class NotificationCenter implements NotificationServiceClient, FrontendApplicationContribution { @inject(NotificationServiceServer) - protected readonly server: JsonRpcProxy; + private readonly server: JsonRpcProxy; @inject(FrontendApplicationStateService) private readonly appStateService: FrontendApplicationStateService; - protected readonly indexDidUpdateEmitter = new Emitter(); - protected readonly indexWillUpdateEmitter = new Emitter(); - protected readonly indexUpdateDidProgressEmitter = + private readonly didReinitializeEmitter = new Emitter(); + private readonly indexUpdateDidCompleteEmitter = + new Emitter(); + private readonly indexUpdateWillStartEmitter = + new Emitter(); + private readonly indexUpdateDidProgressEmitter = new Emitter(); - protected readonly indexUpdateDidFailEmitter = new Emitter<{ - progressId: string; - message: string; - }>(); - protected readonly daemonDidStartEmitter = new Emitter(); - protected readonly daemonDidStopEmitter = new Emitter(); - protected readonly configDidChangeEmitter = new Emitter<{ - config: Config | undefined; - }>(); - protected readonly platformDidInstallEmitter = new Emitter<{ + private readonly indexUpdateDidFailEmitter = + new Emitter(); + private readonly daemonDidStartEmitter = new Emitter(); + private readonly daemonDidStopEmitter = new Emitter(); + private readonly configDidChangeEmitter = new Emitter(); + private readonly platformDidInstallEmitter = new Emitter<{ item: BoardsPackage; }>(); - protected readonly platformDidUninstallEmitter = new Emitter<{ + private readonly platformDidUninstallEmitter = new Emitter<{ item: BoardsPackage; }>(); - protected readonly libraryDidInstallEmitter = new Emitter<{ - item: LibraryPackage; + private readonly libraryDidInstallEmitter = new Emitter<{ + item: LibraryPackage | 'zip-install'; }>(); - protected readonly libraryDidUninstallEmitter = new Emitter<{ + private readonly libraryDidUninstallEmitter = new Emitter<{ item: LibraryPackage; }>(); - protected readonly attachedBoardsDidChangeEmitter = - new Emitter(); - protected readonly recentSketchesChangedEmitter = new Emitter<{ + private readonly detectedPortsDidChangeEmitter = new Emitter<{ + detectedPorts: DetectedPorts; + }>(); + private readonly recentSketchesChangedEmitter = new Emitter<{ sketches: Sketch[]; }>(); private readonly onAppStateDidChangeEmitter = new Emitter(); - protected readonly toDispose = new DisposableCollection( - this.indexWillUpdateEmitter, + private readonly toDispose = new DisposableCollection( + this.didReinitializeEmitter, + this.indexUpdateWillStartEmitter, this.indexUpdateDidProgressEmitter, - this.indexDidUpdateEmitter, + this.indexUpdateDidCompleteEmitter, this.indexUpdateDidFailEmitter, this.daemonDidStartEmitter, this.daemonDidStopEmitter, @@ -79,11 +83,12 @@ export class NotificationCenter this.platformDidUninstallEmitter, this.libraryDidInstallEmitter, this.libraryDidUninstallEmitter, - this.attachedBoardsDidChangeEmitter + this.detectedPortsDidChangeEmitter ); - readonly onIndexDidUpdate = this.indexDidUpdateEmitter.event; - readonly onIndexWillUpdate = this.indexDidUpdateEmitter.event; + readonly onDidReinitialize = this.didReinitializeEmitter.event; + readonly onIndexUpdateDidComplete = this.indexUpdateDidCompleteEmitter.event; + readonly onIndexUpdateWillStart = this.indexUpdateWillStartEmitter.event; readonly onIndexUpdateDidProgress = this.indexUpdateDidProgressEmitter.event; readonly onIndexUpdateDidFail = this.indexUpdateDidFailEmitter.event; readonly onDaemonDidStart = this.daemonDidStartEmitter.event; @@ -93,8 +98,7 @@ export class NotificationCenter readonly onPlatformDidUninstall = this.platformDidUninstallEmitter.event; readonly onLibraryDidInstall = this.libraryDidInstallEmitter.event; readonly onLibraryDidUninstall = this.libraryDidUninstallEmitter.event; - readonly onAttachedBoardsDidChange = - this.attachedBoardsDidChangeEmitter.event; + readonly onDetectedPortsDidChange = this.detectedPortsDidChangeEmitter.event; readonly onRecentSketchesDidChange = this.recentSketchesChangedEmitter.event; readonly onAppStateDidChange = this.onAppStateDidChangeEmitter.event; @@ -112,29 +116,27 @@ export class NotificationCenter this.toDispose.dispose(); } - notifyIndexWillUpdate(progressId: string): void { - this.indexWillUpdateEmitter.fire(progressId); + notifyDidReinitialize(): void { + this.didReinitializeEmitter.fire(); + } + + notifyIndexUpdateWillStart(params: IndexUpdateWillStartParams): void { + this.indexUpdateWillStartEmitter.fire(params); } notifyIndexUpdateDidProgress(progressMessage: ProgressMessage): void { this.indexUpdateDidProgressEmitter.fire(progressMessage); } - notifyIndexDidUpdate(progressId: string): void { - this.indexDidUpdateEmitter.fire(progressId); + notifyIndexUpdateDidComplete(params: IndexUpdateDidCompleteParams): void { + this.indexUpdateDidCompleteEmitter.fire(params); } - notifyIndexUpdateDidFail({ - progressId, - message, - }: { - progressId: string; - message: string; - }): void { - this.indexUpdateDidFailEmitter.fire({ progressId, message }); + notifyIndexUpdateDidFail(params: IndexUpdateDidFailParams): void { + this.indexUpdateDidFailEmitter.fire(params); } - notifyDaemonDidStart(port: string): void { + notifyDaemonDidStart(port: number): void { this.daemonDidStartEmitter.fire(port); } @@ -142,7 +144,7 @@ export class NotificationCenter this.daemonDidStopEmitter.fire(); } - notifyConfigDidChange(event: { config: Config | undefined }): void { + notifyConfigDidChange(event: ConfigState): void { this.configDidChangeEmitter.fire(event); } @@ -154,7 +156,9 @@ export class NotificationCenter this.platformDidUninstallEmitter.fire(event); } - notifyLibraryDidInstall(event: { item: LibraryPackage }): void { + notifyLibraryDidInstall(event: { + item: LibraryPackage | 'zip-install'; + }): void { this.libraryDidInstallEmitter.fire(event); } @@ -162,8 +166,8 @@ export class NotificationCenter this.libraryDidUninstallEmitter.fire(event); } - notifyAttachedBoardsDidChange(event: AttachedBoardsChangeEvent): void { - this.attachedBoardsDidChangeEmitter.fire(event); + notifyDetectedPortsDidChange(event: { detectedPorts: DetectedPorts }): void { + this.detectedPortsDidChangeEmitter.fire(event); } notifyRecentSketchesDidChange(event: { sketches: Sketch[] }): void { diff --git a/arduino-ide-extension/src/browser/serial/monitor/monitor-view-contribution.tsx b/arduino-ide-extension/src/browser/serial/monitor/monitor-view-contribution.tsx index 36f13c3b2..98bf53625 100644 --- a/arduino-ide-extension/src/browser/serial/monitor/monitor-view-contribution.tsx +++ b/arduino-ide-extension/src/browser/serial/monitor/monitor-view-contribution.tsx @@ -1,6 +1,14 @@ -import * as React from '@theia/core/shared/react'; -import { injectable, inject } from '@theia/core/shared/inversify'; -import { AbstractViewContribution, codicon } from '@theia/core/lib/browser'; +import React from '@theia/core/shared/react'; +import { + injectable, + inject, + postConstruct, +} from '@theia/core/shared/inversify'; +import { + AbstractViewContribution, + ApplicationShell, + codicon, +} from '@theia/core/lib/browser'; import { MonitorWidget } from './monitor-widget'; import { MenuModelRegistry, Command, CommandRegistry } from '@theia/core'; import { @@ -10,8 +18,15 @@ import { import { ArduinoToolbar } from '../../toolbar/arduino-toolbar'; import { ArduinoMenus } from '../../menu/arduino-menus'; import { nls } from '@theia/core/lib/common'; +import { Event } from '@theia/core/lib/common/event'; import { MonitorModel } from '../../monitor-model'; import { MonitorManagerProxyClient } from '../../../common/protocol'; +import { + ArduinoPreferences, + defaultMonitorWidgetDockPanel, + isMonitorWidgetDockPanel, +} from '../../arduino-preferences'; +import { serialMonitorWidgetLabel } from '../../../common/nls'; export namespace SerialMonitor { export namespace Commands { @@ -50,30 +65,64 @@ export class MonitorViewContribution MonitorWidget.ID + ':toggle-toolbar'; static readonly RESET_SERIAL_MONITOR = MonitorWidget.ID + ':reset'; - constructor( - @inject(MonitorModel) - protected readonly model: MonitorModel, + @inject(MonitorModel) + private readonly model: MonitorModel; + @inject(MonitorManagerProxyClient) + private readonly monitorManagerProxy: MonitorManagerProxyClient; + @inject(ArduinoPreferences) + private readonly arduinoPreferences: ArduinoPreferences; - @inject(MonitorManagerProxyClient) - protected readonly monitorManagerProxy: MonitorManagerProxyClient - ) { + private _panel: ApplicationShell.Area; + + constructor() { super({ widgetId: MonitorWidget.ID, - widgetName: MonitorWidget.LABEL, + widgetName: serialMonitorWidgetLabel, defaultWidgetOptions: { - area: 'bottom', + area: defaultMonitorWidgetDockPanel, }, toggleCommandId: MonitorViewContribution.TOGGLE_SERIAL_MONITOR, toggleKeybinding: 'CtrlCmd+Shift+M', }); + this._panel = defaultMonitorWidgetDockPanel; + } + + @postConstruct() + protected init(): void { + this._panel = + this.arduinoPreferences['arduino.monitor.dockPanel'] ?? + defaultMonitorWidgetDockPanel; this.monitorManagerProxy.onMonitorShouldReset(() => this.reset()); + this.arduinoPreferences.onPreferenceChanged((event) => { + if ( + event.preferenceName === 'arduino.monitor.dockPanel' && + isMonitorWidgetDockPanel(event.newValue) && + event.newValue !== this._panel + ) { + this._panel = event.newValue; + const widget = this.tryGetWidget(); + // reopen at the new position if opened + if (widget) { + widget.close(); + this.openView({ activate: true, reveal: true }); + } + } + }); + } + + override get defaultViewOptions(): ApplicationShell.WidgetOptions { + const viewOptions = super.defaultViewOptions; + return { + ...viewOptions, + area: this._panel, + }; } override registerMenus(menus: MenuModelRegistry): void { if (this.toggleCommand) { menus.registerMenuAction(ArduinoMenus.TOOLS__MAIN_GROUP, { commandId: this.toggleCommand.id, - label: MonitorWidget.LABEL, + label: serialMonitorWidgetLabel, order: '5', }); } @@ -84,13 +133,13 @@ export class MonitorViewContribution id: 'monitor-autoscroll', render: () => this.renderAutoScrollButton(), isVisible: (widget) => widget instanceof MonitorWidget, - onDidChange: this.model.onChange as any, // XXX: it's a hack. See: https://github.com/eclipse-theia/theia/pull/6696/ + onDidChange: this.model.onChange as Event as Event, }); registry.registerItem({ id: 'monitor-timestamp', render: () => this.renderTimestampButton(), isVisible: (widget) => widget instanceof MonitorWidget, - onDidChange: this.model.onChange as any, // XXX: it's a hack. See: https://github.com/eclipse-theia/theia/pull/6696/ + onDidChange: this.model.onChange as Event as Event, }); registry.registerItem({ id: SerialMonitor.Commands.CLEAR_OUTPUT.id, @@ -143,8 +192,7 @@ export class MonitorViewContribution protected async reset(): Promise { const widget = this.tryGetWidget(); if (widget) { - widget.dispose(); - await this.openView({ activate: true, reveal: true }); + widget.reset(); } } diff --git a/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx b/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx index f9aba5ed4..f5c394603 100644 --- a/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx +++ b/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx @@ -1,8 +1,14 @@ -import * as React from '@theia/core/shared/react'; -import { injectable, inject } from '@theia/core/shared/inversify'; -import { OptionsType } from 'react-select/src/types'; +import React from '@theia/core/shared/react'; +import { + injectable, + inject, + postConstruct, +} from '@theia/core/shared/inversify'; import { Emitter } from '@theia/core/lib/common/event'; -import { Disposable } from '@theia/core/lib/common/disposable'; +import { + Disposable, + DisposableCollection, +} from '@theia/core/lib/common/disposable'; import { ReactWidget, Message, @@ -14,16 +20,17 @@ import { SerialMonitorSendInput } from './serial-monitor-send-input'; import { SerialMonitorOutput } from './serial-monitor-send-output'; import { BoardsServiceProvider } from '../../boards/boards-service-provider'; import { nls } from '@theia/core/lib/common'; -import { MonitorManagerProxyClient } from '../../../common/protocol'; +import { + MonitorEOL, + MonitorManagerProxyClient, + MonitorSettings, +} from '../../../common/protocol'; import { MonitorModel } from '../../monitor-model'; -import { MonitorSettings } from '../../../node/monitor-settings/monitor-settings-provider'; +import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state'; +import { serialMonitorWidgetLabel } from '../../../common/nls'; @injectable() export class MonitorWidget extends ReactWidget { - static readonly LABEL = nls.localize( - 'arduino/common/serialMonitor', - 'Serial Monitor' - ); static readonly ID = 'serial-monitor'; protected settings: MonitorSettings = {}; @@ -41,40 +48,46 @@ export class MonitorWidget extends ReactWidget { protected closing = false; protected readonly clearOutputEmitter = new Emitter(); - constructor( - @inject(MonitorModel) - protected readonly monitorModel: MonitorModel, + @inject(MonitorModel) + private readonly monitorModel: MonitorModel; + @inject(MonitorManagerProxyClient) + private readonly monitorManagerProxy: MonitorManagerProxyClient; + @inject(BoardsServiceProvider) + private readonly boardsServiceProvider: BoardsServiceProvider; + @inject(FrontendApplicationStateService) + private readonly appStateService: FrontendApplicationStateService; - @inject(MonitorManagerProxyClient) - protected readonly monitorManagerProxy: MonitorManagerProxyClient, + private readonly toDisposeOnReset: DisposableCollection; - @inject(BoardsServiceProvider) - protected readonly boardsServiceProvider: BoardsServiceProvider - ) { + constructor() { super(); this.id = MonitorWidget.ID; - this.title.label = MonitorWidget.LABEL; + this.title.label = serialMonitorWidgetLabel; this.title.iconClass = 'monitor-tab-icon'; this.title.closable = true; this.scrollOptions = undefined; + this.toDisposeOnReset = new DisposableCollection(); this.toDispose.push(this.clearOutputEmitter); - this.toDispose.push( - Disposable.create(() => this.monitorManagerProxy.disconnect()) - ); } - protected override onBeforeAttach(msg: Message): void { - this.update(); - this.toDispose.push(this.monitorModel.onChange(() => this.update())); - this.getCurrentSettings().then(this.onMonitorSettingsDidChange.bind(this)); - this.monitorManagerProxy.onMonitorSettingsDidChange( - this.onMonitorSettingsDidChange.bind(this) - ); + @postConstruct() + protected init(): void { + this.toDisposeOnReset.dispose(); + this.toDisposeOnReset.pushAll([ + Disposable.create(() => this.monitorManagerProxy.disconnect()), + this.monitorModel.onChange(() => this.update()), + this.monitorManagerProxy.onMonitorSettingsDidChange((event) => + this.updateSettings(event) + ), + ]); + this.startMonitor(); + } - this.monitorManagerProxy.startMonitor(); + reset(): void { + this.init(); } - onMonitorSettingsDidChange(settings: MonitorSettings): void { + private updateSettings(settings: MonitorSettings): void { this.settings = { ...this.settings, pluggableMonitorSettings: { @@ -91,6 +104,7 @@ export class MonitorWidget extends ReactWidget { } override dispose(): void { + this.toDisposeOnReset.dispose(); super.dispose(); } @@ -118,7 +132,12 @@ export class MonitorWidget extends ReactWidget { (this.focusNode || this.node).focus(); } - protected onFocusResolved = (element: HTMLElement | undefined) => { + protected override onAfterShow(msg: Message): void { + super.onAfterShow(msg); + this.update(); + } + + protected onFocusResolved = (element: HTMLElement | undefined): void => { if (this.closing || !this.isAttached) { return; } @@ -128,9 +147,7 @@ export class MonitorWidget extends ReactWidget { ); }; - protected get lineEndings(): OptionsType< - SerialMonitorOutput.SelectOption - > { + protected get lineEndings(): SerialMonitorOutput.SelectOption[] { return [ { label: nls.localize('arduino/serial/noLineEndings', 'No Line Ending'), @@ -154,11 +171,22 @@ export class MonitorWidget extends ReactWidget { ]; } - private getCurrentSettings(): Promise { + private async startMonitor(): Promise { + await this.appStateService.reachedState('ready'); + await this.syncSettings(); + await this.monitorManagerProxy.startMonitor(); + } + + private async syncSettings(): Promise { + const settings = await this.getCurrentSettings(); + this.updateSettings(settings); + } + + private async getCurrentSettings(): Promise { const board = this.boardsServiceProvider.boardsConfig.selectedBoard; const port = this.boardsServiceProvider.boardsConfig.selectedPort; if (!board || !port) { - return Promise.resolve(this.settings || {}); + return this.settings || {}; } return this.monitorManagerProxy.getCurrentSettings(board, port); } @@ -169,7 +197,7 @@ export class MonitorWidget extends ReactWidget { : undefined; const baudrateOptions = baudrate?.values.map((b) => ({ - label: b + ' baud', + label: nls.localize('arduino/monitor/baudRate', '{0} baud', b), value: b, })); const baudrateSelectedOption = baudrateOptions?.find( @@ -179,7 +207,7 @@ export class MonitorWidget extends ReactWidget { const lineEnding = this.lineEndings.find( (item) => item.value === this.monitorModel.lineEnding - ) || this.lineEndings[1]; // Defaults to `\n`. + ) || MonitorEOL.DEFAULT; return (
@@ -226,13 +254,13 @@ export class MonitorWidget extends ReactWidget { ); } - protected readonly onSend = (value: string) => this.doSend(value); - protected async doSend(value: string): Promise { + protected readonly onSend = (value: string): void => this.doSend(value); + protected doSend(value: string): void { this.monitorManagerProxy.send(value); } protected readonly onChangeLineEnding = ( - option: SerialMonitorOutput.SelectOption + option: SerialMonitorOutput.SelectOption ): void => { this.monitorModel.lineEnding = option.value; }; diff --git a/arduino-ide-extension/src/browser/serial/monitor/serial-monitor-send-input.tsx b/arduino-ide-extension/src/browser/serial/monitor/serial-monitor-send-input.tsx index 180949726..086626c24 100644 --- a/arduino-ide-extension/src/browser/serial/monitor/serial-monitor-send-input.tsx +++ b/arduino-ide-extension/src/browser/serial/monitor/serial-monitor-send-input.tsx @@ -1,11 +1,61 @@ -import * as React from '@theia/core/shared/react'; +import React from '@theia/core/shared/react'; import { Key, KeyCode } from '@theia/core/lib/browser/keys'; import { Board } from '../../../common/protocol/boards-service'; -import { isOSX } from '@theia/core/lib/common/os'; import { DisposableCollection, nls } from '@theia/core/lib/common'; import { BoardsServiceProvider } from '../../boards/boards-service-provider'; import { MonitorModel } from '../../monitor-model'; import { Unknown } from '../../../common/nls'; +import { + isMonitorConnectionError, + MonitorConnectionStatus, +} from '../../../common/protocol'; + +class HistoryList { + private readonly items: string[] = []; + private index = -1; + + constructor(private readonly size = 100) {} + + push(val: string): void { + if (val !== this.items[this.items.length - 1]) { + this.items.push(val); + } + while (this.items.length > this.size) { + this.items.shift(); + } + this.index = -1; + } + + previous(): string { + if (this.index === -1) { + this.index = this.items.length - 1; + return this.items[this.index]; + } + if (this.hasPrevious) { + return this.items[--this.index]; + } + return this.items[this.index]; + } + + private get hasPrevious(): boolean { + return this.index >= 1; + } + + next(): string { + if (this.index === this.items.length - 1) { + this.index = -1; + return ''; + } + if (this.hasNext) { + return this.items[++this.index]; + } + return ''; + } + + private get hasNext(): boolean { + return this.index >= 0 && this.index !== this.items.length - 1; + } +} export namespace SerialMonitorSendInput { export interface Props { @@ -16,7 +66,8 @@ export namespace SerialMonitorSendInput { } export interface State { text: string; - connected: boolean; + connectionStatus: MonitorConnectionStatus; + history: HistoryList; } } @@ -28,18 +79,27 @@ export class SerialMonitorSendInput extends React.Component< constructor(props: Readonly) { super(props); - this.state = { text: '', connected: true }; + this.state = { + text: '', + connectionStatus: 'not-connected', + history: new HistoryList(), + }; this.onChange = this.onChange.bind(this); this.onSend = this.onSend.bind(this); this.onKeyDown = this.onKeyDown.bind(this); } override componentDidMount(): void { - this.setState({ connected: this.props.monitorModel.connected }); + this.setState({ + connectionStatus: this.props.monitorModel.connectionStatus, + }); this.toDisposeBeforeUnmount.push( this.props.monitorModel.onChange(({ property }) => { - if (property === 'connected') - this.setState({ connected: this.props.monitorModel.connected }); + if (property === 'connected' || property === 'connectionStatus') { + this.setState({ + connectionStatus: this.props.monitorModel.connectionStatus, + }); + } }) ); } @@ -50,49 +110,87 @@ export class SerialMonitorSendInput extends React.Component< } override render(): React.ReactNode { + const status = this.state.connectionStatus; + const input = this.renderInput(status); + if (status !== 'connecting') { + return input; + } + return ; + } + + private renderInput(status: MonitorConnectionStatus): React.ReactNode { + const inputClassName = this.inputClassName(status); + const placeholder = this.placeholder; + const readOnly = Boolean(inputClassName); return ( onChange={this.onChange} onKeyDown={this.onKeyDown} /> ); } + private inputClassName( + status: MonitorConnectionStatus + ): 'error' | 'warning' | '' { + if (isMonitorConnectionError(status)) { + return 'error'; + } + if (status === 'connected') { + return ''; + } + return 'warning'; + } + protected shouldShowWarning(): boolean { const board = this.props.boardsServiceProvider.boardsConfig.selectedBoard; const port = this.props.boardsServiceProvider.boardsConfig.selectedPort; - return !this.state.connected || !board || !port; + return !this.state.connectionStatus || !board || !port; } protected get placeholder(): string { - if (this.shouldShowWarning()) { + const status = this.state.connectionStatus; + if (isMonitorConnectionError(status)) { + return status.errorMessage; + } + if (status === 'not-connected') { return nls.localize( 'arduino/serial/notConnected', 'Not connected. Select a board and a port to connect automatically.' ); } - const board = this.props.boardsServiceProvider.boardsConfig.selectedBoard; const port = this.props.boardsServiceProvider.boardsConfig.selectedPort; + const boardLabel = board + ? Board.toString(board, { + useFqbn: false, + }) + : Unknown; + const portLabel = port ? port.address : Unknown; + if (status === 'connecting') { + return nls.localize( + 'arduino/serial/connecting', + "Connecting to '{0}' on '{1}'...", + boardLabel, + portLabel + ); + } return nls.localize( 'arduino/serial/message', - "Message ({0} + Enter to send message to '{1}' on '{2}')", - isOSX ? '⌘' : nls.localize('vscode/keybindingLabels/ctrlKey', 'Ctrl'), - board - ? Board.toString(board, { - useFqbn: false, - }) - : Unknown, - port ? port.address : Unknown + "Message (Enter to send message to '{0}' on '{1}')", + boardLabel, + portLabel ); } - protected setRef = (element: HTMLElement | null) => { + protected setRef = (element: HTMLElement | null): void => { if (this.props.resolveFocus) { this.props.resolveFocus(element || undefined); } @@ -110,9 +208,19 @@ export class SerialMonitorSendInput extends React.Component< protected onKeyDown(event: React.KeyboardEvent): void { const keyCode = KeyCode.createKeyCode(event.nativeEvent); if (keyCode) { - const { key, meta, ctrl } = keyCode; - if (key === Key.ENTER && ((isOSX && meta) || (!isOSX && ctrl))) { + const { key } = keyCode; + if (key === Key.ENTER) { + const { text } = this.state; this.onSend(); + if (text) { + this.state.history.push(text); + } + } else if (key === Key.ARROW_UP) { + this.setState({ text: this.state.history.previous() }); + } else if (key === Key.ARROW_DOWN) { + this.setState({ text: this.state.history.next() }); + } else if (key === Key.ESCAPE) { + this.setState({ text: '' }); } } } diff --git a/arduino-ide-extension/src/browser/serial/monitor/serial-monitor-send-output.tsx b/arduino-ide-extension/src/browser/serial/monitor/serial-monitor-send-output.tsx index 136180202..ec2327ad5 100644 --- a/arduino-ide-extension/src/browser/serial/monitor/serial-monitor-send-output.tsx +++ b/arduino-ide-extension/src/browser/serial/monitor/serial-monitor-send-output.tsx @@ -1,8 +1,8 @@ -import * as React from '@theia/core/shared/react'; +import React from '@theia/core/shared/react'; import { Event } from '@theia/core/lib/common/event'; import { DisposableCollection } from '@theia/core/lib/common/disposable'; import { areEqual, FixedSizeList as List } from 'react-window'; -import dateFormat = require('dateformat'); +import dateFormat from 'dateformat'; import { messagesToLines, truncateLines } from './monitor-utils'; import { MonitorManagerProxyClient } from '../../../common/protocol'; import { MonitorModel } from '../../monitor-model'; @@ -17,7 +17,7 @@ export class SerialMonitorOutput extends React.Component< * Do not touch it. It is used to be able to "follow" the serial monitor log. */ protected toDisposeBeforeUnmount = new DisposableCollection(); - private listRef: React.RefObject; + private listRef: React.RefObject; constructor(props: Readonly) { super(props); @@ -34,12 +34,10 @@ export class SerialMonitorOutput extends React.Component< this.scrollToBottom() + ); }), this.props.clearConsoleEvent(() => this.setState({ lines: [], charCount: 0 }) @@ -91,11 +91,11 @@ export class SerialMonitorOutput extends React.Component< this.toDisposeBeforeUnmount.dispose(); } - scrollToBottom = ((): void => { + private readonly scrollToBottom = () => { if (this.listRef.current && this.props.monitorModel.autoscroll) { this.listRef.current.scrollToItem(this.state.lines.length, 'end'); } - }).bind(this); + }; } const _Row = ({ diff --git a/arduino-ide-extension/src/browser/serial/plotter/plotter-frontend-contribution.ts b/arduino-ide-extension/src/browser/serial/plotter/plotter-frontend-contribution.ts index 2a7c0a23f..23ba248f9 100644 --- a/arduino-ide-extension/src/browser/serial/plotter/plotter-frontend-contribution.ts +++ b/arduino-ide-extension/src/browser/serial/plotter/plotter-frontend-contribution.ts @@ -1,22 +1,17 @@ +import { Endpoint } from '@theia/core/lib/browser/endpoint'; import { ThemeService } from '@theia/core/lib/browser/theming'; -import { injectable, inject } from '@theia/core/shared/inversify'; -import { - Command, - CommandRegistry, - MaybePromise, - MenuModelRegistry, -} from '@theia/core'; -import { ArduinoMenus } from '../../menu/arduino-menus'; -import { Contribution } from '../../contributions/contribution'; -import { Endpoint, FrontendApplication } from '@theia/core/lib/browser'; -import { ipcRenderer } from '@theia/electron/shared/electron'; +import { Command, CommandRegistry } from '@theia/core/lib/common/command'; +import { DisposableCollection } from '@theia/core/lib/common/disposable'; +import type { MenuModelRegistry } from '@theia/core/lib/common/menu'; +import { nls } from '@theia/core/lib/common/nls'; +import { inject, injectable } from '@theia/core/shared/inversify'; +import queryString from 'query-string'; import { MonitorManagerProxyClient } from '../../../common/protocol'; -import { BoardsServiceProvider } from '../../boards/boards-service-provider'; +import { Contribution } from '../../contributions/contribution'; +import { ArduinoMenus } from '../../menu/arduino-menus'; import { MonitorModel } from '../../monitor-model'; import { ArduinoToolbar } from '../../toolbar/arduino-toolbar'; -const queryString = require('query-string'); - export namespace SerialPlotterContribution { export namespace Commands { export const OPEN: Command = Command.toLocalizedCommand( @@ -39,38 +34,31 @@ export namespace SerialPlotterContribution { @injectable() export class PlotterFrontendContribution extends Contribution { - protected window: Window | null; - protected url: string; - protected wsPort: number; + private readonly endpointUrl = new Endpoint({ path: '/plotter' }) + .getRestUrl() + .toString(); + private readonly toDispose = new DisposableCollection(); + private _plotterUrl: string | undefined; @inject(MonitorModel) - protected readonly model: MonitorModel; - + private readonly model: MonitorModel; @inject(ThemeService) - protected readonly themeService: ThemeService; - + private readonly themeService: ThemeService; @inject(MonitorManagerProxyClient) - protected readonly monitorManagerProxy: MonitorManagerProxyClient; - - @inject(BoardsServiceProvider) - protected readonly boardsServiceProvider: BoardsServiceProvider; + private readonly monitorManagerProxy: MonitorManagerProxyClient; - override onStart(app: FrontendApplication): MaybePromise { - this.url = new Endpoint({ path: '/plotter' }).getRestUrl().toString(); - - ipcRenderer.on('CLOSE_CHILD_WINDOW', async () => { - if (!!this.window) { - this.window = null; - } - }); + override onStart(): void { + this.toDispose.push( + window.electronArduino.registerPlotterWindowCloseHandler(() => { + this._plotterUrl = undefined; + }) + ); this.monitorManagerProxy.onMonitorShouldReset(() => this.reset()); - - return super.onStart(app); } override registerCommands(registry: CommandRegistry): void { registry.registerCommand(SerialPlotterContribution.Commands.OPEN, { - execute: this.startPlotter.bind(this), + execute: () => this.startPlotter(), }); registry.registerCommand(SerialPlotterContribution.Commands.RESET, { execute: () => this.reset(), @@ -80,7 +68,7 @@ export class PlotterFrontendContribution extends Contribution { { isVisible: (widget) => ArduinoToolbar.is(widget) && widget.side === 'right', - execute: this.startPlotter.bind(this), + execute: () => this.startPlotter(), } ); } @@ -93,40 +81,52 @@ export class PlotterFrontendContribution extends Contribution { }); } - async startPlotter(): Promise { + private async startPlotter(forceReload = false): Promise { await this.monitorManagerProxy.startMonitor(); - if (!!this.window) { - this.window.focus(); + if (this._plotterUrl) { + window.electronArduino.showPlotterWindow({ + url: this._plotterUrl, + forceReload, + }); return; } const wsPort = this.monitorManagerProxy.getWebSocketPort(); if (wsPort) { this.open(wsPort); } else { - this.messageService.error(`Couldn't open serial plotter`); + this.messageService.error( + nls.localize( + 'arduino/contributions/plotter/couldNotOpen', + "Couldn't open serial plotter" + ) + ); } } - protected async open(wsPort: number): Promise { + private open(wsPort: number): void { const initConfig = { - darkTheme: this.themeService.getCurrentTheme().type === 'dark', + darkTheme: this.isDarkTheme, wsPort, serialPort: this.model.serialPort, }; - const urlWithParams = queryString.stringifyUrl( + this._plotterUrl = queryString.stringifyUrl( { - url: this.url, + url: this.endpointUrl, query: initConfig, }, { arrayFormat: 'comma' } ); - this.window = window.open(urlWithParams, 'serialPlotter'); + window.electronArduino.showPlotterWindow({ url: this._plotterUrl }); + } + + private get isDarkTheme(): boolean { + const themeType = this.themeService.getCurrentTheme().type; + return themeType === 'dark' || themeType === 'hc'; } - protected async reset(): Promise { - if (!!this.window) { - this.window.close(); - await this.startPlotter(); + private async reset(): Promise { + if (this._plotterUrl) { + await this.startPlotter(true); } } } diff --git a/arduino-ide-extension/src/browser/sketches-service-client-impl.ts b/arduino-ide-extension/src/browser/sketches-service-client-impl.ts new file mode 100644 index 000000000..6955f080c --- /dev/null +++ b/arduino-ide-extension/src/browser/sketches-service-client-impl.ts @@ -0,0 +1,321 @@ +import { inject, injectable } from '@theia/core/shared/inversify'; +import URI from '@theia/core/lib/common/uri'; +import { Emitter } from '@theia/core/lib/common/event'; +import { notEmpty } from '@theia/core/lib/common/objects'; +import { FileService } from '@theia/filesystem/lib/browser/file-service'; +import { FileChangeType } from '@theia/filesystem/lib/common/files'; +import { WorkspaceService } from '@theia/workspace/lib/browser/workspace-service'; +import { + Disposable, + DisposableCollection, +} from '@theia/core/lib/common/disposable'; +import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application-contribution'; +import { Sketch, SketchesService } from '../common/protocol'; +import { ConfigServiceClient } from './config/config-service-client'; +import { + SketchContainer, + SketchesError, + SketchRef, +} from '../common/protocol/sketches-service'; +import { + ARDUINO_CLOUD_FOLDER, + REMOTE_SKETCHBOOK_FOLDER, +} from './utils/constants'; +import * as monaco from '@theia/monaco-editor-core'; +import { Deferred } from '@theia/core/lib/common/promise-util'; +import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state'; + +const READ_ONLY_FILES = ['sketch.json']; +const READ_ONLY_FILES_REMOTE = ['thingProperties.h', 'thingsProperties.h']; + +export type CurrentSketch = Sketch | 'invalid'; +export namespace CurrentSketch { + export function isValid(arg: CurrentSketch | undefined): arg is Sketch { + return !!arg && arg !== 'invalid'; + } +} + +@injectable() +export class SketchesServiceClientImpl + implements FrontendApplicationContribution +{ + @inject(FileService) + private readonly fileService: FileService; + @inject(SketchesService) + private readonly sketchesService: SketchesService; + @inject(WorkspaceService) + private readonly workspaceService: WorkspaceService; + @inject(ConfigServiceClient) + private readonly configService: ConfigServiceClient; + @inject(FrontendApplicationStateService) + private readonly appStateService: FrontendApplicationStateService; + + private sketches = new Map(); + private onSketchbookDidChangeEmitter = new Emitter<{ + created: SketchRef[]; + removed: SketchRef[]; + }>(); + readonly onSketchbookDidChange = this.onSketchbookDidChangeEmitter.event; + private currentSketchDidChangeEmitter = new Emitter(); + readonly onCurrentSketchDidChange = this.currentSketchDidChangeEmitter.event; + + private toDisposeBeforeWatchSketchbookDir = new DisposableCollection(); + private toDispose = new DisposableCollection( + this.onSketchbookDidChangeEmitter, + this.currentSketchDidChangeEmitter, + this.toDisposeBeforeWatchSketchbookDir + ); + + private _currentSketch: CurrentSketch | undefined; + private _currentIdeTempFolderUri: URI | undefined; + private currentSketchLoaded = new Deferred(); + + onStart(): void { + const sketchDirUri = this.configService.tryGetSketchDirUri(); + this.watchSketchbookDir(sketchDirUri); + const refreshCurrentSketch = async () => { + await this.workspaceService.ready; + const currentSketch = await this.loadCurrentSketch(); + const ideTempFolderUri = await this.getIdeTempFolderUriForSketch( + currentSketch + ); + this.useCurrentSketch(currentSketch, ideTempFolderUri); + }; + this.toDispose.push( + this.configService.onDidChangeSketchDirUri((sketchDirUri) => { + this.watchSketchbookDir(sketchDirUri); + refreshCurrentSketch(); + }) + ); + this.appStateService + .reachedState('started_contributions') + .then(refreshCurrentSketch); + } + + private async watchSketchbookDir( + sketchDirUri: URI | undefined + ): Promise { + this.toDisposeBeforeWatchSketchbookDir.dispose(); + if (!sketchDirUri) { + return; + } + const container = await this.sketchesService.getSketches({ + uri: sketchDirUri.toString(), + }); + for (const sketch of SketchContainer.toArray(container)) { + this.sketches.set(sketch.uri, sketch); + } + this.toDisposeBeforeWatchSketchbookDir.pushAll([ + Disposable.create(() => this.sketches.clear()), + // Watch changes in the sketchbook to update `File` > `Sketchbook` menu items. + this.fileService.watch(sketchDirUri, { + recursive: true, + excludes: [], + }), + this.fileService.onDidFilesChange(async (event) => { + for (const { type, resource } of event.changes) { + // The file change events have higher precedence in the current sketch over the sketchbook. + if ( + CurrentSketch.isValid(this._currentSketch) && + new URI(this._currentSketch.uri).isEqualOrParent(resource) + ) { + // https://github.com/arduino/arduino-ide/pull/1351#pullrequestreview-1086666656 + // On a sketch file rename, the FS watcher will contain two changes: + // - Deletion of the original file, + // - Update of the new file, + // Hence, `UPDATE` events must be processed but only and if only there is a `DELETED` change in the same event. + // Otherwise, IDE2 would ask CLI to reload the sketch content on every save event in IDE2. + if (type === FileChangeType.UPDATED && event.changes.length === 1) { + // If the event contains only one `UPDATE` change, it cannot be a rename. + return; + } + + let reloadedSketch: Sketch | undefined = undefined; + try { + reloadedSketch = await this.sketchesService.loadSketch( + this._currentSketch.uri + ); + } catch (err) { + if (!SketchesError.NotFound.is(err)) { + throw err; + } + } + + if (!reloadedSketch) { + return; + } + + if (!Sketch.sameAs(this._currentSketch, reloadedSketch)) { + const ideTempFolderUri = await this.getIdeTempFolderUriForSketch( + reloadedSketch + ); + this.useCurrentSketch(reloadedSketch, ideTempFolderUri, true); + } + return; + } + // We track main sketch files changes only. // TODO: check sketch folder changes. One can rename the folder without renaming the `.ino` file. + if (sketchDirUri.isEqualOrParent(resource)) { + if (Sketch.isSketchFile(resource)) { + if (type === FileChangeType.ADDED) { + try { + const toAdd = await this.sketchesService.loadSketch( + resource.parent.toString() + ); + if (!this.sketches.has(toAdd.uri)) { + console.log( + `New sketch '${toAdd.name}' was created in sketchbook '${sketchDirUri}'.` + ); + this.sketches.set(toAdd.uri, toAdd); + this.fireSoon(toAdd, 'created'); + } + } catch {} + } else if (type === FileChangeType.DELETED) { + const uri = resource.parent.toString(); + const toDelete = this.sketches.get(uri); + if (toDelete) { + console.log( + `Sketch '${toDelete.name}' was removed from sketchbook '${sketchDirUri}'.` + ); + this.sketches.delete(uri); + this.fireSoon(toDelete, 'removed'); + } + } + } + } + } + }), + ]); + } + + private async getIdeTempFolderUriForSketch( + sketch: CurrentSketch + ): Promise { + if (CurrentSketch.isValid(sketch)) { + const uri = await this.sketchesService.getIdeTempFolderUri(sketch); + return new URI(uri); + } + return undefined; + } + + private useCurrentSketch( + currentSketch: CurrentSketch, + ideTempFolderUri: URI | undefined, + reassignPromise = false + ) { + this._currentSketch = currentSketch; + this._currentIdeTempFolderUri = ideTempFolderUri; + if (reassignPromise) { + this.currentSketchLoaded = new Deferred(); + } + this.currentSketchLoaded.resolve(this._currentSketch); + this.currentSketchDidChangeEmitter.fire(this._currentSketch); + } + + onStop(): void { + this.toDispose.dispose(); + } + + private async loadCurrentSketch(): Promise { + const sketches = ( + await Promise.all( + this.workspaceService + .tryGetRoots() + .map(({ resource }) => + this.sketchesService.getSketchFolder(resource.toString()) + ) + ) + ).filter(notEmpty); + if (!sketches.length) { + return 'invalid'; + } + if (sketches.length > 1) { + console.log( + `Multiple sketch folders were found in the workspace. Falling back to the first one. Sketch folders: ${JSON.stringify( + sketches + )}` + ); + } + return sketches[0]; + } + + async currentSketch(): Promise { + return this.currentSketchLoaded.promise; + } + + tryGetCurrentSketch(): CurrentSketch | undefined { + return this._currentSketch; + } + + async currentSketchFile(): Promise { + const currentSketch = await this.currentSketch(); + if (CurrentSketch.isValid(currentSketch)) { + return currentSketch.mainFileUri; + } + return undefined; + } + + private fireSoonHandle?: number; + private bufferedSketchbookEvents: { + type: 'created' | 'removed'; + sketch: SketchRef; + }[] = []; + + private fireSoon(sketch: SketchRef, type: 'created' | 'removed'): void { + this.bufferedSketchbookEvents.push({ type, sketch }); + + if (typeof this.fireSoonHandle === 'number') { + window.clearTimeout(this.fireSoonHandle); + } + + this.fireSoonHandle = window.setTimeout(() => { + const event: { created: SketchRef[]; removed: SketchRef[] } = { + created: [], + removed: [], + }; + for (const { type, sketch } of this.bufferedSketchbookEvents) { + if (type === 'created') { + event.created.push(sketch); + } else { + event.removed.push(sketch); + } + } + this.onSketchbookDidChangeEmitter.fire(event); + this.bufferedSketchbookEvents.length = 0; + }, 100); + } + + /** + * `true` if the `uri` is not contained in any of the opened workspaces. Otherwise, `false`. + */ + isReadOnly(uri: URI | monaco.Uri | string): boolean { + const toCheck = uri instanceof URI ? uri : new URI(uri.toString()); + if (toCheck.scheme === 'user-storage') { + return false; + } + + if ( + this._currentIdeTempFolderUri && + this._currentIdeTempFolderUri.resolve('launch.json').toString() === + toCheck.toString() + ) { + return false; + } + + const isCloudSketch = toCheck + .toString() + .includes(`${REMOTE_SKETCHBOOK_FOLDER}/${ARDUINO_CLOUD_FOLDER}`); + + const filesToCheck = [ + ...READ_ONLY_FILES, + ...(isCloudSketch ? READ_ONLY_FILES_REMOTE : []), + ]; + + if (filesToCheck.includes(toCheck?.path?.base)) { + return true; + } + const readOnly = !this.workspaceService + .tryGetRoots() + .some(({ resource }) => resource.isEqualOrParent(toCheck)); + return readOnly; + } +} diff --git a/arduino-ide-extension/src/browser/storage-wrapper.ts b/arduino-ide-extension/src/browser/storage-wrapper.ts deleted file mode 100644 index c1ffeb502..000000000 --- a/arduino-ide-extension/src/browser/storage-wrapper.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { injectable, inject } from '@theia/core/shared/inversify'; -import { StorageService } from '@theia/core/lib/browser/storage-service'; -import { - Command, - CommandContribution, - CommandRegistry, -} from '@theia/core/lib/common/command'; - -/** - * This is a workaround to break cycles in the dependency injection. Provides commands for `setData` and `getData`. - */ -@injectable() -export class StorageWrapper implements CommandContribution { - @inject(StorageService) - protected storageService: StorageService; - - registerCommands(commands: CommandRegistry): void { - commands.registerCommand(StorageWrapper.Commands.GET_DATA, { - execute: (key: string, defaultValue?: any) => - this.storageService.getData(key, defaultValue), - }); - commands.registerCommand(StorageWrapper.Commands.SET_DATA, { - execute: (key: string, value: any) => - this.storageService.setData(key, value), - }); - } -} -export namespace StorageWrapper { - export namespace Commands { - export const SET_DATA: Command = { - id: 'arduino-store-wrapper-set', - }; - export const GET_DATA: Command = { - id: 'arduino-store-wrapper-get', - }; - } -} diff --git a/arduino-ide-extension/src/browser/style/account-icon.svg b/arduino-ide-extension/src/browser/style/account-icon.svg deleted file mode 100644 index 2759d882f..000000000 --- a/arduino-ide-extension/src/browser/style/account-icon.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/arduino-ide-extension/src/browser/style/arduino-select.css b/arduino-ide-extension/src/browser/style/arduino-select.css index 001c1bd9b..8bd53b041 100644 --- a/arduino-ide-extension/src/browser/style/arduino-select.css +++ b/arduino-ide-extension/src/browser/style/arduino-select.css @@ -38,7 +38,9 @@ .arduino-select__control.arduino-select__control--menu-is-open { border: 1px solid !important; border-color: var(--theia-focusBorder) !important; - border-bottom-color: var(--theia-sideBar-background) !important; /* if the bottom border color has the same color as the background of the control, we make the border "invisible" */ + border-bottom-color: var( + --theia-sideBar-background + ) !important; /* if the bottom border color has the same color as the background of the control, we make the border "invisible" */ } .arduino-select__value-container .arduino-select__single-value { @@ -49,14 +51,3 @@ padding-top: 0 !important; padding-bottom: 0 !important; } - - -/* High Contrast Theme rules */ -/* TODO: Remove it when the Theia version is upgraded to 1.27.0 and use Theia APIs to implement it*/ -.hc-black.hc-theia.theia-hc .arduino-select__option--is-selected { - outline: 1px solid var(--theia-focusBorder); -} - -.hc-black.hc-theia.theia-hc .arduino-select__option--is-focused { - outline: 1px dashed var(--theia-focusBorder); -} diff --git a/arduino-ide-extension/src/browser/style/boards-config-dialog.css b/arduino-ide-extension/src/browser/style/boards-config-dialog.css index 1beb7c4f9..cc86271ee 100644 --- a/arduino-ide-extension/src/browser/style/boards-config-dialog.css +++ b/arduino-ide-extension/src/browser/style/boards-config-dialog.css @@ -1,284 +1,324 @@ +#select-board-dialog-container > .dialogBlock { + width: 640px; + height: 500px; +} + div#select-board-dialog { - margin: 5px; + margin: 5px; + height: 100%; } div#select-board-dialog .selectBoardContainer { - display: flex; - gap: 10px; - overflow: hidden; - max-height: 100%; + display: flex; + gap: 10px; + overflow: hidden; + max-height: 100%; + height: 100%; } .select-board-dialog .head { - margin: 5px; + margin: 5px; } -div.dialogContent.select-board-dialog > div.head .title { - font-weight: 400; - letter-spacing: 0.02em; - font-size: 1.2em; - color: var(--theia-editorWidget-foreground); - margin-bottom: 10px; +.dialogContent.select-board-dialog { + height: 100%; } +div.dialogContent.select-board-dialog > div.head .title { + font-weight: 400; + letter-spacing: 0.02em; + font-size: 1.2em; + color: var(--theia-editorWidget-foreground); + margin-bottom: 10px; +} div#select-board-dialog .selectBoardContainer .list .item.selected { - background: var(--theia-secondaryButton-hoverBackground); + background: var(--theia-secondaryButton-hoverBackground); } div#select-board-dialog .selectBoardContainer .list .item.selected i { - color: var(--theia-arduino-branding-primary); + color: var(--theia-arduino-branding-primary); } #select-board-dialog .selectBoardContainer .search, #select-board-dialog .selectBoardContainer .search input, #select-board-dialog .selectBoardContainer .list, #select-board-dialog .selectBoardContainer .list { - background: var(--theia-editor-background); + background: var(--theia-editor-background); } #select-board-dialog .selectBoardContainer .search input { - border: none; - width: 100%; - height: auto; - max-height: 37px; - padding: 10px 5px 10px 10px; - margin: 0; - vertical-align: top; - display: flex; - color: var(--theia-input-foreground); + border: none; + width: 100%; + height: auto; + max-height: 37px; + padding: 10px 5px 10px 10px; + margin: 0; + vertical-align: top; + display: flex; + color: var(--theia-input-foreground); } #select-board-dialog .selectBoardContainer .search input:focus { - box-shadow: none; + box-shadow: none; } #select-board-dialog .selectBoardContainer .container { - flex: 1; - overflow: hidden; - max-height: 100%; + flex: 1; + overflow: hidden; + max-height: 100%; } #select-board-dialog .selectBoardContainer .container .content { - display: flex; - flex-direction: column; - max-height: 100%; + display: flex; + flex-direction: column; + max-height: 100%; + height: 100%; } #select-board-dialog .selectBoardContainer .left.container .content { - margin: 0 5px 0 0; + margin: 0 5px 0 0; } #select-board-dialog .selectBoardContainer .right.container .content { - margin: 0 0 0 5px; + margin: 0 0 0 5px; } #select-board-dialog .selectBoardContainer .container .content .title { - color: var(--theia-editorWidget-foreground); - padding: 0px 0px 10px 0px; - text-transform: uppercase; + color: var(--theia-editorWidget-foreground); + padding: 0px 0px 10px 0px; + text-transform: uppercase; } #select-board-dialog .selectBoardContainer .container .content .footer { - padding: 10px 5px 10px 0px; + padding: 10px 5px 10px 0px; } #select-board-dialog .selectBoardContainer .container .content .loading { - font-size: var(--theia-ui-font-size1); - color: var(--theia-editorWidget-foreground); - padding: 10px 5px 10px 10px; - text-transform: uppercase; - /* The max, min-height comes from `.list` 200px + 47px top padding - 2 * 10px top padding */ - max-height: 227px; - min-height: 227px; + font-size: var(--theia-ui-font-size1); + color: var(--theia-editorWidget-foreground); + padding: 10px 5px 10px 10px; + text-transform: uppercase; + /* The max, min-height comes from `.list` 200px + 47px top padding - 2 * 10px top padding */ + max-height: 227px; + min-height: 227px; } #select-board-dialog .selectBoardContainer .list .item { - padding: 10px 5px 10px 10px; - display: flex; - white-space: nowrap; - overflow-x: hidden; - flex: 1 0; + padding: 10px 5px 10px 10px; + display: flex; + white-space: nowrap; + overflow-x: hidden; + flex: 1 0; } #select-board-dialog .selectBoardContainer .list .item .selected-icon { - margin-left: auto; + margin-left: auto; } #select-board-dialog .selectBoardContainer .list .item .details { - font-size: var(--theia-ui-font-size1); - opacity: var(--theia-mod-disabled-opacity); - width: 155px; /* used heuristics for the calculation */ - white-space: pre; - overflow: hidden; - text-overflow: ellipsis; + font-size: var(--theia-ui-font-size1); + opacity: var(--theia-mod-disabled-opacity); + width: 155px; /* used heuristics for the calculation */ + white-space: pre; + overflow: hidden; + text-overflow: ellipsis; } #select-board-dialog .selectBoardContainer .list .item.missing { - opacity: var(--theia-mod-disabled-opacity); + opacity: var(--theia-mod-disabled-opacity); } #select-board-dialog .selectBoardContainer .list .item:hover { - background: var(--theia-secondaryButton-hoverBackground); + background: var(--theia-secondaryButton-hoverBackground); } #select-board-dialog .selectBoardContainer .list .label { - white-space: pre; - overflow: hidden; - text-overflow: ellipsis; + white-space: pre; + overflow: hidden; + text-overflow: ellipsis; } #select-board-dialog .selectBoardContainer .list { - max-height: 200px; - overflow-y: auto; + max-height: 200px; + overflow-y: auto; + flex: 1; } #select-board-dialog .selectBoardContainer .ports.list { - margin: 47px 0px 0px 0px; /* 47 is 37 as input height for the `Boards`, plus 10 margin bottom. */ + margin: 47px 0px 0px 0px; /* 47 is 37 as input height for the `Boards`, plus 10 margin bottom. */ } #select-board-dialog .selectBoardContainer .search { - margin-bottom: 10px; - display: flex; - align-items: center; - padding-right: 5px; + margin-bottom: 10px; + display: flex; + align-items: center; + padding-right: 5px; } .arduino-boards-toolbar-item-container { - align-items: center; - background: var(--theia-arduino-toolbar-dropdown-background); - border-radius: 1px; - color: var(--theia-arduino-toolbar-dropdown-label); - border: 1px solid var(--theia-arduino-toolbar-dropdown-border); - display: flex; - gap: 10px; - height: 28px; - margin: 0 4px; - overflow: hidden; - padding: 0 10px; - width: 210px; -} - -.arduino-boards-toolbar-item--protocol, + align-items: center; + background: var(--theia-arduino-toolbar-dropdown-background); + border-radius: 1px; + color: var(--theia-arduino-toolbar-dropdown-label); + border: 1px solid var(--theia-arduino-toolbar-dropdown-border); + display: flex; + gap: 10px; + height: var(--arduino-button-height); + margin: 0 4px; + overflow: hidden; + padding: 0 10px; + width: 210px; +} + +.arduino-boards-toolbar-item--protocol, .arduino-boards-dropdown-item--protocol { - align-items: center; - display: flex; - font-size: 16px; + align-items: center; + display: flex; + font-size: 16px; } -.arduino-boards-toolbar-item--protocol , +.arduino-boards-toolbar-item--protocol, .arduino-boards-dropdown-item--protocol { - color: var(--theia-arduino-toolbar-dropdown-label); + color: var(--theia-arduino-toolbar-dropdown-label); } -.arduino-boards-toolbar-item-container - .arduino-boards-toolbar-item { - display: flex; - align-items: baseline; - width: 100%; +.arduino-boards-toolbar-item-container .arduino-boards-toolbar-item { + display: flex; + align-items: baseline; + width: 100%; } .arduino-boards-toolbar-item--label { - width: 100%; + width: 100%; } .arduino-boards-toolbar-item--label-connected { - font-weight: 700; + font-family: "Open Sans Bold"; + font-style: normal; + font-weight: 700; + font-size: 14px; } .arduino-boards-toolbar-item-container .caret { - width: 10px; - margin-right: 5px; + width: 10px; + margin-right: 5px; } .arduino-boards-dropdown-list { - margin: -1px; - z-index: 1; - border: 1px solid var(--theia-arduino-toolbar-dropdown-border); + margin: -1px; + z-index: 1; + border: 1px solid var(--theia-arduino-toolbar-dropdown-border); + font-family: "Open Sans"; + font-style: normal; + font-weight: 400; + font-size: 12px; } .arduino-boards-dropdown-list:focus { - border: 1px solid var(--theia-arduino-toolbar-dropdown-borderActive); + border: 1px solid var(--theia-arduino-toolbar-dropdown-borderActive); } .arduino-boards-dropdown-list--items-container { - overflow: auto; - max-height: 404px; - background: var(--theia-arduino-toolbar-dropdown-background); + overflow: auto; + max-height: 404px; + background: var(--theia-arduino-toolbar-dropdown-background); } .arduino-boards-dropdown-list--items-container::-webkit-scrollbar { - background: var(--theia-arduino-toolbar-dropdown-background); + background: var(--theia-arduino-toolbar-dropdown-background); } .arduino-boards-dropdown-item { - background: var(--theia-arduino-toolbar-dropdown-background); - color: var(--theia-arduino-toolbar-dropdown-label); - cursor: default; - display: flex; - font-size: var(--theia-ui-font-size1); - gap: 10px; - justify-content: space-between; - padding: 10px; + background: var(--theia-arduino-toolbar-dropdown-background); + color: var(--theia-arduino-toolbar-dropdown-label); + cursor: default; + display: flex; + font-size: var(--theia-ui-font-size1); + justify-content: space-between; + padding: 10px; +} + +.arduino-boards-dropdown-item--board-header { + display: flex; + align-items: center; } .arduino-boards-dropdown-item--label { - overflow: hidden; - flex: 1; + overflow: hidden; + flex: 1; +} + +/* Redefine default codicon size https://github.com/microsoft/vscode/commit/38cd0a377b7abef34fb07fe770fc633e68819ba6 */ +.arduino-boards-dropdown-item .codicon[class*="codicon-"] { + font-size: 14px; +} + +.arduino-boards-dropdown-item .p-TabBar-toolbar { + padding: 0px; + margin: 0px; + flex-direction: column; +} + +.arduino-boards-dropdown-item .p-TabBar-toolbar .item { + margin: 0px; +} + +.arduino-boards-dropdown-item .p-TabBar-toolbar .item .action-label { + padding: 0px; } .arduino-boards-dropdown-item--board-label { - font-size: 14px; + font-size: 14px; +} + +.arduino-boards-dropdown-item .arduino-boards-dropdown-item--protocol { + margin-right: 10px; } .arduino-boards-dropdown-item--port-label { - font-size: 12px; + font-size: 12px; } .arduino-boards-dropdown-item:hover { - background: var(--theia-arduino-toolbar-dropdown-option-backgroundHover); + background: var(--theia-arduino-toolbar-dropdown-option-backgroundHover); } .arduino-boards-dropdown-item--selected, .arduino-boards-dropdown-item--selected:hover { - background: var(--theia-arduino-toolbar-dropdown-option-backgroundSelected); - border: 1px solid var(--theia-arduino-toolbar-dropdown-option-backgroundSelected); + background: var(--theia-arduino-toolbar-dropdown-option-backgroundSelected); + border: 1px solid + var(--theia-arduino-toolbar-dropdown-option-backgroundSelected); } .arduino-boards-dropdown-item--selected -.arduino-boards-dropdown-item--port-label { - color: var(--theia-arduino-toolbar-dropdown-label); + .arduino-boards-dropdown-item--port-label { + color: var(--theia-arduino-toolbar-dropdown-label); } .arduino-boards-dropdown-item--selected .fa { - color: var(--theia-arduino-toolbar-dropdown-iconSelected); -} - -.arduino-boards-dropdown-item .fa-check { - align-self: center; + color: var(--theia-arduino-toolbar-dropdown-iconSelected); } .arduino-board-dropdown-footer { - color: var(--theia-secondaryButton-foreground); - border-top: 1px solid var(--theia-dropdown-border); + color: var(--theia-secondaryButton-foreground); + border-top: 1px solid var(--theia-dropdown-border); } -/* High Contrast Theme rules */ -/* TODO: Remove it when the Theia version is upgraded to 1.27.0 and use Theia APIs to implement it*/ -.hc-black.hc-theia.theia-hc #select-board-dialog .selectBoardContainer .list .item:hover { - outline: 1px dashed var(--theia-focusBorder); -} +@media only screen and (max-height: 400px) { + div.dialogContent.select-board-dialog > div.head { + display: none; + } -.hc-black.hc-theia.theia-hc div#select-board-dialog .selectBoardContainer .list .item.selected { - outline: 1px solid var(--theia-focusBorder); + #select-board-dialog .selectBoardContainer .container .content .title { + display: none; + } } -@media only screen and (max-height: 400px) { - div.dialogContent.select-board-dialog > div.head { - display: none; - } - - #select-board-dialog .selectBoardContainer .container .content .title { - display: none; - } +#select-board-dialog .no-result { + text-transform: uppercase; + height: 100%; + user-select: none; + padding: 10px 5px; + overflow-wrap: break-word; } diff --git a/arduino-ide-extension/src/browser/style/browser-menu.css b/arduino-ide-extension/src/browser/style/browser-menu.css index b5ecc5303..85fb053a8 100644 --- a/arduino-ide-extension/src/browser/style/browser-menu.css +++ b/arduino-ide-extension/src/browser/style/browser-menu.css @@ -12,4 +12,4 @@ .p-MenuBar-item.p-mod-active { color: var(--theia-menubar-selectionForeground); -} \ No newline at end of file +} diff --git a/arduino-ide-extension/src/browser/style/certificate-uploader-dialog.css b/arduino-ide-extension/src/browser/style/certificate-uploader-dialog.css index 18216a78a..1b57cab45 100644 --- a/arduino-ide-extension/src/browser/style/certificate-uploader-dialog.css +++ b/arduino-ide-extension/src/browser/style/certificate-uploader-dialog.css @@ -1,76 +1,75 @@ #certificate-uploader-dialog-container > .dialogBlock { - width: 600px; + width: 600px; } .certificate-uploader-dialog .theia-select { - border: none !important; + border: none !important; } .certificate-uploader-dialog .arduino-select__control { - height: 31px; - background: var(--theia-dropdown-background) !important; + height: 31px; + background: var(--theia-dropdown-background) !important; } -.certificate-uploader-dialog .dialogRow > button{ - margin-right: 3px; +.certificate-uploader-dialog .dialogRow > button { + margin-right: 3px; } .certificate-uploader-dialog .certificate-list { - border: 1px solid var(--theia-editorWidget-border); - border-radius: 2px;; - color: var(--theia-editor-foreground); - background-color: var(--theia-editor-background); - overflow: auto; - height: 120px; - flex: 1; + border: 1px solid var(--theia-editorWidget-border); + border-radius: 2px; + color: var(--theia-editor-foreground); + background-color: var(--theia-editor-background); + overflow: auto; + height: 120px; + flex: 1; } .certificate-uploader-dialog .certificate-list .certificate-row { - display: flex; - padding: 6px 10px 5px 10px + display: flex; + padding: 6px 10px 5px 10px; } .certificate-uploader-dialog .certificate-list .certificate-row:hover { - background-color: var(--theia-list-activeSelectionBackground); + background-color: var(--theia-list-activeSelectionBackground); } .certificate-uploader-dialog .upload-status { - display: flex; - align-items: center; - flex: 1; + display: flex; + align-items: center; + flex: 1; } -.certificate-uploader-dialog .success { - display: flex; - align-items: center; - color: #1DA086; +.certificate-uploader-dialog .success { + display: flex; + align-items: center; + color: #1da086; } -.certificate-uploader-dialog .warn { - color: #C11F09; +.certificate-uploader-dialog .warn { + color: #c11f09; } -.certificate-uploader-dialog .status-icon { - margin-right: 10px; +.certificate-uploader-dialog .status-icon { + margin-right: 10px; } .certificate-uploader-dialog .add-cert-btn { - display: flex; - align-items: center; - justify-content: space-between; + display: flex; + align-items: center; + justify-content: space-between; } .certificate-uploader-dialog .add-cert-btn .caret { - margin-left: 6px; + margin-left: 6px; } .certificate-add { - padding: 16px; - border-radius: 3px; - border: 1px solid var(--theia-editorWidget-border); - color: var(--theia-editorWidget-foreground); - background-color: var(--theia-editorWidget-background); + padding: 16px; + border-radius: 3px; + border: 1px solid var(--theia-editorWidget-border); + color: var(--theia-editorWidget-foreground); + background-color: var(--theia-editorWidget-background); } .certificate-add input { - margin-top: 12px; - padding: 0 12px; - width: 100%; - box-sizing: border-box; - + margin-top: 12px; + padding: 0 12px; + width: 100%; + box-sizing: border-box; } diff --git a/arduino-ide-extension/src/browser/style/cloud-sketchbook.css b/arduino-ide-extension/src/browser/style/cloud-sketchbook.css index 8ed370329..e905a315a 100644 --- a/arduino-ide-extension/src/browser/style/cloud-sketchbook.css +++ b/arduino-ide-extension/src/browser/style/cloud-sketchbook.css @@ -15,67 +15,66 @@ .p-TabBar-tabIcon.cloud-sketchbook-tree-icon { background-color: var(--theia-foreground); - -webkit-mask: url(./cloud-sketchbook-tree-icon.svg); + -webkit-mask: url(../icons/arduino-cloud.svg); -webkit-mask-position: center; -webkit-mask-repeat: no-repeat; - width: var(--theia-icon-size); + width: 19px !important; height: var(--theia-icon-size); -webkit-mask-size: 100%; } -.p-mod-current -.cloud-sketchbook-tree-icon { +.p-mod-current .cloud-sketchbook-tree-icon { background-color: var(--theia-foreground); - -webkit-mask: url(./cloud-sketchbook-tree-icon-filled.svg); + -webkit-mask: url(../icons/arduino-cloud-filled.svg); -webkit-mask-position: center; -webkit-mask-repeat: no-repeat; -webkit-mask-size: 100%; } .sketchbook-trees-container -.p-TabBar[data-orientation="horizontal"] -> .p-TabBar-content { + .p-TabBar[data-orientation="horizontal"] + > .p-TabBar-content { justify-content: center; border-bottom: 1px solid var(--theia-tree-indentGuidesStroke); } .sketchbook-trees-container -.p-Widget.p-TabBar.p-DockPanel-tabBar -> ul -> li.p-TabBar-tab -> div.p-TabBar-tabLabel { + .p-Widget.p-TabBar.p-DockPanel-tabBar + > ul + > li.p-TabBar-tab + > div.p-TabBar-tabLabel { display: none; width: 0px; max-width: 0px; } .sketchbook-trees-container -.p-Widget.p-TabBar.p-DockPanel-tabBar -> ul -> li.p-TabBar-tab -> div.p-TabBar-tabCloseIcon { + .p-Widget.p-TabBar.p-DockPanel-tabBar + > ul + > li.p-TabBar-tab + > div.p-TabBar-tabCloseIcon { display: none; width: 0px; max-width: 0px; } .sketchbook-trees-container -.p-TabBar[data-orientation="horizontal"] -.p-TabBar-tab { + .p-TabBar[data-orientation="horizontal"] + .p-TabBar-tab { min-width: 55px; } .sketchbook-trees-container -.p-Widget.p-TabBar.p-DockPanel-tabBar -> ul -> li.p-TabBar-tab { + .p-Widget.p-TabBar.p-DockPanel-tabBar + > ul + > li.p-TabBar-tab { padding-left: 20px; } .sketchbook-trees-container -.p-Widget.p-TabBar.p-DockPanel-tabBar -> ul -> li.p-TabBar-tab.p-mod-current { + .p-Widget.p-TabBar.p-DockPanel-tabBar + > ul + > li.p-TabBar-tab.p-mod-current { border-bottom: 2px solid var(--theia-activityBar-activeBorder); } @@ -99,35 +98,12 @@ color: var(--theia-textLink-foreground); } -.pull-sketch-icon { - background-color: var(--theia-foreground); - -webkit-mask: url(./pull-sketch-icon.svg); - -webkit-mask-position: center; - -webkit-mask-repeat: no-repeat; - width: var(--theia-icon-size); - height: var(--theia-icon-size); -} - -.push-sketch-icon { - background-color: var(--theia-foreground); - -webkit-mask: url(./push-sketch-icon.svg); - -webkit-mask-position: center; - -webkit-mask-repeat: no-repeat; - width: var(--theia-icon-size); - height: var(--theia-icon-size); -} - -.account-icon { - background: url("./account-icon.svg") center center no-repeat; - width: var(--theia-icon-size); - height: var(--theia-icon-size); - border-radius: 50%; - overflow: hidden; -} - -.account-icon > img { +img.arduino-account-picture { + width: var(--theia-private-sidebar-icon-size); + height: var(--theia-private-sidebar-icon-size); max-width: 100%; max-height: 100%; + border-radius: 50%; } .connected-status-icon { @@ -199,3 +175,12 @@ .arduino-share-sketch-dialog .sketch-link-embed textarea { width: 100%; } + +.actions.item.flex-line .fa, +.theia-file-icons-js.file-icon .fa { + font-size: var(--theia-icon-size); +} + +.theia-file-icons-js.file-icon.not-in-sync-offline .fa { + color: var(--theia-activityBar-inactiveForeground); +} diff --git a/arduino-ide-extension/src/browser/style/custom-codicon.css b/arduino-ide-extension/src/browser/style/custom-codicon.css index 48542e4ff..4acf37315 100644 --- a/arduino-ide-extension/src/browser/style/custom-codicon.css +++ b/arduino-ide-extension/src/browser/style/custom-codicon.css @@ -1,4 +1,4 @@ -.codicon-debug-alt:before { - font-family: 'FontAwesome' !important; - content: "\e905" !important -} \ No newline at end of file +.codicon-debug-alt:before { + font-family: "FontAwesome" !important; + content: "\e905" !important; +} diff --git a/arduino-ide-extension/src/browser/style/debug.css b/arduino-ide-extension/src/browser/style/debug.css index 62f2a07f9..a5a37abd9 100644 --- a/arduino-ide-extension/src/browser/style/debug.css +++ b/arduino-ide-extension/src/browser/style/debug.css @@ -1,36 +1,13 @@ -/* TODO: remove after https://github.com/eclipse-theia/theia/pull/9256/ */ - -/* To fix colors in Theia. */ -.theia-debug-hover-title.number, -.theia-debug-console-variable.number { - color: var(--theia-variable-number-variable-color); -} -.theia-debug-hover-title.boolean, -.theia-debug-console-variable.boolean { - color: var(--theia-variable-boolean-variable-color); -} -.theia-debug-hover-title.string, -.theia-debug-console-variable.string { - color: var(--theia-variable-string-variable-color); +/* Naive way of hiding the debug widget when the debug functionality is disabled https://github.com/arduino/arduino-ide/issues/14 */ +.theia-debug-container .debug-toolbar.hidden, +.theia-debug-container .theia-session-container.hidden { + visibility: hidden; } -/* To unset the default debug hover dimension. */ -.theia-debug-hover { - min-width: unset; - min-height: unset; - width: unset; - height: unset; -} - -/* To adjust the left padding in the hover title. */ -.theia-debug-hover-title { - padding-left: 5px; -} +.theia-debug-container .status-message { + font-family: "Open Sans"; + font-style: normal; + font-size: 12px; -/* Use the default Theia dimensions only iff the expression is complex (`!!expression.hasChildren~) */ -.theia-debug-hover.complex-value { - min-width: 324px; - min-height: 324px; - width: 324px; - height: 324px; + padding: 10px; } diff --git a/arduino-ide-extension/src/browser/style/dialogs.css b/arduino-ide-extension/src/browser/style/dialogs.css index aa5ef3fe1..1592057a3 100644 --- a/arduino-ide-extension/src/browser/style/dialogs.css +++ b/arduino-ide-extension/src/browser/style/dialogs.css @@ -9,9 +9,10 @@ total = padding + margin = 96px */ max-width: calc(100% - 96px) !important; - min-width: unset; + + min-width: 424px; max-height: 560px; - padding: 0 28px; + padding: 0 var(--arduino-button-height); } .p-Widget.dialogOverlay .dialogBlock .dialogTitle { @@ -34,7 +35,7 @@ } .p-Widget.dialogOverlay .dialogBlock .dialogContent > input { - margin-bottom: 28px; + margin-bottom: var(--arduino-button-height); } .p-Widget.dialogOverlay .dialogBlock .dialogContent > div { @@ -42,7 +43,7 @@ } .p-Widget.dialogOverlay .dialogBlock .dialogContent .dialogSection { - margin-top: 28px; + margin-top: var(--arduino-button-height); } .p-Widget.dialogOverlay .dialogBlock .dialogContent .dialogSection:first-child { margin-top: 0; @@ -54,19 +55,29 @@ align-items: center; } -.p-Widget.dialogOverlay .dialogBlock .dialogContent .dialogSection .dialogRow .spinner { +.p-Widget.dialogOverlay .dialogControl .spinner, +.p-Widget.dialogOverlay + .dialogBlock + .dialogContent + .dialogSection + .dialogRow + .spinner { background: var(--theia-icon-loading) center center no-repeat; animation: theia-spin 1.25s linear infinite; width: 30px; height: 30px; } -.p-Widget.dialogOverlay .dialogBlock .dialogContent .dialogSection .dialogRow:first-child { - margin-top: 0px; +.p-Widget.dialogOverlay + .dialogBlock + .dialogContent + .dialogSection + .dialogRow:first-child { + margin-top: 0px; height: 32px; } -.fl1{ +.fl1 { flex: 1; } @@ -76,12 +87,16 @@ } .fa.disabled { - opacity: .4; + opacity: 0.4; } - @media only screen and (max-height: 560px) { .p-Widget.dialogOverlay .dialogBlock { max-height: 400px; } } + +.p-Widget.dialogOverlay .error.progress { + color: var(--theia-button-background); + align-self: center; +} diff --git a/arduino-ide-extension/src/browser/style/editor.css b/arduino-ide-extension/src/browser/style/editor.css index 81c3a3fdd..db4266569 100644 --- a/arduino-ide-extension/src/browser/style/editor.css +++ b/arduino-ide-extension/src/browser/style/editor.css @@ -1,7 +1,9 @@ /* Show the dirty indicator on unclosable widgets. On hover, it should still show the dot instead of the X. */ /* https://github.com/arduino/arduino-pro-ide/issues/380 */ -.p-TabBar.theia-app-centers .p-TabBar-tab.p-mod-closable.a-mod-uncloseable.theia-mod-dirty > .p-TabBar-tabCloseIcon:before { - content: "\ea71"; +.p-TabBar.theia-app-centers + .p-TabBar-tab.p-mod-closable.a-mod-uncloseable.theia-mod-dirty + > .p-TabBar-tabCloseIcon:before { + content: "\ea71"; } .monaco-list-row.show-file-icons.focused { diff --git a/arduino-ide-extension/src/browser/style/firmware-uploader-dialog.css b/arduino-ide-extension/src/browser/style/firmware-uploader-dialog.css index 3143d02a8..718d840e6 100644 --- a/arduino-ide-extension/src/browser/style/firmware-uploader-dialog.css +++ b/arduino-ide-extension/src/browser/style/firmware-uploader-dialog.css @@ -1,31 +1,31 @@ #firmware-uploader-dialog-container > .dialogBlock { - width: 600px; + width: 600px; } .firmware-uploader-dialog .theia-select { - border: none !important; + border: none !important; } .firmware-uploader-dialog .arduino-select__control { - height: 31px; - background: var(--theia-menubar-selectionBackground) !important; + height: 31px; + background: var(--theia-input-background) !important; } -.firmware-uploader-dialog .dialogRow > button{ - margin-right: 3px; +.firmware-uploader-dialog .dialogRow > button { + margin-right: 3px; } .firmware-uploader-dialog #firmware-select { - flex: unset; + flex: unset; } -.firmware-uploader-dialog .success { - color: #1DA086; +.firmware-uploader-dialog .success { + color: #1da086; } -.firmware-uploader-dialog .warn { - color: #C11F09; +.firmware-uploader-dialog .warn { + color: #c11f09; } -.firmware-uploader-dialog .status-icon { - margin-right: 10px; -} \ No newline at end of file +.firmware-uploader-dialog .status-icon { + margin-right: 10px; +} diff --git a/arduino-ide-extension/src/browser/style/fonts.css b/arduino-ide-extension/src/browser/style/fonts.css index 2e243103e..806b6f047 100644 --- a/arduino-ide-extension/src/browser/style/fonts.css +++ b/arduino-ide-extension/src/browser/style/fonts.css @@ -1,676 +1,698 @@ @font-face { - font-family: 'Open Sans'; - src: url('fonts/OpenSans-Bold-webfont.woff') format('woff'); + font-family: "Open Sans"; + src: url("fonts/OpenSans-Regular-webfont.woff") format("woff"); } @font-face { - font-family: 'FontAwesome'; - src: - url('fonts/FontAwesome.ttf?2jhpmq') format('truetype'), - url('fonts/FontAwesome.woff?2jhpmq') format('woff'), - url('fonts/FontAwesome.svg?2jhpmq#FontAwesome') format('svg'); - font-weight: normal; - font-style: normal; - font-display: block; + font-family: "Open Sans Bold"; + src: url("fonts/OpenSans-Bold-webfont.woff") format("woff"); +} + +@font-face { + font-family: "FontAwesome"; + src: url("fonts/FontAwesome.ttf?h959em") format("truetype"), + url("fonts/FontAwesome.woff?h959em") format("woff"), + url("fonts/FontAwesome.svg?h959em#FontAwesome") format("svg"); + font-weight: normal; + font-style: normal; + font-display: block; } .fa { - /* use !important to prevent issues with browser extensions that change fonts */ - font-family: 'FontAwesome' !important; - speak: never; - font-style: normal; - font-weight: normal; - font-variant: normal; - text-transform: none; - line-height: 1; + /* use !important to prevent issues with browser extensions that change fonts */ + font-family: "FontAwesome" !important; + speak: never; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; - /* Better Font Rendering =========== */ - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; + /* Better Font Rendering =========== */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; } .fa-arduino-verify:before { - content: "\e90b"; + content: "\e90b"; } .fa-arduino-upload:before { - content: "\e90c"; + content: "\e90c"; } .fa-arduino-monitor:before { - content: "\e90d"; + content: "\e90d"; } .fa-arduino-sketch-tabs-menu:before { - content: "\e90e"; + content: "\e90e"; } .fa-arduino-plotter:before { - content: "\e90f"; + content: "\e90f"; } .fa-fa-check:before { - content: "\e90a"; + content: "\e90a"; } .fa-arduino-technology-3dimensionscube:before { - content: "\e906"; + content: "\e906"; } .fa-arduino-technology-usb:before { - content: "\e907"; + content: "\e907"; } .fa-arduino-technology-connection:before { - content: "\e908"; + content: "\e908"; } .fa-arduino-technology-bluetooth:before { - content: "\e909"; + content: "\e909"; } .fa-arduino-debugger:before { - content: "\e905"; + content: "\e905"; } .fa-arduino-search:before { - content: "\e901"; + content: "\e901"; } .fa-arduino-boards:before { - content: "\e902"; + content: "\e902"; } .fa-arduino-library:before { - content: "\e903"; + content: "\e903"; } .fa-arduino-folder:before { - content: "\e904"; + content: "\e904"; } .fa-reload:before { - content: "\e900"; + content: "\e900"; } .fa-asterisk:before { - content: "\f069"; + content: "\f069"; } .fa-plus:before { - content: "\f067"; + content: "\f067"; } .fa-question:before { - content: "\f128"; + content: "\f128"; } .fa-minus:before { - content: "\f068"; + content: "\f068"; } .fa-music:before { - content: "\f001"; + content: "\f001"; } .fa-search:before { - content: "\f002"; + content: "\f002"; } .fa-envelope-o:before { - content: "\f003"; + content: "\f003"; } .fa-heart:before { - content: "\f004"; + content: "\f004"; } .fa-star:before { - content: "\f005"; + content: "\f005"; } .fa-star-o:before { - content: "\f006"; + content: "\f006"; } .fa-user:before { - content: "\f007"; + content: "\f007"; } .fa-film:before { - content: "\f008"; + content: "\f008"; } .fa-th-large:before { - content: "\f009"; + content: "\f009"; } .fa-th:before { - content: "\f00a"; + content: "\f00a"; } .fa-th-list:before { - content: "\f00b"; + content: "\f00b"; } .fa-close:before { - content: "\f00d"; + content: "\f00d"; } .fa-remove:before { - content: "\f00d"; + content: "\f00d"; } .fa-times:before { - content: "\f00d"; + content: "\f00d"; } .fa-search-plus:before { - content: "\f00e"; + content: "\f00e"; } .fa-search-minus:before { - content: "\f010"; + content: "\f010"; } .fa-power-off:before { - content: "\f011"; + content: "\f011"; } .fa-signal:before { - content: "\f012"; + content: "\f012"; } .fa-cog:before { - content: "\f013"; + content: "\f013"; } .fa-gear:before { - content: "\f013"; + content: "\f013"; } .fa-trash-o:before { - content: "\f014"; + content: "\f014"; } .fa-home:before { - content: "\f015"; + content: "\f015"; } .fa-file-o:before { - content: "\f016"; + content: "\f016"; } .fa-clock-o:before { - content: "\f017"; + content: "\f017"; } .fa-download:before { - content: "\f019"; + content: "\f019"; } .fa-arrow-circle-o-down:before { - content: "\f01a"; + content: "\f01a"; } .fa-arrow-circle-o-up:before { - content: "\f01b"; + content: "\f01b"; } .fa-inbox:before { - content: "\f01c"; + content: "\f01c"; } .fa-play-circle-o:before { - content: "\f01d"; + content: "\f01d"; } .fa-repeat:before { - content: "\f01e"; + content: "\f01e"; } .fa-rotate-right:before { - content: "\f01e"; + content: "\f01e"; } .fa-refresh:before { - content: "\f021"; + content: "\f021"; } .fa-list-alt:before { - content: "\f022"; + content: "\f022"; } .fa-lock:before { - content: "\f023"; + content: "\f023"; } .fa-volume-off:before { - content: "\f026"; + content: "\f026"; } .fa-volume-down:before { - content: "\f027"; + content: "\f027"; } .fa-volume-up:before { - content: "\f028"; + content: "\f028"; } .fa-qrcode:before { - content: "\f029"; + content: "\f029"; } .fa-tag:before { - content: "\f02b"; + content: "\f02b"; } .fa-tags:before { - content: "\f02c"; + content: "\f02c"; } .fa-book:before { - content: "\f02d"; + content: "\f02d"; } .fa-print:before { - content: "\f02f"; + content: "\f02f"; } .fa-text-height:before { - content: "\f034"; + content: "\f034"; } .fa-text-width:before { - content: "\f035"; + content: "\f035"; } .fa-align-left:before { - content: "\f036"; + content: "\f036"; } .fa-align-center:before { - content: "\f037"; + content: "\f037"; } .fa-align-right:before { - content: "\f038"; + content: "\f038"; } .fa-align-justify:before { - content: "\f039"; + content: "\f039"; } .fa-list:before { - content: "\f03a"; + content: "\f03a"; } .fa-dedent:before { - content: "\f03b"; + content: "\f03b"; } .fa-outdent:before { - content: "\f03b"; + content: "\f03b"; } .fa-indent:before { - content: "\f03c"; + content: "\f03c"; } .fa-pencil:before { - content: "\f040"; + content: "\f040"; } .fa-adjust:before { - content: "\f042"; + content: "\f042"; } .fa-edit:before { - content: "\f044"; + content: "\f044"; } .fa-pencil-square-o:before { - content: "\f044"; + content: "\f044"; } .fa-share-square-o:before { - content: "\f045"; + content: "\f045"; } .fa-check-square-o:before { - content: "\f046"; + content: "\f046"; } .fa-arrows:before { - content: "\f047"; + content: "\f047"; } .fa-step-backward:before { - content: "\f048"; + content: "\f048"; } .fa-fast-backward:before { - content: "\f049"; + content: "\f049"; } .fa-backward:before { - content: "\f04a"; + content: "\f04a"; } .fa-play:before { - content: "\f04b"; + content: "\f04b"; } .fa-pause:before { - content: "\f04c"; + content: "\f04c"; } .fa-stop:before { - content: "\f04d"; + content: "\f04d"; } .fa-forward:before { - content: "\f04e"; + content: "\f04e"; } .fa-fast-forward:before { - content: "\f050"; + content: "\f050"; } .fa-step-forward:before { - content: "\f051"; + content: "\f051"; } .fa-eject:before { - content: "\f052"; + content: "\f052"; } .fa-chevron-left:before { - content: "\f053"; + content: "\f053"; } .fa-chevron-right:before { - content: "\f054"; + content: "\f054"; } .fa-plus-circle:before { - content: "\f055"; + content: "\f055"; } .fa-minus-circle:before { - content: "\f056"; + content: "\f056"; } .fa-times-circle:before { - content: "\f057"; + content: "\f057"; } .fa-check-circle:before { - content: "\f058"; + content: "\f058"; } .fa-question-circle:before { - content: "\f059"; + content: "\f059"; } .fa-info-circle:before { - content: "\f05a"; + content: "\f05a"; } .fa-crosshairs:before { - content: "\f05b"; + content: "\f05b"; } .fa-times-circle-o:before { - content: "\f05c"; + content: "\f05c"; } .fa-check-circle-o:before { - content: "\f05d"; + content: "\f05d"; } .fa-ban:before { - content: "\f05e"; + content: "\f05e"; } .fa-arrow-left:before { - content: "\f060"; + content: "\f060"; } .fa-arrow-right:before { - content: "\f061"; + content: "\f061"; } .fa-arrow-up:before { - content: "\f062"; + content: "\f062"; } .fa-arrow-down:before { - content: "\f063"; + content: "\f063"; } .fa-mail-forward:before { - content: "\f064"; + content: "\f064"; } .fa-share:before { - content: "\f064"; + content: "\f064"; } .fa-expand:before { - content: "\f065"; + content: "\f065"; } .fa-compress:before { - content: "\f066"; + content: "\f066"; } .fa-exclamation-circle:before { - content: "\f06a"; + content: "\f06a"; } .fa-eye:before { - content: "\f06e"; + content: "\f06e"; } .fa-eye-slash:before { - content: "\f070"; + content: "\f070"; } .fa-exclamation-triangle:before { - content: "\f071"; + content: "\f071"; } .fa-warning:before { - content: "\f071"; + content: "\f071"; } .fa-calendar:before { - content: "\f073"; + content: "\f073"; } .fa-random:before { - content: "\f074"; + content: "\f074"; } .fa-comment:before { - content: "\f075"; + content: "\f075"; } .fa-chevron-up:before { - content: "\f077"; + content: "\f077"; } .fa-chevron-down:before { - content: "\f078"; + content: "\f078"; } .fa-retweet:before { - content: "\f079"; + content: "\f079"; } .fa-folder:before { - content: "\f07b"; + content: "\f07b"; } .fa-folder-open:before { - content: "\f07c"; + content: "\f07c"; } .fa-arrows-v:before { - content: "\f07d"; + content: "\f07d"; } .fa-arrows-h:before { - content: "\f07e"; + content: "\f07e"; } .fa-cogs:before { - content: "\f085"; + content: "\f085"; } .fa-gears:before { - content: "\f085"; + content: "\f085"; } .fa-star-half:before { - content: "\f089"; + content: "\f089"; } .fa-heart-o:before { - content: "\f08a"; + content: "\f08a"; } .fa-sign-out:before { - content: "\f08b"; + content: "\f08b"; } .fa-thumb-tack:before { - content: "\f08d"; + content: "\f08d"; } .fa-external-link:before { - content: "\f08e"; + content: "\f08e"; } .fa-sign-in:before { - content: "\f090"; + content: "\f090"; } .fa-upload:before { - content: "\f093"; + content: "\f093"; } .fa-square-o:before { - content: "\f096"; + content: "\f096"; } .fa-bookmark-o:before { - content: "\f097"; + content: "\f097"; } .fa-hdd-o:before { - content: "\f0a0"; + content: "\f0a0"; } .fa-bell-o:before { - content: "\f0a2"; + content: "\f0a2"; } .fa-certificate:before { - content: "\f0a3"; + content: "\f0a3"; } .fa-arrow-circle-left:before { - content: "\f0a8"; + content: "\f0a8"; } .fa-arrow-circle-right:before { - content: "\f0a9"; + content: "\f0a9"; } .fa-arrow-circle-up:before { - content: "\f0aa"; + content: "\f0aa"; } .fa-arrow-circle-down:before { - content: "\f0ab"; + content: "\f0ab"; } .fa-wrench:before { - content: "\f0ad"; + content: "\f0ad"; } .fa-tasks:before { - content: "\f0ae"; + content: "\f0ae"; } .fa-filter:before { - content: "\f0b0"; + content: "\f0b0"; } .fa-briefcase:before { - content: "\f0b1"; + content: "\f0b1"; } .fa-arrows-alt:before { - content: "\f0b2"; + content: "\f0b2"; } .fa-cloud:before { - content: "\f0c2"; + content: "\f0c2"; } .fa-copy:before { - content: "\f0c5"; + content: "\f0c5"; } .fa-files-o:before { - content: "\f0c5"; + content: "\f0c5"; } .fa-floppy-o:before { - content: "\f0c7"; + content: "\f0c7"; } .fa-save:before { - content: "\f0c7"; + content: "\f0c7"; } .fa-square:before { - content: "\f0c8"; + content: "\f0c8"; } .fa-bars:before { - content: "\f0c9"; + content: "\f0c9"; } .fa-navicon:before { - content: "\f0c9"; + content: "\f0c9"; } .fa-reorder:before { - content: "\f0c9"; + content: "\f0c9"; } .fa-list-ul:before { - content: "\f0ca"; + content: "\f0ca"; } .fa-list-ol:before { - content: "\f0cb"; + content: "\f0cb"; } .fa-table:before { - content: "\f0ce"; + content: "\f0ce"; } .fa-caret-down:before { - content: "\f0d7"; + content: "\f0d7"; } .fa-caret-up:before { - content: "\f0d8"; + content: "\f0d8"; } .fa-caret-left:before { - content: "\f0d9"; + content: "\f0d9"; } .fa-caret-right:before { - content: "\f0da"; + content: "\f0da"; } .fa-columns:before { - content: "\f0db"; + content: "\f0db"; } .fa-sort:before { - content: "\f0dc"; + content: "\f0dc"; } .fa-unsorted:before { - content: "\f0dc"; + content: "\f0dc"; } .fa-sort-desc:before { - content: "\f0dd"; + content: "\f0dd"; } .fa-sort-down:before { - content: "\f0dd"; + content: "\f0dd"; } .fa-sort-asc:before { - content: "\f0de"; + content: "\f0de"; } .fa-sort-up:before { - content: "\f0de"; + content: "\f0de"; } .fa-rotate-left:before { - content: "\f0e2"; + content: "\f0e2"; } .fa-undo:before { - content: "\f0e2"; + content: "\f0e2"; } .fa-file-text-o:before { - content: "\f0f6"; + content: "\f0f6"; } .fa-plus-square:before { - content: "\f0fe"; + content: "\f0fe"; } .fa-angle-double-left:before { - content: "\f100"; + content: "\f100"; } .fa-angle-double-right:before { - content: "\f101"; + content: "\f101"; } .fa-angle-double-up:before { - content: "\f102"; + content: "\f102"; } .fa-angle-double-down:before { - content: "\f103"; + content: "\f103"; } .fa-angle-left:before { - content: "\f104"; + content: "\f104"; } .fa-angle-right:before { - content: "\f105"; + content: "\f105"; } .fa-angle-up:before { - content: "\f106"; + content: "\f106"; } .fa-angle-down:before { - content: "\f107"; + content: "\f107"; } .fa-circle-o:before { - content: "\f10c"; + content: "\f10c"; } .fa-spinner:before { - content: "\f110"; + content: "\f110"; } .fa-circle:before { - content: "\f111"; + content: "\f111"; } .fa-mail-reply:before { - content: "\f112"; + content: "\f112"; } .fa-reply:before { - content: "\f112"; + content: "\f112"; } .fa-folder-o:before { - content: "\f114"; + content: "\f114"; } .fa-folder-open-o:before { - content: "\f115"; + content: "\f115"; } .fa-keyboard-o:before { - content: "\f11c"; + content: "\f11c"; } .fa-terminal:before { - content: "\f120"; + content: "\f120"; } .fa-code:before { - content: "\f121"; + content: "\f121"; } .fa-mail-reply-all:before { - content: "\f122"; + content: "\f122"; } .fa-reply-all:before { - content: "\f122"; + content: "\f122"; } .fa-star-half-empty:before { - content: "\f123"; + content: "\f123"; } .fa-star-half-full:before { - content: "\f123"; + content: "\f123"; } .fa-star-half-o:before { - content: "\f123"; + content: "\f123"; } .fa-crop:before { - content: "\f125"; + content: "\f125"; } .fa-code-fork:before { - content: "\f126"; + content: "\f126"; } .fa-chain-broken:before { - content: "\f127"; + content: "\f127"; } .fa-unlink:before { - content: "\f127"; + content: "\f127"; } .fa-info:before { - content: "\f129"; + content: "\f129"; } .fa-exclamation:before { - content: "\f12a"; + content: "\f12a"; } .fa-rocket:before { - content: "\f135"; + content: "\f135"; } .fa-maxcdn:before { - content: "\f136"; + content: "\f136"; } .fa-chevron-circle-left:before { - content: "\f137"; + content: "\f137"; } .fa-chevron-circle-right:before { - content: "\f138"; + content: "\f138"; } .fa-chevron-circle-up:before { - content: "\f139"; + content: "\f139"; } .fa-chevron-circle-down:before { - content: "\f13a"; + content: "\f13a"; } .fa-ellipsis-h:before { - content: "\f141"; + content: "\f141"; } .fa-long-arrow-down:before { - content: "\f175"; + content: "\f175"; } .fa-long-arrow-up:before { - content: "\f176"; + content: "\f176"; } .fa-long-arrow-left:before { - content: "\f177"; + content: "\f177"; } .fa-long-arrow-right:before { - content: "\f178"; + content: "\f178"; } .fa-microchip:before { - content: "\f2db"; + content: "\f2db"; +} +.fa-arduino-cloud-download:before { + content: "\e910"; +} +.fa-arduino-cloud-upload:before { + content: "\e914"; +} +.fa-arduino-cloud:before { + content: "\e915"; +} +.fa-arduino-cloud-filled:before { + content: "\e912"; +} +.fa-arduino-cloud-offline:before { + content: "\e913"; +} +.fa-arduino-cloud-filled-offline:before { + content: "\e911"; } diff --git a/arduino-ide-extension/src/browser/style/fonts/FontAwesome.svg b/arduino-ide-extension/src/browser/style/fonts/FontAwesome.svg index c1594c55c..867d29761 100644 --- a/arduino-ide-extension/src/browser/style/fonts/FontAwesome.svg +++ b/arduino-ide-extension/src/browser/style/fonts/FontAwesome.svg @@ -23,6 +23,12 @@ + + + + + + diff --git a/arduino-ide-extension/src/browser/style/fonts/FontAwesome.ttf b/arduino-ide-extension/src/browser/style/fonts/FontAwesome.ttf index 5f0d75b8d..6810cc626 100644 Binary files a/arduino-ide-extension/src/browser/style/fonts/FontAwesome.ttf and b/arduino-ide-extension/src/browser/style/fonts/FontAwesome.ttf differ diff --git a/arduino-ide-extension/src/browser/style/fonts/FontAwesome.woff b/arduino-ide-extension/src/browser/style/fonts/FontAwesome.woff index 86a6f5031..5213d9515 100644 Binary files a/arduino-ide-extension/src/browser/style/fonts/FontAwesome.woff and b/arduino-ide-extension/src/browser/style/fonts/FontAwesome.woff differ diff --git a/arduino-ide-extension/src/browser/style/ide-updater-dialog.css b/arduino-ide-extension/src/browser/style/ide-updater-dialog.css index abdf2eec6..8d722c9d1 100644 --- a/arduino-ide-extension/src/browser/style/ide-updater-dialog.css +++ b/arduino-ide-extension/src/browser/style/ide-updater-dialog.css @@ -1,106 +1,156 @@ #ide-updater-dialog-container > .dialogBlock { - width: 546px; + width: 546px; } .ide-updater-dialog .bold { - font-weight: bold; + font-weight: bold; } .ide-updater-dialog--pre-download { - display: flex; + display: flex; } .ide-updater-dialog--downloading { - flex: 1; + flex: 1; } .ide-updater-dialog--logo-container { - margin-right: 28px; + margin-right: var(--arduino-button-height); } .ide-updater-dialog--logo { - background: url('./ide-logo.png') round; - width: 52px; - height: 52px; + background: url("./ide-logo.png") round; + width: 52px; + height: 52px; } .dialogContent.ide-updater-dialog - .ide-updater-dialog--content - .ide-updater-dialog--new-version-text.dialogSection { - display: flex; - flex: 1; - flex-direction: column; - margin-top: 0; - min-width: 0; + .ide-updater-dialog--content + .ide-updater-dialog--new-version-text.dialogSection { + display: flex; + flex: 1; + flex-direction: column; + margin-top: 0; + min-width: 0; +} + +.ide-updater-dialog--footer { + display: inline-block; + margin-top: -16px; + padding: 12px 0 24px 0; + border-top: 1px solid var(--theia-editorWidget-border); +} +.ide-updater-dialog--footer-content { + float: right; +} + +.ide-updater-dialog--footer-link { + display: inline-block; + color: var(--theia-textLink-foreground); + font-weight: 500; + line-height: 13px; +} +.ide-updater-dialog--footer-link:hover { + color: var(--theia-textLink-foreground); + cursor: pointer; +} +.ide-updater-dialog--footer-link-icon { + display: inline-block; + -webkit-mask: url(../icons/link-open-icon.svg) center no-repeat; + background-color: var(--theia-textLink-foreground); + height: 12px; + width: 12px; + cursor: pointer; + transform: translateY(2px); + margin-left: 4px; } .ide-updater-dialog .changelog { - color: var(--theia-editor-foreground); - background-color: var(--theia-editor-background); - font-size: 12px; - overflow: auto; - padding: 0 12px; - cursor: text; + color: var(--theia-editor-foreground); + background-color: var(--theia-editor-background); + font-size: 12px; + overflow: auto; + padding: 0 12px; + cursor: text; + width: 100%; +} + +.ide-updater-dialog .changelog .fallback { + min-height: 180px; + width: 100%; + display: flex; +} + +.ide-updater-dialog .changelog .fallback .spinner { + align-self: center; } .dialogContent.ide-updater-dialog - .ide-updater-dialog--content - .ide-updater-dialog--new-version-text - .dialogRow.changelog-container { - align-items: flex-start; - border: 1px solid var(--theia-editorWidget-border); - border-radius: 2px; - overflow: auto; - max-height: 180px; + .ide-updater-dialog--content + .ide-updater-dialog--new-version-text + .dialogRow.changelog-container { + align-items: flex-start; + border: 1px solid var(--theia-editorWidget-border); + border-radius: 2px; + overflow: auto; + max-height: 180px; } .ide-updater-dialog .changelog a { - color: var(--theia-textLink-foreground); + color: var(--theia-textLink-foreground); } .ide-updater-dialog .changelog a:hover { - text-decoration: underline; - cursor: pointer; + text-decoration: underline; + cursor: pointer; } .ide-updater-dialog .changelog code { - background: var(--theia-textBlockQuote-background); - border-radius: 2px; - padding: 0 2px; + background: var(--theia-textBlockQuote-background); + border-radius: 2px; + padding: 0 2px; } .ide-updater-dialog .changelog a code { - color: var(--theia-textLink-foreground); + color: var(--theia-textLink-foreground); } .ide-updater-dialog .buttons-container { - display: flex; - justify-content: flex-end; - margin-top: 28px; + display: flex; + justify-content: flex-end; + margin-top: var(--arduino-button-height); } .ide-updater-dialog .buttons-container a.theia-button { - text-decoration: none; - display: flex; - align-items: center; - justify-content: center; + text-decoration: none; + display: flex; + align-items: center; + justify-content: center; } .ide-updater-dialog .buttons-container a.theia-button:hover { - color: var(--theia-button-foreground); + color: var(--theia-button-foreground); } .ide-updater-dialog .buttons-container .push { - margin-right: auto; + margin-right: auto; } .ide-updater-dialog--content { - max-height: 100%; - overflow: hidden; - display: flex; + max-height: 100%; + overflow: hidden; + display: flex; + padding-bottom: 20px !important; } #ide-updater-dialog-container .skip-version-button { - margin-left: 79px; - margin-right: auto; + margin-left: 79px; + margin-right: auto; +} + +/* https://github.com/arduino/arduino-ide/pull/2027#issuecomment-1533174638 */ +/* https://github.com/eclipse-theia/theia/commit/1b5ff9ee459df14cedc0e8266dd02dae93fcd1bf#diff-d8d45a890507a01141c010ad4a6891edf2ae727cfa6dfe604cebbd667812cccbR68 */ +/* Use normal whitespace handling for the changelog content in the update dialog. */ +.p-Widget.dialogOverlay .dialogContent.ide-updater-dialog { + white-space: normal; } diff --git a/arduino-ide-extension/src/browser/style/index.css b/arduino-ide-extension/src/browser/style/index.css index a308deebc..593cf1eaf 100644 --- a/arduino-ide-extension/src/browser/style/index.css +++ b/arduino-ide-extension/src/browser/style/index.css @@ -1,157 +1,178 @@ -@import './list-widget.css'; -@import './boards-config-dialog.css'; -@import './main.css'; -@import './dialogs.css'; -@import './monitor.css'; -@import './arduino-select.css'; -@import './status-bar.css'; -@import './terminal.css'; -@import './editor.css'; -@import './settings-dialog.css'; -@import './firmware-uploader-dialog.css'; -@import './ide-updater-dialog.css'; -@import './certificate-uploader-dialog.css'; -@import './user-fields-dialog.css'; -@import './debug.css'; -@import './sketchbook.css'; -@import './cloud-sketchbook.css'; -@import './fonts.css'; -@import './custom-codicon.css'; -@import './progress-bar.css'; -@import './settings-step-input.css'; +@import "./list-widget.css"; +@import "./boards-config-dialog.css"; +@import "./main.css"; +@import "./dialogs.css"; +@import "./monitor.css"; +@import "./arduino-select.css"; +@import "./status-bar.css"; +@import "./terminal.css"; +@import "./editor.css"; +@import "./settings-dialog.css"; +@import "./firmware-uploader-dialog.css"; +@import "./ide-updater-dialog.css"; +@import "./version-welcome-dialog.css"; +@import "./certificate-uploader-dialog.css"; +@import "./user-fields-dialog.css"; +@import "./debug.css"; +@import "./sketchbook.css"; +@import "./cloud-sketchbook.css"; +@import "./fonts.css"; +@import "./custom-codicon.css"; +@import "./progress-bar.css"; +@import "./settings-step-input.css"; + +:root { + --arduino-button-height: 28px; +} + +/* Revive of the `--theia-icon-loading`. The variable has been removed from Theia while IDE2 still uses is. */ +/* The SVG icons are still part of Theia (1.31.1) */ +/* https://github.com/arduino/arduino-ide/pull/1662#issuecomment-1324997134 */ +body { + --theia-icon-loading: url(../icons/loading-light.svg); + --theia-icon-loading-warning: url(../icons/loading-dark.svg); +} +body.theia-dark { + --theia-icon-loading: url(../icons/loading-dark.svg); + --theia-icon-loading-warning: url(../icons/loading-light.svg); +} .theia-input.warning:focus { - outline-width: 1px; - outline-style: solid; - outline-offset: -1px; - opacity: 1 !important; - color: var(--theia-warningForeground); - background-color: var(--theia-warningBackground); + outline-width: 1px; + outline-style: solid; + outline-offset: -1px; + opacity: 1 !important; + color: var(--theia-warningForeground); + background-color: var(--theia-warningBackground); } .theia-input.warning { - background-color: var(--theia-warningBackground); + background-color: var(--theia-warningBackground); } .theia-input.warning::placeholder { - /* Chrome, Firefox, Opera, Safari 10.1+ */ - color: var(--theia-warningForeground); - background-color: var(--theia-warningBackground); - opacity: 1; /* Firefox */ + color: var(--theia-warningForeground); + background-color: var(--theia-warningBackground); +} + +.theia-input.error:focus { + outline-width: 1px; + outline-style: solid; + outline-offset: -1px; + opacity: 1 !important; + color: var(--theia-errorForeground); + background-color: var(--theia-errorBackground); } -.theia-input.warning:-ms-input-placeholder { - /* Internet Explorer 10-11 */ - color: var(--theia-warningForeground); - background-color: var(--theia-warningBackground); +.theia-input.error { + background-color: var(--theia-errorBackground); } -.theia-input.warning::-ms-input-placeholder { - /* Microsoft Edge */ - color: var(--theia-warningForeground); - background-color: var(--theia-warningBackground); +.theia-input.error::placeholder { + color: var(--theia-errorForeground); + background-color: var(--theia-errorBackground); } /* Makes the sidepanel a bit wider when opening the widget */ .p-DockPanel-widget { - min-width: 200px; - min-height: 200px; + min-width: 220px; + min-height: 20px; + height: 220px; } /* Overrule the default Theia CSS button styles. */ button.theia-button, .theia-button { - align-items: center; - display: flex; - font-family: 'Open Sans',sans-serif; - font-style: normal; - font-weight: 700; - font-size: 14px; - justify-content: center; - cursor: pointer; - letter-spacing: .01em; - line-height: 24px; - outline: none; - padding: 0 16px; - position: relative; - text-align: center; - text-decoration: none; - border-width: 2px; - border-radius: 32px; - text-transform: uppercase; - transition: none; - box-shadow: none; + align-items: center; + display: flex; + font-family: "Open Sans Bold", sans-serif; + font-style: normal; + font-weight: 700; + font-size: 14px; + justify-content: center; + cursor: pointer; + letter-spacing: 0.01em; + line-height: 24px; + outline: none; + padding: 0 16px; + position: relative; + text-align: center; + text-decoration: none; + border-width: 2px; + border-radius: 32px; + text-transform: uppercase; + transition: none; + box-shadow: none; } button.theia-button { - height: 28px; - max-width: none; + height: var(--arduino-button-height); + max-width: none; } .theia-button:active, .theia-button:focus { - box-shadow: 0 0 0 2px var(--theia-focusBorder); + box-shadow: 0 0 0 2px var(--theia-focusBorder); } button.theia-button.secondary { - border: 2px solid var(--theia-secondaryButton-foreground); + border: 2px solid var(--theia-secondaryButton-foreground); +} + +button.theia-button[disabled], +.theia-button[disabled] { + opacity: 0.5; + color: var(--theia-button-foreground); + background-color: var(--theia-button-background); } -button.theia-button[disabled], .theia-button[disabled] { - opacity: 0.5; - color: var(--theia-button-foreground); - background-color: var(--theia-button-background); +button.secondary[disabled], +.theia-button.secondary[disabled] { + color: var(--theia-secondaryButton-foreground); + background-color: var(--theia-secondaryButton-background); } -button.secondary[disabled], .theia-button.secondary[disabled] { - color: var(--theia-secondaryButton-foreground); - background-color: var(--theia-secondaryButton-background); +button.theia-button.message-box-dialog-button { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + display: inline-block; } /* To make the progress-bar slightly thicker, and use the color from the status bar */ .theia-progress-bar-container { - width: 100%; - height: 4px; + width: 100%; + height: 4px; } .theia-progress-bar { - height: 4px; - width: 3%; - animation: progress-animation 1.3s 0s infinite - cubic-bezier(0.645, 0.045, 0.355, 1); + height: 4px; + width: 3%; + animation: progress-animation 1.3s 0s infinite + cubic-bezier(0.645, 0.045, 0.355, 1); } .theia-notification-item-progressbar { - height: 4px; - width: 66%; + height: 4px; + width: 66%; } .flex-line { - display: flex; - align-items: center; - white-space: nowrap; + display: flex; + align-items: center; + white-space: nowrap; } .fa-reload { - font-size: 14px; -} - - -/* High Contrast Theme rules */ -/* TODO: Remove it when the Theia version is upgraded to 1.27.0 and use Theia APIs to implement it*/ -.hc-black.hc-theia.theia-hc button.theia-button:hover, -.hc-black.hc-theia.theia-hc .theia-button:hover { - outline: 1px dashed var(--theia-focusBorder); -} - -.hc-black.hc-theia.theia-hc button.theia-button, -.hc-black.hc-theia.theia-hc .theia-button, -.hc-black.hc-theia.theia-hc button.theia-button.secondary { - border: 1px solid var(--theia-button-border); + font-size: 14px; } -.hc-black.hc-theia.theia-hc .theia-notification-list-item:hover:not(:focus) { - background-color: var(--theia-notifications-background); - outline: 1px dashed var(--theia-focusBorder); - outline-offset: -2px; +.debug-toolbar .debug-action > div { + font-family: var(--theia-ui-font-family); + font-size: var(--theia-ui-font-size0); + display: flex; + align-items: center; + align-self: center; + justify-content: center; + min-height: inherit; } diff --git a/arduino-ide-extension/src/browser/style/list-widget.css b/arduino-ide-extension/src/browser/style/list-widget.css index f60159e34..2c74ec86a 100644 --- a/arduino-ide-extension/src/browser/style/list-widget.css +++ b/arduino-ide-extension/src/browser/style/list-widget.css @@ -1,6 +1,6 @@ .library-tab-icon { - -webkit-mask: url('../icons/library-tab-icon.svg'); - mask: url('../icons/library-tab-icon.svg'); + -webkit-mask: url("../icons/library-tab-icon.svg"); + mask: url("../icons/library-tab-icon.svg"); } .arduino-list-widget { @@ -44,102 +44,166 @@ height: 100%; /* This has top be 100% down to the `scrollContainer`. */ } -.filterable-list-container .items-container > div > div:nth-child(odd) { - background-color: var(--theia-sideBar-background); - filter: contrast(105%); +.component-list-item { + padding: 20px 15px 25px; } -.filterable-list-container .items-container > div > div:nth-child(even) { - background-color: var(--theia-sideBar-background); - filter: contrast(95%); +.component-list-item .header { + padding-bottom: 2px; + min-height: var(--theia-statusBar-height); } -.filterable-list-container .items-container > div > div:hover { - background-color: var(--theia-sideBar-background); - filter: contrast(90%); +.component-list-item .header > div { + display: flex; } -.component-list-item { - padding: 10px 10px 10px 15px; - font-size: var(--theia-ui-font-size1); +.component-list-item .header > div .p-TabBar-toolbar { + align-self: start; + padding: unset; + margin-right: unset; } -.component-list-item:hover { - cursor: pointer; +.component-list-item:hover .header > div .p-TabBar-toolbar > div { + visibility: visible; } -.component-list-item .header { - padding-bottom: 2px; - display: flex; - flex-direction: column; +.component-list-item .header > div .p-TabBar-toolbar > div { + visibility: hidden; +} + +.component-list-item .header .title { + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + white-space: normal; + overflow: hidden; + text-overflow: ellipsis; + flex: 1 1 auto; +} + +.component-list-item .header .title .name { + font-family: "Open Sans Bold"; + font-style: normal; + font-weight: 700; + font-size: 14px; } -.component-list-item .header .version-info { +.component-list-item .header .version { display: flex; justify-content: space-between; align-items: center; } -.component-list-item .header .name { - font-weight: bold; -} - .component-list-item .header .author { - font-weight: bold; color: var(--theia-panelTitle-inactiveForeground); } -.component-list-item:hover .header .author { - color: var(--theia-foreground); -} - .component-list-item .header .version { color: var(--theia-panelTitle-inactiveForeground); + padding-top: 4px; } .component-list-item .footer .theia-button.install { height: auto; /* resets the default Theia button height in the filterable list widget */ } -.component-list-item .header .installed:before { - margin-left: 4px; +.component-list-item .header .installed-version:before { + min-width: 79px; display: inline-block; justify-self: end; - background-color: var(--theia-button-background); + text-align: center; + background-color: var( + --theia-arduino-toolbar-dropdown-option-backgroundHover + ); padding: 2px 4px 2px 4px; - font-size: 10px; - font-weight: bold; + font-size: 12px; max-height: calc(1em + 4px); - color: var(--theia-button-foreground); - content: 'INSTALLED'; + color: var(--theia-button-background); + content: attr(version); + cursor: pointer; + border-radius: 4px; } -.component-list-item .header .installed:hover:before { - background-color: var(--theia-button-foreground); - color: var(--theia-button-background); - content: 'UNINSTALL'; +.component-list-item .header .installed-version:hover:before { + content: attr(remove); + text-transform: uppercase; } -.component-list-item[min-width~="170px"] .footer { - padding: 5px 5px 0px 0px; - min-height: 35px; +.component-list-item .content { display: flex; - flex-direction: row-reverse; + flex-direction: column; + padding-top: 4px; + font-family: "Open Sans"; + font-style: normal; + font-weight: 400; + font-size: 12px; +} + +.component-list-item .content > p { + margin-block-start: unset; + margin-block-end: unset; + + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 3; + white-space: normal; + overflow: hidden; + text-overflow: ellipsis; +} + +.component-list-item .content > .info { + white-space: nowrap; } .component-list-item .footer { flex-direction: column-reverse; + padding-top: 8px; } -.component-list-item:hover .footer > * { +.component-list-item .footer > * { display: inline-block; - margin: 5px 0px 0px 10px; +} + +.filterable-list-container .separator { + display: flex; + flex-direction: row; +} + +.filterable-list-container .separator :last-child, +.filterable-list-container .separator :first-child { + min-height: 8px; + max-height: 8px; + min-width: 8px; + max-width: 8px; +} + +div.filterable-list-container + > div + > div + > div + > div:nth-child(1) + > div.separator + :first-child, +div.filterable-list-container + > div + > div + > div + > div:nth-child(1) + > div.separator + :last-child { + display: none; +} + +.filterable-list-container .separator .line { + max-height: 1px; + height: 1px; + background-color: var(--theia-activityBar-inactiveForeground); + flex: 1 1 auto; } .component-list-item:hover .footer > label { display: inline-block; align-self: center; - margin: 5px 0px 0px 10px; } .component-list-item .info a { @@ -151,13 +215,21 @@ text-decoration: underline; } -/* High Contrast Theme rules */ -/* TODO: Remove it when the Theia version is upgraded to 1.27.0 and use Theia APIs to implement it*/ -.hc-black.hc-theia.theia-hc .component-list-item .header .installed:hover:before { - background-color: transparent; - outline: 1px dashed var(--theia-focusBorder); +.component-list-item .theia-button.secondary.no-border { + border: 2px solid var(--theia-button-foreground); } -.hc-black.hc-theia.theia-hc .component-list-item .header .installed:before { - border: 1px solid var(--theia-button-border); -} \ No newline at end of file +.component-list-item .theia-button.secondary.no-border:hover { + border: 2px solid var(--theia-secondaryButton-foreground); +} + +.component-list-item .theia-button { + margin-left: 12px; +} + +.component-list-item .theia-select { + height: var(--arduino-button-height); + min-height: var(--arduino-button-height); + width: 65px; + min-width: 65px; +} diff --git a/arduino-ide-extension/src/browser/style/main.css b/arduino-ide-extension/src/browser/style/main.css index 40cae2a31..942d3c684 100644 --- a/arduino-ide-extension/src/browser/style/main.css +++ b/arduino-ide-extension/src/browser/style/main.css @@ -1,7 +1,18 @@ -#theia-bottom-content-panel .p-TabBar[data-orientation='horizontal'].theia-app-bottom { +#theia-bottom-content-panel + .p-TabBar[data-orientation="horizontal"].theia-app-bottom { background: var(--theia-editorGroupHeader-tabsBackground); } +/* Avoid the Intellisense widget may be cover by the bottom panel partially. + TODO: This issue may be resolved after monaco-editor upgrade */ +#theia-main-content-panel { + z-index: auto; +} + +#theia-main-content-panel div[id^="code-editor-opener"] { + z-index: auto; +} + .p-TabBar-toolbar .item.arduino-tool-item { margin-left: 0; } @@ -13,13 +24,12 @@ border-radius: 1px; } - .p-TabBar-toolbar .item.arduino-tool-item > div { display: flex; justify-content: center; align-items: center; - height: 28px; - width: 28px; + height: var(--arduino-button-height); + width: var(--arduino-button-height); } .p-TabBar-toolbar .item.arduino-tool-item .arduino-upload-sketch--toolbar, @@ -32,9 +42,15 @@ background: var(--theia-arduino-toolbar-button-hoverBackground); } -.p-TabBar-toolbar .item.arduino-tool-item.enabled:hover > div.toggle-serial-monitor, -.p-TabBar-toolbar .item.arduino-tool-item.enabled:hover > div.toggle-serial-plotter { - background-color: var(--theia-arduino-toolbar-button-secondary-hoverBackground); +.p-TabBar-toolbar + .item.arduino-tool-item.enabled:hover + > div.toggle-serial-monitor, +.p-TabBar-toolbar + .item.arduino-tool-item.enabled:hover + > div.toggle-serial-plotter { + background-color: var( + --theia-arduino-toolbar-button-secondary-hoverBackground + ); border-radius: 14px; } @@ -45,19 +61,19 @@ } .item.arduino-tool-item.toggled { - background-color: unset; - opacity: 1; - border: none; + background-color: unset; + opacity: 1; + border: none; } .item.arduino-tool-item.toggled .arduino-verify-sketch--toolbar, .item.arduino-tool-item.toggled .arduino-upload-sketch--toolbar { - background-color: var(--theia-arduino-toolbar-toggleBackground) !important; + background-color: var(--theia-arduino-toolbar-toggleBackground) !important; } .arduino-tool-icon { - height: 28px; - width: 28px; + height: var(--arduino-button-height); + width: var(--arduino-button-height); } .arduino-verify-sketch--toolbar-icon { @@ -67,7 +83,7 @@ .arduino-upload-sketch--toolbar-icon { -webkit-mask: url(../icons/upload.svg) center no-repeat; - background-color: var(--theia-titleBar-activeBackground); + background-color: var(--theia-titleBar-activeBackground); } .toggle-serial-monitor-icon { @@ -81,14 +97,13 @@ } .arduino-start-debug-icon { - -webkit-mask: url('../icons/debug-dark.svg') 50% 60%; + -webkit-mask: url("../icons/debug-dark.svg") 50% 60%; -webkit-mask-size: 70%; -webkit-mask-repeat: no-repeat; display: flex; justify-content: center; align-items: center; - background-color: var(--theia-titleBar-activeBackground); - + background-color: var(--theia-titleBar-activeBackground); } #arduino-toolbar-container { @@ -105,6 +120,10 @@ z-index: 0; } +.p-TabBar-toolbar .item > div { + text-align: center; +} + :root { --theia-private-menubar-height: 40px; /* set the topbar height */ } @@ -124,24 +143,6 @@ color: var(--theia-titleBar-activeForeground); } -.p-TabBar-toolbar .item > div.arduino-toggle-advanced-mode { - display: flex; - width: 24px; - height: 24px; - justify-content: center; - align-items: center; -} - -.arduino-toggle-advanced-mode-icon { - mask: none; - -webkit-mask: none; - background: none; - display: flex; - justify-content: center; - align-items: center; - color: var(--theia-titleBar-activeBackground); -} - .arduino-open-boards-control-icon { mask: none; -webkit-mask: none; @@ -180,7 +181,12 @@ background-color: var(--theia-terminal-background); } -.theia-output .monaco-editor .lines-content.monaco-editor-background .view-lines .view-line .mtk1:not(.theia-output-error):not(.theia-output-warning) { +.theia-output + .monaco-editor + .lines-content.monaco-editor-background + .view-lines + .view-line + .mtk1:not(.theia-output-error):not(.theia-output-warning) { color: var(--theia-terminal-foreground); } @@ -189,57 +195,9 @@ background-color: var(--theia-terminal-background); } - -/* High Contrast Theme rules */ -/* TODO: Remove it when the Theia version is upgraded to 1.27.0 and use Theia APIs to implement it*/ -.hc-black.hc-theia.theia-hc .p-TabBar-toolbar .item.arduino-tool-item.enabled:hover > div { - background: var(--theia-arduino-toolbar-button-background); - outline: 1px dashed var(--theia-focusBorder); -} - -.hc-black.hc-theia.theia-hc .p-TabBar-toolbar .item.arduino-tool-item.enabled:hover > div.toggle-serial-plotter, -.hc-black.hc-theia.theia-hc .p-TabBar-toolbar .item.arduino-tool-item.enabled:hover > div.toggle-serial-monitor { - background: transparent; -} - -.hc-black.hc-theia.theia-hc .item.arduino-tool-item.toggled .arduino-verify-sketch--toolbar, -.hc-black.hc-theia.theia-hc .item.arduino-tool-item.toggled .arduino-upload-sketch--toolbar { - background-color: var(--theia-arduino-toolbar-button-background) !important; - outline: 1px solid var(--theia-focusBorder); -} - -.hc-black.hc-theia.theia-hc .arduino-boards-dropdown-item:hover { - background: var(--theia-dropdown-background); -} - -.hc-black.hc-theia.theia-hc .arduino-boards-dropdown-item:hover { - outline: 1px dashed var(--theia-focusBorder); - outline-offset: -2px; +.monaco-hover .hover-row.markdown-hover:first-child p { + margin-top: 8px; } - -.hc-black.hc-theia.theia-hc #theia-main-content-panel .p-TabBar .p-TabBar-tab.p-mod-current { - outline: 1px solid var(--theia-focusBorder); - outline-offset: -4px; -} - -.hc-black.hc-theia.theia-hc #theia-main-content-panel .p-TabBar .p-TabBar-tab:hover { - outline: 1px dashed var(--theia-focusBorder); - outline-offset: -4px; -} - -.hc-black.hc-theia.theia-hc .p-TabBar.theia-app-centers .p-TabBar-tab.p-mod-closable > .p-TabBar-tabCloseIcon:hover { - outline: 1px dashed var(--theia-focusBorder); -} - -.hc-black.hc-theia.theia-hc .quick-input-list .monaco-list-row.focused { - outline: 1px dotted var(--theia-focusBorder); -} - -.hc-black.hc-theia.theia-hc .quick-input-list .monaco-list-row:hover { - outline: 1px dashed var(--theia-focusBorder); -} - -.hc-black.hc-theia.theia-hc .quick-input-widget { - outline: 1px solid var(--theia-contrastBorder); - outline-offset: -1px; +.monaco-hover .hover-row.markdown-hover:first-child .monaco-tokenized-source { + margin-top: 8px; } diff --git a/arduino-ide-extension/src/browser/style/monitor.css b/arduino-ide-extension/src/browser/style/monitor.css index 9e8bd44cc..3ee6e65c8 100644 --- a/arduino-ide-extension/src/browser/style/monitor.css +++ b/arduino-ide-extension/src/browser/style/monitor.css @@ -1,6 +1,6 @@ .monitor-tab-icon { - -webkit-mask: url('../icons/monitor-tab-icon.svg'); - mask: url('../icons/monitor-tab-icon.svg'); + -webkit-mask: url("../icons/monitor-tab-icon.svg"); + mask: url("../icons/monitor-tab-icon.svg"); } .serial-monitor { @@ -10,28 +10,57 @@ } .serial-monitor-messages { - white-space: 'pre'; - font-family: monospace + white-space: "pre"; + font-family: monospace; +} + +.serial-monitor-messages pre { + margin: 0px; } .serial-monitor .head { display: flex; - padding: 5px; + padding: 0px 5px 5px 5px; height: 27px; + background-color: var(--theia-activityBar-background); } .serial-monitor .head .send { display: flex; flex: 1; - margin-right: 2px; } -.serial-monitor .head .send > input { +.serial-monitor .head .send > label:before { + content: ""; + position: absolute; + top: -1px; + background: var(--theia-icon-loading-warning) center center no-repeat; + animation: theia-spin 1.25s linear infinite; + width: 30px; + height: 30px; +} + +.serial-monitor .head .send > label { + position: relative; + width: 100%; + display: flex; + align-self: baseline; +} + +.serial-monitor .head .send > input, +.serial-monitor .head .send > label > input { line-height: var(--theia-content-line-height); + height: 27px; width: 100%; } -.serial-monitor .head .send > input:focus { +.serial-monitor .head .send > label > input { + padding-left: 30px; + box-sizing: border-box; +} + +.serial-monitor .head .send > input:focus, +.serial-monitor .head .send > label > input:focus { border-color: var(--theia-focusBorder); } diff --git a/arduino-ide-extension/src/browser/style/progress-bar.css b/arduino-ide-extension/src/browser/style/progress-bar.css index d395ece92..7ccc816f9 100644 --- a/arduino-ide-extension/src/browser/style/progress-bar.css +++ b/arduino-ide-extension/src/browser/style/progress-bar.css @@ -1,32 +1,32 @@ .progress-bar { - margin-top: 20px; + margin-top: 20px; } .progress-bar--outer { - background: var(--theia-editorWidget-background); - border-radius: 11px; - height: 6px; - position: relative; - overflow: hidden; + background: var(--theia-editorWidget-background); + border-radius: 11px; + height: 6px; + position: relative; + overflow: hidden; } .progress-bar--inner { - transition: width 1s; - height: 100%; - background: var(--theia-progressBar-background); - border-radius: 11px; + transition: width 1s; + height: 100%; + background: var(--theia-progressBar-background); + border-radius: 11px; } .progress-bar--percentage { - align-items: flex-end; - display: flex; - height: 40px; - justify-content: center; - margin-top: 10px; - width: 100%; + align-items: flex-end; + display: flex; + height: 40px; + justify-content: center; + margin-top: 10px; + width: 100%; } .progress-bar--percentage-text { - font-size: 14px; - line-height: 24px; + font-size: 14px; + line-height: 24px; } diff --git a/arduino-ide-extension/src/browser/style/settings-dialog.css b/arduino-ide-extension/src/browser/style/settings-dialog.css index 10ddfd0a0..6702e736d 100644 --- a/arduino-ide-extension/src/browser/style/settings-dialog.css +++ b/arduino-ide-extension/src/browser/style/settings-dialog.css @@ -1,5 +1,5 @@ #arduino-settings-dialog-container > .dialogBlock { - height: 531px;; + height: 531px; max-width: 740px !important; width: calc(100% - 96px); } @@ -88,9 +88,13 @@ } .additional-urls-dialog textarea { - width: 100%; + resize: none; + white-space: nowrap; } .p-Widget.dialogOverlay .dialogBlock .dialogContent.additional-urls-dialog { - display: block; + display: flex; + overflow: hidden; + padding: 0 1px; + margin: 0 -1px; } diff --git a/arduino-ide-extension/src/browser/style/settings-step-input.css b/arduino-ide-extension/src/browser/style/settings-step-input.css index d2a5ce7db..e7a07f5fd 100644 --- a/arduino-ide-extension/src/browser/style/settings-step-input.css +++ b/arduino-ide-extension/src/browser/style/settings-step-input.css @@ -1,18 +1,18 @@ .settings-step-input-container { - position: relative + position: relative; } -.settings-step-input-element::-webkit-inner-spin-button, +.settings-step-input-element::-webkit-inner-spin-button, .settings-step-input-element::-webkit-outer-spin-button { - -webkit-appearance: none; - margin: 0; + -webkit-appearance: none; + margin: 0; } .settings-step-input-buttons-container { display: none; flex-direction: column; position: absolute; - right: 14px; + right: 0px; top: 50%; transform: translate(0px, -50%); height: calc(100% - 4px); @@ -21,6 +21,10 @@ background: var(--theia-input-background); } +.settings-step-input-buttons-container-perc { + right: 14px; +} + .settings-step-input-container:hover > .settings-step-input-buttons-container { display: flex; } diff --git a/arduino-ide-extension/src/browser/style/sketch-folder-icon.svg b/arduino-ide-extension/src/browser/style/sketch-folder-icon.svg deleted file mode 100644 index 363c5df10..000000000 --- a/arduino-ide-extension/src/browser/style/sketch-folder-icon.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/arduino-ide-extension/src/browser/style/sketchbook.css b/arduino-ide-extension/src/browser/style/sketchbook.css index dcba8d0d2..33363bc6b 100644 --- a/arduino-ide-extension/src/browser/style/sketchbook.css +++ b/arduino-ide-extension/src/browser/style/sketchbook.css @@ -1,89 +1,80 @@ .sketchbook-tab-icon { - -webkit-mask: url('./sketchbook.svg'); - mask: url('./sketchbook.svg'); -} - -.sketch-folder-icon { - background: url('./sketch-folder-icon.svg') center center no-repeat; - background-position-x: 1px; - width: var(--theia-icon-size); - height: var(--theia-icon-size); + -webkit-mask: url("./sketchbook.svg"); + mask: url("./sketchbook.svg"); } .p-TabBar-tabIcon.sketchbook-tree-icon { - background-color: var(--theia-foreground); - -webkit-mask: url(./sketchbook-tree-icon.svg); - -webkit-mask-position: center; - -webkit-mask-repeat: no-repeat; - width: 19px !important; - height: var(--theia-icon-size); - -webkit-mask-size: 100%; + background-color: var(--theia-foreground); + -webkit-mask: url(./sketchbook-tree-icon.svg); + -webkit-mask-position: center; + -webkit-mask-repeat: no-repeat; + width: 19px !important; + height: var(--theia-icon-size); + -webkit-mask-size: 100%; } -.p-mod-current -.sketchbook-tree-icon { - background-color: var(--theia-foreground); - -webkit-mask: url(./sketchbook-tree-icon-filled.svg); - -webkit-mask-position: center; - -webkit-mask-repeat: no-repeat; - -webkit-mask-size: 100%; +.p-mod-current .sketchbook-tree-icon { + background-color: var(--theia-foreground); + -webkit-mask: url(./sketchbook-tree-icon-filled.svg); + -webkit-mask-position: center; + -webkit-mask-repeat: no-repeat; + -webkit-mask-size: 100%; } .sketchbook-trees-container { - height: 100%; + height: 100%; +} + +.sketchbook-trees-container .create-new { + min-height: 58px; + height: 58px; + display: flex; + align-items: center; + justify-content: center; +} +/* +By default, theia-button has a left-margin. IDE2 does not need the left margin +for the _New Remote? Sketch_. Otherwise, the button does not fit the default +widget width. +*/ +.sketchbook-trees-container .create-new .theia-button { + margin-left: unset; } .sketchbook-tree__opts { - background-color: var(--theia-foreground); - -webkit-mask: url(./sketchbook-opts-icon.svg); - -webkit-mask-position: center; - -webkit-mask-repeat: no-repeat; - width: var(--theia-icon-size); - height: var(--theia-icon-size); + background-color: var(--theia-foreground); + -webkit-mask: url(./sketchbook-opts-icon.svg); + -webkit-mask-position: center; + -webkit-mask-repeat: no-repeat; + width: var(--theia-icon-size); + height: var(--theia-icon-size); } .active-sketch { - font-weight: 500; - background-color: var(--theia-list-activeSelectionBackground) !important; - color: var(--theia-list-activeSelectionForeground) !important; - + font-weight: 500; + background-color: var(--theia-list-activeSelectionBackground) !important; + color: var(--theia-list-activeSelectionForeground) !important; } #arduino-sketchbook-tree-widget .theia-TreeNode { - line-height: 30px; + line-height: 30px; } #arduino-sketchbook-tree-widget .theia-TreeNodeSegmentGrow { - flex: 1; + flex: 1; } .theia-TreeNode .sketchbook-commands-icons { - display: none; + display: none; } .theia-TreeNode:hover .sketchbook-commands-icons, .theia-TreeNode.theia-mod-selected .sketchbook-commands-icons { - display: block; + display: block; } .theia-Tree:focus .theia-TreeNode.theia-mod-selected, .theia-Tree .ReactVirtualized__List:focus .theia-TreeNode.theia-mod-selected { - background: var(--theia-list-inactiveSelectionBackground); - color: var(--theia-list-inactiveSelectionForeground) !important; -} - - -/* High Contrast Theme rules */ -/* TODO: Remove it when the Theia version is upgraded to 1.27.0 and use Theia APIs to implement it*/ -.hc-black.hc-theia.theia-hc .theia-TreeNode:hover { - outline: 1px dashed var(--theia-focusBorder); -} - -.hc-black.hc-theia.theia-hc .theia-Tree .theia-TreeNode.theia-mod-selected { - outline: 1px dotted var(--theia-focusBorder); -} - -.hc-black.hc-theia.theia-hc .theia-Tree:focus .theia-TreeNode.theia-mod-selected, -.hc-black.hc-theia.theia-hc .theia-Tree .ReactVirtualized__List:focus .theia-TreeNode.theia-mod-selected { - outline: 1px solid var(--theia-focusBorder); + background: var(--theia-list-inactiveSelectionBackground); + color: var(--theia-list-inactiveSelectionForeground) !important; } diff --git a/arduino-ide-extension/src/browser/style/user-fields-dialog.css b/arduino-ide-extension/src/browser/style/user-fields-dialog.css index 89a7b149d..19e97b7ac 100644 --- a/arduino-ide-extension/src/browser/style/user-fields-dialog.css +++ b/arduino-ide-extension/src/browser/style/user-fields-dialog.css @@ -1,32 +1,32 @@ .user-fields-container { - max-height: 332px; - overflow: auto; - padding: 2px; + max-height: 332px; + overflow: auto; + padding: 2px; } .user-fields-list { - margin: 16px 0; + margin: 16px 0; } .user-fields-dialog-content { - width: 408px; - max-height: 491px; + width: 408px; + max-height: 491px; } .user-fields-dialog-content .field-label { - color: var(--theia-editorWidget-foreground); - font-size: 14px; - font-style: normal; - font-weight: 400; - line-height: 21px; - letter-spacing: 0.01em; - text-align: left; + color: var(--theia-editorWidget-foreground); + font-size: 14px; + font-style: normal; + font-weight: 400; + line-height: 21px; + letter-spacing: 0.01em; + text-align: left; } .user-fields-dialog-content .theia-input { - flex-grow: 1; + flex-grow: 1; } .user-fields-dialog-content .button-container { - justify-content: flex-end; + justify-content: flex-end; } diff --git a/arduino-ide-extension/src/browser/style/version-welcome-dialog.css b/arduino-ide-extension/src/browser/style/version-welcome-dialog.css new file mode 100644 index 000000000..80d6f71e4 --- /dev/null +++ b/arduino-ide-extension/src/browser/style/version-welcome-dialog.css @@ -0,0 +1,7 @@ +#version-welcome-dialog-container > .dialogBlock { + width: 546px; + + .bold { + font-weight: bold; + } +} diff --git a/arduino-ide-extension/src/browser/theia/core/about-dialog.ts b/arduino-ide-extension/src/browser/theia/core/about-dialog.ts index 3e89c5105..4e22b59fd 100644 --- a/arduino-ide-extension/src/browser/theia/core/about-dialog.ts +++ b/arduino-ide-extension/src/browser/theia/core/about-dialog.ts @@ -1,9 +1,7 @@ import { AboutDialog as TheiaAboutDialog } from '@theia/core/lib/browser/about-dialog'; -import { duration } from '../../../common/decorators'; export class AboutDialog extends TheiaAboutDialog { - @duration({ name: 'theia-about#init' }) - protected override async init(): Promise { + protected override init(): void { // NOOP // IDE2 has a custom about dialog, so it does not make sense to collect Theia extensions at startup time. } diff --git a/arduino-ide-extension/src/browser/theia/core/application-shell.ts b/arduino-ide-extension/src/browser/theia/core/application-shell.ts index 9f0ac6b74..82867adaa 100644 --- a/arduino-ide-extension/src/browser/theia/core/application-shell.ts +++ b/arduino-ide-extension/src/browser/theia/core/application-shell.ts @@ -8,22 +8,21 @@ import { TabBar, Widget, } from '@theia/core/lib/browser'; -import { - ConnectionStatus, - ConnectionStatusService, -} from '@theia/core/lib/browser/connection-status-service'; import { nls } from '@theia/core/lib/common/nls'; import { MessageService } from '@theia/core/lib/common/message-service'; import { inject, injectable } from '@theia/core/shared/inversify'; +import { ApplicationConnectionStatusContribution } from './connection-status-service'; import { ToolbarAwareTabBar } from './tab-bars'; +import { find } from '@theia/core/shared/@phosphor/algorithm'; +import { OutputWidget } from '@theia/output/lib/browser/output-widget'; @injectable() export class ApplicationShell extends TheiaApplicationShell { @inject(MessageService) private readonly messageService: MessageService; - @inject(ConnectionStatusService) - private readonly connectionStatusService: ConnectionStatusService; + @inject(ApplicationConnectionStatusContribution) + private readonly connectionStatusService: ApplicationConnectionStatusContribution; override async addWidget( widget: Widget, @@ -51,6 +50,38 @@ export class ApplicationShell extends TheiaApplicationShell { 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 { // NOOP, dragging has been disabled return false; @@ -64,9 +95,8 @@ export class ApplicationShell extends TheiaApplicationShell { } override async saveAll(options?: SaveOptions): Promise { - if ( - this.connectionStatusService.currentStatus === ConnectionStatus.OFFLINE - ) { + // When there is no connection between the IDE2 frontend and backend. + if (this.connectionStatusService.offlineStatus === 'backend') { this.messageService.error( nls.localize( 'theia/core/couldNotSave', diff --git a/arduino-ide-extension/src/browser/theia/core/browser-main-menu-factory.ts b/arduino-ide-extension/src/browser/theia/core/browser-main-menu-factory.ts deleted file mode 100644 index 737ca98ac..000000000 --- a/arduino-ide-extension/src/browser/theia/core/browser-main-menu-factory.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { injectable } from '@theia/core/shared/inversify'; -import { - BrowserMainMenuFactory as TheiaBrowserMainMenuFactory, - MenuBarWidget, -} from '@theia/core/lib/browser/menu/browser-menu-plugin'; -import { MainMenuManager } from '../../../common/main-menu-manager'; - -@injectable() -export class BrowserMainMenuFactory - extends TheiaBrowserMainMenuFactory - implements MainMenuManager -{ - protected menuBar: MenuBarWidget | undefined; - - override createMenuBar(): MenuBarWidget { - this.menuBar = super.createMenuBar(); - return this.menuBar; - } - - update(): void { - if (this.menuBar) { - this.menuBar.clearMenus(); - this.fillMenuBar(this.menuBar); - } - } -} diff --git a/arduino-ide-extension/src/browser/theia/core/browser-menu-module.ts b/arduino-ide-extension/src/browser/theia/core/browser-menu-module.ts deleted file mode 100644 index fb887142f..000000000 --- a/arduino-ide-extension/src/browser/theia/core/browser-menu-module.ts +++ /dev/null @@ -1,18 +0,0 @@ -import '../../../../src/browser/style/browser-menu.css'; -import { ContainerModule } from '@theia/core/shared/inversify'; -import { - BrowserMenuBarContribution, - BrowserMainMenuFactory as TheiaBrowserMainMenuFactory, -} from '@theia/core/lib/browser/menu/browser-menu-plugin'; -import { MainMenuManager } from '../../../common/main-menu-manager'; -import { ArduinoMenuContribution } from './browser-menu-plugin'; -import { BrowserMainMenuFactory } from './browser-main-menu-factory'; - -export default new ContainerModule((bind, unbind, isBound, rebind) => { - bind(BrowserMainMenuFactory).toSelf().inSingletonScope(); - bind(MainMenuManager).toService(BrowserMainMenuFactory); - rebind(TheiaBrowserMainMenuFactory).toService(BrowserMainMenuFactory); - rebind(BrowserMenuBarContribution) - .to(ArduinoMenuContribution) - .inSingletonScope(); -}); diff --git a/arduino-ide-extension/src/browser/theia/core/browser-window-module.ts b/arduino-ide-extension/src/browser/theia/core/browser-window-module.ts deleted file mode 100644 index ac0862b75..000000000 --- a/arduino-ide-extension/src/browser/theia/core/browser-window-module.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { DefaultWindowService as TheiaDefaultWindowService } from '@theia/core/lib/browser/window/default-window-service'; -import { ContainerModule } from '@theia/core/shared/inversify'; -import { DefaultWindowService } from './default-window-service'; -import { WindowServiceExt } from './window-service-ext'; - -export default new ContainerModule((bind, unbind, isBound, rebind) => { - bind(DefaultWindowService).toSelf().inSingletonScope(); - rebind(TheiaDefaultWindowService).toService(DefaultWindowService); - bind(WindowServiceExt).toService(DefaultWindowService); -}); diff --git a/arduino-ide-extension/src/browser/theia/core/common-frontend-contribution.ts b/arduino-ide-extension/src/browser/theia/core/common-frontend-contribution.ts index 0785cad03..34ea17187 100644 --- a/arduino-ide-extension/src/browser/theia/core/common-frontend-contribution.ts +++ b/arduino-ide-extension/src/browser/theia/core/common-frontend-contribution.ts @@ -1,11 +1,13 @@ -import { injectable } from '@theia/core/shared/inversify'; -import { MenuModelRegistry } from '@theia/core/lib/common/menu'; import { - CommonFrontendContribution as TheiaCommonFrontendContribution, CommonCommands, + CommonFrontendContribution as TheiaCommonFrontendContribution, } from '@theia/core/lib/browser/common-frontend-contribution'; -import { CommandRegistry } from '@theia/core/lib/common/command'; -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 { CommandRegistry } from '@theia/core/lib/common/command'; +import type { MenuModelRegistry } from '@theia/core/lib/common/menu'; +import { isOSX } from '@theia/core/lib/common/os'; +import { injectable } from '@theia/core/shared/inversify'; @injectable() export class CommonFrontendContribution extends TheiaCommonFrontendContribution { @@ -22,7 +24,8 @@ export class CommonFrontendContribution extends TheiaCommonFrontendContribution CommonCommands.TOGGLE_MAXIMIZED, CommonCommands.PIN_TAB, CommonCommands.UNPIN_TAB, - CommonCommands.NEW_FILE, + CommonCommands.NEW_UNTITLED_FILE, + CommonCommands.NEW_UNTITLED_TEXT_FILE, ]) { commandRegistry.unregisterCommand(command); } @@ -44,12 +47,44 @@ export class CommonFrontendContribution extends TheiaCommonFrontendContribution CommonCommands.SELECT_ICON_THEME, CommonCommands.SELECT_COLOR_THEME, CommonCommands.ABOUT_COMMAND, - CommonCommands.SAVE_WITHOUT_FORMATTING, // Patched for https://github.com/eclipse-theia/theia/pull/8877 + CommonCommands.SAVE_WITHOUT_FORMATTING, // Patched for https://github.com/eclipse-theia/theia/pull/8877, + CommonCommands.NEW_UNTITLED_FILE, + CommonCommands.NEW_UNTITLED_TEXT_FILE, ]) { registry.unregisterMenuAction(command); } } + override registerKeybindings(registry: KeybindingRegistry): void { + super.registerKeybindings(registry); + // Workaround for https://github.com/eclipse-theia/theia/issues/11875 + if (isOSX) { + registry.unregisterKeybinding('ctrlcmd+tab'); + registry.unregisterKeybinding('ctrlcmd+alt+d'); + registry.unregisterKeybinding('ctrlcmd+shift+tab'); + registry.unregisterKeybinding('ctrlcmd+alt+a'); + + registry.registerKeybindings( + { + command: CommonCommands.NEXT_TAB.id, + keybinding: 'ctrl+tab', + }, + { + command: CommonCommands.NEXT_TAB.id, + keybinding: 'ctrl+alt+d', + }, + { + command: CommonCommands.PREVIOUS_TAB.id, + keybinding: 'ctrl+shift+tab', + }, + { + command: CommonCommands.PREVIOUS_TAB.id, + keybinding: 'ctrl+alt+a', + } + ); + } + } + override onWillStop(): OnWillStopAction | undefined { // This is NOOP here. All window close and app quit requests are handled in the `Close` contribution. return undefined; diff --git a/arduino-ide-extension/src/browser/theia/core/connection-status-service.ts b/arduino-ide-extension/src/browser/theia/core/connection-status-service.ts index 0738772c6..f892d7eb8 100644 --- a/arduino-ide-extension/src/browser/theia/core/connection-status-service.ts +++ b/arduino-ide-extension/src/browser/theia/core/connection-status-service.ts @@ -1,106 +1,336 @@ +import { + ConnectionStatus, + ApplicationConnectionStatusContribution as TheiaApplicationConnectionStatusContribution, + FrontendConnectionStatusService as TheiaFrontendConnectionStatusService, +} from '@theia/core/lib/browser/connection-status-service'; +import type { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application-contribution'; +import { WebSocketConnectionSource } from '@theia/core/lib/browser/messaging/ws-connection-source'; +import { StatusBarAlignment } from '@theia/core/lib/browser/status-bar/status-bar'; +import { Disposable } from '@theia/core/lib/common/disposable'; +import { Emitter, Event } from '@theia/core/lib/common/event'; +import { MessageService } from '@theia/core/lib/common/message-service'; +import { MessageType } from '@theia/core/lib/common/message-service-protocol'; +import { nls } from '@theia/core/lib/common/nls'; import { inject, injectable, postConstruct, } from '@theia/core/shared/inversify'; -import { Disposable } from '@theia/core/lib/common/disposable'; -import { StatusBarAlignment } from '@theia/core/lib/browser/status-bar/status-bar'; -import { - FrontendConnectionStatusService as TheiaFrontendConnectionStatusService, - ApplicationConnectionStatusContribution as TheiaApplicationConnectionStatusContribution, - ConnectionStatus, -} from '@theia/core/lib/browser/connection-status-service'; +import { NotificationManager } from '@theia/messages/lib/browser/notifications-manager'; +import debounce from 'lodash.debounce'; import { ArduinoDaemon } from '../../../common/protocol'; +import { assertUnreachable } from '../../../common/utils'; +import { CreateFeatures } from '../../create/create-features'; import { NotificationCenter } from '../../notification-center'; -import { nls } from '@theia/core/lib/common'; -import debounce = require('lodash.debounce'); @injectable() -export class FrontendConnectionStatusService extends TheiaFrontendConnectionStatusService { - @inject(ArduinoDaemon) - protected readonly daemon: ArduinoDaemon; +export class IsOnline implements FrontendApplicationContribution { + private readonly onDidChangeOnlineEmitter = new Emitter(); + private _online = false; + private stopped = false; + + onStart(): void { + import('is-online').then((module) => { + const checkOnline = async () => { + if (!this.stopped) { + try { + const online = await module.default(); + this.setOnline(online); + } finally { + window.setTimeout(() => checkOnline(), 6_000); // 6 seconds poll interval + } + } + }; + checkOnline(); + }); + } + + onStop(): void { + this.stopped = true; + this.onDidChangeOnlineEmitter.dispose(); + } + + get online(): boolean { + return this._online; + } + get onDidChangeOnline(): Event { + return this.onDidChangeOnlineEmitter.event; + } + + private setOnline(online: boolean): void { + const oldOnline = this._online; + this._online = online; + if (!this.stopped && this._online !== oldOnline) { + this.onDidChangeOnlineEmitter.fire(this._online); + } + } +} + +@injectable() +export class DaemonPort implements FrontendApplicationContribution { + @inject(ArduinoDaemon) + private readonly daemon: ArduinoDaemon; @inject(NotificationCenter) - protected readonly notificationCenter: NotificationCenter; + private readonly notificationCenter: NotificationCenter; + + private readonly onPortDidChangeEmitter = new Emitter(); + private _port: number | undefined; + + onStart(): void { + this.daemon.tryGetPort().then( + (port) => this.setPort(port), + (reason) => + console.warn('Could not retrieve the CLI daemon port.', reason) + ); + this.notificationCenter.onDaemonDidStart((port) => this.setPort(port)); + this.notificationCenter.onDaemonDidStop(() => this.setPort(undefined)); + } + + onStop(): void { + this.onPortDidChangeEmitter.dispose(); + } + + get port(): number | undefined { + return this._port; + } + + get onDidChangePort(): Event { + return this.onPortDidChangeEmitter.event; + } + + private setPort(port: number | undefined): void { + const oldPort = this._port; + this._port = port; + if (this._port !== oldPort) { + this.onPortDidChangeEmitter.fire(this._port); + } + } +} - protected connectedPort: string | undefined; +@injectable() +export class FrontendConnectionStatusService extends TheiaFrontendConnectionStatusService { + @inject(DaemonPort) + private readonly daemonPort: DaemonPort; + @inject(IsOnline) + private readonly isOnline: IsOnline; + @inject(WebSocketConnectionSource) + private readonly connectionSource: WebSocketConnectionSource; @postConstruct() - protected override async init(): Promise { + protected override init(): void { this.schedulePing(); - try { - this.connectedPort = await this.daemon.tryGetPort(); - } catch {} - this.notificationCenter.onDaemonDidStart( - (port) => (this.connectedPort = port) - ); - this.notificationCenter.onDaemonDidStop( - () => (this.connectedPort = undefined) - ); const refresh = debounce(() => { - this.updateStatus(!!this.connectedPort); + this.updateStatus(Boolean(this.daemonPort.port) && this.isOnline.online); this.schedulePing(); }, this.options.offlineTimeout - 10); this.wsConnectionProvider.onIncomingMessageActivity(() => refresh()); } + + protected override async performPingRequest(): Promise { + if (!this.connectionSource['socket'].connected) { + this.updateStatus(false); + return; + } + try { + await this.pingService.ping(); + this.updateStatus(this.isOnline.online); + } catch (e) { + this.updateStatus(false); + this.logger.error(e); + } + } } +const connectionStatusStatusBar = 'connection-status'; +const theiaOffline = 'theia-mod-offline'; + +export type OfflineConnectionStatus = + /** + * There is no websocket connection between the frontend and the backend. + */ + | 'backend' + /** + * The CLI daemon port is not available. Could not establish the gRPC connection between the backend and the CLI. + */ + | 'daemon' + /** + * Cloud not connect to the Internet from the browser. + */ + | 'internet'; + @injectable() export class ApplicationConnectionStatusContribution extends TheiaApplicationConnectionStatusContribution { - @inject(ArduinoDaemon) - protected readonly daemon: ArduinoDaemon; + @inject(DaemonPort) + private readonly daemonPort: DaemonPort; + @inject(IsOnline) + private readonly isOnline: IsOnline; + @inject(MessageService) + private readonly messageService: MessageService; + @inject(NotificationManager) + private readonly notificationManager: NotificationManager; + @inject(CreateFeatures) + private readonly createFeatures: CreateFeatures; + @inject(WebSocketConnectionSource) + private readonly connectionSource: WebSocketConnectionSource; - @inject(NotificationCenter) - protected readonly notificationCenter: NotificationCenter; + private readonly offlineStatusDidChangeEmitter = new Emitter< + OfflineConnectionStatus | undefined + >(); + private noInternetConnectionNotificationId: string | undefined; + private _offlineStatus: OfflineConnectionStatus | undefined; - protected connectedPort: string | undefined; + get offlineStatus(): OfflineConnectionStatus | undefined { + return this._offlineStatus; + } - @postConstruct() - protected async init(): Promise { - try { - this.connectedPort = await this.daemon.tryGetPort(); - } catch {} - this.notificationCenter.onDaemonDidStart( - (port) => (this.connectedPort = port) - ); - this.notificationCenter.onDaemonDidStop( - () => (this.connectedPort = undefined) - ); + get onOfflineStatusDidChange(): Event { + return this.offlineStatusDidChangeEmitter.event; } protected override onStateChange(state: ConnectionStatus): void { - if (!this.connectedPort && state === ConnectionStatus.ONLINE) { + if ( + (!Boolean(this.daemonPort.port) || !this.isOnline.online) && + state === ConnectionStatus.ONLINE + ) { return; } super.onStateChange(state); } protected override handleOffline(): void { - this.statusBar.setElement('connection-status', { + const params = { + port: this.daemonPort.port, + online: this.isOnline.online, + backendConnected: this.connectionSource['socket'].connected, // https://github.com/arduino/arduino-ide/issues/2081 + }; + this._offlineStatus = offlineConnectionStatusType(params); + const { text, tooltip } = offlineMessage(params); + this.statusBar.setElement(connectionStatusStatusBar, { alignment: StatusBarAlignment.LEFT, - text: this.connectedPort - ? nls.localize('theia/core/offline', 'Offline') - : '$(bolt) ' + - nls.localize('theia/core/daemonOffline', 'CLI Daemon Offline'), - tooltip: this.connectedPort - ? nls.localize( - 'theia/core/cannotConnectBackend', - 'Cannot connect to the backend.' - ) - : nls.localize( - 'theia/core/cannotConnectDaemon', - 'Cannot connect to the CLI daemon.' - ), + text, + tooltip, priority: 5000, }); - this.toDisposeOnOnline.push( - Disposable.create(() => this.statusBar.removeElement('connection-status')) - ); - document.body.classList.add('theia-mod-offline'); - this.toDisposeOnOnline.push( + document.body.classList.add(theiaOffline); + this.toDisposeOnOnline.pushAll([ Disposable.create(() => - document.body.classList.remove('theia-mod-offline') - ) - ); + this.statusBar.removeElement(connectionStatusStatusBar) + ), + Disposable.create(() => document.body.classList.remove(theiaOffline)), + Disposable.create(() => { + this._offlineStatus = undefined; + this.fireStatusDidChange(); + }), + ]); + if (!this.isOnline.online) { + const text = nls.localize( + 'arduino/connectionStatus/connectionLost', + "Connection lost. Cloud sketch actions and updates won't be available." + ); + this.noInternetConnectionNotificationId = this.notificationManager[ + 'getMessageId' + ]({ text, type: MessageType.Warning }); + if (this.createFeatures.enabled) { + this.messageService.warn(text); + } + this.toDisposeOnOnline.push( + Disposable.create(() => this.clearNoInternetConnectionNotification()) + ); + } + this.fireStatusDidChange(); + } + + private clearNoInternetConnectionNotification(): void { + if (this.noInternetConnectionNotificationId) { + this.notificationManager.clear(this.noInternetConnectionNotificationId); + this.noInternetConnectionNotificationId = undefined; + } + } + + private fireStatusDidChange(): void { + if (this.createFeatures.enabled) { + return this.offlineStatusDidChangeEmitter.fire(this._offlineStatus); + } + } +} + +interface OfflineMessageParams { + readonly port: string | undefined; + readonly online: boolean; + readonly backendConnected: boolean; +} +interface OfflineMessage { + readonly text: string; + readonly tooltip: string; +} + +/** + * (non-API) exported for testing + * + * The precedence of the offline states are the following: + * - No connection to the Theia backend, + * - CLI daemon is offline, and + * - There is no Internet connection. + */ +export function offlineMessage(params: OfflineMessageParams): OfflineMessage { + const statusType = offlineConnectionStatusType(params); + const text = getOfflineText(statusType); + const tooltip = getOfflineTooltip(statusType); + return { text, tooltip }; +} + +function offlineConnectionStatusType( + params: OfflineMessageParams +): OfflineConnectionStatus { + const { port, online, backendConnected } = params; + if (!backendConnected || (port && online)) { + return 'backend'; + } + if (!port) { + return 'daemon'; + } + return 'internet'; +} + +export const backendOfflineText = nls.localize('theia/core/offline', 'Offline'); +export const daemonOfflineText = nls.localize( + 'theia/core/daemonOffline', + 'CLI Daemon Offline' +); +export const offlineText = nls.localize('theia/core/offlineText', 'Offline'); +export const backendOfflineTooltip = nls.localize( + 'theia/core/cannotConnectBackend', + 'Cannot connect to the backend.' +); +export const daemonOfflineTooltip = nls.localize( + 'theia/core/cannotConnectDaemon', + 'Cannot connect to the CLI daemon.' +); +export const offlineTooltip = offlineText; + +function getOfflineText(statusType: OfflineConnectionStatus): string { + switch (statusType) { + case 'backend': + return backendOfflineText; + case 'daemon': + return '$(bolt) ' + daemonOfflineText; + case 'internet': + return '$(alert) ' + offlineText; + default: + assertUnreachable(statusType); + } +} + +function getOfflineTooltip(statusType: OfflineConnectionStatus): string { + switch (statusType) { + case 'backend': + return backendOfflineTooltip; + case 'daemon': + return daemonOfflineTooltip; + case 'internet': + return offlineTooltip; + default: + assertUnreachable(statusType); } } diff --git a/arduino-ide-extension/src/browser/theia/core/default-window-service.ts b/arduino-ide-extension/src/browser/theia/core/default-window-service.ts deleted file mode 100644 index 145691727..000000000 --- a/arduino-ide-extension/src/browser/theia/core/default-window-service.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { DefaultWindowService as TheiaDefaultWindowService } from '@theia/core/lib/browser/window/default-window-service'; -import { injectable } from '@theia/core/shared/inversify'; -import { WindowServiceExt } from './window-service-ext'; - -@injectable() -export class DefaultWindowService - extends TheiaDefaultWindowService - implements WindowServiceExt -{ - /** - * The default implementation always resolves to `true`. - * IDE2 does not use it. It's currently an electron-only app. - */ - async isFirstWindow(): Promise { - return true; - } -} diff --git a/arduino-ide-extension/src/browser/theia/core/frontend-application.ts b/arduino-ide-extension/src/browser/theia/core/frontend-application.ts index cb1a96206..4b29df155 100644 --- a/arduino-ide-extension/src/browser/theia/core/frontend-application.ts +++ b/arduino-ide-extension/src/browser/theia/core/frontend-application.ts @@ -1,5 +1,4 @@ import { injectable, inject } from '@theia/core/shared/inversify'; -import { FileService } from '@theia/filesystem/lib/browser/file-service'; import { CommandService } from '@theia/core/lib/common/command'; import { WorkspaceService } from '@theia/workspace/lib/browser/workspace-service'; import { FrontendApplication as TheiaFrontendApplication } from '@theia/core/lib/browser/frontend-application'; @@ -8,17 +7,16 @@ import { OpenSketchFiles } from '../../contributions/open-sketch-files'; @injectable() export class FrontendApplication extends TheiaFrontendApplication { - @inject(FileService) - protected readonly fileService: FileService; - @inject(WorkspaceService) - protected readonly workspaceService: WorkspaceService; + private readonly workspaceService: WorkspaceService; @inject(CommandService) - protected readonly commandService: CommandService; + private readonly commandService: CommandService; @inject(SketchesService) - protected readonly sketchesService: SketchesService; + private readonly sketchesService: SketchesService; + + private layoutWasRestored = false; protected override async initializeLayout(): Promise { await super.initializeLayout(); @@ -26,10 +24,16 @@ export class FrontendApplication extends TheiaFrontendApplication { for (const root of roots) { await this.commandService.executeCommand( OpenSketchFiles.Commands.OPEN_SKETCH_FILES.id, - root.resource + root.resource, + !this.layoutWasRestored ); this.sketchesService.markAsRecentlyOpened(root.resource.toString()); // no await, will get the notification later and rebuild the menu } }); } + + protected override async restoreLayout(): Promise { + this.layoutWasRestored = await super.restoreLayout(); + return this.layoutWasRestored; + } } diff --git a/arduino-ide-extension/src/browser/theia/core/sidebar-bottom-menu-widget.tsx b/arduino-ide-extension/src/browser/theia/core/sidebar-bottom-menu-widget.tsx new file mode 100644 index 000000000..124604098 --- /dev/null +++ b/arduino-ide-extension/src/browser/theia/core/sidebar-bottom-menu-widget.tsx @@ -0,0 +1,90 @@ +import { SidebarBottomMenuWidget as TheiaSidebarBottomMenuWidget } from '@theia/core/lib/browser/shell/sidebar-bottom-menu-widget'; +import type { SidebarMenuItem } from '@theia/core/lib/browser/shell/sidebar-menu-widget'; +import type { MenuPath } from '@theia/core/lib/common/menu'; +import { nls } from '@theia/core/lib/common/nls'; +import { + inject, + injectable, + postConstruct, +} from '@theia/core/shared/inversify'; +import React from '@theia/core/shared/react'; +import { accountMenu } from '../../contributions/account'; +import { CreateFeatures } from '../../create/create-features'; +import { ApplicationConnectionStatusContribution } from './connection-status-service'; + +@injectable() +export class SidebarBottomMenuWidget extends TheiaSidebarBottomMenuWidget { + @inject(CreateFeatures) + private readonly createFeatures: CreateFeatures; + @inject(ApplicationConnectionStatusContribution) + private readonly connectionStatue: ApplicationConnectionStatusContribution; + + @postConstruct() + protected init(): void { + this.toDispose.pushAll([ + this.createFeatures.onDidChangeSession(() => this.update()), + this.connectionStatue.onOfflineStatusDidChange(() => this.update()), + ]); + } + + protected override onClick( + e: React.MouseEvent, + menuPath: MenuPath + ): void { + const button = e.currentTarget.getBoundingClientRect(); + const options = { + menuPath, + includeAnchorArg: false, + anchor: { + x: button.left + button.width, + // Bogus y coordinate? + // https://github.com/eclipse-theia/theia/discussions/12170 + y: button.top, + }, + showDisabled: true, + }; + this.contextMenuRenderer.render(options); + } + + override renderItem(item: SidebarMenuItem): React.ReactNode { + // Removes the _Settings_ (cog) icon from the left sidebar + if (item.menu.id === 'settings-menu') { + return undefined; + } + const arduinoAccount = item.menu.id === accountMenu.id; + const arduinoAccountPicture = + arduinoAccount && + this.connectionStatue.offlineStatus !== 'internet' && + this.createFeatures.session?.account.picture; + + return ( +
this.onClick(e, item.menu.menuPath)} + onMouseDown={this.onMouseDown} + onMouseEnter={(e) => this.onMouseEnter(e, item.menu.title)} + onMouseOut={this.onMouseOut} + > + {arduinoAccountPicture ? ( + + {nls.localize( + + ) : ( + + )} + {item.badge && ( +
{item.badge}
+ )} +
+ ); + } +} diff --git a/arduino-ide-extension/src/browser/theia/core/status-bar.ts b/arduino-ide-extension/src/browser/theia/core/status-bar.ts deleted file mode 100644 index 3e7782c3b..000000000 --- a/arduino-ide-extension/src/browser/theia/core/status-bar.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { injectable } from '@theia/core/shared/inversify'; -import { StatusBarImpl as TheiaStatusBarImpl } from '@theia/core/lib/browser'; - -@injectable() -export class StatusBarImpl extends TheiaStatusBarImpl { - override async removeElement(id: string): Promise { - await this.ready; - if (this.entries.delete(id)) { - // Unlike Theia, IDE2 updates the status bar only if the element to remove was among the entries. Otherwise, it's a NOOP. - this.update(); - } - } -} diff --git a/arduino-ide-extension/src/browser/theia/core/tab-bar-decorator.ts b/arduino-ide-extension/src/browser/theia/core/tab-bar-decorator.ts index ea1f29eed..0f5728d94 100644 --- a/arduino-ide-extension/src/browser/theia/core/tab-bar-decorator.ts +++ b/arduino-ide-extension/src/browser/theia/core/tab-bar-decorator.ts @@ -1,30 +1,39 @@ -import { inject, injectable, postConstruct } from '@theia/core/shared/inversify'; +import { + inject, + injectable, + postConstruct, +} from '@theia/core/shared/inversify'; import URI from '@theia/core/lib/common/uri'; import { Title, Widget } from '@theia/core/shared/@phosphor/widgets'; -import { ILogger } from '@theia/core/lib/common/logger'; import { EditorWidget } from '@theia/editor/lib/browser'; import { WidgetDecoration } from '@theia/core/lib/browser/widget-decoration'; import { TabBarDecoratorService as TheiaTabBarDecoratorService } from '@theia/core/lib/browser/shell/tab-bar-decorator'; -import { ConfigService } from '../../../common/protocol/config-service'; +import { ConfigServiceClient } from '../../config/config-service-client'; +import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state'; @injectable() export class TabBarDecoratorService extends TheiaTabBarDecoratorService { - @inject(ConfigService) - protected readonly configService: ConfigService; + @inject(ConfigServiceClient) + private readonly configService: ConfigServiceClient; + @inject(FrontendApplicationStateService) + private readonly appStateService: FrontendApplicationStateService; - @inject(ILogger) - protected readonly logger: ILogger; - - protected dataDirUri: URI | undefined; + private dataDirUri: URI | undefined; @postConstruct() protected init(): void { - this.configService - .getConfiguration() - .then(({ dataDirUri }) => (this.dataDirUri = new URI(dataDirUri))) - .catch((err) => - this.logger.error(`Failed to determine the data directory: ${err}`) - ); + const fireDidChange = () => + this.appStateService + .reachedState('ready') + .then(() => this.fireDidChangeDecorations()); + this.dataDirUri = this.configService.tryGetDataDirUri(); + this.configService.onDidChangeDataDirUri((dataDirUri) => { + this.dataDirUri = dataDirUri; + fireDidChange(); + }); + if (this.dataDirUri) { + fireDidChange(); + } } override getDecorations(title: Title): WidgetDecoration.Data[] { diff --git a/arduino-ide-extension/src/browser/theia/core/tab-bar-toolbar.tsx b/arduino-ide-extension/src/browser/theia/core/tab-bar-toolbar.tsx deleted file mode 100644 index 42e086d2b..000000000 --- a/arduino-ide-extension/src/browser/theia/core/tab-bar-toolbar.tsx +++ /dev/null @@ -1,61 +0,0 @@ -import * as React from '@theia/core/shared/react'; -import { injectable } from '@theia/core/shared/inversify'; -import { LabelIcon } from '@theia/core/lib/browser/label-parser'; -import { - TabBarToolbar as TheiaTabBarToolbar, - TabBarToolbarItem, -} from '@theia/core/lib/browser/shell/tab-bar-toolbar'; - -@injectable() -export class TabBarToolbar extends TheiaTabBarToolbar { - /** - * Copied over from Theia. Added an ID to the parent of the toolbar item (`--container`). - * CSS3 does not support parent selectors but we want to style the parent of the toolbar item. - */ - protected override renderItem(item: TabBarToolbarItem): React.ReactNode { - let innerText = ''; - const classNames = []; - if (item.text) { - for (const labelPart of this.labelParser.parse(item.text)) { - if (typeof labelPart !== 'string' && LabelIcon.is(labelPart)) { - const className = `fa fa-${labelPart.name}${ - labelPart.animation ? ' fa-' + labelPart.animation : '' - }`; - classNames.push(...className.split(' ')); - } else { - innerText = labelPart; - } - } - } - const command = this.commands.getCommand(item.command); - const iconClass = - (typeof item.icon === 'function' && item.icon()) || - item.icon || - (command && command.iconClass); - if (iconClass) { - classNames.push(iconClass); - } - const tooltip = item.tooltip || (command && command.label); - return ( -
-
- {innerText} -
-
- ); - } -} diff --git a/arduino-ide-extension/src/browser/theia/core/tab-bars.ts b/arduino-ide-extension/src/browser/theia/core/tab-bars.ts index c6d5adc08..90f650b6d 100644 --- a/arduino-ide-extension/src/browser/theia/core/tab-bars.ts +++ b/arduino-ide-extension/src/browser/theia/core/tab-bars.ts @@ -4,7 +4,7 @@ import { TabBarRenderer as TheiaTabBarRenderer, ToolbarAwareTabBar as TheiaToolbarAwareTabBar, } from '@theia/core/lib/browser/shell/tab-bars'; -import debounce = require('lodash.debounce'); +import debounce from 'lodash.debounce'; export class TabBarRenderer extends TheiaTabBarRenderer { // eslint-disable-next-line @typescript-eslint/no-explicit-any diff --git a/arduino-ide-extension/src/browser/theia/core/theming.ts b/arduino-ide-extension/src/browser/theia/core/theming.ts new file mode 100644 index 000000000..c191cb2d7 --- /dev/null +++ b/arduino-ide-extension/src/browser/theia/core/theming.ts @@ -0,0 +1,198 @@ +import { + BuiltinThemeProvider, + ThemeService, +} from '@theia/core/lib/browser/theming'; +import { nls } from '@theia/core/lib/common/nls'; +import type { Theme, ThemeType } from '@theia/core/lib/common/theme'; +import { assertUnreachable } from '../../../common/utils'; + +export namespace ArduinoThemes { + export const light: Theme = { + id: 'arduino-theme', + type: 'light', + label: 'Light (Arduino)', + editorTheme: 'arduino-theme', + }; + export const dark: Theme = { + id: 'arduino-theme-dark', + type: 'dark', + label: 'Dark (Arduino)', + editorTheme: 'arduino-theme-dark', + }; +} + +const builtInThemeIds = new Set( + [ + ArduinoThemes.light, + ArduinoThemes.dark, + BuiltinThemeProvider.hcLightTheme, + BuiltinThemeProvider.hcTheme, + ].map(({ id }) => id) +); +const deprecatedThemeIds = new Set( + [BuiltinThemeProvider.lightTheme, BuiltinThemeProvider.darkTheme].map( + ({ id }) => id + ) +); + +export const lightThemeLabel = nls.localize('arduino/theme/light', 'Light'); +export const darkThemeLabel = nls.localize('arduino/theme/dark', 'Dark'); +export const hcLightThemeLabel = nls.localize( + 'arduino/theme/hcLight', + 'Light High Contrast' +); +export const hcThemeLabel = nls.localize( + 'arduino/theme/hc', + 'Dark High Contrast' +); +export function userThemeLabel(theme: Theme): string { + return nls.localize('arduino/theme/user', '{0} (user)', theme.label); +} +export function deprecatedThemeLabel(theme: Theme): string { + return nls.localize( + 'arduino/theme/deprecated', + '{0} (deprecated)', + theme.label + ); +} + +export function themeLabelForSettings(theme: Theme): string { + switch (theme.id) { + case ArduinoThemes.light.id: + return lightThemeLabel; + case ArduinoThemes.dark.id: + return darkThemeLabel; + case BuiltinThemeProvider.hcTheme.id: + return hcThemeLabel; + case BuiltinThemeProvider.hcLightTheme.id: + return hcLightThemeLabel; + case BuiltinThemeProvider.lightTheme.id: // fall-through + case BuiltinThemeProvider.darkTheme.id: + return deprecatedThemeLabel(theme); + default: + return userThemeLabel(theme); + } +} + +export function compatibleBuiltInTheme(theme: Theme): Theme { + switch (theme.type) { + case 'light': + return ArduinoThemes.light; + case 'dark': + return ArduinoThemes.dark; + case 'hc': + return BuiltinThemeProvider.hcTheme; + case 'hcLight': + return BuiltinThemeProvider.hcLightTheme; + default: { + console.warn( + `Unhandled theme type: ${theme.type}. Theme ID: ${theme.id}, label: ${theme.label}` + ); + return ArduinoThemes.light; + } + } +} + +// For tests without DI +interface ThemeProvider { + themes(): Theme[]; + currentTheme(): Theme; +} + +/** + * Returns with a list of built-in themes officially supported by IDE2 (https://github.com/arduino/arduino-ide/issues/1283). + * The themes in the array follow the following order: + * - built-in themes first (in `Light`, `Dark`, `Light High Contrast`, and `Dark High Contrast`), + * - followed by user installed (VSIX) themes grouped by theme type, then alphabetical order, + * - if the `currentTheme` is either Light (Theia) or Dark (Theia), the last item of the array will be the selected theme with `(deprecated)` suffix. + */ +export function userConfigurableThemes(service: ThemeService): Theme[][]; +export function userConfigurableThemes(provider: ThemeProvider): Theme[][]; +export function userConfigurableThemes( + serviceOrProvider: ThemeService | ThemeProvider +): Theme[][] { + const provider = + serviceOrProvider instanceof ThemeService + ? { + currentTheme: () => serviceOrProvider.getCurrentTheme(), + themes: () => serviceOrProvider.getThemes(), + } + : serviceOrProvider; + const currentTheme = provider.currentTheme(); + const allThemes = provider + .themes() + .map((theme) => ({ ...theme, arduinoThemeType: arduinoThemeTypeOf(theme) })) + .filter( + (theme) => + theme.arduinoThemeType !== 'deprecated' || currentTheme.id === theme.id + ) + .sort((left, right) => { + const leftArduinoThemeType = left.arduinoThemeType; + const rightArduinoThemeType = right.arduinoThemeType; + if (leftArduinoThemeType === rightArduinoThemeType) { + const result = themeTypeOrder[left.type] - themeTypeOrder[right.type]; + if (result) { + return result; + } + return left.label.localeCompare(right.label); // alphabetical order + } + return ( + arduinoThemeTypeOrder[leftArduinoThemeType] - + arduinoThemeTypeOrder[rightArduinoThemeType] + ); + }); + const builtInThemes: Theme[] = []; + const userThemes: Theme[] = []; + const deprecatedThemes: Theme[] = []; + allThemes.forEach((theme) => { + const { arduinoThemeType } = theme; + switch (arduinoThemeType) { + case 'built-in': + builtInThemes.push(theme); + break; + case 'user': + userThemes.push(theme); + break; + case 'deprecated': + deprecatedThemes.push(theme); + break; + default: + assertUnreachable(arduinoThemeType); + } + }); + const groupedThemes: Theme[][] = []; + if (builtInThemes.length) { + groupedThemes.push(builtInThemes); + } + if (userThemes.length) { + groupedThemes.push(userThemes); + } + if (deprecatedThemes.length) { + groupedThemes.push(deprecatedThemes); + } + return groupedThemes; +} + +export type ArduinoThemeType = 'built-in' | 'user' | 'deprecated'; +const arduinoThemeTypeOrder: Record = { + 'built-in': 0, + user: 1, + deprecated: 2, +}; +const themeTypeOrder: Record = { + light: 0, + dark: 1, + hcLight: 2, + hc: 3, +}; + +export function arduinoThemeTypeOf(theme: Theme | string): ArduinoThemeType { + const themeId = typeof theme === 'string' ? theme : theme.id; + if (builtInThemeIds.has(themeId)) { + return 'built-in'; + } + if (deprecatedThemeIds.has(themeId)) { + return 'deprecated'; + } + return 'user'; +} diff --git a/arduino-ide-extension/src/browser/theia/core/widget-manager.ts b/arduino-ide-extension/src/browser/theia/core/widget-manager.ts index 2e98c2bfc..1ab8a2921 100644 --- a/arduino-ide-extension/src/browser/theia/core/widget-manager.ts +++ b/arduino-ide-extension/src/browser/theia/core/widget-manager.ts @@ -1,4 +1,3 @@ -import type { MaybePromise } from '@theia/core'; import type { Widget } from '@theia/core/lib/browser'; import { WidgetManager as TheiaWidgetManager } from '@theia/core/lib/browser/widget-manager'; import { @@ -8,11 +7,10 @@ import { } from '@theia/core/shared/inversify'; import { EditorWidget } from '@theia/editor/lib/browser'; import { OutputWidget } from '@theia/output/lib/browser/output-widget'; -import deepEqual = require('deep-equal'); import { CurrentSketch, SketchesServiceClientImpl, -} from '../../../common/protocol/sketches-service-client-impl'; +} from '../../sketches-service-client-impl'; @injectable() export class WidgetManager extends TheiaWidgetManager { @@ -72,44 +70,4 @@ export class WidgetManager extends TheiaWidgetManager { title.className += title.className + ` ${uncloseableClass}`; } } - - /** - * Customized to find any existing widget based on `options` deepEquals instead of string equals. - * See https://github.com/eclipse-theia/theia/issues/11309. - */ - protected override doGetWidget( - key: string - ): MaybePromise | undefined { - const pendingWidget = this.findExistingWidget(key); - if (pendingWidget) { - return pendingWidget as MaybePromise; - } - return undefined; - } - - private findExistingWidget( - key: string - ): MaybePromise | undefined { - const parsed = this.parseJson(key); - for (const [candidateKey, widget] of [ - ...this.widgetPromises.entries(), - ...this.pendingWidgetPromises.entries(), - ]) { - const candidate = this.parseJson(candidateKey); - if (deepEqual(candidate, parsed)) { - return widget as MaybePromise; - } - } - return undefined; - } - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - private parseJson(json: string): any { - try { - return JSON.parse(json); - } catch (err) { - console.log(`Failed to parse JSON: <${json}>.`, err); - throw err; - } - } } diff --git a/arduino-ide-extension/src/browser/theia/core/window-service-ext.ts b/arduino-ide-extension/src/browser/theia/core/window-service-ext.ts index f22e55cc4..868cfd5f0 100644 --- a/arduino-ide-extension/src/browser/theia/core/window-service-ext.ts +++ b/arduino-ide-extension/src/browser/theia/core/window-service-ext.ts @@ -1,7 +1,11 @@ +import type { StartupTasks } from '../../../electron-common/startup-task'; + export const WindowServiceExt = Symbol('WindowServiceExt'); export interface WindowServiceExt { /** * Returns with a promise that resolves to `true` if the current window is the first window. */ isFirstWindow(): Promise; + reload(tasks?: StartupTasks): void; + close(): void; } diff --git a/arduino-ide-extension/src/browser/theia/core/window-title-updater.ts b/arduino-ide-extension/src/browser/theia/core/window-title-updater.ts new file mode 100644 index 000000000..0fcd046c5 --- /dev/null +++ b/arduino-ide-extension/src/browser/theia/core/window-title-updater.ts @@ -0,0 +1,148 @@ +import { FrontendApplication } from '@theia/core/lib/browser/frontend-application'; +import { FrontendApplicationConfigProvider } from '@theia/core/lib/browser/frontend-application-config-provider'; +import { NavigatableWidget } from '@theia/core/lib/browser/navigatable-types'; +import { ApplicationShell } from '@theia/core/lib/browser/shell/application-shell'; +import { Widget } from '@theia/core/lib/browser/widgets/widget'; +import { WindowTitleUpdater as TheiaWindowTitleUpdater } from '@theia/core/lib/browser/window/window-title-updater'; +import { ApplicationServer } from '@theia/core/lib/common/application-protocol'; +import { DisposableCollection } from '@theia/core/lib/common/disposable'; +import { nls } from '@theia/core/lib/common/nls'; +import { isOSX } from '@theia/core/lib/common/os'; +import { + inject, + injectable, + postConstruct, +} from '@theia/core/shared/inversify'; +import { EditorManager } from '@theia/editor/lib/browser/editor-manager'; +import { EditorWidget } from '@theia/editor/lib/browser/editor-widget'; +import { WorkspaceService } from '@theia/workspace/lib/browser/workspace-service'; +import { ConfigServiceClient } from '../../config/config-service-client'; +import { CreateFeatures } from '../../create/create-features'; +import { + CurrentSketch, + SketchesServiceClientImpl, +} from '../../sketches-service-client-impl'; + +@injectable() +export class WindowTitleUpdater extends TheiaWindowTitleUpdater { + @inject(ApplicationServer) + private readonly applicationServer: ApplicationServer; + @inject(ApplicationShell) + private readonly applicationShell: ApplicationShell; + @inject(WorkspaceService) + private readonly workspaceService: WorkspaceService; + @inject(SketchesServiceClientImpl) + private readonly sketchesServiceClient: SketchesServiceClientImpl; + @inject(ConfigServiceClient) + private readonly configServiceClient: ConfigServiceClient; + @inject(CreateFeatures) + private readonly createFeatures: CreateFeatures; + @inject(EditorManager) + private readonly editorManager: EditorManager; + + private readonly applicationName = + FrontendApplicationConfigProvider.get().applicationName; + private readonly toDispose = new DisposableCollection(); + + private previousRepresentedFilename: string | undefined; + private applicationVersion: string | undefined; + private hasCloudPrefix: boolean | undefined; + + @postConstruct() + protected init(): void { + setTimeout( + () => + this.applicationServer.getApplicationInfo().then((info) => { + this.applicationVersion = info?.version; + if (this.applicationVersion) { + this.handleWidgetChange(this.applicationShell.currentWidget); + } + }), + 0 + ); + } + + override onStart(app: FrontendApplication): void { + super.onStart(app); + this.toDispose.pushAll([ + this.sketchesServiceClient.onCurrentSketchDidChange(() => + this.maybeSetCloudPrefix() + ), + this.configServiceClient.onDidChangeDataDirUri(() => + this.maybeSetCloudPrefix() + ), + ]); + } + + onStop(): void { + this.toDispose.dispose(); + } + + protected override handleWidgetChange(widget?: Widget | undefined): void { + if (isOSX) { + this.maybeUpdateRepresentedFilename(widget); + } + // Unlike Theia, IDE2 does not want to show in the window title if the current widget is dirty or not. + // Hence, IDE2 does not track widgets but updates the window title on current widget change. + this.updateTitleWidget(widget); + } + + protected override updateTitleWidget(widget?: Widget | undefined): void { + let activeEditorShort = ''; + let rootName = this.workspaceService.workspace?.name ?? ''; + let appName = `${this.applicationName}${ + this.applicationVersion ? ` ${this.applicationVersion}` : '' + }`; + if (rootName) { + appName = ` | ${appName}`; + } + const uri = NavigatableWidget.getUri(widget); + if (uri) { + const base = uri.path.base; + // Do not show the basename of the main sketch file. Only other sketch file names are visible in the title. + if (`${rootName}.ino` !== base) { + activeEditorShort = ` - ${base} `; + } + } + if (this.hasCloudPrefix) { + rootName = `[${nls.localize( + 'arduino/title/cloud', + 'Cloud' + )}] ${rootName}`; + } + this.windowTitleService.update({ rootName, appName, activeEditorShort }); + } + + private maybeUpdateRepresentedFilename(widget?: Widget | undefined): void { + if (widget instanceof EditorWidget) { + const { uri } = widget.editor; + const filename = uri.path.toString(); + if (this.previousRepresentedFilename !== filename) { + window.electronArduino.setRepresentedFilename(uri.path.fsPath()); + this.previousRepresentedFilename = filename; + } + } + } + + private maybeSetCloudPrefix(): void { + if (typeof this.hasCloudPrefix === 'boolean') { + return; + } + const sketch = this.sketchesServiceClient.tryGetCurrentSketch(); + if (!CurrentSketch.isValid(sketch)) { + return; + } + const dataDirUri = this.configServiceClient.tryGetDataDirUri(); + if (!dataDirUri) { + return; + } + this.hasCloudPrefix = this.createFeatures.isCloud(sketch, dataDirUri); + if (typeof this.hasCloudPrefix === 'boolean') { + const editor = + this.editorManager.activeEditor ?? this.editorManager.currentEditor; + if (editor) { + this.updateTitleWidget(editor); + } + } + } +} diff --git a/arduino-ide-extension/src/browser/theia/debug/debug-configuration-manager.ts b/arduino-ide-extension/src/browser/theia/debug/debug-configuration-manager.ts index 0059f433c..6e0210a41 100644 --- a/arduino-ide-extension/src/browser/theia/debug/debug-configuration-manager.ts +++ b/arduino-ide-extension/src/browser/theia/debug/debug-configuration-manager.ts @@ -1,46 +1,44 @@ -import debounce = require('p-debounce'); -import { inject, injectable, postConstruct } from '@theia/core/shared/inversify'; -import URI from '@theia/core/lib/common/uri'; -import { Event, Emitter } from '@theia/core/lib/common/event'; import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state'; -import { DebugConfiguration } from '@theia/debug/lib/common/debug-common'; -import { DebugConfigurationModel as TheiaDebugConfigurationModel } from '@theia/debug/lib/browser/debug-configuration-model'; +import { Disposable } from '@theia/core/lib/common/disposable'; +import { Emitter, Event } from '@theia/core/lib/common/event'; +import URI from '@theia/core/lib/common/uri'; +import { inject, injectable } from '@theia/core/shared/inversify'; import { DebugConfigurationManager as TheiaDebugConfigurationManager } from '@theia/debug/lib/browser/debug-configuration-manager'; +import { DebugConfigurationModel as TheiaDebugConfigurationModel } from '@theia/debug/lib/browser/debug-configuration-model'; +import { DebugConfiguration } from '@theia/debug/lib/common/debug-common'; +import { FileService } from '@theia/filesystem/lib/browser/file-service'; +import { + FileOperationError, + FileOperationResult, +} from '@theia/filesystem/lib/common/files'; +import debounce from 'p-debounce'; import { SketchesService } from '../../../common/protocol'; import { CurrentSketch, SketchesServiceClientImpl, -} from '../../../common/protocol/sketches-service-client-impl'; +} from '../../sketches-service-client-impl'; +import { maybeUpdateReadOnlyState } from '../monaco/monaco-editor-provider'; import { DebugConfigurationModel } from './debug-configuration-model'; -import { - FileOperationError, - FileOperationResult, -} from '@theia/filesystem/lib/common/files'; -import { FileService } from '@theia/filesystem/lib/browser/file-service'; @injectable() export class DebugConfigurationManager extends TheiaDebugConfigurationManager { @inject(SketchesService) - protected readonly sketchesService: SketchesService; - + private readonly sketchesService: SketchesService; @inject(SketchesServiceClientImpl) - protected readonly sketchesServiceClient: SketchesServiceClientImpl; - + private readonly sketchesServiceClient: SketchesServiceClientImpl; @inject(FrontendApplicationStateService) - protected readonly appStateService: FrontendApplicationStateService; - + private readonly appStateService: FrontendApplicationStateService; @inject(FileService) - protected readonly fileService: FileService; + private readonly fileService: FileService; - protected onTempContentDidChangeEmitter = + private onTempContentDidChangeEmitter = new Emitter(); get onTempContentDidChange(): Event { return this.onTempContentDidChangeEmitter.event; } - @postConstruct() - protected override async init(): Promise { - super.init(); + protected override async doInit(): Promise { + this.watchLaunchConfigEditor(); this.appStateService.reachedState('ready').then(async () => { const tempContent = await this.getTempLaunchJsonContent(); if (!tempContent) { @@ -74,6 +72,20 @@ export class DebugConfigurationManager extends TheiaDebugConfigurationManager { }); this.updateModels(); }); + return super.doInit(); + } + + /** + * Sets a listener on current sketch change, and maybe updates the readonly state of the editor showing the debug configuration. aka the `launch.json`. + */ + private watchLaunchConfigEditor(): Disposable { + return this.sketchesServiceClient.onCurrentSketchDidChange(() => { + for (const widget of this.editorManager.all) { + maybeUpdateReadOnlyState(widget, (uri) => + this.sketchesServiceClient.isReadOnly(uri) + ); + } + }); } protected override updateModels = debounce(async () => { @@ -112,7 +124,7 @@ export class DebugConfigurationManager extends TheiaDebugConfigurationManager { this.updateCurrent(); }, 500); - protected async getTempLaunchJsonContent(): Promise< + private async getTempLaunchJsonContent(): Promise< (TheiaDebugConfigurationModel.JsonContent & { uri: URI }) | URI | undefined > { const sketch = await this.sketchesServiceClient.currentSketch(); @@ -126,7 +138,7 @@ export class DebugConfigurationManager extends TheiaDebugConfigurationManager { const uri = tempFolderUri.resolve('launch.json'); const { value } = await this.fileService.read(uri); const configurations = DebugConfigurationModel.parse(JSON.parse(value)); - return { uri, configurations }; + return { uri, configurations, compounds: [] }; } catch (err) { if ( err instanceof FileOperationError && diff --git a/arduino-ide-extension/src/browser/theia/debug/debug-configuration-model.ts b/arduino-ide-extension/src/browser/theia/debug/debug-configuration-model.ts index 225a003c1..4eaadf172 100644 --- a/arduino-ide-extension/src/browser/theia/debug/debug-configuration-model.ts +++ b/arduino-ide-extension/src/browser/theia/debug/debug-configuration-model.ts @@ -29,6 +29,7 @@ export class DebugConfigurationModel extends TheiaDebugConfigurationModel { return { uri: this.configUri, configurations: this.config, + compounds: [], }; } } diff --git a/arduino-ide-extension/src/browser/theia/debug/debug-configuration-widget.tsx b/arduino-ide-extension/src/browser/theia/debug/debug-configuration-widget.tsx new file mode 100644 index 000000000..cabaabf39 --- /dev/null +++ b/arduino-ide-extension/src/browser/theia/debug/debug-configuration-widget.tsx @@ -0,0 +1,76 @@ +import { SelectOption } from '@theia/core/lib/browser/widgets/select-component'; +import { DisposableCollection } from '@theia/core/lib/common/disposable'; +import { nls } from '@theia/core/lib/common/nls'; +import { injectable } from '@theia/core/shared/inversify'; +import React from '@theia/core/shared/react'; +import { DebugAction } from '@theia/debug/lib/browser/view/debug-action'; +import { DebugConfigurationSelect as TheiaDebugConfigurationSelect } from '@theia/debug/lib/browser/view/debug-configuration-select'; +import { DebugConfigurationWidget as TheiaDebugConfigurationWidget } from '@theia/debug/lib/browser/view/debug-configuration-widget'; + +/** + * Patched to programmatically update the debug config { - if (e.target) { - const targetValue = (e.target as HTMLInputElement).value || ''; - let shouldSearch = - Key.ENTER.keyCode === - KeyCode.createKeyCode(e.nativeEvent).key?.keyCode; - const currentOptions = (this.searchInWorkspaceOptions[kind] || []) - .slice() - .map((s) => s.trim()) - .sort(); - const candidateOptions = this.splitOnComma(targetValue) - .map((s) => s.trim()) - .sort(); - const sameAs = (left: string[], right: string[]) => { - if (left.length !== right.length) { - return false; - } - for (let i = 0; i < left.length; i++) { - if (left[i] !== right[i]) { - return false; - } - } - return true; - }; - if (!sameAs(currentOptions, candidateOptions)) { - this.searchInWorkspaceOptions[kind] = - this.splitOnComma(targetValue); - shouldSearch = true; - } - if (shouldSearch) { - this.resultTreeWidget.search( - this.searchTerm, - this.searchInWorkspaceOptions - ); - } - } - }} - onFocus={ - kind === 'include' - ? this.handleFocusIncludesInputBox - : this.handleFocusExcludesInputBox - } - onBlur={ - kind === 'include' - ? this.handleBlurIncludesInputBox - : this.handleBlurExcludesInputBox - } - > -
- ); - } -} diff --git a/arduino-ide-extension/src/browser/theia/terminal/terminal-frontend-contribution.ts b/arduino-ide-extension/src/browser/theia/terminal/terminal-frontend-contribution.ts new file mode 100644 index 000000000..bea94ac6c --- /dev/null +++ b/arduino-ide-extension/src/browser/theia/terminal/terminal-frontend-contribution.ts @@ -0,0 +1,16 @@ +import { TabBarToolbarRegistry } from '@theia/core/lib/browser/shell/tab-bar-toolbar'; +import { injectable } from '@theia/core/shared/inversify'; +import { + TerminalCommands, + TerminalFrontendContribution as TheiaTerminalFrontendContribution, +} from '@theia/terminal/lib/browser/terminal-frontend-contribution'; + +@injectable() +export class TerminalFrontendContribution extends TheiaTerminalFrontendContribution { + override registerToolbarItems(toolbar: TabBarToolbarRegistry): void { + super.registerToolbarItems(toolbar); + // removes the `split-terminal` command from the tabbar toolbar + // https://github.com/dankeboy36/esp-exception-decoder/pull/1#pullrequestreview-1500146673 + toolbar.unregisterItem(TerminalCommands.SPLIT.id); + } +} diff --git a/arduino-ide-extension/src/browser/theia/test/test-view-contribution.ts b/arduino-ide-extension/src/browser/theia/test/test-view-contribution.ts new file mode 100644 index 000000000..d15466f0b --- /dev/null +++ b/arduino-ide-extension/src/browser/theia/test/test-view-contribution.ts @@ -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 { + // NOOP + } +} diff --git a/arduino-ide-extension/src/browser/theia/typehierarchy/type-hierarchy-contribution.ts b/arduino-ide-extension/src/browser/theia/typehierarchy/type-hierarchy-contribution.ts new file mode 100644 index 000000000..5afd1e8cf --- /dev/null +++ b/arduino-ide-extension/src/browser/theia/typehierarchy/type-hierarchy-contribution.ts @@ -0,0 +1,32 @@ +import { KeybindingRegistry } from '@theia/core/lib/browser/keybinding'; +import { CommandRegistry } from '@theia/core/lib/common/command'; +import { MenuModelRegistry } from '@theia/core/lib/common/menu'; +import { injectable } from '@theia/core/shared/inversify'; +import { + TypeHierarchyCommands, + TypeHierarchyContribution as TheiaTypeHierarchyContribution, +} from '@theia/typehierarchy/lib/browser/typehierarchy-contribution'; + +@injectable() +export class TypeHierarchyContribution extends TheiaTypeHierarchyContribution { + protected override init(): void { + // NOOP + } + + override registerCommands(registry: CommandRegistry): void { + super.registerCommands(registry); + registry.unregisterCommand(TypeHierarchyCommands.OPEN_SUBTYPE.id); + registry.unregisterCommand(TypeHierarchyCommands.OPEN_SUPERTYPE.id); + } + + override registerMenus(registry: MenuModelRegistry): void { + super.registerMenus(registry); + registry.unregisterMenuAction(TypeHierarchyCommands.OPEN_SUBTYPE.id); + registry.unregisterMenuAction(TypeHierarchyCommands.OPEN_SUPERTYPE.id); + } + + override registerKeybindings(registry: KeybindingRegistry): void { + super.registerKeybindings(registry); + registry.unregisterKeybinding(TypeHierarchyCommands.OPEN_SUBTYPE.id); + } +} diff --git a/arduino-ide-extension/src/browser/theia/typehierarchy/type-hierarchy-service.ts b/arduino-ide-extension/src/browser/theia/typehierarchy/type-hierarchy-service.ts new file mode 100644 index 000000000..1062eea89 --- /dev/null +++ b/arduino-ide-extension/src/browser/theia/typehierarchy/type-hierarchy-service.ts @@ -0,0 +1,9 @@ +import { injectable } from '@theia/core/shared/inversify'; +import { TypeHierarchyServiceProvider as TheiaTypeHierarchyServiceProvider } from '@theia/typehierarchy/lib/browser/typehierarchy-service'; + +@injectable() +export class TypeHierarchyServiceProvider extends TheiaTypeHierarchyServiceProvider { + override init(): void { + // NOOP + } +} diff --git a/arduino-ide-extension/src/browser/theia/workspace/workspace-commands.ts b/arduino-ide-extension/src/browser/theia/workspace/workspace-commands.ts index 5b864732b..ed960356e 100644 --- a/arduino-ide-extension/src/browser/theia/workspace/workspace-commands.ts +++ b/arduino-ide-extension/src/browser/theia/workspace/workspace-commands.ts @@ -1,35 +1,53 @@ -import { inject, injectable } from '@theia/core/shared/inversify'; -import URI from '@theia/core/lib/common/uri'; import { open } from '@theia/core/lib/browser/opener-service'; -import { FileStat } from '@theia/filesystem/lib/common/files'; +import { ApplicationShell } from '@theia/core/lib/browser/shell/application-shell'; import { CommandRegistry, CommandService, } from '@theia/core/lib/common/command'; +import { nls } from '@theia/core/lib/common/nls'; +import { Path } from '@theia/core/lib/common/path'; +import { waitForEvent } from '@theia/core/lib/common/promise-util'; +import { SelectionService } from '@theia/core/lib/common/selection-service'; +import { MaybeArray } from '@theia/core/lib/common/types'; +import URI from '@theia/core/lib/common/uri'; +import { + UriAwareCommandHandler, + UriCommandHandler, +} from '@theia/core/lib/common/uri-command-handler'; +import { inject, injectable } from '@theia/core/shared/inversify'; +import { EditorWidget } from '@theia/editor/lib/browser/editor-widget'; +import { FileStat } from '@theia/filesystem/lib/common/files'; import { WorkspaceCommandContribution as TheiaWorkspaceCommandContribution, WorkspaceCommands, } from '@theia/workspace/lib/browser/workspace-commands'; -import { Sketch, SketchesService } from '../../../common/protocol'; -import { WorkspaceInputDialog } from './workspace-input-dialog'; +import { Sketch } from '../../../common/protocol'; +import { ConfigServiceClient } from '../../config/config-service-client'; +import { CreateFeatures } from '../../create/create-features'; import { CurrentSketch, SketchesServiceClientImpl, -} from '../../../common/protocol/sketches-service-client-impl'; -import { SaveAsSketch } from '../../contributions/save-as-sketch'; -import { SingleTextInputDialog } from '@theia/core/lib/browser'; -import { nls } from '@theia/core/lib/common'; +} from '../../sketches-service-client-impl'; +import { WorkspaceInputDialog } from './workspace-input-dialog'; + +interface ValidationContext { + sketch: Sketch; + isCloud: boolean | undefined; +} @injectable() export class WorkspaceCommandContribution extends TheiaWorkspaceCommandContribution { - @inject(SketchesServiceClientImpl) - protected readonly sketchesServiceClient: SketchesServiceClientImpl; - @inject(CommandService) - protected readonly commandService: CommandService; - - @inject(SketchesService) - protected readonly sketchService: SketchesService; + private readonly commandService: CommandService; + @inject(SketchesServiceClientImpl) + private readonly sketchesServiceClient: SketchesServiceClientImpl; + @inject(CreateFeatures) + private readonly createFeatures: CreateFeatures; + @inject(ApplicationShell) + private readonly shell: ApplicationShell; + @inject(ConfigServiceClient) + private readonly configServiceClient: ConfigServiceClient; + private _validationContext: ValidationContext | undefined; override registerCommands(registry: CommandRegistry): void { super.registerCommands(registry); @@ -47,9 +65,14 @@ export class WorkspaceCommandContribution extends TheiaWorkspaceCommandContribut execute: (uri) => this.renameFile(uri), }) ); + registry.unregisterCommand(WorkspaceCommands.FILE_DELETE); + registry.registerCommand( + WorkspaceCommands.FILE_DELETE, + this.newMultiUriAwareCommandHandler(this.deleteHandler) + ); } - protected async newFile(uri: URI | undefined): Promise { + private async newFile(uri: URI | undefined): Promise { if (!uri) { return; } @@ -68,51 +91,72 @@ export class WorkspaceCommandContribution extends TheiaWorkspaceCommandContribut this.labelProvider ); - const name = await dialog.open(); - const nameWithExt = this.maybeAppendInoExt(name); - if (nameWithExt) { - const fileUri = parentUri.resolve(nameWithExt); - await this.fileService.createFile(fileUri); - this.fireCreateNewFile({ parent: parentUri, uri: fileUri }); - open(this.openerService, fileUri); + const name = await this.openDialog(dialog, parentUri); + if (!name) { + return; } + const nameWithExt = this.maybeAppendInoExt(name); + const fileUri = parentUri.resolve(nameWithExt); + await this.fileService.createFile(fileUri); + this.fireCreateNewFile({ parent: parentUri, uri: fileUri }); + open(this.openerService, fileUri); } protected override async validateFileName( - name: string, + userInput: string, parent: FileStat, recursive = false ): Promise { - // In the Java IDE the followings are the rules: - // - `name` without an extension should default to `name.ino`. - // - `name` with a single trailing `.` also defaults to `name.ino`. - const nameWithExt = this.maybeAppendInoExt(name); - const errorMessage = await super.validateFileName( - nameWithExt, - parent, - recursive - ); + // If name does not have extension or ends with trailing dot (from IDE 1.x), treat it as an .ino file. + // If has extension, + // - if unsupported extension -> error + // - if has a code file extension -> apply folder name validation without the extension and use the Theia-based validation + // - if has any additional file extension -> use the default Theia-based validation + const fileInput = parseFileInput(userInput); + const { name, extension } = fileInput; + if (!Sketch.Extensions.ALL.includes(extension)) { + return invalidExtension(extension); + } + let errorMessage: string | undefined = undefined; + if (Sketch.Extensions.CODE_FILES.includes(extension)) { + errorMessage = this._validationContext?.isCloud + ? Sketch.validateCloudSketchFolderName(name) + : Sketch.validateSketchFolderName(name); + } if (errorMessage) { - return errorMessage; - } - const extension = nameWithExt.split('.').pop(); - if (!extension) { - return nls.localize( - 'theia/workspace/invalidFilename', - 'Invalid filename.' - ); // XXX: this should not happen as we forcefully append `.ino` if it's not there. - } - if (Sketch.Extensions.ALL.indexOf(`.${extension}`) === -1) { - return nls.localize( - 'theia/workspace/invalidExtension', - '.{0} is not a valid extension', - extension - ); + return this.maybeRemapAlreadyExistsMessage(errorMessage, userInput); } - return ''; + errorMessage = await super.validateFileName(userInput, parent, recursive); // run the default Theia validation with the raw input. + if (errorMessage) { + return this.maybeRemapAlreadyExistsMessage(errorMessage, userInput); + } + // It's a legacy behavior from IDE 1.x. Validate the file as if it were an `.ino` file. + // If user did not write the `.ino` extension or ended the user input with dot, run the default Theia validation with the inferred name. + if (extension === '.ino' && !userInput.endsWith('.ino')) { + userInput = `${name}${extension}`; + errorMessage = await super.validateFileName(userInput, parent, recursive); + } + return this.maybeRemapAlreadyExistsMessage(errorMessage ?? '', userInput); } - protected maybeAppendInoExt(name: string | undefined): string { + // Remaps the Theia-based `A file or folder **$fileName** already exists at this location. Please choose a different name.` to a custom one. + private maybeRemapAlreadyExistsMessage( + errorMessage: string, + userInput: string + ): string { + if ( + errorMessage === + nls.localizeByDefault( + 'A file or folder **{0}** already exists at this location. Please choose a different name.', + this['trimFileName'](userInput) + ) + ) { + return fileAlreadyExists(userInput); + } + return errorMessage; + } + + private maybeAppendInoExt(name: string): string { if (!name) { return ''; } @@ -127,7 +171,7 @@ export class WorkspaceCommandContribution extends TheiaWorkspaceCommandContribut return name; } - protected async renameFile(uri: URI | undefined): Promise { + protected async renameFile(uri: URI | undefined): Promise { if (!uri) { return; } @@ -137,10 +181,7 @@ export class WorkspaceCommandContribution extends TheiaWorkspaceCommandContribut } // file belongs to another sketch, do not allow rename - const parentSketch = await this.sketchService.getSketchFolder( - uri.toString() - ); - if (parentSketch && parentSketch.uri !== sketch.uri) { + if (!Sketch.isInSketch(uri, sketch)) { return; } @@ -150,37 +191,273 @@ export class WorkspaceCommandContribution extends TheiaWorkspaceCommandContribut openAfterMove: true, wipeOriginal: true, }; - await this.commandService.executeCommand( - SaveAsSketch.Commands.SAVE_AS_SKETCH.id, + return await this.commandService.executeCommand( + 'arduino-save-as-sketch', options ); - return; } const parent = await this.getParent(uri); if (!parent) { return; } const initialValue = uri.path.base; - const dialog = new SingleTextInputDialog({ - title: nls.localize('theia/workspace/newFileName', 'New name for file'), - initialValue, - initialSelectionRange: { - start: 0, - end: uri.path.name.length, - }, - validate: (name, mode) => { - if (initialValue === name && mode === 'preview') { - return false; - } - return this.validateFileName(name, parent, false); + const parentUri = parent.resource; + + const dialog = new WorkspaceInputDialog( + { + title: nls.localize('theia/workspace/newFileName', 'New name for file'), + initialValue, + parentUri, + initialSelectionRange: { + start: 0, + end: uri.path.name.length, + }, + validate: (name, mode) => { + if (initialValue === name && mode === 'preview') { + return false; + } + return this.validateFileName(name, parent, false); + }, }, - }); - const newName = await dialog.open(); - const newNameWithExt = this.maybeAppendInoExt(newName); - if (newNameWithExt) { - const oldUri = uri; - const newUri = uri.parent.resolve(newNameWithExt); - this.fileService.move(oldUri, newUri); + this.labelProvider + ); + const name = await this.openDialog(dialog, uri); + if (!name) { + return; + } + const nameWithExt = this.maybeAppendInoExt(name); + const oldUri = uri; + const newUri = uri.parent.resolve(nameWithExt); + return this.fileService.move(oldUri, newUri); + } + + protected override newUriAwareCommandHandler( + handler: UriCommandHandler + ): UriAwareCommandHandler { + return this.createUriAwareCommandHandler(handler); + } + + protected override newMultiUriAwareCommandHandler( + handler: UriCommandHandler + ): UriAwareCommandHandler { + return this.createUriAwareCommandHandler(handler, true); + } + + private createUriAwareCommandHandler>( + delegate: UriCommandHandler, + multi = false + ): UriAwareCommandHandler { + return new UriAwareCommandHandlerWithCurrentEditorFallback( + delegate, + this.selectionService, + this.shell, + this.sketchesServiceClient, + this.configServiceClient, + this.createFeatures, + { multi } + ); + } + + private async openDialog( + dialog: WorkspaceInputDialog, + uri: URI + ): Promise { + try { + let dataDirUri = this.configServiceClient.tryGetDataDirUri(); + if (!dataDirUri) { + dataDirUri = await waitForEvent( + this.configServiceClient.onDidChangeDataDirUri, + 2_000 + ); + } + this.acquireValidationContext(uri, dataDirUri); + const name = await dialog.open(true); + return name; + } finally { + this._validationContext = undefined; + } + } + + private acquireValidationContext( + uri: URI, + dataDirUri: URI | undefined + ): void { + const sketch = this.sketchesServiceClient.tryGetCurrentSketch(); + if ( + CurrentSketch.isValid(sketch) && + new URI(sketch.uri).isEqualOrParent(uri) + ) { + const isCloud = this.createFeatures.isCloud(sketch, dataDirUri); + this._validationContext = { sketch, isCloud }; + } + } +} + +// (non-API) exported for tests +export function fileAlreadyExists(userInput: string): string { + return nls.localize( + 'arduino/workspace/alreadyExists', + "'{0}' already exists.", + userInput + ); +} + +// (non-API) exported for tests +export function invalidExtension(extension: string): string { + return nls.localize( + 'theia/workspace/invalidExtension', + '.{0} is not a valid extension', + extension.charAt(0) === '.' ? extension.slice(1) : extension + ); +} + +interface FileInput { + /** + * The raw text the user enters in the ``. + */ + readonly raw: string; + /** + * This is the name without the extension. If raw is `'lib.cpp'`, then `name` will be `'lib'`. If raw is `'foo'` or `'foo.'` this value is `'foo'`. + */ + readonly name: string; + /** + * With the leading dot. For example `'.ino'` or `'.cpp'`. + */ + readonly extension: string; +} +export function parseFileInput(userInput: string): FileInput { + if (!userInput) { + return { + raw: '', + name: '', + extension: Sketch.Extensions.DEFAULT, + }; + } + const path = new Path(userInput); + let extension = path.ext; + if (extension.trim() === '' || extension.trim() === '.') { + extension = Sketch.Extensions.DEFAULT; + } + return { + raw: userInput, + name: path.name, + extension, + }; +} + +/** + * By default, the Theia-based URI-aware command handler tries to retrieve the URI from the selection service. + * Delete/Rename from the tab-bar toolbar (`...`) is not active if the selection was never inside an editor. + * This implementation falls back to the current current title of the main panel if no URI can be retrieved from the parent classes. + * - https://github.com/arduino/arduino-ide/issues/1847 + * - https://github.com/eclipse-theia/theia/issues/12139 + */ +class UriAwareCommandHandlerWithCurrentEditorFallback< + T extends MaybeArray +> extends UriAwareCommandHandler { + constructor( + delegate: UriCommandHandler, + selectionService: SelectionService, + private readonly shell: ApplicationShell, + private readonly sketchesServiceClient: SketchesServiceClientImpl, + private readonly configServiceClient: ConfigServiceClient, + private readonly createFeatures: CreateFeatures, + options?: UriAwareCommandHandler.Options + ) { + super(selectionService, delegate, options); + } + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + protected override getUri(...args: any[]): T | undefined { + const uri = super.getUri(...args); + if (!uri || (Array.isArray(uri) && !uri.length)) { + const fallbackUri = this.currentTitleOwnerUriFromMainPanel; + if (fallbackUri) { + return (this.isMulti() ? [fallbackUri] : fallbackUri) as T; + } + } + return uri; + } + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + override isEnabled(...args: any[]): boolean { + const [uri, ...others] = this.getArgsWithUri(...args); + if (uri) { + if (!this.isInSketch(uri)) { + return false; + } + if (this.affectsCloudSketchFolderWhenSignedOut(uri)) { + return false; + } + if (this.handler.isEnabled) { + return this.handler.isEnabled(uri, ...others); + } + return true; + } + return false; + } + + // The `currentEditor` is broken after a rename. (https://github.com/eclipse-theia/theia/issues/12139) + // `ApplicationShell#currentWidget` might provide a wrong result just as the `getFocusedCodeEditor` and `getFocusedCodeEditor` of the `MonacoEditorService` + // Try to extract the URI from the current title of the main panel if it's an editor widget. + private get currentTitleOwnerUriFromMainPanel(): URI | undefined { + const owner = this.shell.mainPanel.currentTitle?.owner; + return owner instanceof EditorWidget + ? owner.editor.getResourceUri() + : undefined; + } + + private isInSketch(uri: T | undefined): boolean { + if (!uri) { + return false; + } + const sketch = this.sketchesServiceClient.tryGetCurrentSketch(); + if (!CurrentSketch.isValid(sketch)) { + return false; + } + if (this.isMulti() && Array.isArray(uri)) { + return uri.every((u) => Sketch.isInSketch(u, sketch)); + } + if (!this.isMulti() && uri instanceof URI) { + return Sketch.isInSketch(uri, sketch); + } + return false; + } + + /** + * If the user is not logged in, deleting/renaming the main sketch file or the sketch folder of a cloud sketch is disabled. + */ + private affectsCloudSketchFolderWhenSignedOut(uri: T | undefined): boolean { + return ( + !Boolean(this.createFeatures.session) && + Boolean(this.isCurrentSketchCloud()) && + this.affectsSketchFolder(uri) + ); + } + + private affectsSketchFolder(uri: T | undefined): boolean { + if (!uri) { + return false; + } + const sketch = this.sketchesServiceClient.tryGetCurrentSketch(); + if (!CurrentSketch.isValid(sketch)) { + return false; + } + if (this.isMulti() && Array.isArray(uri)) { + return uri.map((u) => u.toString()).includes(sketch.mainFileUri); + } + if (!this.isMulti()) { + return sketch.mainFileUri === uri.toString(); + } + return false; + } + + private isCurrentSketchCloud(): boolean | undefined { + const sketch = this.sketchesServiceClient.tryGetCurrentSketch(); + if (!CurrentSketch.isValid(sketch)) { + return false; } + const dataDirUri = this.configServiceClient.tryGetDataDirUri(); + return this.createFeatures.isCloud(sketch, dataDirUri); } } diff --git a/arduino-ide-extension/src/browser/theia/workspace/workspace-delete-handler.ts b/arduino-ide-extension/src/browser/theia/workspace/workspace-delete-handler.ts index e3461c379..fe844d252 100644 --- a/arduino-ide-extension/src/browser/theia/workspace/workspace-delete-handler.ts +++ b/arduino-ide-extension/src/browser/theia/workspace/workspace-delete-handler.ts @@ -1,55 +1,36 @@ -import { inject, injectable } from '@theia/core/shared/inversify'; -import * as remote from '@theia/core/electron-shared/@electron/remote'; +import { CommandService } from '@theia/core/lib/common/command'; import URI from '@theia/core/lib/common/uri'; +import { inject, injectable } from '@theia/core/shared/inversify'; import { WorkspaceDeleteHandler as TheiaWorkspaceDeleteHandler } from '@theia/workspace/lib/browser/workspace-delete-handler'; +import { DeleteSketch } from '../../contributions/delete-sketch'; import { CurrentSketch, SketchesServiceClientImpl, -} from '../../../common/protocol/sketches-service-client-impl'; -import { nls } from '@theia/core/lib/common'; +} from '../../sketches-service-client-impl'; @injectable() export class WorkspaceDeleteHandler extends TheiaWorkspaceDeleteHandler { + @inject(CommandService) + private readonly commandService: CommandService; @inject(SketchesServiceClientImpl) - protected readonly sketchesServiceClient: SketchesServiceClientImpl; + private readonly sketchesServiceClient: SketchesServiceClientImpl; override async execute(uris: URI[]): Promise { const sketch = await this.sketchesServiceClient.currentSketch(); if (!CurrentSketch.isValid(sketch)) { return; } - // Deleting the main sketch file. - if ( - uris - .map((uri) => uri.toString()) - .some((uri) => uri === sketch.mainFileUri) - ) { - const { response } = await remote.dialog.showMessageBox({ - title: nls.localize('vscode/fileActions/delete', 'Delete'), - type: 'question', - buttons: [ - nls.localize('vscode/issueMainService/cancel', 'Cancel'), - nls.localize('vscode/issueMainService/ok', 'OK'), - ], - message: nls.localize( - 'theia/workspace/deleteCurrentSketch', - 'Do you want to delete the current sketch?' - ), - }); - if (response === 1) { - // OK - await Promise.all( - [ - ...sketch.additionalFileUris, - ...sketch.otherSketchFileUris, - sketch.mainFileUri, - ].map((uri) => this.closeWithoutSaving(new URI(uri))) - ); - await this.fileService.delete(new URI(sketch.uri)); - window.close(); - } - return; + // Deleting the main sketch file means deleting the sketch folder and all its content. + if (uris.some((uri) => uri.toString() === sketch.mainFileUri)) { + return this.commandService.executeCommand( + DeleteSketch.Commands.DELETE_SKETCH.id, + { + toDelete: sketch, + willNavigateAway: true, + } + ); } + // Individual file deletion(s). return super.execute(uris); } } diff --git a/arduino-ide-extension/src/browser/theia/workspace/workspace-input-dialog.ts b/arduino-ide-extension/src/browser/theia/workspace/workspace-input-dialog.ts index d70d7e27d..8fcabd177 100644 --- a/arduino-ide-extension/src/browser/theia/workspace/workspace-input-dialog.ts +++ b/arduino-ide-extension/src/browser/theia/workspace/workspace-input-dialog.ts @@ -1,44 +1,205 @@ -import { inject } from '@theia/core/shared/inversify'; -import { MaybePromise } from '@theia/core/lib/common/types'; +import { Dialog, DialogError } from '@theia/core/lib/browser/dialogs'; import { LabelProvider } from '@theia/core/lib/browser/label-provider'; -import { DialogError, DialogMode } from '@theia/core/lib/browser/dialogs'; +import { CancellationTokenSource } from '@theia/core/lib/common/cancellation'; +import { + Disposable, + DisposableCollection, +} from '@theia/core/lib/common/disposable'; +import type { + Progress, + ProgressUpdate, +} from '@theia/core/lib/common/message-service-protocol'; +import type { MaybePromise } from '@theia/core/lib/common/types'; +import { UUID } from '@theia/core/shared/@phosphor/coreutils'; +import { Widget } from '@theia/core/shared/@phosphor/widgets'; +import { inject } from '@theia/core/shared/inversify'; import { WorkspaceInputDialog as TheiaWorkspaceInputDialog, WorkspaceInputDialogProps, } from '@theia/workspace/lib/browser/workspace-input-dialog'; -import { nls } from '@theia/core/lib/common'; export class WorkspaceInputDialog extends TheiaWorkspaceInputDialog { - protected wasTouched = false; + private skipShowErrorMessageOnOpen: boolean; constructor( @inject(WorkspaceInputDialogProps) protected override readonly props: WorkspaceInputDialogProps, - @inject(LabelProvider) protected override readonly labelProvider: LabelProvider + @inject(LabelProvider) + protected override readonly labelProvider: LabelProvider ) { super(props, labelProvider); - this.appendCloseButton( - nls.localize('vscode/issueMainService/cancel', 'Cancel') - ); + if (this.contentNode.contains(this.errorMessageNode)) { + // Reverts https://github.com/eclipse-theia/theia/pull/12585/files#diff-068570364d86f936ca72dfc52f8bfa93f14f6d971e2e6fa19216f33cb322244bR533-R534 + this.contentNode.removeChild(this.errorMessageNode); + this.controlPanel.prepend(this.errorMessageNode); + } + this.node.classList.add('workspace-input-dialog'); + this.appendCloseButton(Dialog.CANCEL); } protected override appendParentPath(): void { // NOOP } - override isValid(value: string, mode: DialogMode): MaybePromise { - if (value !== '') { - this.wasTouched = true; - } - return super.isValid(value, mode); + override isValid(value: string): MaybePromise { + return super.isValid(value, 'open'); + } + + override open( + skipShowErrorMessageOnOpen = false + ): Promise { + this.skipShowErrorMessageOnOpen = skipShowErrorMessageOnOpen; + return super.open(); } protected override setErrorMessage(error: DialogError): void { if (this.acceptButton) { this.acceptButton.disabled = !DialogError.getResult(error); } - if (this.wasTouched) { + if (this.skipShowErrorMessageOnOpen) { + this.skipShowErrorMessageOnOpen = false; + } else { this.errorMessageNode.innerText = DialogError.getMessage(error); } } + + protected override appendCloseButton(text: string): HTMLButtonElement { + this.closeButton = this.createButton(text); + this.controlPanel.insertBefore( + this.closeButton, + this.controlPanel.lastChild + ); + this.closeButton.classList.add('secondary'); + return this.closeButton; + } +} + +interface TaskFactory { + createTask(value: string): (progress: Progress) => Promise; +} + +export class TaskFactoryImpl implements TaskFactory { + private _value: string | undefined; + + constructor(private readonly task: TaskFactory['createTask']) {} + + get value(): string | undefined { + return this._value; + } + + createTask(value: string): (progress: Progress) => Promise { + this._value = value; + return this.task(this._value); + } +} + +/** + * Workspace input dialog executing a long running operation with indefinite progress. + */ +export class WorkspaceInputDialogWithProgress< + T = unknown +> extends WorkspaceInputDialog { + private _taskResult: T | undefined; + + constructor( + protected override readonly props: WorkspaceInputDialogProps, + protected override readonly labelProvider: LabelProvider, + /** + * The created task will provide the result. See `#taskResult`. + */ + private readonly taskFactory: TaskFactory + ) { + super(props, labelProvider); + } + + get taskResult(): T | undefined { + return this._taskResult; + } + + protected override async accept(): Promise { + if (!this.resolve) { + return; + } + this.acceptCancellationSource.cancel(); + this.acceptCancellationSource = new CancellationTokenSource(); + const token = this.acceptCancellationSource.token; + const value = this.value; + const error = await this.isValid(value); + if (token.isCancellationRequested) { + return; + } + if (!DialogError.getResult(error)) { + this.setErrorMessage(error); + } else { + const spinner = document.createElement('div'); + spinner.classList.add('spinner'); + const disposables = new DisposableCollection(); + try { + this.toggleButtons(true); + disposables.push(Disposable.create(() => this.toggleButtons(false))); + + const closeParent = this.closeCrossNode.parentNode; + closeParent?.removeChild(this.closeCrossNode); + disposables.push( + Disposable.create(() => { + closeParent?.appendChild(this.closeCrossNode); + }) + ); + + this.errorMessageNode.classList.add('progress'); + disposables.push( + Disposable.create(() => + this.errorMessageNode.classList.remove('progress') + ) + ); + + const errorParent = this.errorMessageNode.parentNode; + errorParent?.insertBefore(spinner, this.errorMessageNode); + disposables.push( + Disposable.create(() => errorParent?.removeChild(spinner)) + ); + + const cancellationSource = new CancellationTokenSource(); + const progress: Progress = { + id: UUID.uuid4(), + cancel: () => cancellationSource.cancel(), + report: (update: ProgressUpdate) => { + this.setProgressMessage(update); + }, + result: Promise.resolve(value), + }; + const task = this.taskFactory.createTask(value); + this._taskResult = await task(progress); + this.resolve(value); + } catch (err) { + if (this.reject) { + this.reject(err); + } else { + throw err; + } + } finally { + Widget.detach(this); + disposables.dispose(); + } + } + } + + private toggleButtons(disabled: boolean): void { + if (this.acceptButton) { + this.acceptButton.disabled = disabled; + } + if (this.closeButton) { + this.closeButton.disabled = disabled; + } + } + + private setProgressMessage(update: ProgressUpdate): void { + if (update.work && update.work.done === update.work.total) { + this.errorMessageNode.innerText = ''; + } else { + if (update.message) { + this.errorMessageNode.innerText = update.message; + } + } + } } diff --git a/arduino-ide-extension/src/browser/theia/workspace/workspace-service.ts b/arduino-ide-extension/src/browser/theia/workspace/workspace-service.ts index 38f15c9d1..f039d5816 100644 --- a/arduino-ide-extension/src/browser/theia/workspace/workspace-service.ts +++ b/arduino-ide-extension/src/browser/theia/workspace/workspace-service.ts @@ -1,67 +1,40 @@ -import * as remote from '@theia/core/electron-shared/@electron/remote'; -import { injectable, inject } from '@theia/core/shared/inversify'; +import { ContributionProvider } from '@theia/core/lib/common/contribution-provider'; import URI from '@theia/core/lib/common/uri'; -import { EditorWidget } from '@theia/editor/lib/browser'; -import { LabelProvider } from '@theia/core/lib/browser/label-provider'; -import { MessageService } from '@theia/core/lib/common/message-service'; -import { ApplicationServer } from '@theia/core/lib/common/application-protocol'; -import { FrontendApplication } from '@theia/core/lib/browser/frontend-application'; -import { FocusTracker, Widget } from '@theia/core/lib/browser'; -import { DEFAULT_WINDOW_HASH } from '@theia/core/lib/common/window'; -import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state'; +import { + DEFAULT_WINDOW_HASH, + NewWindowOptions, +} from '@theia/core/lib/common/window'; +import { inject, injectable, named } from '@theia/core/shared/inversify'; +import { FileStat } from '@theia/filesystem/lib/common/files'; import { WorkspaceInput, WorkspaceService as TheiaWorkspaceService, } from '@theia/workspace/lib/browser/workspace-service'; -import { ConfigService } from '../../../common/protocol/config-service'; import { + SketchesError, SketchesService, - Sketch, } from '../../../common/protocol/sketches-service'; -import { BoardsServiceProvider } from '../../boards/boards-service-provider'; -import { BoardsConfig } from '../../boards/boards-config'; -import { FileStat } from '@theia/filesystem/lib/common/files'; import { + StartupTaskProvider, + hasStartupTasks, StartupTask, - StartupTasks, -} from '../../widgets/sketchbook/startup-task'; -import { setURL } from '../../utils/window'; +} from '../../../electron-common/startup-task'; +import { WindowServiceExt } from '../core/window-service-ext'; @injectable() export class WorkspaceService extends TheiaWorkspaceService { @inject(SketchesService) - protected readonly sketchService: SketchesService; - - @inject(ConfigService) - protected readonly configService: ConfigService; - - @inject(LabelProvider) - protected override readonly labelProvider: LabelProvider; + private readonly sketchesService: SketchesService; + @inject(WindowServiceExt) + private readonly windowServiceExt: WindowServiceExt; + @inject(ContributionProvider) + @named(StartupTaskProvider) + private readonly providers: ContributionProvider; - @inject(MessageService) - protected override readonly messageService: MessageService; + private _workspaceError: Error | undefined; - @inject(ApplicationServer) - protected readonly applicationServer: ApplicationServer; - - @inject(FrontendApplicationStateService) - protected readonly appStateService: FrontendApplicationStateService; - - @inject(BoardsServiceProvider) - protected readonly boardsServiceProvider: BoardsServiceProvider; - - private version?: string; - - async onStart(application: FrontendApplication): Promise { - const info = await this.applicationServer.getApplicationInfo(); - this.version = info?.version; - application.shell.onDidChangeCurrentWidget( - this.onCurrentWidgetChange.bind(this) - ); - const newValue = application.shell.currentWidget - ? application.shell.currentWidget - : null; - this.onCurrentWidgetChange({ newValue, oldValue: null }); + get workspaceError(): Error | undefined { + return this._workspaceError; } protected override async toFileStat( @@ -69,9 +42,34 @@ export class WorkspaceService extends TheiaWorkspaceService { ): Promise { const stat = await super.toFileStat(uri); if (!stat) { - const newSketchUri = await this.sketchService.createNewSketch(); + const newSketchUri = await this.sketchesService.createNewSketch(); return this.toFileStat(newSketchUri.uri); } + // When opening a file instead of a directory, IDE2 (and Theia) expects a workspace JSON file. + // Nothing will work if the workspace file is invalid. Users tend to start (see #964) IDE2 from the `.ino` files, + // so here, IDE2 tries to load the sketch via the CLI from the main sketch file URI. + // If loading the sketch is OK, IDE2 starts and uses the sketch folder as the workspace root instead of the sketch file. + // If loading fails due to invalid name error, IDE2 loads a temp sketch and preserves the startup error, and offers the sketch move to the user later. + // If loading the sketch fails, create a fallback sketch and open the new temp sketch folder as the workspace root. + if (stat.isFile && stat.resource.path.ext === '.ino') { + try { + const sketch = await this.sketchesService.loadSketch( + stat.resource.toString() + ); + return this.toFileStat(sketch.uri); + } catch (err) { + if (SketchesError.InvalidName.is(err)) { + this._workspaceError = err; + const newSketchUri = await this.sketchesService.createNewSketch(); + return this.toFileStat(newSketchUri.uri); + } else if (SketchesError.NotFound.is(err)) { + this._workspaceError = err; + const newSketchUri = await this.sketchesService.createNewSketch(); + return this.toFileStat(newSketchUri.uri); + } + throw err; + } + } return stat; } @@ -103,112 +101,37 @@ export class WorkspaceService extends TheiaWorkspaceService { } } - /** - * Copied from Theia as-is to be able to pass the original `options` down. - */ - protected override async doOpen( - uri: URI, - options?: WorkspaceInput - ): Promise { - const stat = await this.toFileStat(uri); - if (stat) { - if (!stat.isDirectory && !this.isWorkspaceFile(stat)) { - const message = `Not a valid workspace: ${uri.path.toString()}`; - this.messageService.error(message); - throw new Error(message); - } - // The same window has to be preserved too (instead of opening a new one), if the workspace root is not yet available and we are setting it for the first time. - // Option passed as parameter has the highest priority (for api developers), then the preference, then the default. - await this.roots; - const { preserveWindow } = { - preserveWindow: - this.preferences['workspace.preserveWindow'] || !this.opened, - ...options, - }; - await this.server.setMostRecentlyUsedWorkspace(uri.toString()); - if (preserveWindow) { - this._workspace = stat; - } - this.openWindow(stat, Object.assign(options ?? {}, { preserveWindow })); // Unlike Theia, IDE2 passes the whole `input` downstream and not only { preserveWindow } - return; - } - throw new Error( - 'Invalid workspace root URI. Expected an existing directory or workspace file.' - ); - } - - /** - * Copied from Theia. Can pass the `options` further down the chain. - */ - protected override openWindow(uri: FileStat, options?: WorkspaceInput): void { - const workspacePath = uri.resource.path.toString(); - if (this.shouldPreserveWindow(options)) { - this.reloadWindow(options); // Unlike Theia, IDE2 passes the `input` downstream. - } else { - try { - this.openNewWindow(workspacePath, options); // Unlike Theia, IDE2 passes the `input` downstream. - } catch (error) { - // Fall back to reloading the current window in case the browser has blocked the new window - this._workspace = uri; - this.logger.error(error.toString()).then(() => this.reloadWindow()); - } - } - } - protected override reloadWindow(options?: WorkspaceInput): void { - if (StartupTasks.WorkspaceInput.is(options)) { - setURL(StartupTask.append(options.tasks, new URL(window.location.href))); - } - super.reloadWindow(); + const tasks = this.tasks(options); + this.setURLFragment(this._workspace?.resource.path.toString() || ''); + this.windowServiceExt.reload({ tasks }); } protected override openNewWindow( workspacePath: string, options?: WorkspaceInput ): void { - const { boardsConfig } = this.boardsServiceProvider; - let url = BoardsConfig.Config.setConfig( - boardsConfig, - new URL(window.location.href) - ); // Set the current boards config for the new browser window. - url.hash = workspacePath; - if (StartupTasks.WorkspaceInput.is(options)) { - url = StartupTask.append(options.tasks, url); - } - - this.windowService.openNewWindow(url.toString()); - } - - protected onCurrentWidgetChange({ - newValue, - }: FocusTracker.IChangedArgs): void { - if (newValue instanceof EditorWidget) { - const { uri } = newValue.editor; - const currentWindow = remote.getCurrentWindow(); - currentWindow.setRepresentedFilename(uri.path.toString()); - if (Sketch.isSketchFile(uri.toString())) { - this.updateTitle(); - } else { - const title = this.workspaceTitle; - const fileName = this.labelProvider.getName(uri); - document.title = this.formatTitle( - title ? `${title} - ${fileName}` : fileName - ); - } - } else { - this.updateTitle(); - } + const tasks = this.tasks(options); + const url = new URL(window.location.href); + url.hash = encodeURI(workspacePath); + this.windowService.openNewWindow( + url.toString(), + Object.assign({} as NewWindowOptions, { tasks }) + ); } - protected override formatTitle(title?: string): string { - const version = this.version ? ` ${this.version}` : ''; - const name = `${this.applicationName} ${version}`; - return title ? `${title} | ${name}` : name; + protected override updateTitle(): void { + // NOOP. IDE2 handles the `window.title` updates solely via the customized `WindowTitleUpdater`. } - protected get workspaceTitle(): string | undefined { - if (this.workspace) { - return this.labelProvider.getName(this.workspace.resource); + private tasks(options?: WorkspaceInput): StartupTask[] { + const tasks = this.providers + .getContributions() + .map((contribution) => contribution.tasks()) + .reduce((prev, curr) => prev.concat(curr), []); + if (hasStartupTasks(options)) { + tasks.push(...options.tasks); } + return tasks; } } diff --git a/arduino-ide-extension/src/browser/theia/workspace/workspace-variable-contribution.ts b/arduino-ide-extension/src/browser/theia/workspace/workspace-variable-contribution.ts index 2f9c88800..c14027791 100644 --- a/arduino-ide-extension/src/browser/theia/workspace/workspace-variable-contribution.ts +++ b/arduino-ide-extension/src/browser/theia/workspace/workspace-variable-contribution.ts @@ -9,7 +9,7 @@ import { Sketch } from '../../../common/protocol'; import { CurrentSketch, SketchesServiceClientImpl, -} from '../../../common/protocol/sketches-service-client-impl'; +} from '../../sketches-service-client-impl'; import { DisposableCollection } from '@theia/core/lib/common/disposable'; @injectable() diff --git a/arduino-ide-extension/src/browser/toolbar/arduino-toolbar.tsx b/arduino-ide-extension/src/browser/toolbar/arduino-toolbar.tsx index c1a656206..4458b8fc6 100644 --- a/arduino-ide-extension/src/browser/toolbar/arduino-toolbar.tsx +++ b/arduino-ide-extension/src/browser/toolbar/arduino-toolbar.tsx @@ -1,9 +1,10 @@ -import * as React from '@theia/core/shared/react'; +import React from '@theia/core/shared/react'; import { TabBarToolbar, TabBarToolbarRegistry, TabBarToolbarItem, ReactTabBarToolbarItem, + RenderedToolbarItem, } from '@theia/core/lib/browser/shell/tab-bar-toolbar'; import { CommandRegistry } from '@theia/core/lib/common/command'; import { ReactWidget } from '@theia/core/lib/browser'; @@ -14,7 +15,7 @@ export const ARDUINO_TOOLBAR_ITEM_CLASS = 'arduino-tool-item'; export namespace ArduinoToolbarComponent { export interface Props { side: 'left' | 'right'; - items: (TabBarToolbarItem | ReactTabBarToolbarItem)[]; + items: TabBarToolbarItem[]; commands: CommandRegistry; labelParser: LabelParser; commandIsEnabled: (id: string) => boolean; @@ -34,7 +35,7 @@ export class ArduinoToolbarComponent extends React.Component< this.state = { tooltip: '' }; } - protected renderItem = (item: TabBarToolbarItem) => { + protected renderItem = (item: RenderedToolbarItem) => { let innerText = ''; let className = `arduino-tool-icon ${item.id}-icon`; 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} ${ TabBarToolbar.Styles.TAB_BAR_TOOLBAR_ITEM } ${command && this.props.commandIsEnabled(command.id) ? 'enabled' : ''} ${ @@ -80,7 +82,9 @@ export class ArduinoToolbarComponent extends React.Component< const items = [ {[...this.props.items].map((item) => - TabBarToolbarItem.is(item) ? this.renderItem(item) : item.render() + ReactTabBarToolbarItem.is(item) + ? item.render() + : this.renderItem(item) )} , ]; @@ -94,10 +98,7 @@ export class ArduinoToolbarComponent extends React.Component< } export class ArduinoToolbar extends ReactWidget { - protected items = new Map< - string, - TabBarToolbarItem | ReactTabBarToolbarItem - >(); + protected items = new Map(); constructor( protected readonly tabBarToolbarRegistry: TabBarToolbarRegistry, @@ -112,9 +113,7 @@ export class ArduinoToolbar extends ReactWidget { this.tabBarToolbarRegistry.onDidChange(() => this.updateToolbar()); } - protected updateItems( - items: Array - ): void { + protected updateItems(items: Array): void { this.items.clear(); const revItems = items .sort(TabBarToolbarItem.PRIORITY_COMPARATOR) @@ -163,7 +162,7 @@ export class ArduinoToolbar extends ReactWidget { protected executeCommand = (e: React.MouseEvent) => { const item = this.items.get(e.currentTarget.id); - if (TabBarToolbarItem.is(item)) { + if (item && item.command) { this.commands.executeCommand(item.command, this, e.target); } }; diff --git a/arduino-ide-extension/src/browser/utils/constants.ts b/arduino-ide-extension/src/browser/utils/constants.ts index f4bf28e31..570929d35 100644 --- a/arduino-ide-extension/src/browser/utils/constants.ts +++ b/arduino-ide-extension/src/browser/utils/constants.ts @@ -1,2 +1,2 @@ export const REMOTE_SKETCHBOOK_FOLDER = 'RemoteSketchbook'; -export const ARDUINO_CLOUD_FOLDER = 'ArduinoCloud'; \ No newline at end of file +export const ARDUINO_CLOUD_FOLDER = 'ArduinoCloud'; diff --git a/arduino-ide-extension/src/browser/utils/dom.ts b/arduino-ide-extension/src/browser/utils/dom.ts new file mode 100644 index 000000000..47cc830e6 --- /dev/null +++ b/arduino-ide-extension/src/browser/utils/dom.ts @@ -0,0 +1,69 @@ +import { notEmpty } from '@theia/core/lib/common/objects'; + +/** + * Finds the closest child HTMLButtonElement representing a Theia button. + * A button is a Theia button if it's a `
@@ -83,7 +85,10 @@ export class CloudSketchbookTreeWidget extends SketchbookTreeWidget { return CompositeTreeNode.is(node) && node.children.length === 0; } - protected override createNodeClassNames(node: any, props: NodeProps): string[] { + protected override createNodeClassNames( + node: any, + props: NodeProps + ): string[] { const classNames = super.createNodeClassNames(node, props); if ( @@ -97,10 +102,33 @@ export class CloudSketchbookTreeWidget extends SketchbookTreeWidget { return classNames; } + protected override renderIcon( + node: TreeNode, + props: NodeProps + ): React.ReactNode { + if (CloudSketchbookTree.CloudSketchDirNode.is(node)) { + const synced = CloudSketchbookTree.CloudSketchTreeNode.isSynced(node); + const offline = this.connectionStatus.offlineStatus === 'internet'; + const icon = `fa fa-arduino-cloud${synced ? '-filled' : ''}${ + offline ? '-offline' : '' + }`; + return ( +
+
+
+ ); + } + return super.renderIcon(node, props); + } + protected override renderInlineCommands(node: any): React.ReactNode { if (CloudSketchbookTree.CloudSketchDirNode.is(node) && node.commands) { return Array.from(new Set(node.commands)).map((command) => - this.renderInlineCommand(command.id, node, { + this.renderInlineCommand(command, node, { username: this.authenticationService.session?.account?.label, }) ); diff --git a/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-tree.ts b/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-tree.ts index 7204df632..9a5571da2 100644 --- a/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-tree.ts +++ b/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-tree.ts @@ -1,8 +1,6 @@ -import { SketchCache } from './cloud-sketch-cache'; import { inject, injectable } from '@theia/core/shared/inversify'; import URI from '@theia/core/lib/common/uri'; import { MaybePromise } from '@theia/core/lib/common/types'; -import { FileService } from '@theia/filesystem/lib/browser/file-service'; import { FileStatNode } from '@theia/filesystem/lib/browser/file-tree'; import { Command } from '@theia/core/lib/common/command'; import { WidgetDecoration } from '@theia/core/lib/browser/widget-decoration'; @@ -24,17 +22,22 @@ import { LocalCacheFsProvider, LocalCacheUri, } from '../../local-cache/local-cache-fs-provider'; -import { CloudSketchbookCommands } from './cloud-sketchbook-contributions'; +import { CloudSketchbookCommands } from './cloud-sketchbook-commands'; import { DoNotAskAgainConfirmDialog } from '../../dialogs/do-not-ask-again-dialog'; import { SketchbookTree } from '../sketchbook/sketchbook-tree'; -import { firstToUpperCase } from '../../../common/utils'; -import { ArduinoPreferences } from '../../arduino-preferences'; -import { SketchesServiceClientImpl } from '../../../common/protocol/sketches-service-client-impl'; +import { assertUnreachable } from '../../../common/utils'; import { FileStat } from '@theia/filesystem/lib/common/files'; import { WorkspaceNode } from '@theia/navigator/lib/browser/navigator-tree'; import { posix, splitSketchPath } from '../../create/create-paths'; import { Create } from '../../create/typings'; import { nls } from '@theia/core/lib/common'; +import { ApplicationConnectionStatusContribution } from '../../theia/core/connection-status-service'; +import { ExecuteWithProgress } from '../../../common/protocol/progressible'; +import { + pullingSketch, + pushingSketch, +} from '../../contributions/cloud-contribution'; +import { CloudSketchState, CreateFeatures } from '../../create/create-features'; const MESSAGE_TIMEOUT = 5 * 1000; const deepmerge = require('deepmerge').default; @@ -46,29 +49,30 @@ type FilesToSync = { }; @injectable() export class CloudSketchbookTree extends SketchbookTree { - @inject(FileService) - protected override readonly fileService: FileService; - @inject(LocalCacheFsProvider) - protected readonly localCacheFsProvider: LocalCacheFsProvider; - - @inject(SketchCache) - protected readonly sketchCache: SketchCache; - - @inject(ArduinoPreferences) - protected override readonly arduinoPreferences: ArduinoPreferences; + private readonly localCacheFsProvider: LocalCacheFsProvider; @inject(PreferenceService) - protected readonly preferenceService: PreferenceService; + private readonly preferenceService: PreferenceService; @inject(MessageService) - protected readonly messageService: MessageService; - - @inject(SketchesServiceClientImpl) - protected readonly sketchServiceClient: SketchesServiceClientImpl; + private readonly messageService: MessageService; @inject(CreateApi) - protected readonly createApi: CreateApi; + private readonly createApi: CreateApi; + + @inject(ApplicationConnectionStatusContribution) + private readonly connectionStatus: ApplicationConnectionStatusContribution; + + @inject(CreateFeatures) + private readonly createFeatures: CreateFeatures; + + protected override init(): void { + this.toDispose.push( + this.connectionStatus.onOfflineStatusDidChange(() => this.refresh()) + ); + super.init(); + } async pushPublicWarn( node: CloudSketchbookTree.CloudSketchDirNode @@ -93,16 +97,14 @@ export class CloudSketchbookTree extends SketchbookTree { PreferenceScope.User ), }).open(); - if (!ok) { - return false; - } - return true; + return Boolean(ok); } else { return true; } } - async pull(arg: any): Promise { + // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types, @typescript-eslint/no-explicit-any + async pull(arg: any, noProgress = false): Promise { const { // model, node, @@ -136,32 +138,45 @@ export class CloudSketchbookTree extends SketchbookTree { return; } } - this.runWithState(node, 'pulling', async (node) => { - const commandsCopy = node.commands; - node.commands = []; + return this.runWithState( + node, + 'pull', + async (node) => { + await this.pullNode(node); + }, + noProgress + ); + } - const localUri = await this.fileService.toUnderlyingResource( - LocalCacheUri.root.resolve(node.remoteUri.path) - ); - await this.sync(node.remoteUri, localUri); + private async pullNode(node: CloudSketchbookTree.CloudSketchDirNode) { + const commandsCopy = node.commands; + node.commands = []; - this.sketchCache.purgeByPath(node.remoteUri.path.toString()); + const localUri = await this.fileService.toUnderlyingResource( + LocalCacheUri.root.resolve(node.remoteUri.path) + ); + await this.sync(node.remoteUri, localUri); - node.commands = commandsCopy; - this.messageService.info( - nls.localize( - 'arduino/cloud/donePulling', - 'Done pulling ‘{0}’.', - node.fileStat.name - ), - { - timeout: MESSAGE_TIMEOUT, - } - ); - }); + this.createApi.sketchCache.purgeByPath(node.remoteUri.path.toString()); + + node.commands = commandsCopy; + this.messageService.info( + nls.localize( + 'arduino/cloud/donePulling', + "Done pulling '{0}'.", + node.fileStat.name + ), + { + timeout: MESSAGE_TIMEOUT, + } + ); } - async push(node: CloudSketchbookTree.CloudSketchDirNode): Promise { + async push( + node: CloudSketchbookTree.CloudSketchDirNode, + noProgress = false, + ignorePushWarnings = false + ): Promise { if (!CloudSketchbookTree.CloudSketchTreeNode.isSynced(node)) { throw new Error( nls.localize( @@ -176,7 +191,8 @@ export class CloudSketchbookTree extends SketchbookTree { return; } - const warn = this.arduinoPreferences['arduino.cloud.push.warn']; + const warn = + !ignorePushWarnings && this.arduinoPreferences['arduino.cloud.push.warn']; if (warn) { const ok = await new DoNotAskAgainConfirmDialog({ @@ -196,40 +212,49 @@ export class CloudSketchbookTree extends SketchbookTree { return; } } - this.runWithState(node, 'pushing', async (node) => { - if (!CloudSketchbookTree.CloudSketchTreeNode.isSynced(node)) { - throw new Error( - nls.localize( - 'arduino/cloud/pullFirst', - 'You have to pull first to be able to push to the Cloud.' - ) - ); - } - const commandsCopy = node.commands; - node.commands = []; + return this.runWithState( + node, + 'push', + async (node) => { + await this.pushNode(node); + }, + noProgress + ); + } - const localUri = await this.fileService.toUnderlyingResource( - LocalCacheUri.root.resolve(node.remoteUri.path) + private async pushNode(node: CloudSketchbookTree.CloudSketchDirNode) { + if (!CloudSketchbookTree.CloudSketchTreeNode.isSynced(node)) { + throw new Error( + nls.localize( + 'arduino/cloud/pullFirst', + 'You have to pull first to be able to push to the Cloud.' + ) ); - await this.sync(localUri, node.remoteUri); + } + const commandsCopy = node.commands; + node.commands = []; - this.sketchCache.purgeByPath(node.remoteUri.path.toString()); + const localUri = await this.fileService.toUnderlyingResource( + LocalCacheUri.root.resolve(node.remoteUri.path) + ); + await this.sync(localUri, node.remoteUri); - node.commands = commandsCopy; - this.messageService.info( - nls.localize( - 'arduino/cloud/donePushing', - 'Done pushing ‘{0}’.', - node.fileStat.name - ), - { - timeout: MESSAGE_TIMEOUT, - } - ); - }); + this.createApi.sketchCache.purgeByPath(node.remoteUri.path.toString()); + + node.commands = commandsCopy; + this.messageService.info( + nls.localize( + 'arduino/cloud/donePushing', + "Done pushing '{0}'.", + node.fileStat.name + ), + { + timeout: MESSAGE_TIMEOUT, + } + ); } - async recursiveURIs(uri: URI): Promise { + private async recursiveURIs(uri: URI): Promise { // remote resources can be fetched one-shot via api if (CreateUri.is(uri)) { const resources = await this.createApi.readDirectory( @@ -269,7 +294,7 @@ export class CloudSketchbookTree extends SketchbookTree { return prev; } - // do not map "do_not_sync" files/directoris and their descendants + // do not map "do_not_sync" files/directories and their descendants const segments = path[1].split(posix.sep) || []; if ( segments.some((segment) => Create.do_not_sync_files.includes(segment)) @@ -286,7 +311,7 @@ export class CloudSketchbookTree extends SketchbookTree { }, {}); } - async getUrisMap(uri: URI) { + private async getUrisMap(uri: URI): Promise> { const basepath = uri.toString(); const exists = await this.fileService.exists(uri); const uris = @@ -294,7 +319,7 @@ export class CloudSketchbookTree extends SketchbookTree { return uris; } - async treeDiff(source: URI, dest: URI): Promise { + private async treeDiff(source: URI, dest: URI): Promise { const [sourceURIs, destURIs] = await Promise.all([ this.getUrisMap(source), this.getUrisMap(dest), @@ -328,35 +353,41 @@ export class CloudSketchbookTree extends SketchbookTree { private async runWithState( node: CloudSketchbookTree.CloudSketchDirNode & Partial, - state: CloudSketchbookTree.CloudSketchDirNode.State, - task: (node: CloudSketchbookTree.CloudSketchDirNode) => MaybePromise + state: CloudSketchState, + task: (node: CloudSketchbookTree.CloudSketchDirNode) => MaybePromise, + noProgress = false ): Promise { - const decoration: WidgetDecoration.TailDecoration = { - data: `${firstToUpperCase(state)}...`, - fontData: { - color: 'var(--theia-list-highlightForeground)', - }, - }; + this.createFeatures.setCloudSketchState(node.remoteUri, state); try { - node.state = state; - this.mergeDecoration(node, { tailDecorations: [decoration] }); + const result = await (noProgress + ? task(node) + : ExecuteWithProgress.withProgress( + this.taskMessage(state, node.uri.path.name), + this.messageService, + async (progress) => { + progress.report({ work: { done: 0, total: NaN } }); + return task(node); + } + )); await this.refresh(node); - const result = await task(node); return result; } finally { - delete node.state; - // TODO: find a better way to attach and detach decorators. Do we need a proper `TreeDecorator` instead? - const index = node.decorationData?.tailDecorations?.findIndex( - (candidate) => JSON.stringify(decoration) === JSON.stringify(candidate) - ); - if (typeof index === 'number' && index !== -1) { - node.decorationData?.tailDecorations?.splice(index, 1); - } - await this.refresh(node); + this.createFeatures.setCloudSketchState(node.remoteUri, undefined); } } - async sync(source: URI, dest: URI) { + private taskMessage(state: CloudSketchState, input: string): string { + switch (state) { + case 'pull': + return pullingSketch(input); + case 'push': + return pushingSketch(input); + default: + assertUnreachable(state); + } + } + + private async sync(source: URI, dest: URI): Promise { const { filesToWrite, filesToDelete } = await this.treeDiff(source, dest); await Promise.all( filesToWrite.map(async ({ source, dest }) => { @@ -375,7 +406,9 @@ export class CloudSketchbookTree extends SketchbookTree { ); } - override async resolveChildren(parent: CompositeTreeNode): Promise { + override async resolveChildren( + parent: CompositeTreeNode + ): Promise { return (await super.resolveChildren(parent)).sort((a, b) => { if ( WorkspaceNode.is(parent) && @@ -416,14 +449,16 @@ export class CloudSketchbookTree extends SketchbookTree { CreateUri.is(node.remoteUri) ) { let remoteFileStat: FileStat; - const cacheHit = this.sketchCache.getItem(node.remoteUri.path.toString()); + const cacheHit = this.createApi.sketchCache.getItem( + node.remoteUri.path.toString() + ); if (cacheHit) { remoteFileStat = cacheHit; } else { // not found, fetch and add it for future calls remoteFileStat = await this.fileService.resolve(node.remoteUri); if (remoteFileStat) { - this.sketchCache.addItem(remoteFileStat); + this.createApi.sketchCache.addItem(remoteFileStat); } } @@ -453,6 +488,7 @@ export class CloudSketchbookTree extends SketchbookTree { if (!CreateUri.is(childFs.resource)) { let refUri = node.fileStat.resource; if (node.fileStat.hasOwnProperty('remoteUri')) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any refUri = (node.fileStat as any).remoteUri; } remoteUri = refUri.resolve(childFs.name); @@ -471,6 +507,7 @@ export class CloudSketchbookTree extends SketchbookTree { } protected override toNode( + // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types, @typescript-eslint/no-explicit-any fileStat: any, parent: CompositeTreeNode ): FileNode | DirNode { @@ -513,7 +550,7 @@ export class CloudSketchbookTree extends SketchbookTree { }; } - protected readonly notInSyncDecoration: WidgetDecoration.Data = { + protected readonly notInSyncOfflineDecoration: WidgetDecoration.Data = { fontData: { color: 'var(--theia-activityBar-inactiveForeground)', }, @@ -530,15 +567,19 @@ export class CloudSketchbookTree extends SketchbookTree { * @returns */ protected override async augmentSketchNode(node: DirNode): Promise { - const sketch = this.sketchCache.getSketch( + const sketch = this.createApi.sketchCache.getSketch( node.fileStat.resource.path.toString() ); - const commands = [CloudSketchbookCommands.PULL_SKETCH]; + const commands: Command[] = []; + if (this.connectionStatus.offlineStatus !== 'internet') { + commands.push(CloudSketchbookCommands.PULL_SKETCH); + } if ( CloudSketchbookTree.CloudSketchTreeNode.is(node) && - CloudSketchbookTree.CloudSketchTreeNode.isSynced(node) + CloudSketchbookTree.CloudSketchTreeNode.isSynced(node) && + this.connectionStatus.offlineStatus !== 'internet' ) { commands.push(CloudSketchbookCommands.PUSH_SKETCH); } @@ -569,14 +610,15 @@ export class CloudSketchbookTree extends SketchbookTree { } } - // add style decoration for not-in-sync files + // add style decoration for not-in-sync files when offline if ( CloudSketchbookTree.CloudSketchTreeNode.is(node) && - !CloudSketchbookTree.CloudSketchTreeNode.isSynced(node) + !CloudSketchbookTree.CloudSketchTreeNode.isSynced(node) && + this.connectionStatus.offlineStatus === 'internet' ) { - this.mergeDecoration(node, this.notInSyncDecoration); + this.mergeDecoration(node, this.notInSyncOfflineDecoration); } else { - this.removeDecoration(node, this.notInSyncDecoration); + this.removeDecoration(node, this.notInSyncOfflineDecoration); } return node; @@ -594,7 +636,7 @@ export class CloudSketchbookTree extends SketchbookTree { protected override async isSketchNode(node: DirNode): Promise { if (DirNode.is(node)) { - const sketch = this.sketchCache.getSketch( + const sketch = this.createApi.sketchCache.getSketch( node.fileStat.resource.path.toString() ); return !!sketch; @@ -621,6 +663,7 @@ export class CloudSketchbookTree extends SketchbookTree { if (DecoratedTreeNode.is(node)) { for (const property of Object.keys(decorationData)) { if (node.decorationData.hasOwnProperty(property)) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any delete (node.decorationData as any)[property]; } } @@ -655,16 +698,14 @@ export namespace CloudSketchbookTree { export interface CloudSketchDirNode extends Omit, CloudSketchTreeNode { - state?: CloudSketchDirNode.State; + state?: CloudSketchState; isPublic?: boolean; sketchId?: string; commands?: Command[]; } export namespace CloudSketchDirNode { - export function is(node: TreeNode): node is CloudSketchDirNode { + export function is(node: TreeNode | undefined): node is CloudSketchDirNode { return SketchbookTree.SketchDirNode.is(node); } - - export type State = 'syncing' | 'pulling' | 'pushing'; } } diff --git a/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-widget.ts b/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-widget.ts index 22239a227..528aab2ae 100644 --- a/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-widget.ts +++ b/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-widget.ts @@ -1,7 +1,12 @@ -import { inject, injectable, postConstruct } from '@theia/core/shared/inversify'; +import { + inject, + injectable, + postConstruct, +} from '@theia/core/shared/inversify'; import { CloudSketchbookCompositeWidget } from './cloud-sketchbook-composite-widget'; import { SketchbookWidget } from '../sketchbook/sketchbook-widget'; import { ArduinoPreferences } from '../../arduino-preferences'; +import { BaseSketchbookCompositeWidget } from '../sketchbook/sketchbook-composite-widget'; @injectable() export class CloudSketchbookWidget extends SketchbookWidget { @@ -19,8 +24,8 @@ export class CloudSketchbookWidget extends SketchbookWidget { override getTreeWidget(): any { const widget: any = this.sketchbookTreesContainer.selectedWidgets().next(); - if (widget && typeof widget.getTreeWidget !== 'undefined') { - return (widget as CloudSketchbookCompositeWidget).getTreeWidget(); + if (widget instanceof BaseSketchbookCompositeWidget) { + return widget.treeWidget; } return widget; } @@ -30,7 +35,7 @@ export class CloudSketchbookWidget extends SketchbookWidget { this.sketchbookTreesContainer.activateWidget(this.widget); } else { this.sketchbookTreesContainer.activateWidget( - this.localSketchbookTreeWidget + this.sketchbookCompositeWidget ); } this.setDocumentMode(); diff --git a/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-status.tsx b/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-status.tsx new file mode 100644 index 000000000..6674727ee --- /dev/null +++ b/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-status.tsx @@ -0,0 +1,101 @@ +import React from '@theia/core/shared/react'; +import { DisposableCollection } from '@theia/core/lib/common/disposable'; +import { CloudSketchbookTreeModel } from './cloud-sketchbook-tree-model'; +import { AuthenticationClientService } from '../../auth/authentication-client-service'; +import { nls } from '@theia/core/lib/common'; +import { ApplicationConnectionStatusContribution } from '../../theia/core/connection-status-service'; + +export class CloudStatus extends React.Component< + CloudStatus.Props, + CloudStatus.State +> { + protected readonly toDispose = new DisposableCollection(); + + constructor(props: CloudStatus.Props) { + super(props); + this.state = { + status: this.status, + refreshing: false, + }; + } + + override componentDidMount(): void { + this.toDispose.push( + this.props.connectionStatus.onOfflineStatusDidChange(() => + this.setState({ status: this.status }) + ) + ); + } + + override componentWillUnmount(): void { + this.toDispose.dispose(); + } + + override render(): React.ReactNode { + if (!this.props.authenticationService.session) { + return null; + } + return ( +
+
+
+ {this.state.status === 'connected' + ? nls.localize('arduino/cloud/connected', 'Connected') + : nls.localize('arduino/cloud/offline', 'Offline')} +
+
+ {this.props.connectionStatus.offlineStatus === 'internet' ? ( +
+ ) : ( +
+ )} +
+
+ ); + } + + private onDidClickRefresh = () => { + this.setState({ refreshing: true }); + Promise.all([ + this.props.model.updateRoot(), + new Promise((resolve) => setTimeout(() => resolve(true), 1000)), + ]).then(() => { + this.props.model.sketchbookTree().refresh(); + this.setState({ refreshing: false }); + }); + }; + + private get status(): 'connected' | 'offline' { + return this.props.connectionStatus.offlineStatus === 'internet' + ? 'offline' + : 'connected'; + } +} + +export namespace CloudStatus { + export interface Props { + readonly model: CloudSketchbookTreeModel; + readonly authenticationService: AuthenticationClientService; + readonly connectionStatus: ApplicationConnectionStatusContribution; + } + export interface State { + status: 'connected' | 'offline'; + refreshing?: boolean; + } +} diff --git a/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-user-status.tsx b/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-user-status.tsx deleted file mode 100644 index 3611deca7..000000000 --- a/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-user-status.tsx +++ /dev/null @@ -1,134 +0,0 @@ -import * as React from '@theia/core/shared/react'; -import { - Disposable, - DisposableCollection, -} from '@theia/core/lib/common/disposable'; -import { CloudSketchbookTreeModel } from './cloud-sketchbook-tree-model'; -import { AuthenticationClientService } from '../../auth/authentication-client-service'; -import { CloudUserCommands } from '../../auth/cloud-user-commands'; -import { AuthenticationSessionAccountInformation } from '../../../common/protocol/authentication-service'; -import { nls } from '@theia/core/lib/common'; - -export class UserStatus extends React.Component< - UserStatus.Props, - UserStatus.State -> { - protected readonly toDispose = new DisposableCollection(); - - constructor(props: UserStatus.Props) { - super(props); - this.state = { - status: this.status, - accountInfo: props.authenticationService.session?.account, - refreshing: false, - }; - } - - override componentDidMount(): void { - const statusListener = () => this.setState({ status: this.status }); - window.addEventListener('online', statusListener); - window.addEventListener('offline', statusListener); - this.toDispose.pushAll([ - this.props.authenticationService.onSessionDidChange((session) => - this.setState({ accountInfo: session?.account }) - ), - Disposable.create(() => - window.removeEventListener('online', statusListener) - ), - Disposable.create(() => - window.removeEventListener('offline', statusListener) - ), - ]); - } - - override componentWillUnmount(): void { - this.toDispose.dispose(); - } - - override render(): React.ReactNode { - if (!this.props.authenticationService.session) { - return null; - } - return ( -
-
-
- {this.state.status === 'connected' - ? nls.localize('arduino/cloud/connected', 'Connected') - : nls.localize('arduino/cloud/offline', 'Offline')} -
-
-
-
-
-
{ - event.preventDefault(); - event.stopPropagation(); - this.props.model.commandRegistry.executeCommand( - CloudUserCommands.OPEN_PROFILE_CONTEXT_MENU.id, - { - event: event.nativeEvent, - username: this.state.accountInfo?.label, - } - ); - }} - > - {this.state.accountInfo?.picture && ( - {nls.localize( - )} -
-
-
- ); - } - - private onDidClickRefresh = () => { - this.setState({ refreshing: true }); - Promise.all([ - this.props.model.updateRoot(), - new Promise((resolve) => setTimeout(() => resolve(true), 1000)), - ]).then(() => { - this.props.model.sketchbookTree().refresh(); - this.setState({ refreshing: false }); - }); - }; - - private get status(): 'connected' | 'offline' { - return window.navigator.onLine ? 'connected' : 'offline'; - } -} - -export namespace UserStatus { - export interface Props { - readonly model: CloudSketchbookTreeModel; - readonly authenticationService: AuthenticationClientService; - } - export interface State { - status: 'connected' | 'offline'; - accountInfo?: AuthenticationSessionAccountInformation; - refreshing?: boolean; - } -} diff --git a/arduino-ide-extension/src/browser/widgets/component-list/component-list-item.tsx b/arduino-ide-extension/src/browser/widgets/component-list/component-list-item.tsx index 950df64bd..d5e320ee1 100644 --- a/arduino-ide-extension/src/browser/widgets/component-list/component-list-item.tsx +++ b/arduino-ide-extension/src/browser/widgets/component-list/component-list-item.tsx @@ -1,73 +1,76 @@ -import * as React from '@theia/core/shared/react'; +import React from '@theia/core/shared/react'; +import type { ArduinoComponent } from '../../../common/protocol/arduino-component'; import { Installable } from '../../../common/protocol/installable'; -import { ArduinoComponent } from '../../../common/protocol/arduino-component'; -import { ListItemRenderer } from './list-item-renderer'; +import type { ListItemRenderer } from './list-item-renderer'; +import { UserAbortError } from '../../../common/protocol/progressible'; export class ComponentListItem< T extends ArduinoComponent > extends React.Component, ComponentListItem.State> { constructor(props: ComponentListItem.Props) { super(props); - if (props.item.installable) { - const version = props.item.availableVersions.filter( - (version) => version !== props.item.installedVersion - )[0]; - this.state = { - selectedVersion: version, - focus: false, - }; - } - } - - override componentDidUpdate( - prevProps: ComponentListItem.Props, - prevState: ComponentListItem.State - ): void { - if (this.state.focus !== prevState.focus) { - this.props.onFocusDidChange(); - } + this.state = {}; } override render(): React.ReactNode { const { item, itemRenderer } = this.props; + const selectedVersion = + this.props.edited?.item.name === item.name + ? this.props.edited.selectedVersion + : this.latestVersion; return ( -
this.setState({ focus: true })} - onMouseLeave={() => this.setState({ focus: false })} - > - {itemRenderer.renderItem( - Object.assign(this.state, { item }), - this.install.bind(this), - this.uninstall.bind(this), - this.onVersionChange.bind(this) - )} -
+ <> + {itemRenderer.renderItem({ + item, + selectedVersion, + inProgress: this.state.inProgress, + install: (item) => this.install(item), + uninstall: (item) => this.uninstall(item), + onVersionChange: (version) => this.onVersionChange(version), + })} + ); } private async install(item: T): Promise { - const toInstall = this.state.selectedVersion; - const version = this.props.item.availableVersions.filter( - (version) => version !== this.state.selectedVersion - )[0]; - this.setState({ - selectedVersion: version, - }); - try { - await this.props.install(item, toInstall); - } catch { - this.setState({ - selectedVersion: toInstall, - }); - } + await this.withState('installing', () => + this.props.install( + item, + this.props.edited?.item.name === item.name + ? this.props.edited.selectedVersion + : Installable.latest(this.props.item.availableVersions) + ) + ); } private async uninstall(item: T): Promise { - await this.props.uninstall(item); + await this.withState('uninstalling', () => this.props.uninstall(item)); + } + + private async withState( + inProgress: 'installing' | 'uninstalling', + task: () => Promise + ): Promise { + this.setState({ inProgress }); + try { + await task(); + } catch (err) { + if (err instanceof UserAbortError) { + // No state update when user cancels the task + return; + } + throw err; + } finally { + this.setState({ inProgress: undefined }); + } } private onVersionChange(version: Installable.Version): void { - this.setState({ selectedVersion: version }); + this.props.onItemEdit(this.props.item, version); + } + + private get latestVersion(): Installable.Version | undefined { + return Installable.latest(this.props.item.availableVersions); } } @@ -76,12 +79,18 @@ export namespace ComponentListItem { readonly item: T; readonly install: (item: T, version?: Installable.Version) => Promise; readonly uninstall: (item: T) => Promise; + readonly edited?: { + item: T; + selectedVersion: Installable.Version; + }; + readonly onItemEdit: ( + item: T, + selectedVersion: Installable.Version + ) => void; readonly itemRenderer: ListItemRenderer; - readonly onFocusDidChange: () => void; } export interface State { - selectedVersion?: Installable.Version; - focus: boolean; + inProgress?: 'installing' | 'uninstalling' | undefined; } } diff --git a/arduino-ide-extension/src/browser/widgets/component-list/component-list.tsx b/arduino-ide-extension/src/browser/widgets/component-list/component-list.tsx index 067fbc6af..08b8f19a7 100644 --- a/arduino-ide-extension/src/browser/widgets/component-list/component-list.tsx +++ b/arduino-ide-extension/src/browser/widgets/component-list/component-list.tsx @@ -1,156 +1,46 @@ -import 'react-virtualized/styles.css'; -import * as React from '@theia/core/shared/react'; -import AutoSizer from 'react-virtualized/dist/commonjs/AutoSizer'; -import { - CellMeasurer, - CellMeasurerCache, -} from 'react-virtualized/dist/commonjs/CellMeasurer'; -import type { - ListRowProps, - ListRowRenderer, -} from 'react-virtualized/dist/commonjs/List'; -import List from 'react-virtualized/dist/commonjs/List'; +import React from '@theia/core/shared/react'; +import { Virtuoso } from '@theia/core/shared/react-virtuoso'; import { ArduinoComponent } from '../../../common/protocol/arduino-component'; import { Installable } from '../../../common/protocol/installable'; import { ComponentListItem } from './component-list-item'; import { ListItemRenderer } from './list-item-renderer'; -function sameAs( - left: T[], - right: T[], - ...compareProps: (keyof T)[] -): boolean { - if (left === right) { - return true; - } - const leftLength = left.length; - if (leftLength !== right.length) { - return false; - } - for (let i = 0; i < leftLength; i++) { - for (const prop of compareProps) { - const leftValue = left[i][prop]; - const rightValue = right[i][prop]; - if (leftValue !== rightValue) { - return false; - } - } - } - return true; -} - export class ComponentList extends React.Component< ComponentList.Props > { - private readonly cache: CellMeasurerCache; - private resizeAllFlag: boolean; - private list: List | undefined; - private mostRecentWidth: number | undefined; - - constructor(props: ComponentList.Props) { - super(props); - this.cache = new CellMeasurerCache({ - defaultHeight: 140, - fixedWidth: true, - }); - } - override render(): React.ReactNode { return ( - - {({ width, height }) => { - if (this.mostRecentWidth && this.mostRecentWidth !== width) { - this.resizeAllFlag = true; - setTimeout(() => this.clearAll(), 0); - } - this.mostRecentWidth = width; - return ( - ` won't be visible even if the mouse cursor is over the `
`. - // See https://github.com/bvaughn/react-virtualized/blob/005be24a608add0344284053dae7633be86053b2/source/Grid/Grid.js#L38-L42 - scrollingResetTimeInterval={0} - /> - ); - }} - - ); - } - - override componentDidUpdate(prevProps: ComponentList.Props): void { - if ( - this.resizeAllFlag || - !sameAs(this.props.items, prevProps.items, 'name', 'installedVersion') - ) { - this.clearAll(true); - } - } - - private readonly setListRef = (ref: List | null): void => { - this.list = ref || undefined; - }; - - private clearAll(scrollToTop = false): void { - this.resizeAllFlag = false; - this.cache.clearAll(); - if (this.list) { - this.list.recomputeRowHeights(); - if (scrollToTop) { - this.list.scrollToPosition(0); - } - } - } - - private readonly createItem: ListRowRenderer = ({ - index, - parent, - key, - style, - }: ListRowProps): React.ReactNode => { - const item = this.props.items[index]; - return ( - - {({ measure, registerChild }) => ( - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore -
- - key={this.props.itemLabel(item)} - item={item} - itemRenderer={this.props.itemRenderer} - install={this.props.install} - uninstall={this.props.uninstall} - onFocusDidChange={() => measure()} - /> -
+ ( + + key={this.props.itemLabel(item)} + item={item} + itemRenderer={this.props.itemRenderer} + install={this.props.install} + uninstall={this.props.uninstall} + edited={this.props.edited} + onItemEdit={this.props.onItemEdit} + /> )} -
+ /> ); - }; + } } - export namespace ComponentList { export interface Props { readonly items: T[]; readonly itemLabel: (item: T) => string; - readonly itemDeprecated: (item: T) => boolean; readonly itemRenderer: ListItemRenderer; readonly install: (item: T, version?: Installable.Version) => Promise; readonly uninstall: (item: T) => Promise; + readonly edited?: { + item: T; + selectedVersion: Installable.Version; + }; + readonly onItemEdit: ( + item: T, + selectedVersion: Installable.Version + ) => void; } } diff --git a/arduino-ide-extension/src/browser/widgets/component-list/filter-renderer.tsx b/arduino-ide-extension/src/browser/widgets/component-list/filter-renderer.tsx index 9f4a9cffb..bc55c4810 100644 --- a/arduino-ide-extension/src/browser/widgets/component-list/filter-renderer.tsx +++ b/arduino-ide-extension/src/browser/widgets/component-list/filter-renderer.tsx @@ -1,5 +1,5 @@ import { injectable } from '@theia/core/shared/inversify'; -import * as React from '@theia/core/shared/react'; +import React from '@theia/core/shared/react'; import { BoardSearch, LibrarySearch, diff --git a/arduino-ide-extension/src/browser/widgets/component-list/filterable-list-container.tsx b/arduino-ide-extension/src/browser/widgets/component-list/filterable-list-container.tsx index 20b5f317f..086ffbf4f 100644 --- a/arduino-ide-extension/src/browser/widgets/component-list/filterable-list-container.tsx +++ b/arduino-ide-extension/src/browser/widgets/component-list/filterable-list-container.tsx @@ -1,20 +1,31 @@ -import * as React from '@theia/core/shared/react'; -import debounce = require('lodash.debounce'); +import React from '@theia/core/shared/react'; +import debounce from 'lodash.debounce'; import { Event } from '@theia/core/lib/common/event'; import { CommandService } from '@theia/core/lib/common/command'; import { MessageService } from '@theia/core/lib/common/message-service'; import { ConfirmDialog } from '@theia/core/lib/browser/dialogs'; import { Searchable } from '../../../common/protocol/searchable'; -import { ExecuteWithProgress } from '../../../common/protocol/progressible'; -import { Installable } from '../../../common/protocol/installable'; +import { + ExecuteWithProgress, + UserAbortError, +} from '../../../common/protocol/progressible'; +import { + Installable, + libraryInstallFailed, + platformInstallFailed, +} from '../../../common/protocol/installable'; import { ArduinoComponent } from '../../../common/protocol/arduino-component'; import { SearchBar } from './search-bar'; import { ListWidget } from './list-widget'; import { ComponentList } from './component-list'; import { ListItemRenderer } from './list-item-renderer'; -import { ResponseServiceClient } from '../../../common/protocol'; +import { + LibraryPackage, + ResponseServiceClient, +} from '../../../common/protocol'; import { nls } from '@theia/core/lib/common'; import { FilterRenderer } from './filter-renderer'; +import { DisposableCollection } from '@theia/core/lib/common/disposable'; export class FilterableListContainer< T extends ArduinoComponent, @@ -23,21 +34,30 @@ export class FilterableListContainer< FilterableListContainer.Props, FilterableListContainer.State > { + private readonly toDispose: DisposableCollection; + constructor(props: Readonly>) { super(props); this.state = { searchOptions: props.defaultSearchOptions, items: [], }; + this.toDispose = new DisposableCollection(); } override componentDidMount(): void { - this.search = debounce(this.search, 500); + this.search = debounce(this.search, 500, { trailing: true }); this.search(this.state.searchOptions); - this.props.searchOptionsDidChange((newSearchOptions) => { - const { searchOptions } = this.state; - this.setSearchOptionsAndUpdate({ ...searchOptions, ...newSearchOptions }); - }); + this.toDispose.pushAll([ + this.props.searchOptionsDidChange((newSearchOptions) => { + const { searchOptions } = this.state; + this.setSearchOptionsAndUpdate({ + ...searchOptions, + ...newSearchOptions, + }); + }), + this.props.onDidShow(() => this.setState({ edited: undefined })), + ]); } override componentDidUpdate(): void { @@ -46,6 +66,10 @@ export class FilterableListContainer< this.props.container.updateScrollBar(); } + override componentWillUnmount(): void { + this.toDispose.dispose(); + } + override render(): React.ReactNode { return (
@@ -82,20 +106,21 @@ export class FilterableListContainer< } protected renderComponentList(): React.ReactNode { - const { itemLabel, itemDeprecated, itemRenderer } = this.props; + const { itemLabel, itemRenderer } = this.props; return ( items={this.state.items} itemLabel={itemLabel} - itemDeprecated={itemDeprecated} itemRenderer={itemRenderer} install={this.install.bind(this)} uninstall={this.uninstall.bind(this)} + edited={this.state.edited} + onItemEdit={this.onItemEdit.bind(this)} /> ); } - protected handlePropChange = (prop: keyof S, value: S[keyof S]): void => { + private handlePropChange = (prop: keyof S, value: S[keyof S]): void => { const searchOptions = { ...this.state.searchOptions, [prop]: value, @@ -107,42 +132,43 @@ export class FilterableListContainer< this.setState({ searchOptions }, () => this.search(searchOptions)); } - protected search(searchOptions: S): void { + private search(searchOptions: S): void { const { searchable } = this.props; searchable .search(searchOptions) - .then((items) => this.setState({ items: this.sort(items) })); + .then((items) => this.setState({ items, edited: undefined })); } - protected sort(items: T[]): T[] { - const { itemLabel, itemDeprecated } = this.props; - return items.sort((left, right) => { - // always put deprecated items at the bottom of the list - if (itemDeprecated(left)) { - return 1; - } - - return itemLabel(left).localeCompare(itemLabel(right)); - }); - } - - protected async install( - item: T, - version: Installable.Version - ): Promise { - const { install, searchable } = this.props; + private async install(item: T, version: Installable.Version): Promise { + const { install, searchable, messageService } = this.props; + const { name } = item; await ExecuteWithProgress.doWithProgress({ ...this.props, progressText: nls.localize('arduino/common/processing', 'Processing') + - ` ${item.name}:${version}`, - run: ({ progressId }) => install({ item, progressId, version }), + ` ${name}:${version}`, + run: async ({ progressId }) => { + try { + await install({ item, progressId, version }); + } catch (err) { + if (err instanceof UserAbortError) { + // Do not toast an error message on user abort. + // https://github.com/arduino/arduino-ide/issues/2063 + return; + } + const message = LibraryPackage.is(item) // TODO: this dispatch does not belong here + ? libraryInstallFailed(name, version) + : platformInstallFailed(name, version); + const cause = err instanceof Error ? err.message : String(err); + messageService.error(`${message} ${cause}`); + } + }, }); const items = await searchable.search(this.state.searchOptions); - this.setState({ items: this.sort(items) }); + this.setState({ items, edited: undefined }); } - protected async uninstall(item: T): Promise { + private async uninstall(item: T): Promise { const ok = await new ConfirmDialog({ title: nls.localize('arduino/component/uninstall', 'Uninstall'), msg: nls.localize( @@ -167,7 +193,11 @@ export class FilterableListContainer< run: ({ progressId }) => uninstall({ item, progressId }), }); const items = await searchable.search(this.state.searchOptions); - this.setState({ items: this.sort(items) }); + this.setState({ items, edited: undefined }); + } + + private onItemEdit(item: T, selectedVersion: Installable.Version): void { + this.setState({ edited: { item, selectedVersion } }); } } @@ -180,13 +210,13 @@ export namespace FilterableListContainer { readonly container: ListWidget; readonly searchable: Searchable; readonly itemLabel: (item: T) => string; - readonly itemDeprecated: (item: T) => boolean; readonly itemRenderer: ListItemRenderer; readonly filterRenderer: FilterRenderer; readonly resolveFocus: (element: HTMLElement | undefined) => void; readonly searchOptionsDidChange: Event | undefined>; readonly messageService: MessageService; readonly responseService: ResponseServiceClient; + readonly onDidShow: Event; readonly install: ({ item, progressId, @@ -209,5 +239,9 @@ export namespace FilterableListContainer { export interface State { searchOptions: S; items: T[]; + edited?: { + item: T; + selectedVersion: Installable.Version; + }; } } diff --git a/arduino-ide-extension/src/browser/widgets/component-list/list-item-renderer.tsx b/arduino-ide-extension/src/browser/widgets/component-list/list-item-renderer.tsx index 537f4d415..c9c08a49d 100644 --- a/arduino-ide-extension/src/browser/widgets/component-list/list-item-renderer.tsx +++ b/arduino-ide-extension/src/browser/widgets/component-list/list-item-renderer.tsx @@ -1,132 +1,783 @@ -import * as React from '@theia/core/shared/react'; -import { inject, injectable } from '@theia/core/shared/inversify'; +import { ApplicationError } from '@theia/core'; +import { + Anchor, + ContextMenuRenderer, +} from '@theia/core/lib/browser/context-menu-renderer'; +import { TabBarToolbar } from '@theia/core/lib/browser/shell/tab-bar-toolbar'; +import { codicon } from '@theia/core/lib/browser/widgets/widget'; import { WindowService } from '@theia/core/lib/browser/window/window-service'; -import { Installable } from '../../../common/protocol/installable'; -import { ArduinoComponent } from '../../../common/protocol/arduino-component'; -import { ComponentListItem } from './component-list-item'; -import { nls } from '@theia/core/lib/common'; +import { + CommandHandler, + CommandRegistry, + CommandService, +} from '@theia/core/lib/common/command'; +import { + Disposable, + DisposableCollection, +} from '@theia/core/lib/common/disposable'; +import { + MenuModelRegistry, + MenuPath, + SubMenuOptions, +} from '@theia/core/lib/common/menu'; +import { MessageService } from '@theia/core/lib/common/message-service'; +import { nls } from '@theia/core/lib/common/nls'; +import { inject, injectable } from '@theia/core/shared/inversify'; +import React from '@theia/core/shared/react'; import { Unknown } from '../../../common/nls'; +import { + CoreService, + ExamplesService, + LibraryPackage, + Sketch, + SketchContainer, + SketchesService, + SketchRef, +} from '../../../common/protocol'; +import type { ArduinoComponent } from '../../../common/protocol/arduino-component'; +import { Installable } from '../../../common/protocol/installable'; +import { openClonedExample } from '../../contributions/examples'; +import { + ArduinoMenus, + examplesLabel, + unregisterSubmenu, +} from '../../menu/arduino-menus'; + +const moreInfoLabel = nls.localize('arduino/component/moreInfo', 'More info'); +const otherVersionsLabel = nls.localize( + 'arduino/component/otherVersions', + 'Other Versions' +); +const installLabel = nls.localize('arduino/component/install', 'Install'); +const installLatestLabel = nls.localize( + 'arduino/component/installLatest', + 'Install Latest' +); +function installVersionLabel(selectedVersion: string) { + return nls.localize( + 'arduino/component/installVersion', + 'Install {0}', + selectedVersion + ); +} +const updateLabel = nls.localize('arduino/component/update', 'Update'); +const removeLabel = nls.localize('arduino/component/remove', 'Remove'); +const byLabel = nls.localize('arduino/component/by', 'by'); +function nameAuthorLabel(name: string, author: string) { + return nls.localize('arduino/component/title', '{0} by {1}', name, author); +} +function installedLabel(installedVersion: string) { + return nls.localize( + 'arduino/component/installed', + '{0} installed', + installedVersion + ); +} +function clickToOpenInBrowserLabel(href: string): string | undefined { + return nls.localize( + 'arduino/component/clickToOpen', + 'Click to open in browser: {0}', + href + ); +} + +interface MenuTemplate { + readonly menuLabel: string; +} +interface MenuActionTemplate extends MenuTemplate { + readonly menuPath: MenuPath; + readonly handler: CommandHandler; + /** + * If not defined the insertion oder will be the order string. + */ + readonly order?: string; +} +interface SubmenuTemplate extends MenuTemplate { + readonly menuLabel: string; + readonly submenuPath: MenuPath; + readonly options?: SubMenuOptions; +} +function isMenuTemplate(arg: unknown): arg is MenuTemplate { + return ( + typeof arg === 'object' && + (arg as MenuTemplate).menuLabel !== undefined && + typeof (arg as MenuTemplate).menuLabel === 'string' + ); +} +function isMenuActionTemplate(arg: MenuTemplate): arg is MenuActionTemplate { + return ( + isMenuTemplate(arg) && + (arg as MenuActionTemplate).handler !== undefined && + typeof (arg as MenuActionTemplate).handler === 'object' && + (arg as MenuActionTemplate).menuPath !== undefined && + Array.isArray((arg as MenuActionTemplate).menuPath) + ); +} + +@injectable() +export class ArduinoComponentContextMenuRenderer { + @inject(CommandRegistry) + private readonly commandRegistry: CommandRegistry; + @inject(MenuModelRegistry) + private readonly menuRegistry: MenuModelRegistry; + @inject(ContextMenuRenderer) + private readonly contextMenuRenderer: ContextMenuRenderer; + + private readonly toDisposeBeforeRender = new DisposableCollection(); + private menuIndexCounter = 0; + + async render( + anchor: Anchor, + ...templates: (MenuActionTemplate | SubmenuTemplate)[] + ): Promise { + this.toDisposeBeforeRender.dispose(); + this.toDisposeBeforeRender.pushAll([ + Disposable.create(() => (this.menuIndexCounter = 0)), + ...templates.map((template) => this.registerMenu(template)), + ]); + const options = { + menuPath: ArduinoMenus.ARDUINO_COMPONENT__CONTEXT, + anchor, + showDisabled: true, + }; + this.contextMenuRenderer.render(options); + } + + private registerMenu( + template: MenuActionTemplate | SubmenuTemplate + ): Disposable { + if (isMenuActionTemplate(template)) { + const { menuLabel, menuPath, handler, order } = template; + const id = this.generateCommandId(menuLabel, menuPath); + const index = this.menuIndexCounter++; + return new DisposableCollection( + this.commandRegistry.registerCommand({ id }, handler), + this.menuRegistry.registerMenuAction(menuPath, { + commandId: id, + label: menuLabel, + order: typeof order === 'string' ? order : String(index).padStart(4), + }) + ); + } else { + const { menuLabel, submenuPath, options } = template; + return new DisposableCollection( + this.menuRegistry.registerSubmenu(submenuPath, menuLabel, options), + Disposable.create(() => + unregisterSubmenu(submenuPath, this.menuRegistry) + ) + ); + } + } + + private generateCommandId(menuLabel: string, menuPath: MenuPath): string { + return `arduino--component-context-${menuPath.join('-')}-${menuLabel}`; + } +} + +interface ListItemRendererParams { + readonly item: T; + readonly selectedVersion: Installable.Version | undefined; + readonly inProgress?: 'installing' | 'uninstalling' | undefined; + readonly install: (item: T) => Promise; + readonly uninstall: (item: T) => Promise; + readonly onVersionChange: (version: Installable.Version) => void; +} + +interface ListItemRendererServices { + readonly windowService: WindowService; + readonly messagesService: MessageService; + readonly commandService: CommandService; + readonly coreService: CoreService; + readonly examplesService: ExamplesService; + readonly sketchesService: SketchesService; + readonly contextMenuRenderer: ArduinoComponentContextMenuRenderer; +} @injectable() export class ListItemRenderer { @inject(WindowService) - protected windowService: WindowService; + private readonly windowService: WindowService; + @inject(MessageService) + private readonly messageService: MessageService; + @inject(CommandService) + private readonly commandService: CommandService; + @inject(CoreService) + private readonly coreService: CoreService; + @inject(ExamplesService) + private readonly examplesService: ExamplesService; + @inject(SketchesService) + private readonly sketchesService: SketchesService; + @inject(ArduinoComponentContextMenuRenderer) + private readonly contextMenuRenderer: ArduinoComponentContextMenuRenderer; - protected onMoreInfoClick = ( - event: React.SyntheticEvent - ): void => { - const { target } = event.nativeEvent; - if (target instanceof HTMLAnchorElement) { - this.windowService.openNewWindow(target.href, { external: true }); - event.nativeEvent.preventDefault(); + private readonly onMoreInfo = (href: string | undefined): void => { + if (href) { + this.windowService.openNewWindow(href, { external: true }); } }; - renderItem( - input: ComponentListItem.State & { item: T }, - install: (item: T) => Promise, - uninstall: (item: T) => Promise, - onVersionChange: (version: Installable.Version) => void - ): React.ReactNode { - const { item, focus } = input; - let nameAndAuthor: JSX.Element; - if (item.name && item.author) { - const name = {item.name}; - const author = {item.author}; - nameAndAuthor = ( - - {name} {nls.localize('arduino/component/by', 'by')} {author} - + renderItem(params: ListItemRendererParams): React.ReactNode { + const action = this.action(params); + return ( + <> + +
+
+ +
+
+ + ); + } + + private action(params: ListItemRendererParams): Installable.Action { + const { + item: { installedVersion, availableVersions }, + selectedVersion, + } = params; + return Installable.action({ + installed: installedVersion, + available: availableVersions, + selected: selectedVersion, + }); + } + + private get services(): ListItemRendererServices { + return { + windowService: this.windowService, + messagesService: this.messageService, + commandService: this.commandService, + coreService: this.coreService, + sketchesService: this.sketchesService, + examplesService: this.examplesService, + contextMenuRenderer: this.contextMenuRenderer, + }; + } +} + +class Separator extends React.Component { + override render(): React.ReactNode { + return ( +
+
+
+
+
+ ); + } +} + +class Header extends React.Component< + Readonly<{ + params: ListItemRendererParams; + action: Installable.Action; + services: ListItemRendererServices; + onMoreInfo: (href: string | undefined) => void; + }> +> { + override render(): React.ReactNode { + return ( +
+
+ + <Toolbar {...this.props} /> + </div> + <InstalledVersion {...this.props} /> + </div> + ); + } +} + +class Toolbar<T extends ArduinoComponent> extends React.Component< + Readonly<{ + params: ListItemRendererParams<T>; + action: Installable.Action; + services: ListItemRendererServices; + onMoreInfo: (href: string | undefined) => void; + }> +> { + private readonly onClick = (event: React.MouseEvent): void => { + event.stopPropagation(); + event.preventDefault(); + const anchor = this.toAnchor(event); + this.showContextMenu(anchor); + }; + + override render(): React.ReactNode { + return ( + <div className={TabBarToolbar.Styles.TAB_BAR_TOOLBAR}> + <div className={`${TabBarToolbar.Styles.TAB_BAR_TOOLBAR_ITEM} enabled`}> + <div + id="__more__" + className={codicon('ellipsis', true)} + title={nls.localizeByDefault('More Actions...')} + onClick={this.onClick} + /> + </div> + </div> + ); + } + + private toAnchor(event: React.MouseEvent): Anchor { + const itemBox = event.currentTarget + .closest('.' + TabBarToolbar.Styles.TAB_BAR_TOOLBAR_ITEM) + ?.getBoundingClientRect(); + return itemBox + ? { + y: itemBox.bottom + itemBox.height / 2, + x: itemBox.left, + } + : event.nativeEvent; + } + + private async showContextMenu(anchor: Anchor): Promise<void> { + this.props.services.contextMenuRenderer.render( + anchor, + this.moreInfo, + ...(await this.examples), + ...this.otherVersions, + ...this.actions + ); + } + + private get moreInfo(): MenuActionTemplate { + const { + params: { + item: { moreInfoLink }, + }, + } = this.props; + return { + menuLabel: moreInfoLabel, + menuPath: ArduinoMenus.ARDUINO_COMPONENT__CONTEXT, + handler: { + execute: () => this.props.onMoreInfo(moreInfoLink), + isEnabled: () => Boolean(moreInfoLink), + }, + }; + } + + private get examples(): Promise<(MenuActionTemplate | SubmenuTemplate)[]> { + const { + params: { + item, + item: { installedVersion, name }, + }, + services: { examplesService }, + } = this.props; + // TODO: `LibraryPackage.is` should not be here but it saves one extra `lib list` + // gRPC equivalent call with the name of a platform which will result an empty array. + if (!LibraryPackage.is(item) || !installedVersion) { + return Promise.resolve([]); + } + const submenuPath = [ + ...ArduinoMenus.ARDUINO_COMPONENT__CONTEXT, + 'examples', + ]; + return examplesService.find({ libraryName: name }).then((containers) => [ + { + submenuPath, + menuLabel: examplesLabel, + options: { order: String(0) }, + }, + ...containers + .map((container) => this.flattenContainers(container, submenuPath)) + .reduce((acc, curr) => acc.concat(curr), []), + ]); + } + + private flattenContainers( + container: SketchContainer, + menuPath: MenuPath, + depth = 0 + ): (MenuActionTemplate | SubmenuTemplate)[] { + const templates: (MenuActionTemplate | SubmenuTemplate)[] = []; + const { label } = container; + if (depth > 0) { + menuPath = [...menuPath, label]; + templates.push({ + submenuPath: menuPath, + menuLabel: label, + options: { order: label.toLocaleLowerCase() }, + }); + } + return templates + .concat( + ...container.sketches.map((sketch) => + this.sketchToMenuTemplate(sketch, menuPath) + ) + ) + .concat( + container.children + .map((childContainer) => + this.flattenContainers(childContainer, menuPath, ++depth) + ) + .reduce((acc, curr) => acc.concat(curr), []) ); - } else if (item.name) { - nameAndAuthor = <span className="name">{item.name}</span>; - } else if ((item as any).id) { - nameAndAuthor = <span className="name">{(item as any).id}</span>; - } else { - nameAndAuthor = <span className="name">{Unknown}</span>; + } + + private sketchToMenuTemplate( + sketch: SketchRef, + menuPath: MenuPath + ): MenuActionTemplate { + const { name, uri } = sketch; + const { sketchesService, commandService } = this.props.services; + return { + menuLabel: name, + menuPath, + handler: { + execute: () => + openClonedExample( + uri, + { sketchesService, commandService }, + this.onExampleOpenError + ), + }, + order: name.toLocaleLowerCase(), + }; + } + + private get onExampleOpenError(): { + onDidFailClone: ( + err: ApplicationError<number, unknown>, + uri: string + ) => unknown; + onDidFailOpen: ( + err: ApplicationError<number, unknown>, + sketch: Sketch + ) => unknown; + } { + const { + services: { messagesService, coreService }, + } = this.props; + const handle = async (err: ApplicationError<number, unknown>) => { + messagesService.error(err.message); + return coreService.refresh(); + }; + return { + onDidFailClone: handle, + onDidFailOpen: handle, + }; + } + + private get otherVersions(): (MenuActionTemplate | SubmenuTemplate)[] { + const { + params: { + item: { availableVersions }, + selectedVersion, + onVersionChange, + }, + } = this.props; + const submenuPath = [ + ...ArduinoMenus.ARDUINO_COMPONENT__CONTEXT, + 'other-versions', + ]; + return [ + { + submenuPath, + menuLabel: otherVersionsLabel, + options: { order: String(1) }, + }, + ...availableVersions + .filter((version) => version !== selectedVersion) + .map((version) => ({ + menuPath: submenuPath, + menuLabel: version, + handler: { + execute: () => onVersionChange(version), + }, + })), + ]; + } + + private get actions(): MenuActionTemplate[] { + const { + action, + params: { + item, + item: { availableVersions, installedVersion }, + install, + uninstall, + selectedVersion, + }, + } = this.props; + const removeAction = { + menuLabel: removeLabel, + menuPath: ArduinoMenus.ARDUINO_COMPONENT__CONTEXT__ACTION_GROUP, + handler: { + execute: () => uninstall(item), + }, + }; + const installAction = { + menuLabel: installVersionLabel( + selectedVersion ?? Installable.latest(availableVersions) ?? '' + ), + menuPath: ArduinoMenus.ARDUINO_COMPONENT__CONTEXT__ACTION_GROUP, + handler: { + execute: () => install(item), + }, + }; + const installLatestAction = { + menuLabel: installLatestLabel, + menuPath: ArduinoMenus.ARDUINO_COMPONENT__CONTEXT__ACTION_GROUP, + handler: { + execute: () => install(item), + }, + }; + const updateAction = { + menuLabel: updateLabel, + menuPath: ArduinoMenus.ARDUINO_COMPONENT__CONTEXT__ACTION_GROUP, + handler: { + execute: () => install(item), + }, + }; + switch (action) { + case 'unknown': + return []; + case 'remove': { + return [removeAction]; + } + case 'update': { + return [removeAction, updateAction]; + } + case 'installLatest': + return [ + ...(Boolean(installedVersion) ? [removeAction] : []), + installLatestAction, + ]; + case 'installSelected': { + return [ + ...(Boolean(installedVersion) ? [removeAction] : []), + installAction, + ]; + } } - const onClickUninstall = () => uninstall(item); - const installedVersion = !!item.installedVersion && ( - <div className="version-info"> - <span className="version"> - {nls.localize( - 'arduino/component/version', - 'Version {0}', - item.installedVersion - )} - </span> - <span className="installed" onClick={onClickUninstall} /> + } +} + +class Title<T extends ArduinoComponent> extends React.Component< + Readonly<{ + params: ListItemRendererParams<T>; + }> +> { + override render(): React.ReactNode { + const { name, author } = this.props.params.item; + const title = + name && author ? nameAuthorLabel(name, author) : name ? name : Unknown; + return ( + <div className="title" title={title}> + {name && author ? ( + <> + {<span className="name">{name}</span>}{' '} + {<span className="author">{`${byLabel} ${author}`}</span>} + </> + ) : name ? ( + <span className="name">{name}</span> + ) : ( + <span className="name">{Unknown}</span> + )} </div> ); + } +} - const summary = <div className="summary">{item.summary}</div>; - const description = <div className="summary">{item.description}</div>; +class InstalledVersion<T extends ArduinoComponent> extends React.Component< + Readonly<{ + params: ListItemRendererParams<T>; + }> +> { + private readonly onClick = (): void => { + this.props.params.uninstall(this.props.params.item); + }; - const moreInfo = !!item.moreInfoLink && ( - <a href={item.moreInfoLink} onClick={this.onMoreInfoClick}> - {nls.localize('arduino/component/moreInfo', 'More info')} - </a> + override render(): React.ReactNode { + const { installedVersion } = this.props.params.item; + return ( + installedVersion && ( + <div className="version"> + <span + className="installed-version" + onClick={this.onClick} + {...{ + version: installedLabel(installedVersion), + remove: removeLabel, + }} + /> + </div> + ) ); - const onClickInstall = () => install(item); - const installButton = item.installable && ( - <button - className="theia-button secondary install" - onClick={onClickInstall} - > - {nls.localize('arduino/component/install', 'INSTALL')} - </button> + } +} + +class Content<T extends ArduinoComponent> extends React.Component< + Readonly<{ + params: ListItemRendererParams<T>; + onMoreInfo: (href: string | undefined) => void; + }> +> { + override render(): React.ReactNode { + const { + params: { + item: { summary, description }, + }, + } = this.props; + const content = [summary, description].filter(Boolean).join(' '); + return ( + <div className="content" title={content}> + <p>{content}</p> + <MoreInfo {...this.props} /> + </div> ); + } +} - const onSelectChange = (event: React.ChangeEvent<HTMLSelectElement>) => { - const version = event.target.value; - if (version) { - onVersionChange(version); - } - }; +class MoreInfo<T extends ArduinoComponent> extends React.Component< + Readonly<{ + params: ListItemRendererParams<T>; + onMoreInfo: (href: string | undefined) => void; + }> +> { + private readonly onClick = ( + event: React.SyntheticEvent<HTMLAnchorElement, Event> + ): void => { + const { target } = event.nativeEvent; + if (target instanceof HTMLAnchorElement) { + this.props.onMoreInfo(target.href); + event.nativeEvent.preventDefault(); + } + }; - const versions = (() => { - const { availableVersions } = item; - if (availableVersions.length === 0) { - return undefined; - } else if (availableVersions.length === 1) { - return <label>{availableVersions[0]}</label>; - } else { + override render(): React.ReactNode { + const { + params: { + item: { moreInfoLink: href }, + }, + } = this.props; + return ( + href && ( + <div className="info" title={clickToOpenInBrowserLabel(href)}> + <a href={href} onClick={this.onClick}> + {moreInfoLabel} + </a> + </div> + ) + ); + } +} + +class Footer<T extends ArduinoComponent> extends React.Component< + Readonly<{ + params: ListItemRendererParams<T>; + action: Installable.Action; + }> +> { + override render(): React.ReactNode { + return ( + <div className="footer"> + <SelectVersion {...this.props} /> + <Button {...this.props} /> + </div> + ); + } +} + +class SelectVersion<T extends ArduinoComponent> extends React.Component< + Readonly<{ + params: ListItemRendererParams<T>; + action: Installable.Action; + }> +> { + private readonly onChange = ( + event: React.ChangeEvent<HTMLSelectElement> + ): void => { + const version = event.target.value; + if (version) { + this.props.params.onVersionChange(version); + } + }; + + override render(): React.ReactNode { + const { + selectedVersion, + item: { availableVersions }, + } = this.props.params; + switch (this.props.action) { + case 'installLatest': // fall-through + case 'installSelected': // fall-through + case 'update': // fall-through + case 'remove': return ( <select className="theia-select" - value={input.selectedVersion} - onChange={onSelectChange} + value={selectedVersion} + onChange={this.onChange} > - {item.availableVersions - .filter((version) => version !== item.installedVersion) // Filter the version that is currently installed. - .map((version) => ( - <option value={version} key={version}> - {version} - </option> - ))} + {availableVersions.map((version) => ( + <option value={version} key={version}> + {version} + </option> + ))} </select> ); - } - })(); + case 'unknown': + return undefined; + } + } +} +class Button<T extends ArduinoComponent> extends React.Component< + Readonly<{ + params: ListItemRendererParams<T>; + action: Installable.Action; + }> +> { + override render(): React.ReactNode { + const { + params: { item, install, uninstall, inProgress: state }, + } = this.props; + const classNames = ['theia-button install uppercase']; + let onClick; + let label; + switch (this.props.action) { + case 'unknown': + return undefined; + case 'installLatest': { + classNames.push('primary'); + label = installLabel; + onClick = () => install(item); + break; + } + case 'installSelected': { + classNames.push('secondary'); + label = installLabel; + onClick = () => install(item); + break; + } + case 'update': { + classNames.push('secondary'); + label = updateLabel; + onClick = () => install(item); + break; + } + case 'remove': { + classNames.push('secondary', 'no-border'); + label = removeLabel; + onClick = () => uninstall(item); + break; + } + } return ( - <div className="component-list-item noselect"> - <div className="header"> - {nameAndAuthor} - {installedVersion} - </div> - <div className="content"> - {summary} - {description} - </div> - <div className="info">{moreInfo}</div> - {focus && ( - <div className="footer"> - {versions} - {installButton} - </div> - )} - </div> + <button + className={classNames.join(' ')} + onClick={onClick} + disabled={Boolean(state)} + > + {label} + </button> ); } } diff --git a/arduino-ide-extension/src/browser/widgets/component-list/list-widget-frontend-contribution.ts b/arduino-ide-extension/src/browser/widgets/component-list/list-widget-frontend-contribution.ts index 6ec22ddfd..205dac9ed 100644 --- a/arduino-ide-extension/src/browser/widgets/component-list/list-widget-frontend-contribution.ts +++ b/arduino-ide-extension/src/browser/widgets/component-list/list-widget-frontend-contribution.ts @@ -1,9 +1,15 @@ -import { injectable } from '@theia/core/shared/inversify'; -import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application'; +import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application-contribution'; +import { + OpenerOptions, + OpenHandler, +} from '@theia/core/lib/browser/opener-service'; import { AbstractViewContribution } from '@theia/core/lib/browser/shell/view-contribution'; +import { MenuModelRegistry } from '@theia/core/lib/common/menu'; +import { URI } from '@theia/core/lib/common/uri'; +import { injectable } from '@theia/core/shared/inversify'; +import { Searchable } from '../../../common/protocol'; import { ArduinoComponent } from '../../../common/protocol/arduino-component'; import { ListWidget } from './list-widget'; -import { Searchable } from '../../../common/protocol'; @injectable() export abstract class ListWidgetFrontendContribution< @@ -11,14 +17,49 @@ export abstract class ListWidgetFrontendContribution< S extends Searchable.Options > extends AbstractViewContribution<ListWidget<T, S>> - implements FrontendApplicationContribution + implements FrontendApplicationContribution, OpenHandler { + readonly id: string = `http-opener-${this.viewId}`; + async initializeLayout(): Promise<void> { - // TS requires at least one method from `FrontendApplicationContribution`. - // Expected to be empty. + this.openView(); } - override registerMenus(): void { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + override registerMenus(_: MenuModelRegistry): void { // NOOP } + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + canHandle(uri: URI, _?: OpenerOptions): number { + // `500` is the default HTTP opener in Theia. IDE2 has higher priority. + // https://github.com/eclipse-theia/theia/blob/b75b6144b0ffea06a549294903c374fa642135e4/packages/core/src/browser/http-open-handler.ts#L39 + return this.canParse(uri) ? 501 : 0; + } + + async open( + uri: URI, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + _?: OpenerOptions | undefined + ): Promise<void> { + const searchOptions = this.parse(uri); + if (!searchOptions) { + console.warn( + `Failed to parse URI into a search options. URI: ${uri.toString()}` + ); + return; + } + const widget = await this.openView({ + activate: true, + reveal: true, + }); + if (!widget) { + console.warn(`Failed to open view for URI: ${uri.toString()}`); + return; + } + widget.refresh(searchOptions); + } + + protected abstract canParse(uri: URI): boolean; + protected abstract parse(uri: URI): S | undefined; } diff --git a/arduino-ide-extension/src/browser/widgets/component-list/list-widget.tsx b/arduino-ide-extension/src/browser/widgets/component-list/list-widget.tsx index 3e388cce2..d13d4ac7d 100644 --- a/arduino-ide-extension/src/browser/widgets/component-list/list-widget.tsx +++ b/arduino-ide-extension/src/browser/widgets/component-list/list-widget.tsx @@ -1,4 +1,4 @@ -import * as React from '@theia/core/shared/react'; +import React from '@theia/core/shared/react'; import { injectable, postConstruct, @@ -7,6 +7,7 @@ import { import { Widget } from '@theia/core/shared/@phosphor/widgets'; import { Message } from '@theia/core/shared/@phosphor/messaging'; import { Emitter } from '@theia/core/lib/common/event'; +import { Deferred } from '@theia/core/lib/common/promise-util'; import { ReactWidget } from '@theia/core/lib/browser/widgets/react-widget'; import { CommandService } from '@theia/core/lib/common/command'; import { MessageService } from '@theia/core/lib/common/message-service'; @@ -28,28 +29,27 @@ export abstract class ListWidget< > extends ReactWidget { @inject(MessageService) protected readonly messageService: MessageService; - - @inject(CommandService) - protected readonly commandService: CommandService; - - @inject(ResponseServiceClient) - protected readonly responseService: ResponseServiceClient; - @inject(NotificationCenter) protected readonly notificationCenter: NotificationCenter; + @inject(CommandService) + private readonly commandService: CommandService; + @inject(ResponseServiceClient) + private readonly responseService: ResponseServiceClient; /** * Do not touch or use it. It is for setting the focus on the `input` after the widget activation. */ - protected focusNode: HTMLElement | undefined; - protected readonly searchOptionsChangeEmitter = new Emitter< + private focusNode: HTMLElement | undefined; + private readonly didReceiveFirstFocus = new Deferred(); + private readonly searchOptionsChangeEmitter = new Emitter< Partial<S> | undefined >(); + private readonly onDidShowEmitter = new Emitter<void>(); /** * Instead of running an `update` from the `postConstruct` `init` method, * we use this variable to track first activate, then run. */ - protected firstActivate = true; + private firstUpdate = true; constructor(protected options: ListWidget.Options<T, S>) { super(); @@ -62,13 +62,18 @@ export abstract class ListWidget< this.addClass('arduino-list-widget'); this.node.tabIndex = 0; // To be able to set the focus on the widget. this.scrollOptions = undefined; - this.toDispose.push(this.searchOptionsChangeEmitter); + this.toDispose.pushAll([ + this.searchOptionsChangeEmitter, + this.onDidShowEmitter, + ]); } @postConstruct() protected init(): void { this.toDispose.pushAll([ - this.notificationCenter.onIndexDidUpdate(() => this.refresh(undefined)), + this.notificationCenter.onIndexUpdateDidComplete(() => + this.refresh(undefined) + ), this.notificationCenter.onDaemonDidStart(() => this.refresh(undefined)), this.notificationCenter.onDaemonDidStop(() => this.refresh(undefined)), ]); @@ -77,12 +82,14 @@ export abstract class ListWidget< protected override onAfterShow(message: Message): void { this.maybeUpdateOnFirstRender(); super.onAfterShow(message); + this.onDidShowEmitter.fire(); } private maybeUpdateOnFirstRender() { - if (this.firstActivate) { - this.firstActivate = false; + if (this.firstUpdate) { + this.firstUpdate = false; this.update(); + this.didReceiveFirstFocus.promise.then(() => this.focusNode?.focus()); } } @@ -102,8 +109,11 @@ export abstract class ListWidget< this.updateScrollBar(); } - protected onFocusResolved = (element: HTMLElement | undefined): void => { + private readonly onFocusResolved = ( + element: HTMLElement | undefined + ): void => { this.focusNode = element; + this.didReceiveFirstFocus.resolve(); }; protected async install({ @@ -128,7 +138,7 @@ export abstract class ListWidget< return this.options.installable.uninstall({ item, progressId }); } - render(): React.ReactNode { + override render(): React.ReactNode { return ( <FilterableListContainer<T, S> defaultSearchOptions={this.options.defaultSearchOptions} @@ -138,13 +148,13 @@ export abstract class ListWidget< install={this.install.bind(this)} uninstall={this.uninstall.bind(this)} itemLabel={this.options.itemLabel} - itemDeprecated={this.options.itemDeprecated} itemRenderer={this.options.itemRenderer} filterRenderer={this.options.filterRenderer} searchOptionsDidChange={this.searchOptionsChangeEmitter.event} messageService={this.messageService} commandService={this.commandService} responseService={this.responseService} + onDidShow={this.onDidShowEmitter.event} /> ); } @@ -154,7 +164,9 @@ export abstract class ListWidget< * If it is `undefined`, updates the view state by re-running the search with the current `filterText` term. */ refresh(searchOptions: Partial<S> | undefined): void { - this.searchOptionsChangeEmitter.fire(searchOptions); + this.didReceiveFirstFocus.promise.then(() => + this.searchOptionsChangeEmitter.fire(searchOptions) + ); } updateScrollBar(): void { @@ -175,7 +187,6 @@ export namespace ListWidget { readonly installable: Installable<T>; readonly searchable: Searchable<T, S>; readonly itemLabel: (item: T) => string; - readonly itemDeprecated: (item: T) => boolean; readonly itemRenderer: ListItemRenderer<T>; readonly filterRenderer: FilterRenderer<S>; readonly defaultSearchOptions: S; diff --git a/arduino-ide-extension/src/browser/widgets/component-list/search-bar.tsx b/arduino-ide-extension/src/browser/widgets/component-list/search-bar.tsx index cc9630989..fa72b755a 100644 --- a/arduino-ide-extension/src/browser/widgets/component-list/search-bar.tsx +++ b/arduino-ide-extension/src/browser/widgets/component-list/search-bar.tsx @@ -1,5 +1,5 @@ import { nls } from '@theia/core/lib/common'; -import * as React from '@theia/core/shared/react'; +import React from '@theia/core/shared/react'; export class SearchBar extends React.Component<SearchBar.Props> { constructor(props: Readonly<SearchBar.Props>) { diff --git a/arduino-ide-extension/src/browser/widgets/sketchbook/create-new.tsx b/arduino-ide-extension/src/browser/widgets/sketchbook/create-new.tsx new file mode 100644 index 000000000..bee5792f9 --- /dev/null +++ b/arduino-ide-extension/src/browser/widgets/sketchbook/create-new.tsx @@ -0,0 +1,20 @@ +import React from '@theia/core/shared/react'; + +export class CreateNew extends React.Component<CreateNew.Props> { + override render(): React.ReactNode { + return ( + <div className="create-new"> + <button className="theia-button secondary" onClick={this.props.onClick}> + {this.props.label} + </button> + </div> + ); + } +} + +export namespace CreateNew { + export interface Props { + readonly label: string; + readonly onClick: () => void; + } +} diff --git a/arduino-ide-extension/src/browser/widgets/sketchbook/sketchbook-commands.ts b/arduino-ide-extension/src/browser/widgets/sketchbook/sketchbook-commands.ts index 50b5f9008..c8935d663 100644 --- a/arduino-ide-extension/src/browser/widgets/sketchbook/sketchbook-commands.ts +++ b/arduino-ide-extension/src/browser/widgets/sketchbook/sketchbook-commands.ts @@ -27,17 +27,14 @@ export namespace SketchbookCommands { export const OPEN_SKETCHBOOK_CONTEXT_MENU: Command = { id: 'arduino-sketchbook--open-sketch-context-menu', - label: 'Contextual menu', iconClass: 'sketchbook-tree__opts', }; export const SKETCHBOOK_HIDE_FILES: Command = { id: 'arduino-sketchbook--hide-files', - label: 'Contextual menu', }; export const SKETCHBOOK_SHOW_FILES: Command = { id: 'arduino-sketchbook--show-files', - label: 'Contextual menu', }; } diff --git a/arduino-ide-extension/src/browser/widgets/sketchbook/sketchbook-composite-widget.tsx b/arduino-ide-extension/src/browser/widgets/sketchbook/sketchbook-composite-widget.tsx new file mode 100644 index 000000000..e537b8ff4 --- /dev/null +++ b/arduino-ide-extension/src/browser/widgets/sketchbook/sketchbook-composite-widget.tsx @@ -0,0 +1,96 @@ +import React from '@theia/core/shared/react'; +import { createRoot, Root } from '@theia/core/shared/react-dom/client'; +import { inject, injectable } from '@theia/core/shared/inversify'; +import { nls } from '@theia/core/lib/common/nls'; +import { Widget } from '@theia/core/shared/@phosphor/widgets'; +import { Message, MessageLoop } from '@theia/core/shared/@phosphor/messaging'; +import { Disposable } from '@theia/core/lib/common/disposable'; +import { BaseWidget } from '@theia/core/lib/browser/widgets/widget'; +import { CommandService } from '@theia/core/lib/common/command'; +import { SketchbookTreeWidget } from './sketchbook-tree-widget'; +import { CreateNew } from '../sketchbook/create-new'; +import { findChildTheiaButton } from '../../utils/dom'; + +@injectable() +export abstract class BaseSketchbookCompositeWidget< + TW extends SketchbookTreeWidget +> extends BaseWidget { + @inject(CommandService) + protected readonly commandService: CommandService; + + private readonly compositeNode: HTMLElement; + private readonly footerNode: HTMLElement; + private readonly footerRoot: Root; + + constructor() { + super(); + this.compositeNode = document.createElement('div'); + this.compositeNode.classList.add('composite-node'); + this.footerNode = document.createElement('div'); + this.footerNode.classList.add('footer-node'); + this.compositeNode.appendChild(this.footerNode); + this.footerRoot = createRoot(this.footerNode); + this.node.appendChild(this.compositeNode); + this.title.closable = false; + } + + abstract get treeWidget(): TW; + protected abstract renderFooter(footerRoot: Root): void; + protected updateFooter(): void { + this.renderFooter(this.footerRoot); + } + + protected override onAfterAttach(message: Message): void { + super.onAfterAttach(message); + Widget.attach(this.treeWidget, this.compositeNode); + this.renderFooter(this.footerRoot); + this.toDisposeOnDetach.push( + Disposable.create(() => Widget.detach(this.treeWidget)) + ); + } + + protected override onActivateRequest(message: Message): void { + super.onActivateRequest(message); + // Sending a resize message is needed because otherwise the tree widget would render empty + this.onResize(Widget.ResizeMessage.UnknownSize); + findChildTheiaButton(this.footerNode, true)?.focus(); + } + + protected override onResize(message: Widget.ResizeMessage): void { + super.onResize(message); + MessageLoop.sendMessage(this.treeWidget, Widget.ResizeMessage.UnknownSize); + } +} + +@injectable() +export class SketchbookCompositeWidget extends BaseSketchbookCompositeWidget<SketchbookTreeWidget> { + @inject(SketchbookTreeWidget) + private readonly sketchbookTreeWidget: SketchbookTreeWidget; + + constructor() { + super(); + this.id = 'sketchbook-composite-widget'; + this.title.caption = nls.localize( + 'arduino/sketch/titleLocalSketchbook', + 'Local Sketchbook' + ); + this.title.iconClass = 'sketchbook-tree-icon'; + } + + get treeWidget(): SketchbookTreeWidget { + return this.sketchbookTreeWidget; + } + + protected renderFooter(footerRoot: Root): void { + footerRoot.render( + <CreateNew + label={nls.localize('arduino/sketchbook/newSketch', 'New Sketch')} + onClick={this.onDidClickCreateNew} + /> + ); + } + + private onDidClickCreateNew: () => void = () => { + this.commandService.executeCommand('arduino-new-sketch'); + }; +} diff --git a/arduino-ide-extension/src/browser/widgets/sketchbook/sketchbook-tree-model.ts b/arduino-ide-extension/src/browser/widgets/sketchbook/sketchbook-tree-model.ts index 5b567d0be..89a013547 100644 --- a/arduino-ide-extension/src/browser/widgets/sketchbook/sketchbook-tree-model.ts +++ b/arduino-ide-extension/src/browser/widgets/sketchbook/sketchbook-tree-model.ts @@ -1,8 +1,12 @@ -import { inject, injectable, postConstruct } from '@theia/core/shared/inversify'; +import { + inject, + injectable, + postConstruct, +} from '@theia/core/shared/inversify'; import URI from '@theia/core/lib/common/uri'; import { FileNode, FileTreeModel } from '@theia/filesystem/lib/browser'; import { FileService } from '@theia/filesystem/lib/browser/file-service'; -import { ConfigService } from '../../../common/protocol'; +import { ConfigServiceClient } from './../../config/config-service-client'; import { SketchbookTree } from './sketchbook-tree'; import { ArduinoPreferences } from '../../arduino-preferences'; import { @@ -13,7 +17,10 @@ import { } from '@theia/core/lib/browser/tree'; import { SketchbookCommands } from './sketchbook-commands'; import { OpenerService, open } from '@theia/core/lib/browser'; -import { CurrentSketch, SketchesServiceClientImpl } from '../../../common/protocol/sketches-service-client-impl'; +import { + CurrentSketch, + SketchesServiceClientImpl, +} from '../../sketches-service-client-impl'; import { CommandRegistry } from '@theia/core/lib/common/command'; import { WorkspaceService } from '@theia/workspace/lib/browser/workspace-service'; import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state'; @@ -36,8 +43,8 @@ export class SketchbookTreeModel extends FileTreeModel { @inject(CommandRegistry) public readonly commandRegistry: CommandRegistry; - @inject(ConfigService) - protected readonly configService: ConfigService; + @inject(ConfigServiceClient) + protected readonly configService: ConfigServiceClient; @inject(OpenerService) protected readonly openerService: OpenerService; @@ -59,6 +66,12 @@ export class SketchbookTreeModel extends FileTreeModel { super.init(); this.reportBusyProgress(); this.initializeRoot(); + this.toDispose.push( + this.configService.onDidChangeSketchDirUri(async () => { + await this.updateRoot(); + this.selectRoot(this.root); + }) + ); } protected readonly pendingBusyProgress = new Map<string, Deferred<void>>(); @@ -114,6 +127,9 @@ export class SketchbookTreeModel extends FileTreeModel { if (preferenceName === 'arduino.sketchbook.showAllFiles') { this.updateRoot(); } + if (preferenceName === 'arduino.cloud.sharedSpaceID') { + this.updateRoot(); + } }) ); @@ -121,6 +137,10 @@ export class SketchbookTreeModel extends FileTreeModel { return; } const root = this.root; + this.selectRoot(root); + } + + private selectRoot(root: TreeNode | undefined) { if (CompositeTreeNode.is(root) && root.children.length === 1) { const child = root.children[0]; if ( @@ -161,10 +181,12 @@ export class SketchbookTreeModel extends FileTreeModel { } protected async createRoot(): Promise<TreeNode | undefined> { - const config = await this.configService.getConfiguration(); - const rootFileStats = await this.fileService.resolve( - new URI(config.sketchDirUri) - ); + const sketchDirUri = this.configService.tryGetSketchDirUri(); + const errors = this.configService.tryGetMessages(); + if (!sketchDirUri || errors?.length) { + return undefined; + } + const rootFileStats = await this.fileService.resolve(sketchDirUri); if (this.workspaceService.opened && rootFileStats.children) { // filter out libraries and hardware @@ -183,7 +205,10 @@ export class SketchbookTreeModel extends FileTreeModel { /** * Move the given source file or directory to the given target directory. */ - override async move(source: TreeNode, target: TreeNode): Promise<URI | undefined> { + override async move( + source: TreeNode, + target: TreeNode + ): Promise<URI | undefined> { if (source.parent && WorkspaceRootNode.is(source)) { // do not support moving a root folder return undefined; diff --git a/arduino-ide-extension/src/browser/widgets/sketchbook/sketchbook-tree-widget.tsx b/arduino-ide-extension/src/browser/widgets/sketchbook/sketchbook-tree-widget.tsx index bb1a69914..650e5a5f1 100644 --- a/arduino-ide-extension/src/browser/widgets/sketchbook/sketchbook-tree-widget.tsx +++ b/arduino-ide-extension/src/browser/widgets/sketchbook/sketchbook-tree-widget.tsx @@ -1,11 +1,11 @@ -import * as React from '@theia/core/shared/react'; +import React from '@theia/core/shared/react'; import { inject, injectable, postConstruct, } from '@theia/core/shared/inversify'; import { TreeNode } from '@theia/core/lib/browser/tree/tree'; -import { CommandRegistry } from '@theia/core/lib/common/command'; +import { Command, CommandRegistry } from '@theia/core/lib/common/command'; import { NodeProps, TreeProps, @@ -21,9 +21,8 @@ import { ArduinoPreferences } from '../../arduino-preferences'; import { CurrentSketch, SketchesServiceClientImpl, -} from '../../../common/protocol/sketches-service-client-impl'; +} from '../../sketches-service-client-impl'; import { SelectableTreeNode } from '@theia/core/lib/browser/tree/tree-selection'; -import { Sketch } from '../../contributions/contribution'; import { nls } from '@theia/core/lib/common'; const customTreeProps: TreeProps = { @@ -59,15 +58,20 @@ export class SketchbookTreeWidget extends FileTreeWidget { 'Local Sketchbook' ); this.title.closable = false; + this.addClass('tree-container'); // Adds `height: 100%` to the tree. Otherwise you cannot see it. } @postConstruct() - protected override async init(): Promise<void> { + protected override init(): void { super.init(); // cache the current open sketch uri - const currentSketch = await this.sketchServiceClient.currentSketch(); - this.currentSketchUri = - (CurrentSketch.isValid(currentSketch) && currentSketch.uri) || ''; + this.sketchServiceClient + .currentSketch() + .then( + (currentSketch) => + (this.currentSketchUri = + (CurrentSketch.isValid(currentSketch) && currentSketch.uri) || '') + ); } protected override createNodeClassNames( @@ -90,8 +94,8 @@ export class SketchbookTreeWidget extends FileTreeWidget { node: TreeNode, props: NodeProps ): React.ReactNode { - if (SketchbookTree.SketchDirNode.is(node) || Sketch.isSketchFile(node.id)) { - return <div className="sketch-folder-icon file-icon"></div>; + if (SketchbookTree.SketchDirNode.is(node)) { + return undefined; } const icon = this.toNodeIcon(node); if (icon) { @@ -115,7 +119,6 @@ export class SketchbookTreeWidget extends FileTreeWidget { protected hoveredNodeId: string | undefined; protected setHoverNodeId(id: string | undefined): void { this.hoveredNodeId = id; - this.update(); } protected override createNodeAttributes( @@ -133,26 +136,34 @@ export class SketchbookTreeWidget extends FileTreeWidget { protected renderInlineCommands(node: TreeNode): React.ReactNode { if (SketchbookTree.SketchDirNode.is(node) && node.commands) { return Array.from(new Set(node.commands)).map((command) => - this.renderInlineCommand(command.id, node) + this.renderInlineCommand(command, node) ); } return undefined; } protected renderInlineCommand( - commandId: string, + command: Command | string | [command: string, label: string], node: SketchbookTree.SketchDirNode, options?: any ): React.ReactNode { - const command = this.commandRegistry.getCommand(commandId); - const icon = command?.iconClass; + const commandId = Command.is(command) + ? command.id + : Array.isArray(command) + ? command[0] + : command; + const resolvedCommand = this.commandRegistry.getCommand(commandId); + const icon = resolvedCommand?.iconClass; const args = { model: this.model, node: node, ...options }; if ( - command && + resolvedCommand && icon && this.commandRegistry.isEnabled(commandId, args) && this.commandRegistry.isVisible(commandId, args) ) { + const label = Array.isArray(command) + ? command[1] + : resolvedCommand.label ?? resolvedCommand.id; const className = [ TREE_NODE_SEGMENT_CLASS, TREE_NODE_TAIL_CLASS, @@ -164,7 +175,7 @@ export class SketchbookTreeWidget extends FileTreeWidget { <div key={`${commandId}--${node.id}`} className={className} - title={command?.label || command.id} + title={label} onClick={(event) => { event.preventDefault(); event.stopPropagation(); diff --git a/arduino-ide-extension/src/browser/widgets/sketchbook/sketchbook-tree.ts b/arduino-ide-extension/src/browser/widgets/sketchbook/sketchbook-tree.ts index 6726f12b6..86391c7db 100644 --- a/arduino-ide-extension/src/browser/widgets/sketchbook/sketchbook-tree.ts +++ b/arduino-ide-extension/src/browser/widgets/sketchbook/sketchbook-tree.ts @@ -9,6 +9,7 @@ import { WorkspaceRootNode, } from '@theia/navigator/lib/browser/navigator-tree'; import { ArduinoPreferences } from '../../arduino-preferences'; +import { nls } from '@theia/core/lib/common/nls'; @injectable() export class SketchbookTree extends FileNavigatorTree { @@ -18,7 +19,9 @@ export class SketchbookTree extends FileNavigatorTree { @inject(ArduinoPreferences) protected readonly arduinoPreferences: ArduinoPreferences; - override async resolveChildren(parent: CompositeTreeNode): Promise<TreeNode[]> { + override async resolveChildren( + parent: CompositeTreeNode + ): Promise<TreeNode[]> { const showAllFiles = this.arduinoPreferences['arduino.sketchbook.showAllFiles']; @@ -71,7 +74,13 @@ export class SketchbookTree extends FileNavigatorTree { protected async augmentSketchNode(node: DirNode): Promise<void> { Object.assign(node, { type: 'sketch', - commands: [SketchbookCommands.OPEN_SKETCHBOOK_CONTEXT_MENU], + commands: [ + [ + 'arduino-create-cloud-copy', + nls.localize('arduino/createCloudCopy', 'Push Sketch to Cloud'), + ], + SketchbookCommands.OPEN_SKETCHBOOK_CONTEXT_MENU, + ], }); } @@ -96,7 +105,10 @@ export class SketchbookTree extends FileNavigatorTree { export namespace SketchbookTree { export interface SketchDirNode extends DirNode { readonly type: 'sketch'; - readonly commands?: Command[]; + /** + * Theia command, the command ID string, or a tuple of command ID and preferred UI label. If the array construct is used, the label is the 1<sup>st</sup> of the array. + */ + readonly commands?: (Command | string | [string, string])[]; } export namespace SketchDirNode { export function is( diff --git a/arduino-ide-extension/src/browser/widgets/sketchbook/sketchbook-widget-contribution.ts b/arduino-ide-extension/src/browser/widgets/sketchbook/sketchbook-widget-contribution.ts index 74b782887..e3ce5b136 100644 --- a/arduino-ide-extension/src/browser/widgets/sketchbook/sketchbook-widget-contribution.ts +++ b/arduino-ide-extension/src/browser/widgets/sketchbook/sketchbook-widget-contribution.ts @@ -1,10 +1,9 @@ -import * as remote from '@theia/core/electron-shared/@electron/remote'; import { inject, injectable } from '@theia/core/shared/inversify'; import { CommandRegistry } from '@theia/core/lib/common/command'; import { MenuModelRegistry } from '@theia/core/lib/common/menu'; import { PreferenceService } from '@theia/core/lib/browser/preferences/preference-service'; 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 { ArduinoPreferences } from '../../arduino-preferences'; import { SketchbookWidget } from './sketchbook-widget'; @@ -26,7 +25,7 @@ import { import { CurrentSketch, SketchesServiceClientImpl, -} from '../../../common/protocol/sketches-service-client-impl'; +} from '../../sketches-service-client-impl'; import { FileService } from '@theia/filesystem/lib/browser/file-service'; import { URI } from '../../contributions/contribution'; import { WorkspaceInput } from '@theia/workspace/lib/browser'; @@ -106,7 +105,7 @@ export class SketchbookWidgetContribution this.revealSketchNode(treeWidgetId, nodeUri), }); registry.registerCommand(SketchbookCommands.OPEN_NEW_WINDOW, { - execute: (arg) => this.openNewWindow(arg.node), + execute: (arg) => this.openNewWindow(arg.node, arg?.treeWidgetId), isEnabled: (arg) => !!arg && 'node' in arg && SketchbookTree.SketchDirNode.is(arg.node), isVisible: (arg) => @@ -120,7 +119,7 @@ export class SketchbookWidgetContribution if (exists) { const fsPath = await this.fileService.fsPath(new URI(arg.node.uri)); if (fsPath) { - remote.shell.openPath(fsPath); + window.electronArduino.openPath(fsPath); } } } @@ -209,14 +208,20 @@ export class SketchbookWidgetContribution }); } - private openNewWindow(node: SketchbookTree.SketchDirNode): void { - const widget = this.tryGetWidget(); - if (widget) { - const treeWidgetId = widget.activeTreeWidgetId(); - if (!treeWidgetId) { + private openNewWindow( + node: SketchbookTree.SketchDirNode, + treeWidgetId?: string + ): void { + if (!treeWidgetId) { + const widget = this.tryGetWidget(); + if (!widget) { console.warn(`Could not retrieve active sketchbook tree ID.`); return; } + treeWidgetId = widget.activeTreeWidgetId(); + } + const widget = this.tryGetWidget(); + if (widget) { const nodeUri = node.uri.toString(); const options: WorkspaceInput = {}; Object.assign(options, { diff --git a/arduino-ide-extension/src/browser/widgets/sketchbook/sketchbook-widget.tsx b/arduino-ide-extension/src/browser/widgets/sketchbook/sketchbook-widget.tsx index 0b7b920a1..2d99f97b7 100644 --- a/arduino-ide-extension/src/browser/widgets/sketchbook/sketchbook-widget.tsx +++ b/arduino-ide-extension/src/browser/widgets/sketchbook/sketchbook-widget.tsx @@ -11,15 +11,21 @@ import { Disposable } from '@theia/core/lib/common/disposable'; import { BaseWidget } from '@theia/core/lib/browser/widgets/widget'; import { SketchbookTreeWidget } from './sketchbook-tree-widget'; import { nls } from '@theia/core/lib/common'; -import { CloudSketchbookCompositeWidget } from '../cloud-sketchbook/cloud-sketchbook-composite-widget'; import { URI } from '../../contributions/contribution'; +import { + BaseSketchbookCompositeWidget, + SketchbookCompositeWidget, +} from './sketchbook-composite-widget'; @injectable() export class SketchbookWidget extends BaseWidget { - static LABEL = nls.localize('arduino/sketch/titleSketchbook', 'Sketchbook'); + static readonly LABEL = nls.localize( + 'arduino/sketch/titleSketchbook', + 'Sketchbook' + ); - @inject(SketchbookTreeWidget) - protected readonly localSketchbookTreeWidget: SketchbookTreeWidget; + @inject(SketchbookCompositeWidget) + protected readonly sketchbookCompositeWidget: SketchbookCompositeWidget; protected readonly sketchbookTreesContainer: DockPanel; @@ -36,7 +42,7 @@ export class SketchbookWidget extends BaseWidget { @postConstruct() protected init(): void { - this.sketchbookTreesContainer.addWidget(this.localSketchbookTreeWidget); + this.sketchbookTreesContainer.addWidget(this.sketchbookCompositeWidget); } protected override onAfterAttach(message: Message): void { @@ -47,8 +53,26 @@ export class SketchbookWidget extends BaseWidget { ); } + /** + * The currently selected sketchbook tree widget inside the view. + */ getTreeWidget(): SketchbookTreeWidget { - return this.localSketchbookTreeWidget; + return this.sketchbookCompositeWidget.treeWidget; + } + + /** + * An array of all sketchbook tree widgets managed by the view. + */ + getTreeWidgets(): SketchbookTreeWidget[] { + return toArray(this.sketchbookTreesContainer.widgets()).reduce( + (acc, curr) => { + if (curr instanceof BaseSketchbookCompositeWidget) { + acc.push(curr.treeWidget); + } + return acc; + }, + [] as SketchbookTreeWidget[] + ); } activeTreeWidgetId(): string | undefined { @@ -80,8 +104,8 @@ export class SketchbookWidget extends BaseWidget { if (widget instanceof SketchbookTreeWidget) { return widget; } - if (widget instanceof CloudSketchbookCompositeWidget) { - return widget.getTreeWidget(); + if (widget instanceof BaseSketchbookCompositeWidget) { + return widget.treeWidget; } return undefined; }; @@ -104,13 +128,7 @@ export class SketchbookWidget extends BaseWidget { protected override onActivateRequest(message: Message): void { super.onActivateRequest(message); - - // TODO: focus the active sketchbook - // if (this.editor) { - // this.editor.focus(); - // } else { - // } - this.node.focus(); + this.sketchbookCompositeWidget.activate(); } protected override onResize(message: Widget.ResizeMessage): void { diff --git a/arduino-ide-extension/src/browser/widgets/sketchbook/startup-task.ts b/arduino-ide-extension/src/browser/widgets/sketchbook/startup-task.ts deleted file mode 100644 index 25cf33a3e..000000000 --- a/arduino-ide-extension/src/browser/widgets/sketchbook/startup-task.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { injectable } from '@theia/core/shared/inversify'; -import { WorkspaceInput as TheiaWorkspaceInput } from '@theia/workspace/lib/browser'; -import { Contribution } from '../../contributions/contribution'; -import { setURL } from '../../utils/window'; - -@injectable() -export class StartupTasks extends Contribution { - override onReady(): void { - const tasks = StartupTask.get(new URL(window.location.href)); - console.log(`Executing startup tasks: ${JSON.stringify(tasks)}`); - tasks.forEach(({ command, args = [] }) => - this.commandService - .executeCommand(command, ...args) - .catch((err) => - console.error( - `Error occurred when executing the startup task '${command}'${ - args?.length ? ` with args: '${JSON.stringify(args)}` : '' - }.`, - err - ) - ) - ); - if (tasks.length) { - // Remove the startup tasks after the execution. - // Otherwise, IDE2 executes them again on a window reload event. - setURL(StartupTask.set([], new URL(window.location.href))); - console.info(`Removed startup tasks from URL.`); - } - } -} - -export interface StartupTask { - command: string; - /** - * Must be JSON serializable. - */ - // eslint-disable-next-line @typescript-eslint/no-explicit-any - args?: any[]; -} -export namespace StartupTask { - const QUERY = 'startupTasks'; - export function is(arg: unknown): arg is StartupTasks { - if (typeof arg === 'object') { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const object = arg as any; - return 'command' in object && typeof object['command'] === 'string'; - } - return false; - } - export function get(url: URL): StartupTask[] { - const { searchParams } = url; - const encodedTasks = searchParams.get(QUERY); - if (encodedTasks) { - const rawTasks = decodeURIComponent(encodedTasks); - const tasks = JSON.parse(rawTasks); - if (Array.isArray(tasks)) { - return tasks.filter((task) => { - if (StartupTask.is(task)) { - return true; - } - console.warn(`Was not a task: ${JSON.stringify(task)}. Ignoring.`); - return false; - }); - } else { - debugger; - console.warn(`Startup tasks was not an array: ${rawTasks}. Ignoring.`); - } - } - return []; - } - export function set(tasks: StartupTask[], url: URL): URL { - const copy = new URL(url); - copy.searchParams.set(QUERY, encodeURIComponent(JSON.stringify(tasks))); - return copy; - } - export function append(tasks: StartupTask[], url: URL): URL { - return set([...get(url), ...tasks], url); - } -} - -export namespace StartupTasks { - export interface WorkspaceInput extends TheiaWorkspaceInput { - tasks: StartupTask[]; - } - export namespace WorkspaceInput { - export function is( - input: (TheiaWorkspaceInput & Partial<WorkspaceInput>) | undefined - ): input is WorkspaceInput { - return !!input && !!input.tasks; - } - } -} diff --git a/arduino-ide-extension/src/common/nls.ts b/arduino-ide-extension/src/common/nls.ts index a2e58b86a..7514a45c8 100644 --- a/arduino-ide-extension/src/common/nls.ts +++ b/arduino-ide-extension/src/common/nls.ts @@ -1,5 +1,6 @@ import { nls } from '@theia/core/lib/common/nls'; +// TODO: rename constants: `Unknown` should be `unknownLabel`, change `Later` to `laterLabel`, etc. export const Unknown = nls.localize('arduino/common/unknown', 'Unknown'); export const Later = nls.localize('arduino/common/later', 'Later'); export const Updatable = nls.localize('arduino/common/updateable', 'Updatable'); @@ -19,3 +20,24 @@ export const InstallManually = nls.localize( 'arduino/common/installManually', 'Install Manually' ); +export const SelectManually = nls.localize( + 'arduino/common/selectManually', + 'Select Manually' +); + +export const serialMonitorWidgetLabel = nls.localize( + 'arduino/common/serialMonitor', + 'Serial Monitor' +); + +export const noBoardSelected = nls.localize( + 'arduino/common/noBoardSelected', + 'No board selected' +); + +export const noSketchOpened = nls.localize( + 'arduino/common/noSketchOpened', + 'No sketch opened' +); + +export const userAbort = nls.localize('arduino/common/userAbort', 'User abort'); diff --git a/arduino-ide-extension/src/common/protocol/arduino-component.ts b/arduino-ide-extension/src/common/protocol/arduino-component.ts index 2cdfe38a2..298708e12 100644 --- a/arduino-ide-extension/src/common/protocol/arduino-component.ts +++ b/arduino-ide-extension/src/common/protocol/arduino-component.ts @@ -1,34 +1,35 @@ -import { Installable } from './installable'; +import type { Installable } from './installable'; export interface ArduinoComponent { readonly name: string; - readonly deprecated: boolean; readonly author: string; readonly summary: string; readonly description: string; - readonly moreInfoLink?: string; readonly availableVersions: Installable.Version[]; - readonly installable: boolean; readonly installedVersion?: Installable.Version; /** * This is the `Type` in IDE (1.x) UI. */ readonly types: string[]; + readonly deprecated?: boolean; + readonly moreInfoLink?: string; } export namespace ArduinoComponent { - export function is(arg: any): arg is ArduinoComponent { + export function is(arg: unknown): arg is ArduinoComponent { return ( - !!arg && - 'name' in arg && - typeof arg['name'] === 'string' && - 'author' in arg && - typeof arg['author'] === 'string' && - 'summary' in arg && - typeof arg['summary'] === 'string' && - 'description' in arg && - typeof arg['description'] === 'string' && - 'installable' in arg && - typeof arg['installable'] === 'boolean' + typeof arg === 'object' && + (<ArduinoComponent>arg).name !== undefined && + typeof (<ArduinoComponent>arg).name === 'string' && + (<ArduinoComponent>arg).author !== undefined && + typeof (<ArduinoComponent>arg).author === 'string' && + (<ArduinoComponent>arg).summary !== undefined && + typeof (<ArduinoComponent>arg).summary === 'string' && + (<ArduinoComponent>arg).description !== undefined && + typeof (<ArduinoComponent>arg).description === 'string' && + (<ArduinoComponent>arg).availableVersions !== undefined && + Array.isArray((<ArduinoComponent>arg).availableVersions) && + (<ArduinoComponent>arg).types !== undefined && + Array.isArray((<ArduinoComponent>arg).types) ); } } diff --git a/arduino-ide-extension/src/common/protocol/arduino-context-mapper.ts b/arduino-ide-extension/src/common/protocol/arduino-context-mapper.ts new file mode 100644 index 000000000..ede24fe1c --- /dev/null +++ b/arduino-ide-extension/src/common/protocol/arduino-context-mapper.ts @@ -0,0 +1,126 @@ +import type { + Port as APIPort, + BoardDetails as ApiBoardDetails, + BuildProperties as ApiBuildProperties, + CompileSummary as ApiCompileSummary, + ConfigOption as ApiConfigOption, + ConfigValue as ApiConfigValue, + Tool as ApiTool, +} from 'vscode-arduino-api'; +import type { + BoardDetails, + CompileSummary, + ConfigOption, + ConfigValue, + Port, + Tool, +} from '../protocol'; + +export function toApiCompileSummary( + compileSummary: CompileSummary +): ApiCompileSummary { + const { + buildPath, + buildProperties, + boardPlatform, + buildPlatform, + executableSectionsSize, + usedLibraries, + } = compileSummary; + return { + buildPath, + buildProperties: toApiBuildProperties(buildProperties), + executableSectionsSize: executableSectionsSize, + boardPlatform, + buildPlatform, + usedLibraries, + }; +} + +export function toApiPort(port: Port): APIPort | undefined { + const { + hardwareId = '', + properties = {}, + address, + protocol, + protocolLabel, + addressLabel: label, + } = port; + return { + label, + address, + hardwareId, + properties, + protocol, + protocolLabel, + }; +} + +export function toApiBoardDetails(boardDetails: BoardDetails): ApiBoardDetails { + const { fqbn, programmers, configOptions, requiredTools } = boardDetails; + return { + buildProperties: toApiBuildProperties(boardDetails.buildProperties), + configOptions: configOptions.map(toApiConfigOption), + fqbn, + programmers, + toolsDependencies: requiredTools.map(toApiTool), + }; +} + +function toApiConfigOption(configOption: ConfigOption): ApiConfigOption { + const { label, values, option } = configOption; + return { + optionLabel: label, + option, + values: values.map(toApiConfigValue), + }; +} + +function toApiConfigValue(configValue: ConfigValue): ApiConfigValue { + const { label, selected, value } = configValue; + return { + selected, + value, + valueLabel: label, + }; +} + +function toApiTool(toolDependency: Tool): ApiTool { + const { name, packager, version } = toolDependency; + return { + name, + packager, + version, + }; +} + +const propertySep = '='; + +function parseProperty( + property: string +): [key: string, value: string] | undefined { + const segments = property.split(propertySep); + if (segments.length < 2) { + console.warn(`Could not parse build property: ${property}.`); + return undefined; + } + + const [key, ...rest] = segments; + if (!key) { + console.warn(`Could not determine property key from raw: ${property}.`); + return undefined; + } + const value = rest.join(propertySep); + return [key, value]; +} + +export function toApiBuildProperties(properties: string[]): ApiBuildProperties { + return properties.reduce((acc, curr) => { + const entry = parseProperty(curr); + if (entry) { + const [key, value] = entry; + acc[key] = value; + } + return acc; + }, <Record<string, string>>{}); +} diff --git a/arduino-ide-extension/src/common/protocol/arduino-daemon.ts b/arduino-ide-extension/src/common/protocol/arduino-daemon.ts index b59d4c617..b1b8456d8 100644 --- a/arduino-ide-extension/src/common/protocol/arduino-daemon.ts +++ b/arduino-ide-extension/src/common/protocol/arduino-daemon.ts @@ -5,14 +5,14 @@ export interface ArduinoDaemon { * Returns with a promise that resolves with the port * of the CLI daemon when it's up and running. */ - getPort(): Promise<string>; + getPort(): Promise<number>; /** * Unlike `getPort` this method returns with a promise * that resolves to `undefined` when the daemon is not running. * Otherwise resolves to the CLI daemon port. */ - tryGetPort(): Promise<string | undefined>; - start(): Promise<string>; + tryGetPort(): Promise<number | undefined>; + start(): Promise<number>; stop(): Promise<void>; - restart(): Promise<string>; + restart(): Promise<number>; } diff --git a/arduino-ide-extension/src/common/protocol/arduino-firmware-uploader.ts b/arduino-ide-extension/src/common/protocol/arduino-firmware-uploader.ts index 3cf9437d3..7e24afcb3 100644 --- a/arduino-ide-extension/src/common/protocol/arduino-firmware-uploader.ts +++ b/arduino-ide-extension/src/common/protocol/arduino-firmware-uploader.ts @@ -1,19 +1,24 @@ -import { Port } from "./boards-service"; +import type { Port } from './boards-service'; export const ArduinoFirmwareUploaderPath = '/services/arduino-firmware-uploader'; export const ArduinoFirmwareUploader = Symbol('ArduinoFirmwareUploader'); -export type FirmwareInfo = { +export interface FirmwareInfo { board_name: string; board_fqbn: string; module: string; firmware_version: string; Latest: boolean; -}; +} +export interface UploadCertificateParams { + readonly fqbn: string; + readonly address: string; + readonly urls: readonly string[]; +} export interface ArduinoFirmwareUploader { list(fqbn?: string): Promise<FirmwareInfo[]>; flash(firmware: FirmwareInfo, port: Port): Promise<string>; - uploadCertificates(command: string): Promise<any>; + uploadCertificates(params: UploadCertificateParams): Promise<unknown>; updatableBoards(): Promise<string[]>; availableFirmwares(fqbn: string): Promise<FirmwareInfo[]>; } diff --git a/arduino-ide-extension/src/common/protocol/authentication-service.ts b/arduino-ide-extension/src/common/protocol/authentication-service.ts index cb2c87e74..b53d1868e 100644 --- a/arduino-ide-extension/src/common/protocol/authentication-service.ts +++ b/arduino-ide-extension/src/common/protocol/authentication-service.ts @@ -1,5 +1,15 @@ import { JsonRpcServer } from '@theia/core/lib/common/messaging/proxy-factory'; -import { AuthOptions } from '../../node/auth/types'; +export const authServerPort = 9876; + +export interface AuthOptions { + redirectUri: string; + responseType: string; + clientID: string; + domain: string; + audience: string; + registerUri: string; + scopes: string[]; +} export interface AuthenticationSession { readonly id: string; diff --git a/arduino-ide-extension/src/common/protocol/board-list.ts b/arduino-ide-extension/src/common/protocol/board-list.ts new file mode 100644 index 000000000..f17bf0600 --- /dev/null +++ b/arduino-ide-extension/src/common/protocol/board-list.ts @@ -0,0 +1,707 @@ +import type { Mutable } from '@theia/core/lib/common/types'; +import { Unknown } from '../nls'; +import type { Defined } from '../types'; +import { naturalCompare } from '../utils'; +import { + BoardIdentifier, + boardIdentifierComparator, + boardIdentifierEquals, + BoardsConfig, + DetectedPort, + DetectedPorts, + emptyBoardsConfig, + findMatchingPortIndex, + isBoardIdentifier, + isDefinedBoardsConfig, + Port, + PortIdentifier, + portIdentifierEquals, + portProtocolComparator, + selectBoard, + unconfirmedBoard, + notConnected, + boardIdentifierLabel, +} from './boards-service'; + +/** + * Representation of a detected port with an optional board. + */ +export interface BoardListItem { + readonly port: Port; + readonly board?: BoardIdentifier; +} + +/** + * Representation of a detected port with multiple discovered boards on the same port. For example Arduino Nano ESP32 from `esp32:esp32:nano_nora` and `arduino:esp32:nano_nora`. + * If multiple boards are detected, but the board names are the same, the `board` will be the `first` element of the `boards` array. + * If multiple boards are detected, but the board names are not identical, the `board` will be missing. + */ +export interface MultiBoardsBoardListItem extends BoardListItem { + readonly boards: readonly BoardIdentifier[]; +} + +function findUniqueBoardName( + item: MultiBoardsBoardListItem +): string | undefined { + const distinctNames = new Set(item.boards.map(({ name }) => name)); + if (distinctNames.size === 1) { + const name = Array.from(distinctNames.keys()).shift(); + if (name) { + return name; + } + } + return undefined; +} + +export function isMultiBoardsBoardListItem( + arg: unknown +): arg is MultiBoardsBoardListItem { + return ( + isBoardListItem(arg) && + (<MultiBoardsBoardListItem>arg).boards !== undefined && + Array.isArray((<MultiBoardsBoardListItem>arg).boards) && + Boolean((<MultiBoardsBoardListItem>arg).boards.length) && + (<MultiBoardsBoardListItem>arg).boards.every(isBoardIdentifier) + ); +} + +/** + * Base inferred board list item type. + * The the type of the inferred board can be: + * - manually specified board for a detected port where no boards were discovered, + * - the board has been overridden for detected port discovered board pair. + */ +export type InferredBoardListItem = + | ManuallySelectedBoardListItem + | BoardOverriddenBoardListItem; + +/** + * No boards have been discovered for a detected port, it has been manually selected by the user. + */ +export interface ManuallySelectedBoardListItem extends BoardListItem { + readonly inferredBoard: BoardIdentifier; + readonly type: 'manually-selected'; +} + +/** + * One or more boards have been discovered for a detected port, but the board has been overridden by a manual action. + */ +export interface BoardOverriddenBoardListItem extends BoardListItem { + readonly inferredBoard: BoardIdentifier; + readonly board: BoardIdentifier; + readonly type: 'board-overridden'; +} + +export function isBoardListItem(arg: unknown): arg is BoardListItem { + return ( + Boolean(arg) && + typeof arg === 'object' && + (<BoardListItem>arg).port !== undefined && + Port.is((<BoardListItem>arg).port) && + ((<BoardListItem>arg).board === undefined || + ((<BoardListItem>arg).board !== undefined && + isBoardIdentifier((<BoardListItem>arg).board))) + ); +} + +export function boardListItemEquals( + left: BoardListItem, + right: BoardListItem +): boolean { + if (portIdentifierEquals(left.port, right.port)) { + const leftBoard = getBoardOrInferredBoard(left); + const rightBoard = getBoardOrInferredBoard(right); + if (boardIdentifierEquals(leftBoard, rightBoard)) { + const leftInferredBoard = getInferredBoardOrBoard(left); + const rightInferredBoard = getInferredBoardOrBoard(right); + return boardIdentifierEquals(leftInferredBoard, rightInferredBoard); + } + } + return false; +} + +export interface BoardListItemWithBoard extends BoardListItem { + readonly board: BoardIdentifier; +} + +function getBoardOrInferredBoard( + item: BoardListItem +): BoardIdentifier | undefined { + let board: BoardIdentifier | undefined = undefined; + board = item.board; + if (!board && isInferredBoardListItem(item)) { + board = item.inferredBoard; + } + return board; +} + +export function getInferredBoardOrBoard( + item: BoardListItem +): BoardIdentifier | undefined { + if (isInferredBoardListItem(item)) { + return item.inferredBoard; + } + return item.board; +} + +export function isInferredBoardListItem( + arg: unknown +): arg is InferredBoardListItem { + return ( + isBoardListItem(arg) && + (<InferredBoardListItem>arg).type !== undefined && + isInferenceType((<InferredBoardListItem>arg).type) && + (<InferredBoardListItem>arg).inferredBoard !== undefined && + isBoardIdentifier((<InferredBoardListItem>arg).inferredBoard) + ); +} + +/** + * Stores historical info about boards manually specified for detected boards. The key are generated with `Port#keyOf`. + */ +export type BoardListHistory = Readonly<Record<string, BoardIdentifier>>; + +export function isBoardListHistory(arg: unknown): arg is BoardListHistory { + return ( + Boolean(arg) && + typeof arg === 'object' && + Object.entries(<object>arg).every(([, value]) => isBoardIdentifier(value)) + ); +} + +const inferenceTypeLiterals = [ + /** + * The user has manually selected the board (FQBN) for the detected port of a 3rd party board (no matching boards were detected by the CLI for the port) + */ + 'manually-selected', + /** + * The user has manually edited the detected FQBN of a recognized board from a detected port (there are matching boards for a detected port, but the user decided to use another FQBN) + */ + 'board-overridden', +] as const; +type InferenceType = (typeof inferenceTypeLiterals)[number]; +function isInferenceType(arg: unknown): arg is InferenceType { + return ( + typeof arg === 'string' && + inferenceTypeLiterals.includes(<InferenceType>arg) + ); +} + +/** + * Compare precedence: + * 1. `BoardListItem#port#protocol`: `'serial'`, `'network'`, then natural compare of the `protocol` string. + * 1. `BoardListItem`s with a `board` comes before items without a `board`. + * 1. `BoardListItem#board`: + * 1. Items with `'arduino'` vendor ID in the `fqbn` come before other vendors. + * 1. Natural compare of the `name`. + * 1. If the `BoardListItem`s do not have a `board` property: + * 1. Ambiguous boards come before no boards. + * 1. `BoardListItem#port#address` natural compare is the fallback. + */ +function boardListItemComparator( + left: BoardListItem, + right: BoardListItem +): number { + // sort by port protocol + let result = portProtocolComparator(left.port, right.port); + if (result) { + return result; + } + + // compare by board + result = boardIdentifierComparator( + getBoardOrInferredBoard(left), + getBoardOrInferredBoard(right) + ); + if (result) { + return result; + } + + // detected ports with multiple discovered boards come before any other unknown items + if (isMultiBoardsBoardListItem(left) && !isMultiBoardsBoardListItem(right)) { + return -1; + } + if (!isMultiBoardsBoardListItem(left) && !isMultiBoardsBoardListItem(right)) { + return 1; + } + // ambiguous boards with a unique board name comes first than other ambiguous ones + if (isMultiBoardsBoardListItem(left) && isMultiBoardsBoardListItem(right)) { + const leftUniqueName = findUniqueBoardName(left); + const rightUniqueName = findUniqueBoardName(right); + if (leftUniqueName && !rightUniqueName) { + return -1; + } + if (!leftUniqueName && rightUniqueName) { + return 1; + } + if (leftUniqueName && rightUniqueName) { + return naturalCompare(leftUniqueName, rightUniqueName); + } + } + + // fallback compare based on the address + return naturalCompare(left.port.address, right.port.address); +} + +/** + * What is shown in the UI for the entire board list. + */ +export interface BoardListLabels { + readonly boardLabel: string; + readonly portProtocol: string | undefined; + readonly tooltip: string; + /** + * The client's board+port selection matches with one of the board list items. + */ + readonly selected: boolean; +} + +function createBoardListLabels( + boardsConfig: BoardsConfig, + allPorts: readonly DetectedPort[], + selectedItem: BoardListItem | undefined +): BoardListLabels { + const { selectedBoard, selectedPort } = boardsConfig; + const boardLabel = selectedBoard?.name || selectBoard; + let tooltip = ''; + if (!selectedBoard && !selectedPort) { + tooltip = selectBoard; + } else { + if (selectedBoard) { + tooltip += boardIdentifierLabel(selectedBoard); + } + if (selectedPort) { + if (tooltip) { + tooltip += '\n'; + } + tooltip += selectedPort.address; + const index = findMatchingPortIndex(selectedPort, allPorts); + if (index < 0) { + tooltip += ` ${notConnected}`; + } + } + } + return { + boardLabel, + portProtocol: selectedBoard ? selectedPort?.protocol : undefined, + tooltip, + selected: Boolean(selectedItem), + }; +} + +/** + * What is show in the UI for a particular board with all its refinements, fallbacks, and tooltips. + */ +export interface BoardListItemLabels { + readonly boardLabel: string; + readonly boardLabelWithFqbn: string; + readonly portLabel: string; + readonly portProtocol: string; + readonly tooltip: string; +} + +export interface BoardListItemUI extends BoardListItem { + readonly labels: BoardListItemLabels; + readonly defaultAction: BoardListItemAction; + readonly otherActions: Readonly<{ + edit?: EditBoardsConfigAction; + revert?: SelectBoardsConfigAction; + }>; +} + +function createBoardListItemLabels(item: BoardListItem): BoardListItemLabels { + const { port } = item; + const portLabel = port.address; + const portProtocol = port.protocol; + let board = item.board; // use default board label if any + if (isInferredBoardListItem(item)) { + board = item.inferredBoard; // inferred board overrides any discovered boards + } + // if the board is still missing, maybe it's ambiguous + if (!board && isMultiBoardsBoardListItem(item)) { + const name = + // get a unique board name + findUniqueBoardName(item) ?? + // or fall back to something else than unknown board + unconfirmedBoard; + board = { name, fqbn: undefined }; + } + const boardLabel = board?.name ?? Unknown; + let boardLabelWithFqbn = boardLabel; + if (board?.fqbn) { + boardLabelWithFqbn += ` (${board.fqbn})`; + } + return { + boardLabel, + boardLabelWithFqbn, + portLabel, + portProtocol, + tooltip: `${boardLabelWithFqbn}\n${portLabel}`, + }; +} + +/** + * A list of boards discovered by the Arduino CLI. With the `board list --watch` gRPC equivalent command, + * the CLI provides a `1..*` mapping between a port and the matching boards list. This type inverts the mapping + * and makes a `1..1` association between a board identifier and the port it belongs to. + */ +export interface BoardList { + readonly labels: BoardListLabels; + /** + * All detected ports with zero to many boards and optional inferred information based on historical selection/usage. + */ + readonly items: readonly BoardListItemUI[]; + /** + * A snapshot of the board and port configuration this board list has been initialized with. + */ + readonly boardsConfig: Readonly<BoardsConfig>; + + /** + * Index of the board+port item that is currently "selected". A board list item is selected, if matches the board+port combination of `boardsConfig`. + */ + readonly selectedIndex: number; + + /** + * Contains all the following board+port pairs: + * - one discovered board on a detected board (`1`), + * - manually selected or overridden board for a detected port (`1`), + * - multiple discovered boards on detected port (`1..*`) + */ + readonly boards: readonly BoardListItemWithBoard[]; + + /** + * If `predicate` is not defined, no ports are filtered. + */ + ports( + predicate?: (detectedPort: DetectedPort) => boolean + ): readonly DetectedPort[] & Readonly<{ matchingIndex: number }>; + + /** + * Sugar for `#ports` with additional grouping based on the port `protocol`. + */ + portsGroupedByProtocol(): Readonly< + Record<'serial' | 'network' | string, ReturnType<BoardList['ports']>> + >; + + /** + * For dumping the current state of board list for debugging purposes. + */ + toString(): string; +} + +export type SelectBoardsConfigActionParams = Readonly<Defined<BoardsConfig>>; +export interface SelectBoardsConfigAction { + readonly type: 'select-boards-config'; + readonly params: SelectBoardsConfigActionParams; +} +export interface EditBoardsConfigActionParams { + readonly portToSelect?: PortIdentifier; + readonly boardToSelect?: BoardIdentifier; + readonly query?: string; + readonly searchSet?: readonly BoardIdentifier[]; +} +export interface EditBoardsConfigAction { + readonly type: 'edit-boards-config'; + readonly params: EditBoardsConfigActionParams; +} +export type BoardListItemAction = + | SelectBoardsConfigAction + | EditBoardsConfigAction; + +export function createBoardList( + detectedPorts: DetectedPorts, + boardsConfig: Readonly<BoardsConfig> = emptyBoardsConfig(), + boardListHistory: BoardListHistory = {} +): BoardList { + const items: BoardListItemUI[] = []; + for (const detectedPort of Object.values(detectedPorts)) { + const item = createBoardListItemUI(detectedPort, boardListHistory); + items.push(item); + } + items.sort(boardListItemComparator); + const selectedIndex = findSelectedIndex(boardsConfig, items); + const boards = collectBoards(items); + const allPorts = collectPorts(items, detectedPorts); + const labels = createBoardListLabels( + boardsConfig, + allPorts, + items[selectedIndex] + ); + return { + labels, + items, + boardsConfig, + boards, + selectedIndex, + ports(predicate?: (detectedPort: DetectedPort) => boolean) { + return filterPorts(allPorts, boardsConfig.selectedPort, predicate); + }, + portsGroupedByProtocol() { + const _allPorts = filterPorts(allPorts, boardsConfig.selectedPort); + return portsGroupedByProtocol(_allPorts); + }, + toString() { + return JSON.stringify( + { + labels, + detectedPorts, + boardsConfig, + items, + selectedIndex, + boardListHistory, + }, + null, + 2 + ); + }, + }; +} + +function portsGroupedByProtocol( + allPorts: ReturnType<BoardList['ports']> +): ReturnType<BoardList['portsGroupedByProtocol']> { + const result: Record<string, DetectedPort[] & { matchingIndex: number }> = {}; + for (const detectedPort of allPorts) { + const protocol = detectedPort.port.protocol; + if (!result[protocol]) { + result[protocol] = Object.assign([], { + matchingIndex: -1, + }); + } + const portsOnProtocol = result[protocol]; + portsOnProtocol.push(detectedPort); + } + const matchItem = allPorts[allPorts.matchingIndex]; + // the cached match index is per all ports. Here, IDE2 needs to adjust the match index per grouped protocol + if (matchItem) { + const matchProtocol = matchItem.port.protocol; + const matchPorts = result[matchProtocol]; + matchPorts.matchingIndex = matchPorts.indexOf(matchItem); + } + return result; +} + +function filterPorts( + allPorts: readonly DetectedPort[], + selectedPort: PortIdentifier | undefined, + predicate: (detectedPort: DetectedPort) => boolean = () => true +): ReturnType<BoardList['ports']> { + const ports = allPorts.filter(predicate); + const matchingIndex = findMatchingPortIndex(selectedPort, ports); + return Object.assign(ports, { matchingIndex }); +} + +function collectPorts( + items: readonly BoardListItem[], + detectedPorts: DetectedPorts +): DetectedPort[] { + const allPorts: DetectedPort[] = []; + // to keep the order or the detected ports + const visitedPortKeys = new Set<string>(); + for (let i = 0; i < items.length; i++) { + const { port } = items[i]; + const portKey = Port.keyOf(port); + if (!visitedPortKeys.has(portKey)) { + visitedPortKeys.add(portKey); + const detectedPort = detectedPorts[portKey]; + if (detectedPort) { + allPorts.push(detectedPort); + } + } + } + return allPorts; +} + +function collectBoards( + items: readonly BoardListItem[] +): readonly BoardListItemWithBoard[] { + const result: BoardListItemWithBoard[] = []; + for (let i = 0; i < items.length; i++) { + const boards: BoardListItemWithBoard[] = []; + const item = items[i]; + const { port } = item; + const board = getInferredBoardOrBoard(item); + if (board) { + boards.push({ board, port }); + } + if (isMultiBoardsBoardListItem(item)) { + for (const otherBoard of item.boards) { + if (!boardIdentifierEquals(board, otherBoard)) { + boards.push({ board: otherBoard, port }); + } + } + } + boards.sort(boardListItemComparator); + result.push(...boards); + } + return result; +} + +function findSelectedIndex( + boardsConfig: BoardsConfig, + items: readonly BoardListItem[] +): number { + if (!isDefinedBoardsConfig(boardsConfig)) { + return -1; + } + const length = items.length; + const { selectedPort, selectedBoard } = boardsConfig; + const portKey = Port.keyOf(selectedPort); + // find the exact match of the board and port combination + for (let index = 0; index < length; index++) { + const item = items[index]; + const { board, port } = item; + if (!board) { + continue; + } + if ( + Port.keyOf(port) === portKey && + boardIdentifierEquals(board, selectedBoard) + ) { + return index; + } + } + // find match from inferred board + for (let index = 0; index < length; index++) { + const item = items[index]; + if (!isInferredBoardListItem(item)) { + continue; + } + const { inferredBoard, port } = item; + if ( + Port.keyOf(port) === portKey && + boardIdentifierEquals(inferredBoard, boardsConfig.selectedBoard) + ) { + return index; + } + } + return -1; +} + +function createBoardListItemUI( + detectedPort: DetectedPort, + boardListHistory: BoardListHistory +): BoardListItemUI { + const item = createBoardListItem(detectedPort, boardListHistory); + const labels = createBoardListItemLabels(item); + const defaultAction = createDefaultAction(item); + const otherActions = createOtherActions(item); + return Object.assign(item, { labels, defaultAction, otherActions }); +} + +function createBoardListItem( + detectedPort: DetectedPort, + boardListHistory: BoardListHistory +): BoardListItem { + const { port, boards } = detectedPort; + // boards with arduino vendor should come first + boards?.sort(boardIdentifierComparator); + const portKey = Port.keyOf(port); + const inferredBoard = boardListHistory[portKey]; + if (!boards?.length) { + let unknownItem: BoardListItem | InferredBoardListItem = { port }; + // Infer unrecognized boards from the history + if (inferredBoard) { + unknownItem = { + ...unknownItem, + inferredBoard, + type: 'manually-selected', + }; + } + return unknownItem; + } else if (boards.length === 1) { + const board = boards[0]; + let detectedItem: BoardListItemWithBoard | InferredBoardListItem = { + port, + board, + }; + if ( + inferredBoard && + // ignore the inferred item if it's the same as the discovered board + !boardIdentifierEquals(board, inferredBoard) + ) { + detectedItem = { + ...detectedItem, + inferredBoard, + type: 'board-overridden', + }; + } + return detectedItem; + } else { + let ambiguousItem: MultiBoardsBoardListItem | InferredBoardListItem = { + port, + boards, + }; + if (inferredBoard) { + ambiguousItem = { + ...ambiguousItem, + inferredBoard, + type: 'manually-selected', + }; + } + return ambiguousItem; + } +} + +function createDefaultAction(item: BoardListItem): BoardListItemAction { + if (isInferredBoardListItem(item)) { + return createSelectAction({ + selectedBoard: item.inferredBoard, + selectedPort: item.port, + }); + } + if (item.board) { + return createSelectAction({ + selectedBoard: item.board, + selectedPort: item.port, + }); + } + return createEditAction(item); +} + +function createOtherActions( + item: BoardListItem +): BoardListItemUI['otherActions'] { + if (isInferredBoardListItem(item)) { + const edit = createEditAction(item); + if (item.type === 'board-overridden') { + const revert = createSelectAction({ + selectedBoard: item.board, + selectedPort: item.port, + }); + return { edit, revert }; + } + return { edit }; + } + return {}; +} + +function createSelectAction( + params: SelectBoardsConfigActionParams +): SelectBoardsConfigAction { + return { + type: 'select-boards-config', + params, + }; +} + +function createEditAction(item: BoardListItem): EditBoardsConfigAction { + const params: Mutable<EditBoardsConfigActionParams> = { + portToSelect: item.port, + }; + if (isMultiBoardsBoardListItem(item)) { + const uniqueBoardName = findUniqueBoardName(item); + params.query = uniqueBoardName ?? ''; + params.searchSet = item.boards; + } else if (isInferredBoardListItem(item)) { + params.query = item.inferredBoard.name; + } else if (item.board) { + params.query = item.board.name; + } else { + params.query = ''; + } + return { + type: 'edit-boards-config', + params, + }; +} diff --git a/arduino-ide-extension/src/common/protocol/boards-service.ts b/arduino-ide-extension/src/common/protocol/boards-service.ts index 7be49725e..a97dc9057 100644 --- a/arduino-ide-extension/src/common/protocol/boards-service.ts +++ b/arduino-ide-extension/src/common/protocol/boards-service.ts @@ -1,132 +1,54 @@ +import { nls } from '@theia/core/lib/common/nls'; +import { FQBN } from 'fqbn'; +import type { MaybePromise } from '@theia/core/lib/common/types'; +import type URI from '@theia/core/lib/common/uri'; +import { + All, + Contributed, + Partner, + Type as TypeLabel, + Updatable, +} from '../nls'; +import type { Defined } from '../types'; import { naturalCompare } from './../utils'; -import { Searchable } from './searchable'; +import type { ArduinoComponent } from './arduino-component'; +import type { BoardList } from './board-list'; import { Installable } from './installable'; -import { ArduinoComponent } from './arduino-component'; -import { nls } from '@theia/core/lib/common/nls'; -import { All, Contributed, Partner, Type, Updatable } from '../nls'; - -export type AvailablePorts = Record<string, [Port, Array<Board>]>; -export namespace AvailablePorts { - export function groupByProtocol( - availablePorts: AvailablePorts - ): Map<string, AvailablePorts> { - const grouped = new Map<string, AvailablePorts>(); - for (const portID of Object.keys(availablePorts)) { - const [port, boards] = availablePorts[portID]; - let ports = grouped.get(port.protocol); - if (!ports) { - ports = {} as AvailablePorts; - } - ports[portID] = [port, boards]; - grouped.set(port.protocol, ports); - } - return grouped; - } - export function split( - state: AvailablePorts - ): Readonly<{ boards: Board[]; ports: Port[] }> { - const availablePorts: Port[] = []; - const attachedBoards: Board[] = []; - for (const key of Object.keys(state)) { - const [port, boards] = state[key]; - availablePorts.push(port); - attachedBoards.push(...boards); - } - return { - boards: attachedBoards, - ports: availablePorts, - }; - } -} +import { Searchable } from './searchable'; -export interface AttachedBoardsChangeEvent { - readonly oldState: Readonly<{ boards: Board[]; ports: Port[] }>; - readonly newState: Readonly<{ boards: Board[]; ports: Port[] }>; - readonly uploadInProgress: boolean; +export interface DetectedPort { + readonly port: Port; + readonly boards?: Pick<Board, 'name' | 'fqbn'>[]; } -export namespace AttachedBoardsChangeEvent { - export function isEmpty(event: AttachedBoardsChangeEvent): boolean { - const { detached, attached } = diff(event); - return ( - !!detached.boards.length && - !!detached.ports.length && - !!attached.boards.length && - !!attached.ports.length - ); - } - export function toString(event: AttachedBoardsChangeEvent): string { - const rows: string[] = []; - if (!isEmpty(event)) { - const { attached, detached } = diff(event); - const visitedAttachedPorts: Port[] = []; - const visitedDetachedPorts: Port[] = []; - for (const board of attached.boards) { - const port = board.port ? ` on ${Port.toString(board.port)}` : ''; - rows.push(` - Attached board: ${Board.toString(board)}${port}`); - if (board.port) { - visitedAttachedPorts.push(board.port); - } - } - for (const board of detached.boards) { - const port = board.port ? ` from ${Port.toString(board.port)}` : ''; - rows.push(` - Detached board: ${Board.toString(board)}${port}`); - if (board.port) { - visitedDetachedPorts.push(board.port); - } - } - for (const port of attached.ports) { - if (!visitedAttachedPorts.find((p) => Port.sameAs(port, p))) { - rows.push(` - New port is available on ${Port.toString(port)}`); - } - } - for (const port of detached.ports) { - if (!visitedDetachedPorts.find((p) => Port.sameAs(port, p))) { - rows.push(` - Port is no longer available on ${Port.toString(port)}`); - } - } - } - return rows.length ? rows.join('\n') : 'No changes.'; +export function findMatchingPortIndex( + toFind: PortIdentifier | undefined, + ports: readonly DetectedPort[] | readonly Port[] +): number { + if (!toFind) { + return -1; } + const toFindPortKey = Port.keyOf(toFind); + return ports.findIndex((port) => Port.keyOf(port) === toFindPortKey); +} - export function diff(event: AttachedBoardsChangeEvent): Readonly<{ - attached: { - boards: Board[]; - ports: Port[]; - }; - detached: { - boards: Board[]; - ports: Port[]; - }; - }> { - // In `lefts` AND not in `rights`. - const diff = <T>( - lefts: T[], - rights: T[], - sameAs: (left: T, right: T) => boolean - ) => { - return lefts.filter( - (left) => rights.findIndex((right) => sameAs(left, right)) === -1 - ); - }; - const { boards: newBoards } = event.newState; - const { boards: oldBoards } = event.oldState; - const { ports: newPorts } = event.newState; - const { ports: oldPorts } = event.oldState; - const boardSameAs = (left: Board, right: Board) => - Board.sameAs(left, right); - const portSameAs = (left: Port, right: Port) => Port.sameAs(left, right); - return { - detached: { - boards: diff(oldBoards, newBoards, boardSameAs), - ports: diff(oldPorts, newPorts, portSameAs), - }, - attached: { - boards: diff(newBoards, oldBoards, boardSameAs), - ports: diff(newPorts, oldPorts, portSameAs), - }, - }; +/** + * The closest representation what the Arduino CLI detects with the `board list --watch` gRPC equivalent. + * The keys are unique identifiers generated from the port object (via `Port#keyOf`). + * The values are the detected ports with all their optional `properties` and matching board list. + */ +export type DetectedPorts = Readonly<Record<string, DetectedPort>>; + +export function resolveDetectedPort( + port: PortIdentifier, + detectedPorts: DetectedPorts +): Port | undefined { + const portKey = Port.keyOf(port); + const detectedPort = detectedPorts[portKey]; + if (detectedPort) { + return detectedPort.port; } + return undefined; } export const BoardsServicePath = '/services/boards-service'; @@ -134,23 +56,60 @@ export const BoardsService = Symbol('BoardsService'); export interface BoardsService extends Installable<BoardsPackage>, Searchable<BoardsPackage, BoardSearch> { - getState(): Promise<AvailablePorts>; - getBoardDetails(options: { fqbn: string }): Promise<BoardDetails | undefined>; - getBoardPackage(options: { id: string }): Promise<BoardsPackage | undefined>; + install(options: { + item: BoardsPackage; + progressId?: string; + version?: Installable.Version; + noOverwrite?: boolean; + /** + * Only for testing to avoid confirmation dialogs from Windows User Access Control when installing a platform. + */ + skipPostInstall?: boolean; + }): Promise<void>; + getDetectedPorts(): Promise<DetectedPorts>; + getBoardDetails(options: { + fqbn: string; + forceRefresh?: boolean; + }): Promise<BoardDetails | undefined>; + getBoardPackage(options: { + id: string /* TODO: change to PlatformIdentifier type? */; + }): Promise<BoardsPackage | undefined>; getContainerBoardPackage(options: { fqbn: string; }): Promise<BoardsPackage | undefined>; searchBoards({ query }: { query?: string }): Promise<BoardWithPackage[]>; + getInstalledBoards(): Promise<BoardWithPackage[]>; + /** + * Returns with all installed platforms including the manually installed ones. + */ + getInstalledPlatforms(): Promise<BoardsPackage[]>; getBoardUserFields(options: { fqbn: string; protocol: string; }): Promise<BoardUserField[]>; + /** + * Checks whether the debugging is enabled with the FQBN, programmer, current sketch, and custom board options. + * + * When the debugging is enabled, the promise resolves with the FQBN to use with the debugger. This is the same + * FQBN given in the `CheckDebugEnabledParams#fqbn` but cleaned up of the board options that do not affect the debugger configuration. + * It may be used by clients/IDE to group slightly different boards option selections under the same debug configuration. + */ + checkDebugEnabled(params: CheckDebugEnabledParams): Promise<string>; +} + +export interface CheckDebugEnabledParams { + /** + * The FQBN might contain custom board config options. For example, `arduino:esp32:nano_nora:USBMode=hwcdc,option2=value2`. + */ + readonly fqbn: string; + readonly programmer?: string; } export interface BoardSearch extends Searchable.Options { readonly type?: BoardSearch.Type; } export namespace BoardSearch { + export const Default: BoardSearch = { type: 'All' }; export const TypeLiterals = [ 'All', 'Updatable', @@ -160,7 +119,12 @@ export namespace BoardSearch { 'Partner', 'Arduino@Heart', ] as const; - export type Type = typeof TypeLiterals[number]; + export type Type = (typeof TypeLiterals)[number]; + export namespace Type { + export function is(arg: unknown): arg is Type { + return typeof arg === 'string' && TypeLiterals.includes(arg as Type); + } + } export const TypeLabels: Record<Type, string> = { All: All, Updatable: Updatable, @@ -177,8 +141,41 @@ export namespace BoardSearch { keyof Omit<BoardSearch, 'query'>, string > = { - type: Type, + type: TypeLabel, }; + export namespace UriParser { + export const authority = 'boardsmanager'; + export function parse(uri: URI): BoardSearch | undefined { + if (uri.scheme !== 'http') { + throw new Error( + `Invalid 'scheme'. Expected 'http'. URI was: ${uri.toString()}.` + ); + } + if (uri.authority !== authority) { + throw new Error( + `Invalid 'authority'. Expected: '${authority}'. URI was: ${uri.toString()}.` + ); + } + const segments = Searchable.UriParser.normalizedSegmentsOf(uri); + if (segments.length !== 1) { + return undefined; + } + let searchOptions: BoardSearch | undefined = undefined; + const [type] = segments; + if (!type) { + searchOptions = BoardSearch.Default; + } else if (BoardSearch.Type.is(type)) { + searchOptions = { type }; + } + if (searchOptions) { + return { + ...searchOptions, + ...Searchable.UriParser.parseQuery(uri), + }; + } + return undefined; + } + } } export interface Port { @@ -187,15 +184,16 @@ export interface Port { readonly protocol: string; readonly protocolLabel: string; readonly properties?: Record<string, string>; + readonly hardwareId?: string; } export namespace Port { export type Properties = Record<string, string>; export namespace Properties { export function create( properties: [string, string][] | undefined - ): Properties { - if (!properties) { - return {}; + ): Properties | undefined { + if (!properties || !properties.length) { + return undefined; } return properties.reduce((acc, curr) => { const [key, value] = curr; @@ -223,10 +221,13 @@ export namespace Port { } /** - * Key is the combination of address and protocol formatted like `'${address}|${protocol}'` used to uniquely identify a port. + * Key is the combination of address and protocol formatted like `'arduino+${protocol}://${address}'` used to uniquely identify a port. */ - export function keyOf({ address, protocol }: Port): string { - return `${address}|${protocol}`; + export function keyOf(port: PortIdentifier | Port | DetectedPort): string { + if (isPortIdentifier(port)) { + return `arduino+${port.protocol}://${port.address}`; + } + return keyOf(port.port); } export function toString({ addressLabel, protocolLabel }: Port): string { @@ -238,16 +239,8 @@ export namespace Port { // 1. Serial // 2. Network // 3. Other protocols - if (left.protocol === 'serial' && right.protocol !== 'serial') { - return -1; - } else if (left.protocol !== 'serial' && right.protocol === 'serial') { - return 1; - } else if (left.protocol === 'network' && right.protocol !== 'network') { - return -1; - } else if (left.protocol !== 'network' && right.protocol === 'network') { - return 1; - } - return naturalCompare(left.address!, right.address!); + const priorityResult = portProtocolComparator(left, right); + return priorityResult || naturalCompare(left.address, right.address); } export function sameAs( @@ -265,25 +258,41 @@ export namespace Port { /** * All ports with `'serial'` or `'network'` `protocol`, or any other port `protocol` that has at least one recognized board connected to. */ - export function visiblePorts( - boardsHaystack: ReadonlyArray<Board> - ): (port: Port) => boolean { - return (port: Port) => { - if (port.protocol === 'serial' || port.protocol === 'network') { - // Allow all `serial` and `network` boards. - // IDE2 must support better label for unrecognized `network` boards: https://github.com/arduino/arduino-ide/issues/1331 - return true; - } - // All other ports with different protocol are - // only shown if there is a recognized board - // connected - for (const board of boardsHaystack) { - if (board.port?.address === port.address) { - return true; - } + export function isVisiblePort(detectedPort: DetectedPort): boolean { + const protocol = detectedPort.port.protocol; + if (protocol === 'serial' || protocol === 'network') { + // Allow all `serial` and `network` boards. + // IDE2 must support better label for unrecognized `network` boards: https://github.com/arduino/arduino-ide/issues/1331 + return true; + } + // All other ports with different protocol are + // only shown if there is a recognized board + // connected + return Boolean(detectedPort?.boards?.length); + } + + export namespace Protocols { + // IDE2 does not want to handle any other port protocols in a special way + export const KnownProtocolLiterals = ['serial', 'network'] as const; + export type KnownProtocol = (typeof KnownProtocolLiterals)[number]; + export namespace KnownProtocol { + export function is(protocol: unknown): protocol is KnownProtocol { + return ( + typeof protocol === 'string' && + KnownProtocolLiterals.includes(protocol as KnownProtocol) + ); } - return false; + } + export const ProtocolLabels: Record<KnownProtocol, string> = { + serial: nls.localize('arduino/portProtocol/serial', 'Serial'), + network: nls.localize('arduino/portProtocol/network', 'Network'), }; + export function protocolLabel(protocol: string): string { + if (KnownProtocol.is(protocol)) { + return ProtocolLabels[protocol]; + } + return protocol; + } } } @@ -295,29 +304,12 @@ export namespace BoardsPackage { export function equals(left: BoardsPackage, right: BoardsPackage): boolean { return left.id === right.id; } - - export function contains( - selectedBoard: Board, - { id, boards }: BoardsPackage - ): boolean { - if (boards.some((board) => Board.sameAs(board, selectedBoard))) { - return true; - } - if (selectedBoard.fqbn) { - const [platform, architecture] = selectedBoard.fqbn.split(':'); - if (platform && architecture) { - return `${platform}:${architecture}` === id; - } - } - return false; - } } -export interface Board { - readonly name: string; - readonly fqbn?: string; - readonly port?: Port; -} +/** + * @deprecated user `BoardIdentifier` instead. + */ +export type Board = BoardIdentifier; export interface BoardUserField { readonly toolId: string; @@ -329,14 +321,19 @@ export interface BoardUserField { export interface BoardWithPackage extends Board { readonly packageName: string; - readonly packageId: string; + readonly packageId: PlatformIdentifier; readonly manuallyInstalled: boolean; } export namespace BoardWithPackage { - export function is( - board: Board & Partial<{ packageName: string; packageId: string }> - ): board is BoardWithPackage { - return !!board.packageId && !!board.packageName; + export function is(arg: unknown): arg is BoardWithPackage { + return ( + isBoardIdentifier(arg) && + (<BoardWithPackage>arg).packageName !== undefined && + typeof (<BoardWithPackage>arg).packageName === 'string' && + isPlatformIdentifier((<BoardWithPackage>arg).packageId) && + (<BoardWithPackage>arg).manuallyInstalled !== undefined && + typeof (<BoardWithPackage>arg).manuallyInstalled === 'boolean' + ); } } @@ -356,9 +353,10 @@ export interface BoardDetails { readonly requiredTools: Tool[]; readonly configOptions: ConfigOption[]; readonly programmers: Programmer[]; - readonly debuggingSupported: boolean; readonly VID: string; readonly PID: string; + readonly buildProperties: string[]; + readonly defaultProgrammerId?: string; } export interface Tool { @@ -373,52 +371,6 @@ export interface ConfigOption { readonly values: ConfigValue[]; } export namespace ConfigOption { - export function is(arg: any): arg is ConfigOption { - return ( - !!arg && - 'option' in arg && - 'label' in arg && - 'values' in arg && - typeof arg['option'] === 'string' && - typeof arg['label'] === 'string' && - Array.isArray(arg['values']) - ); - } - - /** - * Appends the configuration options to the `fqbn` argument. - * Throws an error if the `fqbn` does not have the `segment(':'segment)*` format. - * The provided output format is always segment(':'segment)*(':'option'='value(','option'='value)*)? - */ - export function decorate( - fqbn: string, - configOptions: ConfigOption[] - ): string { - if (!configOptions.length) { - return fqbn; - } - - const toValue = (values: ConfigValue[]) => { - const selectedValue = values.find(({ selected }) => selected); - if (!selectedValue) { - console.warn( - `None of the config values was selected. Values were: ${JSON.stringify( - values - )}` - ); - return undefined; - } - return selectedValue.value; - }; - const options = configOptions - .map(({ option, values }) => [option, toValue(values)]) - .filter(([, value]) => !!value) - .map(([option, value]) => `${option}=${value}`) - .join(','); - - return `${fqbn}:${options}`; - } - export class ConfigOptionError extends Error { constructor(message: string) { super(message); @@ -462,6 +414,18 @@ export namespace Programmer { ); } } +export function isProgrammer(arg: unknown): arg is Programmer { + return ( + typeof arg === 'object' && + arg !== null && + (<Programmer>arg).id !== undefined && + typeof (<Programmer>arg).id === 'string' && + (<Programmer>arg).name !== undefined && + typeof (<Programmer>arg).name === 'string' && + (<Programmer>arg).platform !== undefined && + typeof (<Programmer>arg).platform === 'string' + ); +} export namespace Board { export function is(board: any): board is Board { @@ -472,11 +436,15 @@ export namespace Board { return left.name === right.name && left.fqbn === right.fqbn; } - export function sameAs(left: Board, right: string | Board): boolean { + export function sameAs( + left: BoardIdentifier, + right: string | BoardIdentifier + ): boolean { // How to associate a selected board with one of the available cores: https://typefox.slack.com/archives/CJJHJCJSJ/p1571142327059200 // 1. How to use the FQBN if any and infer the package ID from it: https://typefox.slack.com/archives/CJJHJCJSJ/p1571147549069100 // 2. How to trim the `/Genuino` from the name: https://arduino.slack.com/archives/CJJHJCJSJ/p1571146951066800?thread_ts=1571142327.059200&cid=CJJHJCJSJ - const other = typeof right === 'string' ? { name: right } : right; + const other: BoardIdentifier = + typeof right === 'string' ? { name: right, fqbn: undefined } : right; if (left.fqbn && other.fqbn) { return left.fqbn === other.fqbn; } @@ -498,7 +466,7 @@ export namespace Board { } export function toString( - board: Board, + board: BoardIdentifier, options: { useFqbn: boolean } = { useFqbn: true } ): string { const fqbn = @@ -511,14 +479,15 @@ export namespace Board { selected: boolean; missing: boolean; packageName: string; - packageId: string; + packageId: PlatformIdentifier; details?: string; manuallyInstalled: boolean; }>; export function decorateBoards( - selectedBoard: Board | undefined, + selectedBoard: BoardIdentifier | BoardWithPackage | undefined, boards: Array<BoardWithPackage> ): Array<Detailed> { + let foundSelected = false; // Board names are not unique. We show the corresponding core name as a detail. // https://github.com/arduino/arduino-cli/pull/294#issuecomment-513764948 const distinctBoardNames = new Map<string, number>(); @@ -526,21 +495,42 @@ export namespace Board { const counter = distinctBoardNames.get(name) || 0; distinctBoardNames.set(name, counter + 1); } - - // Due to the non-unique board names, we have to check the package name as well. - const selected = (board: BoardWithPackage) => { - if (!!selectedBoard) { - if (Board.equals(board, selectedBoard)) { - if ('packageName' in selectedBoard) { - return board.packageName === (selectedBoard as any).packageName; - } - if ('packageId' in selectedBoard) { - return board.packageId === (selectedBoard as any).packageId; + const selectedBoardPackageId = selectedBoard + ? createPlatformIdentifier(selectedBoard) + : undefined; + const selectedBoardFqbn = selectedBoard?.fqbn; + // Due to the non-unique board names, IDE2 has to check the package name when boards are not installed and the FQBN is absent. + const isSelected = (board: BoardWithPackage) => { + if (!selectedBoard) { + return false; + } + if (foundSelected) { + return false; + } + let selected = false; + if (board.fqbn && selectedBoardFqbn) { + if (boardIdentifierEquals(board, selectedBoard)) { + selected = true; + } + } + if (!selected) { + if (board.name === selectedBoard.name) { + if (selectedBoardPackageId) { + const boardPackageId = createPlatformIdentifier(board); + if (boardPackageId) { + if ( + platformIdentifierEquals(boardPackageId, selectedBoardPackageId) + ) { + selected = true; + } + } } - return true; } } - return false; + if (selected) { + foundSelected = true; + } + return selected; }; return boards.map((board) => ({ ...board, @@ -548,8 +538,384 @@ export namespace Board { (distinctBoardNames.get(board.name) || 0) > 1 ? ` - ${board.packageName}` : undefined, - selected: selected(board), + selected: isSelected(board), missing: !installed(board), })); } } + +/** + * Converts the `VENDOR:ARCHITECTURE:BOARD_ID[:MENU_ID=OPTION_ID[,MENU2_ID=OPTION_ID ...]]` FQBN to + * `VENDOR:ARCHITECTURE:BOARD_ID` format. + * See the details of the `{build.fqbn}` entry in the [specs](https://arduino.github.io/arduino-cli/latest/platform-specification/#global-predefined-properties). + */ +export function sanitizeFqbn(fqbn: string): string { + return new FQBN(fqbn).sanitize().toString(); +} + +export type PlatformIdentifier = Readonly<{ vendorId: string; arch: string }>; +export function createPlatformIdentifier( + board: BoardWithPackage +): PlatformIdentifier; +export function createPlatformIdentifier( + board: BoardIdentifier +): PlatformIdentifier | undefined; +export function createPlatformIdentifier( + fqbn: string +): PlatformIdentifier | undefined; +export function createPlatformIdentifier( + arg: BoardIdentifier | BoardWithPackage | string +): PlatformIdentifier | undefined { + if (BoardWithPackage.is(arg)) { + return arg.packageId; + } + const toSplit = typeof arg === 'string' ? arg : arg.fqbn; + if (toSplit) { + const [vendorId, arch] = toSplit.split(':'); + if (vendorId && arch) { + return { vendorId, arch }; + } + } + return undefined; +} + +export function isPlatformIdentifier(arg: unknown): arg is PlatformIdentifier { + return ( + Boolean(arg) && + typeof arg === 'object' && + (<PlatformIdentifier>arg).vendorId !== undefined && + typeof (<PlatformIdentifier>arg).vendorId === 'string' && + (<PlatformIdentifier>arg).arch !== undefined && + typeof (<PlatformIdentifier>arg).arch === 'string' + ); +} + +export function serializePlatformIdentifier({ + vendorId, + arch, +}: PlatformIdentifier): string { + return `${vendorId}:${arch}`; +} + +export function platformIdentifierEquals( + left: PlatformIdentifier, + right: PlatformIdentifier +) { + return left.vendorId === right.vendorId && left.arch === right.arch; +} + +/** + * Bare minimum information to identify port. + */ +export type PortIdentifier = Readonly<Pick<Port, 'protocol' | 'address'>>; + +export function portIdentifierEquals( + left: PortIdentifier | undefined, + right: PortIdentifier | undefined +): boolean { + if (!left) { + return !right; + } + if (!right) { + return !left; + } + return left.protocol === right.protocol && left.address === right.address; +} + +export function isPortIdentifier(arg: unknown): arg is PortIdentifier { + return ( + Boolean(arg) && + typeof arg === 'object' && + (<PortIdentifier>arg).protocol !== undefined && + typeof (<PortIdentifier>arg).protocol === 'string' && + (<PortIdentifier>arg).address !== undefined && + typeof (<PortIdentifier>arg).address === 'string' + ); +} + +// the smaller the number, the higher the priority +const portProtocolPriorities: Record<string, number> = { + serial: 0, + network: 1, +} as const; + +/** + * See `boardListItemComparator`. + */ +export function portProtocolComparator( + left: PortIdentifier, + right: PortIdentifier +): number { + const leftPriority = + portProtocolPriorities[left.protocol] ?? Number.MAX_SAFE_INTEGER; + const rightPriority = + portProtocolPriorities[right.protocol] ?? Number.MAX_SAFE_INTEGER; + return leftPriority - rightPriority; +} + +/** + * Lightweight information to identify a board.\ + * \ + * Note: the `name` property of the board identifier must never participate in the board's identification. + * Hence, it should only be used as the final fallback for the UI when the board's platform is not installed and only the board's name is available. + */ +export interface BoardIdentifier { + /** + * The name of the board. It's only purpose is to provide a fallback for the UI. Preferably do not use this property for any sophisticated logic. When + */ + readonly name: string; + /** + * The FQBN might contain boards config options if selected from the discovered ports (see [arduino/arduino-ide#1588](https://github.com/arduino/arduino-ide/issues/1588)). + */ + // TODO: decide whether to persist the boards config if any + readonly fqbn: string | undefined; +} + +export function isBoardIdentifier(arg: unknown): arg is BoardIdentifier { + return ( + Boolean(arg) && + typeof arg === 'object' && + (<BoardIdentifier>arg).name !== undefined && + typeof (<BoardIdentifier>arg).name === 'string' && + ((<BoardIdentifier>arg).fqbn === undefined || + ((<BoardIdentifier>arg).fqbn !== undefined && + typeof (<BoardIdentifier>arg).fqbn === 'string')) + ); +} + +/** + * @param options if `looseFqbn` is `true`, FQBN config options are ignored. Hence, `{ name: 'x', fqbn: 'a:b:c:o1=v1 }` equals `{ name: 'y', fqbn: 'a:b:c' }`. It's `true` by default. + */ +export function boardIdentifierEquals( + left: BoardIdentifier | undefined, + right: BoardIdentifier | undefined, + options: { looseFqbn: boolean } = { looseFqbn: true } +): boolean { + if (!left) { + return !right; + } + if (!right) { + return !left; + } + if ((left.fqbn && !right.fqbn) || (!left.fqbn && right.fqbn)) { + // This can be very tricky when comparing boards + // the CLI's board search returns with falsy FQBN when the platform is not installed + // the CLI's board list returns with the full FQBN (for detected boards) even if the platform is not installed + // when there are multiple boards with the same name (Arduino Nano RP2040) from different platforms (Mbed Nano OS vs. the deprecated global Mbed OS) + // maybe add some 3rd party platform overhead (https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json) + // and it will get very tricky when comparing a board which has a FQBN and which does not. + return false; // TODO: This a strict now. Maybe compare name in the future. + } + if (left.fqbn && right.fqbn) { + const leftFqbn = new FQBN(left.fqbn).toString(options.looseFqbn); + const rightFqbn = new FQBN(right.fqbn).toString(options.looseFqbn); + return leftFqbn === rightFqbn; + } + // No more Genuino hack. + // https://github.com/arduino/arduino-ide/blob/f6a43254f5c416a2e4fa888875358336b42dd4d5/arduino-ide-extension/src/common/protocol/boards-service.ts#L572-L581 + return left.name === right.name; +} + +/** + * See `boardListItemComparator`. + */ +export function boardIdentifierComparator( + left: BoardIdentifier | undefined, + right: BoardIdentifier | undefined +): number { + if (!left) { + return right ? 1 : 0; + } + if (!right) { + return left ? -1 : 0; + } + let leftVendor: string | undefined = undefined; + let rightVendor: string | undefined = undefined; + if (left.fqbn) { + const [vendor] = left.fqbn.split(':'); + leftVendor = vendor; + } + if (right.fqbn) { + const [vendor] = right.fqbn.split(':'); + rightVendor = vendor; + } + if (leftVendor === 'arduino' && rightVendor !== 'arduino') { + return -1; + } + if (leftVendor !== 'arduino' && rightVendor === 'arduino') { + return 1; + } + return naturalCompare(left.name, right.name); +} + +export function boardIdentifierLabel( + board: BoardIdentifier, + showFqbn = true +): string { + const { name, fqbn } = board; + let label = name; + if (fqbn && showFqbn) { + label += ` (${fqbn})`; + } + return label; +} + +export interface BoardsConfig { + selectedBoard: BoardIdentifier | undefined; + selectedPort: PortIdentifier | undefined; +} + +/** + * Creates a new board config object with `undefined` properties. + */ +export function emptyBoardsConfig(): BoardsConfig { + return { + selectedBoard: undefined, + selectedPort: undefined, + }; +} + +export function isDefinedBoardsConfig( + boardsConfig: BoardsConfig | undefined +): boardsConfig is Defined<BoardsConfig> { + if (!boardsConfig) { + return false; + } + return ( + boardsConfig.selectedBoard !== undefined && + boardsConfig.selectedPort !== undefined + ); +} + +export interface BoardIdentifierChangeEvent { + readonly previousSelectedBoard: BoardIdentifier | undefined; + readonly selectedBoard: BoardIdentifier | undefined; +} + +export function isBoardIdentifierChangeEvent( + event: BoardsConfigChangeEvent +): event is BoardIdentifierChangeEvent { + return 'previousSelectedBoard' in event && 'selectedBoard' in event; +} + +export interface PortIdentifierChangeEvent { + readonly previousSelectedPort: PortIdentifier | undefined; + readonly selectedPort: PortIdentifier | undefined; +} + +export function isPortIdentifierChangeEvent( + event: BoardsConfigChangeEvent +): event is PortIdentifierChangeEvent { + return 'previousSelectedPort' in event && 'selectedPort' in event; +} + +export type BoardsConfigChangeEvent = + | BoardIdentifierChangeEvent + | PortIdentifierChangeEvent + | (BoardIdentifierChangeEvent & PortIdentifierChangeEvent); + +export interface BoardInfo { + /** + * Board name. Could be `'Unknown board`'. + */ + BN: string; + /** + * Vendor ID. + */ + VID: string; + /** + * Product ID. + */ + PID: string; + /** + * Serial number. + */ + SN: string; +} + +export const selectPortForInfo = nls.localize( + 'arduino/board/selectPortForInfo', + 'Please select a port to obtain board info.' +); +export const nonSerialPort = nls.localize( + 'arduino/board/nonSerialPort', + "Non-serial port, can't obtain info." +); +export const noNativeSerialPort = nls.localize( + 'arduino/board/noNativeSerialPort', + "Native serial port, can't obtain info." +); +export const unknownBoard = nls.localize( + 'arduino/board/unknownBoard', + 'Unknown board' +); +export const unconfirmedBoard = nls.localize( + 'arduino/board/unconfirmedBoard', + 'Unconfirmed board' +); +export const selectBoard = nls.localize( + 'arduino/board/selectBoard', + 'Select Board' +); +export const notConnected = nls.localize( + 'arduino/common/notConnected', + '[not connected]' +); + +/** + * The returned promise resolves to a `BoardInfo` if available to show in the UI or an info message explaining why showing the board info is not possible. + */ +export async function getBoardInfo( + boardListProvider: MaybePromise<BoardList> +): Promise<BoardInfo | string> { + const boardList = await boardListProvider; + const ports = boardList.ports(); + const detectedPort = ports[ports.matchingIndex]; + if (!detectedPort) { + return selectPortForInfo; + } + const { port: selectedPort, boards } = detectedPort; + // IDE2 must show the board info based on the selected port. + // https://github.com/arduino/arduino-ide/issues/1489 + // IDE 1.x supports only serial port protocol + if (selectedPort.protocol !== 'serial') { + return nonSerialPort; + } + if (!isNonNativeSerial(selectedPort)) { + return noNativeSerialPort; + } + + if (boards && boards.length > 1) { + console.warn( + `Detected more than one available boards on the selected port : ${JSON.stringify( + detectedPort + )}. Detected boards were: ${JSON.stringify( + boards + )}. Using the first one: ${JSON.stringify(boards[0])}` + ); + } + + const board = boards ? boards[0] : undefined; + const BN = board?.name ?? unknownBoard; + const VID = readProperty('vid', selectedPort); + const PID = readProperty('pid', selectedPort); + const SN = readProperty('serialNumber', selectedPort); + return { VID, PID, SN, BN }; +} + +// serial protocol with one or many detected boards or available VID+PID properties from the port +function isNonNativeSerial(port: Port): boolean { + return !!( + port.protocol === 'serial' && + port.properties?.['vid'] && + port.properties?.['pid'] + ); +} + +function readProperty(property: string, port: Port): string { + return falsyToNullString(port.properties?.[property]); +} + +function falsyToNullString(s: string | undefined): string { + return !!s ? s : '(null)'; +} diff --git a/arduino-ide-extension/src/common/protocol/config-service.ts b/arduino-ide-extension/src/common/protocol/config-service.ts index adc5d9aa0..4ec13c0da 100644 --- a/arduino-ide-extension/src/common/protocol/config-service.ts +++ b/arduino-ide-extension/src/common/protocol/config-service.ts @@ -3,13 +3,12 @@ import { RecursivePartial } from '@theia/core/lib/common/types'; export const ConfigServicePath = '/services/config-service'; export const ConfigService = Symbol('ConfigService'); export interface ConfigService { - getVersion(): Promise< - Readonly<{ version: string; commit: string; status?: string }> - >; - getCliConfigFileUri(): Promise<string>; - getConfiguration(): Promise<Config>; + getConfiguration(): Promise<ConfigState>; setConfiguration(config: Config): Promise<void>; } +export type ConfigState = + | { config: undefined; messages: string[] } + | { config: Config; messages?: string[] }; export interface Daemon { readonly port: string | number; @@ -60,8 +59,10 @@ export namespace Network { try { // Patter: PROTOCOL://USER:PASS@HOSTNAME:PORT/ const { protocol, hostname, password, username, port } = new URL(raw); + // protocol in URL object contains a trailing colon + const newProtocol = protocol.replace(/:$/, ''); return { - protocol, + protocol: newProtocol, hostname, password, username, @@ -117,7 +118,16 @@ export interface Config { readonly network: Network; } export namespace Config { - export function sameAs(left: Config, right: Config): boolean { + export function sameAs( + left: Config | undefined, + right: Config | undefined + ): boolean { + if (!left) { + return !right; + } + if (!right) { + return false; + } const leftUrls = left.additionalUrls.sort(); const rightUrls = right.additionalUrls.sort(); if (leftUrls.length !== rightUrls.length) { @@ -148,7 +158,16 @@ export namespace AdditionalUrls { export function stringify(additionalUrls: AdditionalUrls): string { return additionalUrls.join(','); } - export function sameAs(left: AdditionalUrls, right: AdditionalUrls): boolean { + export function sameAs( + left: AdditionalUrls | undefined, + right: AdditionalUrls | undefined + ): boolean { + if (!left) { + return !right; + } + if (!right) { + return false; + } if (left.length !== right.length) { return false; } diff --git a/arduino-ide-extension/src/common/protocol/core-service.ts b/arduino-ide-extension/src/common/protocol/core-service.ts index a7124d865..f4b0d8f02 100644 --- a/arduino-ide-extension/src/common/protocol/core-service.ts +++ b/arduino-ide-extension/src/common/protocol/core-service.ts @@ -1,14 +1,15 @@ import { ApplicationError } from '@theia/core/lib/common/application-error'; +import type { CancellationToken } from '@theia/core/lib/common/cancellation'; +import { nls } from '@theia/core/lib/common/nls'; import type { Location, - Range, Position, + Range, } from '@theia/core/shared/vscode-languageserver-protocol'; -import type { - BoardUserField, - Port, -} from '../../common/protocol/boards-service'; -import type { Programmer } from './boards-service'; +import type { CompileSummary as ApiCompileSummary } from 'vscode-arduino-api'; +import type { BoardUserField, Installable } from '../../common/protocol/'; +import { PortIdentifier, Programmer, isPortIdentifier } from './boards-service'; +import type { IndexUpdateSummary } from './notification-service'; import type { Sketch } from './sketches-service'; export const CompilerWarningLiterals = [ @@ -17,7 +18,18 @@ export const CompilerWarningLiterals = [ 'More', 'All', ] as const; -export type CompilerWarnings = typeof CompilerWarningLiterals[number]; +export type CompilerWarnings = (typeof CompilerWarningLiterals)[number]; +export namespace CompilerWarnings { + export function labelOf(warning: CompilerWarnings): string { + return CompilerWarningLabels[warning]; + } + const CompilerWarningLabels: Record<CompilerWarnings, string> = { + None: nls.localize('arduino/core/compilerWarnings/none', 'None'), + Default: nls.localize('arduino/core/compilerWarnings/default', 'Default'), + More: nls.localize('arduino/core/compilerWarnings/more', 'More'), + All: nls.localize('arduino/core/compilerWarnings/all', 'All'), + }; +} export namespace CoreError { export interface ErrorLocationRef { readonly message: string; @@ -59,13 +71,18 @@ export namespace CoreError { Upload: 4002, UploadUsingProgrammer: 4003, BurnBootloader: 4004, + UploadRequiresProgrammer: 4005, }; - export const VerifyFailed = create(Codes.Verify); - export const UploadFailed = create(Codes.Upload); - export const UploadUsingProgrammerFailed = create( + export const VerifyFailed = declareCoreError(Codes.Verify); + export const UploadFailed = declareCoreError(Codes.Upload); + export const UploadUsingProgrammerFailed = declareCoreError( Codes.UploadUsingProgrammer ); - export const BurnBootloaderFailed = create(Codes.BurnBootloader); + export const BurnBootloaderFailed = declareCoreError(Codes.BurnBootloader); + export const UploadRequiresProgrammer = declareCoreError( + Codes.UploadRequiresProgrammer + ); + export function is( error: unknown ): error is ApplicationError<number, ErrorLocation[]> { @@ -75,7 +92,7 @@ export namespace CoreError { Object.values(Codes).includes(error.code) ); } - function create( + function declareCoreError( code: number ): ApplicationError.Constructor<number, ErrorLocation[]> { return ApplicationError.declare( @@ -90,12 +107,110 @@ export namespace CoreError { } } +export interface InstalledPlatformReference { + readonly id: string; + readonly version: Installable.Version; + /** + * Absolute filesystem path. + */ + readonly installDir: string; + readonly packageUrl: string; +} + +export interface ExecutableSectionSize { + readonly name: string; + readonly size: number; + readonly maxSize: number; +} + +export interface CompileSummary { + readonly buildPath: string; + /** + * To be compatible with the `vscode-arduino-tools` API. + * @deprecated Use `buildPath` instead. Use Theia or VS Code URI to convert to an URI string on the client side. + */ + readonly buildOutputUri: string; + readonly usedLibraries: ApiCompileSummary['usedLibraries']; + readonly executableSectionsSize: ExecutableSectionSize[]; + readonly boardPlatform?: InstalledPlatformReference | undefined; + readonly buildPlatform?: InstalledPlatformReference | undefined; + readonly buildProperties: string[]; +} + +export function isCompileSummary(arg: unknown): arg is CompileSummary { + return ( + Boolean(arg) && + typeof arg === 'object' && + (<CompileSummary>arg).buildPath !== undefined && + typeof (<CompileSummary>arg).buildPath === 'string' && + (<CompileSummary>arg).buildOutputUri !== undefined && + typeof (<CompileSummary>arg).buildOutputUri === 'string' && + (<CompileSummary>arg).executableSectionsSize !== undefined && + Array.isArray((<CompileSummary>arg).executableSectionsSize) && + (<CompileSummary>arg).usedLibraries !== undefined && + Array.isArray((<CompileSummary>arg).usedLibraries) && + (<CompileSummary>arg).buildProperties !== undefined && + Array.isArray((<CompileSummary>arg).buildProperties) + ); +} + +export interface UploadResponse { + readonly portAfterUpload: PortIdentifier; +} +export function isUploadResponse(arg: unknown): arg is UploadResponse { + return ( + Boolean(arg) && + typeof arg === 'object' && + isPortIdentifier((<UploadResponse>arg).portAfterUpload) + ); +} + export const CoreServicePath = '/services/core-service'; export const CoreService = Symbol('CoreService'); export interface CoreService { - compile(options: CoreService.Options.Compile): Promise<void>; - upload(options: CoreService.Options.Upload): Promise<void>; - burnBootloader(options: CoreService.Options.Bootloader): Promise<void>; + compile( + options: CoreService.Options.Compile, + cancellationToken?: CancellationToken + ): Promise<CompileSummary | undefined>; + upload( + options: CoreService.Options.Upload, + cancellationToken?: CancellationToken + ): Promise<UploadResponse>; + burnBootloader( + options: CoreService.Options.Bootloader, + cancellationToken?: CancellationToken + ): Promise<void>; + /** + * Refreshes the underling core gRPC client for the Arduino CLI. + */ + refresh(): Promise<void>; + /** + * Updates the index of the given index types and refreshes (`init`) the underlying core gRPC client. + * If `types` is empty, only the refresh part will be executed. + */ + updateIndex({ types }: { types: IndexType[] }): Promise<void>; + /** + * If the IDE2 detects invalid or missing indexes on core client init, + * IDE2 tries to update the indexes before the first frontend connects. + * Use this method to determine whether the backend has already updated + * the indexes before updating them. + * + * If yes, the connected frontend can update the local storage with the most + * recent index update date-time for a particular index type, + * and IDE2 can avoid the double indexes update. + */ + indexUpdateSummaryBeforeInit(): Promise<Readonly<IndexUpdateSummary>>; +} + +export const IndexTypeLiterals = ['platform', 'library'] as const; +export type IndexType = (typeof IndexTypeLiterals)[number]; +export namespace IndexType { + export function is(arg: unknown): arg is IndexType { + return ( + typeof arg === 'string' && IndexTypeLiterals.includes(arg as IndexType) + ); + } + export const All: IndexType[] = IndexTypeLiterals.filter(is); } export namespace CoreService { @@ -109,7 +224,7 @@ export namespace CoreService { readonly sketch: Sketch; } export interface BoardBased { - readonly port?: Port; + readonly port?: PortIdentifier; readonly programmer?: Programmer | undefined; /** * For the _Verify after upload_ setting. diff --git a/arduino-ide-extension/src/common/protocol/examples-service.ts b/arduino-ide-extension/src/common/protocol/examples-service.ts index 8194e57e4..db16a66f0 100644 --- a/arduino-ide-extension/src/common/protocol/examples-service.ts +++ b/arduino-ide-extension/src/common/protocol/examples-service.ts @@ -9,4 +9,8 @@ export interface ExamplesService { current: SketchContainer[]; any: SketchContainer[]; }>; + /** + * Finds example sketch containers for the installed library. + */ + find(options: { libraryName: string }): Promise<SketchContainer[]>; } diff --git a/arduino-ide-extension/src/common/protocol/executable-service.ts b/arduino-ide-extension/src/common/protocol/executable-service.ts index f29516fb5..81bcc50aa 100644 --- a/arduino-ide-extension/src/common/protocol/executable-service.ts +++ b/arduino-ide-extension/src/common/protocol/executable-service.ts @@ -5,6 +5,5 @@ export interface ExecutableService { clangdUri: string; cliUri: string; lsUri: string; - fwuploaderUri: string; }>; } diff --git a/arduino-ide-extension/src/common/protocol/ide-updater.ts b/arduino-ide-extension/src/common/protocol/ide-updater.ts index 5608e63be..ebc8bfef2 100644 --- a/arduino-ide-extension/src/common/protocol/ide-updater.ts +++ b/arduino-ide-extension/src/common/protocol/ide-updater.ts @@ -71,3 +71,4 @@ export interface IDEUpdaterClient { } export const SKIP_IDE_VERSION = 'skipIDEVersion'; +export const LAST_USED_IDE_VERSION = 'lastUsedIDEVersion'; diff --git a/arduino-ide-extension/src/common/protocol/installable.ts b/arduino-ide-extension/src/common/protocol/installable.ts index f311f8202..a7c70f891 100644 --- a/arduino-ide-extension/src/common/protocol/installable.ts +++ b/arduino-ide-extension/src/common/protocol/installable.ts @@ -1,10 +1,41 @@ -import * as semver from 'semver'; -import { ExecuteWithProgress } from './progressible'; +import type { MessageService } from '@theia/core/lib/common/message-service'; +import { nls } from '@theia/core/lib/common/nls'; +import { + coerce as coerceSemver, + compare as compareSemver, + parse as parseSemver, +} from 'semver'; import { naturalCompare } from '../utils'; import type { ArduinoComponent } from './arduino-component'; -import type { MessageService } from '@theia/core/lib/common/message-service'; +import { ExecuteWithProgress } from './progressible'; import type { ResponseServiceClient } from './response-service'; +export function libraryInstallFailed( + name: string, + version?: string | undefined +): string { + const versionSuffix = version ? `:${version}` : ''; + return nls.localize( + 'arduino/installable/libraryInstallFailed', + "Failed to install library: '{0}{1}'.", + name, + versionSuffix + ); +} + +export function platformInstallFailed( + name: string, + version?: string | undefined +): string { + const versionSuffix = version ? `:${version}` : ''; + return nls.localize( + 'arduino/installable/platformInstallFailed', + "Failed to install platform: '{0}{1}'.", + name, + versionSuffix + ); +} + export interface Installable<T extends ArduinoComponent> { /** * If `options.version` is specified, that will be installed. Otherwise, `item.availableVersions[0]`. @@ -35,22 +66,62 @@ export namespace Installable { right: Version, coerce = false ): number => { - const validLeft = semver.parse(left); - const validRight = semver.parse(right); + const validLeft = parseSemver(left); + const validRight = parseSemver(right); if (validLeft && validRight) { - return semver.compare(validLeft, validRight); + return compareSemver(validLeft, validRight); } if (coerce) { - const coercedLeft = validLeft ?? semver.coerce(left); - const coercedRight = validRight ?? semver.coerce(right); + const coercedLeft = validLeft ?? coerceSemver(left); + const coercedRight = validRight ?? coerceSemver(right); if (coercedLeft && coercedRight) { - return semver.compare(coercedLeft, coercedRight); + return compareSemver(coercedLeft, coercedRight); } } return naturalCompare(left, right); }; } + export const ActionLiterals = [ + 'installLatest', + 'installSelected', + 'update', + 'remove', + 'unknown', + ] as const; + export type Action = (typeof ActionLiterals)[number]; + + export function action(params: { + installed?: Version | undefined; + available: Version[]; + selected?: Version; + }): Action { + const { installed, available } = params; + const latest = Installable.latest(available); + if (!latest || (installed && !available.includes(installed))) { + return 'unknown'; + } + const selected = params.selected ?? latest; + if (installed === selected) { + return 'remove'; + } + if (installed) { + return selected === latest && installed !== latest + ? 'update' + : 'installSelected'; + } else { + return selected === latest ? 'installLatest' : 'installSelected'; + } + } + + export function latest(versions: Version[]): Version | undefined { + if (!versions.length) { + return undefined; + } + const ordered = versions.slice().sort(Installable.Version.COMPARATOR); + return ordered[ordered.length - 1]; + } + export const Installed = <T extends ArduinoComponent>({ installedVersion, }: T): boolean => { diff --git a/arduino-ide-extension/src/common/protocol/library-service.ts b/arduino-ide-extension/src/common/protocol/library-service.ts index bd7d2bfd7..a45b9757c 100644 --- a/arduino-ide-extension/src/common/protocol/library-service.ts +++ b/arduino-ide-extension/src/common/protocol/library-service.ts @@ -8,9 +8,10 @@ import { Partner, Recommended, Retired, - Type, + Type as TypeLabel, Updatable, } from '../nls'; +import URI from '@theia/core/lib/common/uri'; export const LibraryServicePath = '/services/library-service'; export const LibraryService = Symbol('LibraryService'); @@ -55,6 +56,7 @@ export interface LibrarySearch extends Searchable.Options { readonly topic?: LibrarySearch.Topic; } export namespace LibrarySearch { + export const Default: LibrarySearch = { type: 'All', topic: 'All' }; export const TypeLiterals = [ 'All', 'Updatable', @@ -65,7 +67,12 @@ export namespace LibrarySearch { 'Contributed', 'Retired', ] as const; - export type Type = typeof TypeLiterals[number]; + export type Type = (typeof TypeLiterals)[number]; + export namespace Type { + export function is(arg: unknown): arg is Type { + return typeof arg === 'string' && TypeLiterals.includes(arg as Type); + } + } export const TypeLabels: Record<Type, string> = { All: All, Updatable: Updatable, @@ -89,7 +96,12 @@ export namespace LibrarySearch { 'Timing', 'Uncategorized', ] as const; - export type Topic = typeof TopicLiterals[number]; + export type Topic = (typeof TopicLiterals)[number]; + export namespace Topic { + export function is(arg: unknown): arg is Topic { + return typeof arg === 'string' && TopicLiterals.includes(arg as Topic); + } + } export const TopicLabels: Record<Topic, string> = { All: All, Communication: nls.localize( @@ -126,14 +138,70 @@ export namespace LibrarySearch { string > = { topic: nls.localize('arduino/librarySearchProperty/topic', 'Topic'), - type: Type, + type: TypeLabel, }; + export namespace UriParser { + export const authority = 'librarymanager'; + export function parse(uri: URI): LibrarySearch | undefined { + if (uri.scheme !== 'http') { + throw new Error( + `Invalid 'scheme'. Expected 'http'. URI was: ${uri.toString()}.` + ); + } + if (uri.authority !== authority) { + throw new Error( + `Invalid 'authority'. Expected: '${authority}'. URI was: ${uri.toString()}.` + ); + } + const segments = Searchable.UriParser.normalizedSegmentsOf(uri); + // Special magic handling for `Signal Input/Output`. + // TODO: IDE2 deserves a better lib/boards URL spec. + // https://github.com/arduino/arduino-ide/issues/1442#issuecomment-1252136377 + if (segments.length === 3) { + const [type, topicHead, topicTail] = segments; + const maybeTopic = `${topicHead}/${topicTail}`; + if ( + LibrarySearch.Topic.is(maybeTopic) && + maybeTopic === 'Signal Input/Output' && + LibrarySearch.Type.is(type) + ) { + return { + type, + topic: maybeTopic, + ...Searchable.UriParser.parseQuery(uri), + }; + } + } + let searchOptions: LibrarySearch | undefined = undefined; + const [type, topic] = segments; + if (!type && !topic) { + searchOptions = LibrarySearch.Default; + } else if (LibrarySearch.Type.is(type)) { + if (!topic) { + searchOptions = { ...LibrarySearch.Default, type }; + } else if (LibrarySearch.Topic.is(topic)) { + searchOptions = { type, topic }; + } + } + if (searchOptions) { + return { + ...searchOptions, + ...Searchable.UriParser.parseQuery(uri), + }; + } + return undefined; + } + } } export namespace LibraryService { export namespace List { export interface Options { readonly fqbn?: string | undefined; + /** + * The name of the library to filter to. + */ + readonly libraryName?: string | undefined; } } } @@ -162,12 +230,6 @@ export enum LibraryLocation { } export interface LibraryPackage extends ArduinoComponent { - /** - * Same as [`Library#real_name`](https://arduino.github.io/arduino-cli/latest/rpc/commands/#library). - * Should be used for the UI, and `name` is used to uniquely identify a library. It does not have an ID. - */ - readonly label: string; - /** * An array of string that should be included into the `ino` file if this library is used. * For example, including `SD` will prepend `#include <SD.h>` to the `ino` file. While including `Bridge` @@ -183,11 +245,15 @@ export interface LibraryPackage extends ArduinoComponent { readonly category: string; } export namespace LibraryPackage { - export function is(arg: any): arg is LibraryPackage { + export function is(arg: unknown): arg is LibraryPackage { return ( ArduinoComponent.is(arg) && - 'includes' in arg && - Array.isArray(arg['includes']) + (<LibraryPackage>arg).includes !== undefined && + Array.isArray((<LibraryPackage>arg).includes) && + (<LibraryPackage>arg).exampleUris !== undefined && + Array.isArray((<LibraryPackage>arg).exampleUris) && + (<LibraryPackage>arg).location !== undefined && + typeof (<LibraryPackage>arg).location === 'number' ); } diff --git a/arduino-ide-extension/src/common/protocol/monitor-service.ts b/arduino-ide-extension/src/common/protocol/monitor-service.ts index 7374951db..92fb7e4a6 100644 --- a/arduino-ide-extension/src/common/protocol/monitor-service.ts +++ b/arduino-ide-extension/src/common/protocol/monitor-service.ts @@ -1,9 +1,14 @@ -import { Event, JsonRpcServer } from '@theia/core'; -import { - PluggableMonitorSettings, - MonitorSettings, -} from '../../node/monitor-settings/monitor-settings-provider'; -import { Board, Port } from './boards-service'; +import { ApplicationError } from '@theia/core/lib/common/application-error'; +import type { Event } from '@theia/core/lib/common/event'; +import type { JsonRpcServer } from '@theia/core/lib/common/messaging/proxy-factory'; +import { nls } from '@theia/core/lib/common/nls'; +import type { BoardIdentifier, PortIdentifier } from './boards-service'; + +export type PluggableMonitorSettings = Record<string, PluggableMonitorSetting>; +export interface MonitorSettings { + pluggableMonitorSettings?: PluggableMonitorSettings; + monitorUISettings?: Partial<MonitorState>; +} export const MonitorManagerProxyFactory = Symbol('MonitorManagerProxyFactory'); export type MonitorManagerProxyFactory = () => MonitorManagerProxy; @@ -13,17 +18,20 @@ export const MonitorManagerProxy = Symbol('MonitorManagerProxy'); export interface MonitorManagerProxy extends JsonRpcServer<MonitorManagerProxyClient> { startMonitor( - board: Board, - port: Port, + board: BoardIdentifier, + port: PortIdentifier, settings?: PluggableMonitorSettings ): Promise<void>; changeMonitorSettings( - board: Board, - port: Port, + board: BoardIdentifier, + port: PortIdentifier, settings: MonitorSettings ): Promise<void>; - stopMonitor(board: Board, port: Port): Promise<void>; - getCurrentSettings(board: Board, port: Port): Promise<MonitorSettings>; + stopMonitor(board: BoardIdentifier, port: PortIdentifier): Promise<void>; + getCurrentSettings( + board: BoardIdentifier, + port: PortIdentifier + ): Promise<MonitorSettings>; } export const MonitorManagerProxyClient = Symbol('MonitorManagerProxyClient'); @@ -31,12 +39,15 @@ export interface MonitorManagerProxyClient { onMessagesReceived: Event<{ messages: string[] }>; onMonitorSettingsDidChange: Event<MonitorSettings>; onMonitorShouldReset: Event<void>; - connect(addressPort: number): void; + connect(addressPort: number): Promise<void>; disconnect(): void; getWebSocketPort(): number | undefined; isWSConnected(): Promise<boolean>; startMonitor(settings?: PluggableMonitorSettings): Promise<void>; - getCurrentSettings(board: Board, port: Port): Promise<MonitorSettings>; + getCurrentSettings( + board: BoardIdentifier, + port: PortIdentifier + ): Promise<MonitorSettings>; send(message: string): void; changeSettings(settings: MonitorSettings): void; } @@ -46,7 +57,7 @@ export interface PluggableMonitorSetting { readonly id: string; // A human-readable label of the setting (to be displayed on the GUI) readonly label: string; - // The setting type (at the moment only "enum" is avaiable) + // The setting type (at the moment only "enum" is available) readonly type: string; // The values allowed on "enum" types readonly values: string[]; @@ -72,24 +83,168 @@ export namespace Monitor { }; } -export interface Status {} -export type OK = Status; -export interface ErrorStatus extends Status { - readonly message: string; +export const MonitorErrorCodes = { + ConnectionFailed: 6001, + NotConnected: 6002, + AlreadyConnected: 6003, + MissingConfiguration: 6004, +} as const; + +export const ConnectionFailedError = declareMonitorError( + MonitorErrorCodes.ConnectionFailed +); +export const NotConnectedError = declareMonitorError( + MonitorErrorCodes.NotConnected +); +export const AlreadyConnectedError = declareMonitorError( + MonitorErrorCodes.AlreadyConnected +); +export const MissingConfigurationError = declareMonitorError( + MonitorErrorCodes.MissingConfiguration +); + +export function createConnectionFailedError( + port: PortIdentifier, + details?: string +): ApplicationError<number, PortDescriptor> { + const { protocol, address } = port; + let message; + if (details) { + const detailsWithPeriod = details.endsWith('.') ? details : `${details}.`; + message = nls.localize( + 'arduino/monitor/connectionFailedErrorWithDetails', + '{0} Could not connect to {1} {2} port.', + detailsWithPeriod, + address, + protocol + ); + } else { + message = nls.localize( + 'arduino/monitor/connectionFailedError', + 'Could not connect to {0} {1} port.', + address, + protocol + ); + } + return ConnectionFailedError(message, { protocol, address }); +} +export function createNotConnectedError( + port: PortIdentifier +): ApplicationError<number, PortDescriptor> { + const { protocol, address } = port; + return NotConnectedError( + nls.localize( + 'arduino/monitor/notConnectedError', + 'Not connected to {0} {1} port.', + address, + protocol + ), + { protocol, address } + ); +} +export function createAlreadyConnectedError( + port: PortIdentifier +): ApplicationError<number, PortDescriptor> { + const { protocol, address } = port; + return AlreadyConnectedError( + nls.localize( + 'arduino/monitor/alreadyConnectedError', + 'Could not connect to {0} {1} port. Already connected.', + address, + protocol + ), + { protocol, address } + ); +} +export function createMissingConfigurationError( + port: PortIdentifier +): ApplicationError<number, PortDescriptor> { + const { protocol, address } = port; + return MissingConfigurationError( + nls.localize( + 'arduino/monitor/missingConfigurationError', + 'Could not connect to {0} {1} port. The monitor configuration is missing.', + address, + protocol + ), + { protocol, address } + ); +} + +/** + * Bare minimum representation of a port. Supports neither UI labels nor properties. + */ +interface PortDescriptor { + readonly protocol: string; + readonly address: string; +} +function declareMonitorError( + code: number +): ApplicationError.Constructor<number, PortDescriptor> { + return ApplicationError.declare( + code, + (message: string, data: PortDescriptor) => ({ data, message }) + ); +} + +export interface MonitorConnectionError { + readonly errorMessage: string; +} + +export type MonitorConnectionStatus = + | 'connecting' + | 'connected' + | 'not-connected' + | MonitorConnectionError; + +export function monitorConnectionStatusEquals( + left: MonitorConnectionStatus, + right: MonitorConnectionStatus +): boolean { + if (typeof left === 'object' && typeof right === 'object') { + return left.errorMessage === right.errorMessage; + } + return left === right; +} + +/** + * @deprecated see `MonitorState#connected` + */ +export function isMonitorConnected( + status: MonitorConnectionStatus +): status is 'connected' { + return status === 'connected'; +} + +export function isMonitorConnectionError( + status: MonitorConnectionStatus +): status is MonitorConnectionError { + return typeof status === 'object'; } -export namespace Status { - export function isOK(status: Status & { message?: string }): status is OK { - return !!status && typeof status.message !== 'string'; + +export interface MonitorState { + autoscroll: boolean; + timestamp: boolean; + lineEnding: MonitorEOL; + interpolate: boolean; + darkTheme: boolean; + wsPort: number; + serialPort: string; + connectionStatus: MonitorConnectionStatus; + /** + * @deprecated This property is never get by IDE2 only set. This value is present to be backward compatible with the plotter app. + * IDE2 uses `MonitorState#connectionStatus`. + */ + connected: boolean; +} +export namespace MonitorState { + export interface Change<K extends keyof MonitorState> { + readonly property: K; + readonly value: MonitorState[K]; } - export const OK: OK = {}; - export const NOT_CONNECTED: ErrorStatus = { message: 'Not connected.' }; - export const ALREADY_CONNECTED: ErrorStatus = { - message: 'Already connected.', - }; - export const CONFIG_MISSING: ErrorStatus = { - message: 'Serial Config missing.', - }; - export const UPLOAD_IN_PROGRESS: ErrorStatus = { - message: 'Upload in progress.', - }; +} + +export type MonitorEOL = '' | '\n' | '\r' | '\r\n'; +export namespace MonitorEOL { + export const DEFAULT: MonitorEOL = '\n'; } diff --git a/arduino-ide-extension/src/common/protocol/notification-service.ts b/arduino-ide-extension/src/common/protocol/notification-service.ts index e1b192ece..7b0aea120 100644 --- a/arduino-ide-extension/src/common/protocol/notification-service.ts +++ b/arduino-ide-extension/src/common/protocol/notification-service.ts @@ -1,32 +1,76 @@ import type { JsonRpcServer } from '@theia/core/lib/common/messaging/proxy-factory'; import type { - AttachedBoardsChangeEvent, BoardsPackage, - Config, + ConfigState, + DetectedPorts, + IndexType, ProgressMessage, Sketch, } from '../protocol'; import type { LibraryPackage } from './library-service'; +/** + * Values are [ISO 8601](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString) + * strings representing the date-time when the update of the index has been completed. + */ +export type IndexUpdateSummary = { + [T in IndexType]: string; +} & { message?: string }; +export interface IndexUpdateParams { + /** + * Application unique ID of the progress. + */ + readonly progressId: string; + /** + * The type of the index is which is being updated. + */ + readonly types: IndexType[]; +} +export type IndexUpdateWillStartParams = IndexUpdateParams; +export interface IndexUpdateDidCompleteParams + extends Omit<IndexUpdateParams, 'types'> { + readonly summary: IndexUpdateSummary; +} +export interface IndexUpdateDidFailParams extends IndexUpdateParams { + /** + * Describes the reason of the index update failure. + */ + readonly message: string; +} + export interface NotificationServiceClient { - notifyIndexWillUpdate(progressId: string): void; + // The cached state of the core client. Libraries, examples, etc. has been updated. + // This can happen without an index update. For example, changing the `directories.user` location. + // An index update always implicitly involves a re-initialization without notifying via this method. + notifyDidReinitialize(): void; + + // Index + notifyIndexUpdateWillStart(params: IndexUpdateWillStartParams): void; notifyIndexUpdateDidProgress(progressMessage: ProgressMessage): void; - notifyIndexDidUpdate(progressId: string): void; - notifyIndexUpdateDidFail({ - progressId, - message, - }: { - progressId: string; - message: string; - }): void; - notifyDaemonDidStart(port: string): void; + notifyIndexUpdateDidComplete(params: IndexUpdateDidCompleteParams): void; + notifyIndexUpdateDidFail(params: IndexUpdateDidFailParams): void; + + // Daemon + notifyDaemonDidStart(port: number): void; notifyDaemonDidStop(): void; - notifyConfigDidChange(event: { config: Config | undefined }): void; + + // CLI config + notifyConfigDidChange(event: ConfigState): void; + + // Platforms notifyPlatformDidInstall(event: { item: BoardsPackage }): void; notifyPlatformDidUninstall(event: { item: BoardsPackage }): void; - notifyLibraryDidInstall(event: { item: LibraryPackage }): void; + + // Libraries + notifyLibraryDidInstall(event: { + item: LibraryPackage | 'zip-install'; + }): void; notifyLibraryDidUninstall(event: { item: LibraryPackage }): void; - notifyAttachedBoardsDidChange(event: AttachedBoardsChangeEvent): void; + + // Boards discovery + notifyDetectedPortsDidChange(event: { detectedPorts: DetectedPorts }): void; + + // Sketches notifyRecentSketchesDidChange(event: { sketches: Sketch[] }): void; } diff --git a/arduino-ide-extension/src/common/protocol/progressible.ts b/arduino-ide-extension/src/common/protocol/progressible.ts index c27737ccc..d01bc270d 100644 --- a/arduino-ide-extension/src/common/protocol/progressible.ts +++ b/arduino-ide-extension/src/common/protocol/progressible.ts @@ -1,22 +1,48 @@ +import { ApplicationError } from '@theia/core/lib/common/application-error'; import type { CancellationToken } from '@theia/core/lib/common/cancellation'; import { CancellationTokenSource } from '@theia/core/lib/common/cancellation'; import type { MessageService } from '@theia/core/lib/common/message-service'; import type { Progress } from '@theia/core/lib/common/message-service-protocol'; +import { userAbort } from '../nls'; import type { ResponseServiceClient } from './response-service'; +export const UserAbortApplicationError = ApplicationError.declare( + 9999, + (message: string, uri: string) => { + return { + message, + data: { uri }, + }; + } +); + +export class UserAbortError extends Error { + constructor() { + super(userAbort); + Object.setPrototypeOf(this, UserAbortError.prototype); + } +} + export namespace ExecuteWithProgress { export async function doWithProgress<T>(options: { - run: ({ progressId }: { progressId: string }) => Promise<T>; + run: ({ + progressId, + cancellationToken, + }: { + progressId: string; + cancellationToken?: CancellationToken; + }) => Promise<T>; messageService: MessageService; responseService: ResponseServiceClient; progressText: string; keepOutput?: boolean; + cancelable?: boolean; }): Promise<T> { return withProgress( options.progressText, options.messageService, // eslint-disable-next-line @typescript-eslint/no-unused-vars - async (progress, _token) => { + async (progress, token) => { const progressId = progress.id; const toDispose = options.responseService.onProgressDidChange( (progressMessage) => { @@ -30,24 +56,29 @@ export namespace ExecuteWithProgress { if (!options.keepOutput) { options.responseService.clearOutput(); } - const result = await options.run({ progressId }); + const result = await options.run({ + progressId, + cancellationToken: token, + }); return result; } finally { toDispose.dispose(); } - } + }, + options.cancelable ); } export async function withProgress<T>( text: string, messageService: MessageService, - cb: (progress: Progress, token: CancellationToken) => Promise<T> + cb: (progress: Progress, token: CancellationToken) => Promise<T>, + cancelable = false ): Promise<T> { const cancellationSource = new CancellationTokenSource(); const { token } = cancellationSource; const progress = await messageService.showProgress( - { text, options: { cancelable: false } }, + { text, options: { cancelable } }, () => cancellationSource.cancel() ); try { diff --git a/arduino-ide-extension/src/common/protocol/searchable.ts b/arduino-ide-extension/src/common/protocol/searchable.ts index af6a2c02e..2caf53730 100644 --- a/arduino-ide-extension/src/common/protocol/searchable.ts +++ b/arduino-ide-extension/src/common/protocol/searchable.ts @@ -1,3 +1,6 @@ +import URI from '@theia/core/lib/common/uri'; +import type { ArduinoComponent } from './arduino-component'; + export interface Searchable<T, O extends Searchable.Options> { search(options: O): Promise<T[]>; } @@ -8,4 +11,52 @@ export namespace Searchable { */ readonly query?: string; } + export namespace UriParser { + /** + * Parses the `URI#fragment` into a query term. + */ + export function parseQuery(uri: URI): { query: string } { + return { query: uri.fragment }; + } + /** + * Splits the `URI#path#toString` on the `/` POSIX separator into decoded segments. The first, empty segment representing the root is omitted. + * Examples: + * - `/` -> `['']` + * - `/All` -> `['All']` + * - `/All/Device%20Control` -> `['All', 'Device Control']` + * - `/All/Display` -> `['All', 'Display']` + * - `/Updatable/Signal%20Input%2FOutput` -> `['Updatable', 'Signal Input', 'Output']` (**caveat**!) + */ + export function normalizedSegmentsOf(uri: URI): string[] { + return uri.path.toString().split('/').slice(1).map(decodeURIComponent); + } + } +} + +// IDE2 must keep the library search order from the CLI but do additional boosting +// https://github.com/arduino/arduino-ide/issues/1106 +// This additional search result boosting considers the following groups: 'Arduino', '', 'Arduino-Retired', and 'Retired'. +// If two libraries fall into the same group, the original index is the tiebreaker. +export type SortGroup = 'Arduino' | '' | 'Arduino-Retired' | 'Retired'; +const sortGroupOrder: Record<SortGroup, number> = { + Arduino: 0, + '': 1, + 'Arduino-Retired': 2, + Retired: 3, +}; + +export function sortComponents<T extends ArduinoComponent>( + components: T[], + group: (component: T) => SortGroup +): T[] { + return components + .map((component, index) => ({ ...component, index })) + .sort((left, right) => { + const leftGroup = group(left); + const rightGroup = group(right); + if (leftGroup === rightGroup) { + return left.index - right.index; + } + return sortGroupOrder[leftGroup] - sortGroupOrder[rightGroup]; + }); } diff --git a/arduino-ide-extension/src/common/protocol/sketches-service-client-impl.ts b/arduino-ide-extension/src/common/protocol/sketches-service-client-impl.ts deleted file mode 100644 index 34da46bfd..000000000 --- a/arduino-ide-extension/src/common/protocol/sketches-service-client-impl.ts +++ /dev/null @@ -1,292 +0,0 @@ -import { inject, injectable } from '@theia/core/shared/inversify'; -import URI from '@theia/core/lib/common/uri'; -import { Emitter } from '@theia/core/lib/common/event'; -import { notEmpty } from '@theia/core/lib/common/objects'; -import { FileService } from '@theia/filesystem/lib/browser/file-service'; -import { MessageService } from '@theia/core/lib/common/message-service'; -import { FileChangeType } from '@theia/filesystem/lib/common/files'; -import { WorkspaceService } from '@theia/workspace/lib/browser/workspace-service'; -import { DisposableCollection } from '@theia/core/lib/common/disposable'; -import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application'; -import { Sketch, SketchesService } from '../../common/protocol'; -import { ConfigService } from './config-service'; -import { SketchContainer, SketchesError, SketchRef } from './sketches-service'; -import { - ARDUINO_CLOUD_FOLDER, - REMOTE_SKETCHBOOK_FOLDER, -} from '../../browser/utils/constants'; -import * as monaco from '@theia/monaco-editor-core'; -import { Deferred } from '@theia/core/lib/common/promise-util'; -import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state'; - -const READ_ONLY_FILES = ['sketch.json']; -const READ_ONLY_FILES_REMOTE = ['thingProperties.h', 'thingsProperties.h']; - -export type CurrentSketch = Sketch | 'invalid'; -export namespace CurrentSketch { - export function isValid(arg: CurrentSketch | undefined): arg is Sketch { - return !!arg && arg !== 'invalid'; - } -} - -@injectable() -export class SketchesServiceClientImpl - implements FrontendApplicationContribution -{ - @inject(FileService) - protected readonly fileService: FileService; - - @inject(MessageService) - protected readonly messageService: MessageService; - - @inject(SketchesService) - protected readonly sketchService: SketchesService; - - @inject(WorkspaceService) - protected readonly workspaceService: WorkspaceService; - - @inject(ConfigService) - protected readonly configService: ConfigService; - - @inject(FrontendApplicationStateService) - private readonly appStateService: FrontendApplicationStateService; - - protected sketches = new Map<string, SketchRef>(); - // TODO: rename this + event to the `onBlabla` pattern - protected sketchbookDidChangeEmitter = new Emitter<{ - created: SketchRef[]; - removed: SketchRef[]; - }>(); - readonly onSketchbookDidChange = this.sketchbookDidChangeEmitter.event; - protected currentSketchDidChangeEmitter = new Emitter<CurrentSketch>(); - readonly onCurrentSketchDidChange = this.currentSketchDidChangeEmitter.event; - - protected toDispose = new DisposableCollection( - this.sketchbookDidChangeEmitter, - this.currentSketchDidChangeEmitter - ); - - private _currentSketch: CurrentSketch | undefined; - private currentSketchLoaded = new Deferred<CurrentSketch>(); - - onStart(): void { - this.configService.getConfiguration().then(({ sketchDirUri }) => { - this.sketchService - .getSketches({ uri: sketchDirUri }) - .then((container) => { - const sketchbookUri = new URI(sketchDirUri); - for (const sketch of SketchContainer.toArray(container)) { - this.sketches.set(sketch.uri, sketch); - } - this.toDispose.push( - // Watch changes in the sketchbook to update `File` > `Sketchbook` menu items. - this.fileService.watch(new URI(sketchDirUri), { - recursive: true, - excludes: [], - }) - ); - this.toDispose.push( - this.fileService.onDidFilesChange(async (event) => { - for (const { type, resource } of event.changes) { - // The file change events have higher precedence in the current sketch over the sketchbook. - if ( - CurrentSketch.isValid(this._currentSketch) && - new URI(this._currentSketch.uri).isEqualOrParent(resource) - ) { - // https://github.com/arduino/arduino-ide/pull/1351#pullrequestreview-1086666656 - // On a sketch file rename, the FS watcher will contain two changes: - // - Deletion of the original file, - // - Update of the new file, - // Hence, `UPDATE` events must be processed but only and if only there is a `DELETED` change in the same event. - // Otherwise, IDE2 would ask CLI to reload the sketch content on every save event in IDE2. - if ( - type === FileChangeType.UPDATED && - event.changes.length === 1 - ) { - // If the event contains only one `UPDATE` change, it cannot be a rename. - return; - } - - let reloadedSketch: Sketch | undefined = undefined; - try { - reloadedSketch = await this.sketchService.loadSketch( - this._currentSketch.uri - ); - } catch (err) { - if (!SketchesError.NotFound.is(err)) { - throw err; - } - } - - if (!reloadedSketch) { - return; - } - - if (!Sketch.sameAs(this._currentSketch, reloadedSketch)) { - this.useCurrentSketch(reloadedSketch, true); - } - return; - } - // We track main sketch files changes only. // TODO: check sketch folder changes. One can rename the folder without renaming the `.ino` file. - if (sketchbookUri.isEqualOrParent(resource)) { - if (Sketch.isSketchFile(resource)) { - if (type === FileChangeType.ADDED) { - try { - const toAdd = await this.sketchService.loadSketch( - resource.parent.toString() - ); - if (!this.sketches.has(toAdd.uri)) { - console.log( - `New sketch '${toAdd.name}' was created in sketchbook '${sketchDirUri}'.` - ); - this.sketches.set(toAdd.uri, toAdd); - this.fireSoon(toAdd, 'created'); - } - } catch {} - } else if (type === FileChangeType.DELETED) { - const uri = resource.parent.toString(); - const toDelete = this.sketches.get(uri); - if (toDelete) { - console.log( - `Sketch '${toDelete.name}' was removed from sketchbook '${sketchbookUri}'.` - ); - this.sketches.delete(uri); - this.fireSoon(toDelete, 'removed'); - } - } - } - } - } - }) - ); - }); - }); - this.appStateService - .reachedState('started_contributions') - .then(async () => { - const currentSketch = await this.loadCurrentSketch(); - if (CurrentSketch.isValid(currentSketch)) { - this.toDispose.pushAll([ - // Watch the file changes of the current sketch - this.fileService.watch(new URI(currentSketch.uri), { - recursive: true, - excludes: [], - }), - ]); - } - this.useCurrentSketch(currentSketch); - }); - } - - private useCurrentSketch( - currentSketch: CurrentSketch, - reassignPromise = false - ) { - this._currentSketch = currentSketch; - if (reassignPromise) { - this.currentSketchLoaded = new Deferred(); - } - this.currentSketchLoaded.resolve(this._currentSketch); - this.currentSketchDidChangeEmitter.fire(this._currentSketch); - } - - onStop(): void { - this.toDispose.dispose(); - } - - private async loadCurrentSketch(): Promise<CurrentSketch> { - const sketches = ( - await Promise.all( - this.workspaceService - .tryGetRoots() - .map(({ resource }) => - this.sketchService.getSketchFolder(resource.toString()) - ) - ) - ).filter(notEmpty); - if (!sketches.length) { - return 'invalid'; - } - if (sketches.length > 1) { - console.log( - `Multiple sketch folders were found in the workspace. Falling back to the first one. Sketch folders: ${JSON.stringify( - sketches - )}` - ); - } - return sketches[0]; - } - - async currentSketch(): Promise<CurrentSketch> { - return this.currentSketchLoaded.promise; - } - - tryGetCurrentSketch(): CurrentSketch | undefined { - return this._currentSketch; - } - - async currentSketchFile(): Promise<string | undefined> { - const currentSketch = await this.currentSketch(); - if (CurrentSketch.isValid(currentSketch)) { - return currentSketch.mainFileUri; - } - return undefined; - } - - private fireSoonHandle?: number; - private bufferedSketchbookEvents: { - type: 'created' | 'removed'; - sketch: SketchRef; - }[] = []; - - private fireSoon(sketch: SketchRef, type: 'created' | 'removed'): void { - this.bufferedSketchbookEvents.push({ type, sketch }); - - if (typeof this.fireSoonHandle === 'number') { - window.clearTimeout(this.fireSoonHandle); - } - - this.fireSoonHandle = window.setTimeout(() => { - const event: { created: SketchRef[]; removed: SketchRef[] } = { - created: [], - removed: [], - }; - for (const { type, sketch } of this.bufferedSketchbookEvents) { - if (type === 'created') { - event.created.push(sketch); - } else { - event.removed.push(sketch); - } - } - this.sketchbookDidChangeEmitter.fire(event); - this.bufferedSketchbookEvents.length = 0; - }, 100); - } - - /** - * `true` if the `uri` is not contained in any of the opened workspaces. Otherwise, `false`. - */ - isReadOnly(uri: URI | monaco.Uri | string): boolean { - const toCheck = uri instanceof URI ? uri : new URI(uri); - if (toCheck.scheme === 'user-storage') { - return false; - } - - const isCloudSketch = toCheck - .toString() - .includes(`${REMOTE_SKETCHBOOK_FOLDER}/${ARDUINO_CLOUD_FOLDER}`); - - const filesToCheck = [ - ...READ_ONLY_FILES, - ...(isCloudSketch ? READ_ONLY_FILES_REMOTE : []), - ]; - - if (filesToCheck.includes(toCheck?.path?.base)) { - return true; - } - const readOnly = !this.workspaceService - .tryGetRoots() - .some(({ resource }) => resource.isEqualOrParent(toCheck)); - return readOnly; - } -} diff --git a/arduino-ide-extension/src/common/protocol/sketches-service.ts b/arduino-ide-extension/src/common/protocol/sketches-service.ts index 719ecaacd..fa009e22f 100644 --- a/arduino-ide-extension/src/common/protocol/sketches-service.ts +++ b/arduino-ide-extension/src/common/protocol/sketches-service.ts @@ -1,9 +1,15 @@ import { ApplicationError } from '@theia/core/lib/common/application-error'; +import { nls } from '@theia/core/lib/common/nls'; import URI from '@theia/core/lib/common/uri'; +import dateFormat from 'dateformat'; +const filenameReservedRegex = require('filename-reserved-regex'); export namespace SketchesError { export const Codes = { NotFound: 5001, + InvalidName: 5002, + InvalidFolderName: 5003, + SketchAlreadyContainsThisFile: 5004, }; export const NotFound = ApplicationError.declare( Codes.NotFound, @@ -14,6 +20,39 @@ export namespace SketchesError { }; } ); + export const InvalidName = ApplicationError.declare( + Codes.InvalidName, + (message: string, invalidMainSketchUri: string) => { + return { + message, + data: { invalidMainSketchUri }, + }; + } + ); + export const InvalidFolderName = ApplicationError.declare( + Codes.InvalidFolderName, + (message: string, invalidFolderName: string) => { + return { + message, + data: { invalidFolderName }, + }; + } + ); + // https://github.com/arduino/arduino-ide/issues/827 + export const SketchAlreadyContainsThisFile = ApplicationError.declare( + Codes.SketchAlreadyContainsThisFile, + ( + message: string, + sourceSketchName: string, + targetSketchName: string, + existingSketchFilename: string + ) => { + return { + message, + data: { sourceSketchName, targetSketchName, existingSketchFilename }, + }; + } + ); } export const SketchesServicePath = '/services/sketches-service'; @@ -21,16 +60,9 @@ export const SketchesService = Symbol('SketchesService'); export interface SketchesService { /** * Resolves to a sketch container representing the hierarchical structure of the sketches. - * If `uri` is not given, `directories.user` will be user instead. Specify `exclude` global patterns to filter folders from the sketch container. - * If `exclude` is not set `['**\/libraries\/**', '**\/hardware\/**']` will be used instead. + * If `uri` is not given, `directories.user` will be user instead. */ - getSketches({ - uri, - exclude, - }: { - uri?: string; - exclude?: string[]; - }): Promise<SketchContainer>; + getSketches({ uri }: { uri?: string }): Promise<SketchContainer>; /** * This is the TS implementation of `SketchLoad` from the CLI and should be replaced with a gRPC call eventually. @@ -49,6 +81,11 @@ export interface SketchesService { */ createNewSketch(): Promise<Sketch>; + /** + * The default content when creating a new `.ino` file. Either the built-in or the user defined (`arduino.sketch.inoBlueprint`) content. + */ + defaultInoContent(): Promise<string>; + /** * Creates a new sketch with existing content. Rejects if `uri` is not pointing to a valid sketch folder. */ @@ -63,15 +100,18 @@ export interface SketchesService { isTemp(sketch: SketchRef): Promise<boolean>; /** - * If `isTemp` is `true` for the `sketch`, you can call this method to move the sketch from the temp - * location to `directories.user`. Resolves with the URI of the sketch after the move. Rejects, when the sketch - * was not in the temp folder. This method always overrides. It's the callers responsibility to ask the user whether - * the files at the destination can be overwritten or not. + * Recursively copies the sketch folder content including all files into the destination folder. + * Resolves with the new URI of the sketch after the move. This method always overrides. It's the callers responsibility to ask the user whether + * the files at the destination can be overwritten or not. This method copies all filesystem files, if you want to copy only sketch files, + * but exclude, for example, language server log file, set the `onlySketchFiles` property to `true`. `onlySketchFiles` is `false` by default. */ - copy(sketch: Sketch, options: { destinationUri: string }): Promise<string>; + copy( + sketch: Sketch, + options: { destinationUri: string; onlySketchFiles?: boolean } + ): Promise<Sketch>; /** - * Returns with the container sketch for the input `uri`. If the `uri` is not in a sketch folder, resolved `undefined`. + * Returns with the container sketch for the input `uri`. If the `uri` is not in a sketch folder, the promise resolves to `undefined`. */ getSketchFolder(uri: string): Promise<Sketch | undefined>; @@ -82,8 +122,10 @@ export interface SketchesService { /** * Resolves to an array of sketches in inverse chronological order. The newest is the first. + * If `forceUpdate` is `true`, the array of recently opened sketches will be recalculated. + * Invalid and missing sketches will be removed from the list. It's `false` by default. */ - recentlyOpenedSketches(): Promise<Sketch[]>; + recentlyOpenedSketches(forceUpdate?: boolean): Promise<Sketch[]>; /** * Archives the sketch, resolves to the archive URI. @@ -97,9 +139,16 @@ export interface SketchesService { getIdeTempFolderUri(sketch: Sketch): Promise<string>; /** - * Notifies the backend to recursively delete the sketch folder with all its content. + * This is the JS/TS re-implementation of [`GenBuildPath`](https://github.com/arduino/arduino-cli/blob/c0d4e4407d80aabad81142693513b3306759cfa6/arduino/sketch/sketch.go#L296-L306) of the CLI. + * Pass in a sketch and get the build temporary folder filesystem path calculated from the main sketch file location. Can be multiple ones. This method does not check the existence of the sketch. + * Since CLI v1.1.0 the default sketch folder is the os user cache dir. See https://github.com/arduino/arduino-cli/pull/2673/commits/d2ffeb06ca6360a211d5aa7ddd11505212ffb1b9 + * + * The case sensitivity of the drive letter on Windows matters when the CLI calculates the MD5 hash of the temporary build folder. + * IDE2 does not know and does not want to rely on how the CLI treats the paths: with lowercase or uppercase drive letters. + * Hence, IDE2 has to provide multiple build paths on Windows. This hack will be obsolete when the CLI can provide error codes: + * https://github.com/arduino/arduino-cli/issues/1762. */ - notifyDeleteSketch(sketch: Sketch): void; + getBuildPath(sketch: SketchRef): Promise<string[]>; } export interface SketchRef { @@ -114,6 +163,19 @@ export namespace SketchRef { uri: typeof uriLike === 'string' ? uriLike : uriLike.toString(), }; } + export function is(arg: unknown): arg is SketchRef { + if (typeof arg === 'object') { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const object = arg as any; + return ( + 'name' in object && + typeof object['name'] === 'string' && + 'uri' in object && + typeof object['name'] === 'string' + ); + } + return false; + } } export interface Sketch extends SketchRef { readonly mainFileUri: string; // `MainFile` @@ -122,29 +184,168 @@ export interface Sketch extends SketchRef { readonly rootFolderFileUris: string[]; // `RootFolderFiles` (does not include the main sketch file) } export namespace Sketch { - export function is(arg: any): arg is Sketch { + // (non-API) exported for the tests + export const defaultSketchFolderName = 'sketch'; + // (non-API) exported for the tests + export const defaultFallbackChar = '_'; + // (non-API) exported for the tests + export function reservedFilename(name: string): string { + return nls.localize( + 'arduino/sketch/reservedFilename', + "'{0}' is a reserved filename.", + name + ); + } + // (non-API) exported for the tests + export const noTrailingPeriod = nls.localize( + 'arduino/sketch/noTrailingPeriod', + 'A filename cannot end with a dot' + ); + // (non-API) exported for the tests + export const invalidSketchFolderNameMessage = nls.localize( + 'arduino/sketch/invalidSketchName', + 'The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.' + ); + const invalidCloudSketchFolderNameMessage = nls.localize( + 'arduino/sketch/invalidCloudSketchName', + 'The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.' + ); + /** + * `undefined` if the candidate sketch folder name is valid. Otherwise, the validation error message. + * Based on the [specs](https://arduino.github.io/arduino-cli/latest/sketch-specification/#sketch-folders-and-files). + */ + export function validateSketchFolderName( + candidate: string + ): string | undefined { + const validFilenameError = isValidFilename(candidate); + if (validFilenameError) { + return validFilenameError; + } + return /^[0-9a-zA-Z_]{1}[0-9a-zA-Z_\.-]{0,62}$/.test(candidate) + ? undefined + : invalidSketchFolderNameMessage; + } + + /** + * `undefined` if the candidate cloud sketch folder name is valid. Otherwise, the validation error message. + */ + export function validateCloudSketchFolderName( + candidate: string + ): string | undefined { + const validFilenameError = isValidFilename(candidate); + if (validFilenameError) { + return validFilenameError; + } + return /^[0-9a-zA-Z_]{1}[0-9a-zA-Z_\.-]{0,35}$/.test(candidate) + ? undefined + : invalidCloudSketchFolderNameMessage; + } + + function isValidFilename(candidate: string): string | undefined { + if (isReservedFilename(candidate)) { + return reservedFilename(candidate); + } + if (endsWithPeriod(candidate)) { + return noTrailingPeriod; + } + return undefined; + } + + function endsWithPeriod(candidate: string): boolean { + return candidate.length > 1 && candidate[candidate.length - 1] === '.'; + } + + function isReservedFilename(candidate: string): boolean { return ( - !!arg && - 'name' in arg && - 'uri' in arg && - typeof arg.name === 'string' && - typeof arg.uri === 'string' + filenameReservedRegex().test(candidate) || + filenameReservedRegex.windowsNames().test(candidate) ); } + + /** + * Transforms the `candidate` argument into a valid sketch folder name by replacing all invalid characters with underscore (`_`) and trimming the string after 63 characters. + * If the argument is falsy, returns with `"sketch"`. + */ + export function toValidSketchFolderName( + candidate: string, + /** + * Type of `Date` is only for tests. Use boolean for production. + */ + appendTimestampSuffix: boolean | Date = false + ): string { + if ( + !appendTimestampSuffix && + filenameReservedRegex.windowsNames().test(candidate) + ) { + return defaultSketchFolderName; + } + const validName = candidate + ? candidate.replace(/[^0-9a-zA-Z_]/g, defaultFallbackChar).slice(0, 63) + : defaultSketchFolderName; + if (appendTimestampSuffix) { + return `${validName.slice(0, 63 - timestampSuffixLength)}${ + typeof appendTimestampSuffix === 'boolean' + ? timestampSuffix() + : timestampSuffix(appendTimestampSuffix) + }`; + } + return validName; + } + + const copy = '_copy_'; + const datetimeFormat = 'yyyymmddHHMMss'; + const timestampSuffixLength = copy.length + datetimeFormat.length; + // (non-API) + export function timestampSuffix(now = new Date()): string { + return `${copy}${dateFormat(now, datetimeFormat)}`; + } + + /** + * Transforms the `candidate` argument into a valid cloud sketch folder name by replacing all invalid characters with underscore and trimming the string after 36 characters. + */ + export function toValidCloudSketchFolderName(candidate: string): string { + if (filenameReservedRegex.windowsNames().test(candidate)) { + return defaultSketchFolderName; + } + return candidate + ? candidate.replace(/[^0-9a-zA-Z_]/g, defaultFallbackChar).slice(0, 36) + : defaultSketchFolderName; + } + + export function is(arg: unknown): arg is Sketch { + if (!SketchRef.is(arg)) { + return false; + } + if (typeof arg === 'object') { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const object = arg as any; + return ( + 'mainFileUri' in object && + typeof object['mainFileUri'] === 'string' && + 'otherSketchFileUris' in object && + Array.isArray(object['otherSketchFileUris']) && + 'additionalFileUris' in object && + Array.isArray(object['additionalFileUris']) && + 'rootFolderFileUris' in object && + Array.isArray(object['rootFolderFileUris']) + ); + } + return false; + } export namespace Extensions { - export const MAIN = ['.ino', '.pde']; - export const SOURCE = ['.c', '.cpp', '.s']; - export const ADDITIONAL = [ + export const DEFAULT = '.ino'; + export const MAIN = [DEFAULT, '.pde']; + export const SOURCE = ['.c', '.cpp', '.S', '.cxx', '.cc']; + export const CODE_FILES = [ + ...MAIN, + ...SOURCE, '.h', - '.c', - '.hpp', '.hh', - '.cpp', - '.S', - '.json', - '.md', - '.adoc', + '.hpp', + '.tpp', + '.ipp', ]; + export const ADDITIONAL = [...CODE_FILES, '.json', '.md', '.adoc']; export const ALL = Array.from(new Set([...MAIN, ...SOURCE, ...ADDITIONAL])); } export function isInSketch(uri: string | URI, sketch: Sketch): boolean { diff --git a/arduino-ide-extension/src/common/protocol/survey-service.ts b/arduino-ide-extension/src/common/protocol/survey-service.ts deleted file mode 100644 index 3ab53b230..000000000 --- a/arduino-ide-extension/src/common/protocol/survey-service.ts +++ /dev/null @@ -1,7 +0,0 @@ -export const SurveyNotificationServicePath = - '/services/survey-notification-service'; -export const SurveyNotificationService = Symbol('SurveyNotificationService'); - -export interface SurveyNotificationService { - isFirstInstance(): Promise<boolean>; -} diff --git a/arduino-ide-extension/src/common/types.ts b/arduino-ide-extension/src/common/types.ts index 421a27534..c73987650 100644 --- a/arduino-ide-extension/src/common/types.ts +++ b/arduino-ide-extension/src/common/types.ts @@ -1,3 +1,7 @@ export type RecursiveRequired<T> = { [P in keyof T]-?: RecursiveRequired<T[P]>; }; + +export type Defined<T> = { + [P in keyof T]: NonNullable<T[P]>; +}; diff --git a/arduino-ide-extension/src/common/utils.ts b/arduino-ide-extension/src/common/utils.ts index 8ffa1fd9a..8a392c770 100644 --- a/arduino-ide-extension/src/common/utils.ts +++ b/arduino-ide-extension/src/common/utils.ts @@ -13,6 +13,51 @@ export function firstToUpperCase(what: string): string { return what.charAt(0).toUpperCase() + what.slice(1); } -export function isNullOrUndefined(what: any): what is undefined | null { +export function startsWithUpperCase(what: string): boolean { + return !!what && what.charAt(0) === firstToUpperCase(what.charAt(0)); +} + +export function isNullOrUndefined(what: unknown): what is undefined | null { return what === undefined || what === null; } + +// Use it for and exhaustive `switch` statements +// https://stackoverflow.com/a/39419171/5529090 +// eslint-disable-next-line @typescript-eslint/no-unused-vars +export function assertUnreachable(_: never): never { + throw new Error(); +} + +// Text encoder can crash in electron browser: https://github.com/arduino/arduino-ide/issues/634#issuecomment-1440039171 +export function uint8ArrayToString(uint8Array: Uint8Array): string { + return uint8Array.reduce( + (text, byte) => text + String.fromCharCode(byte), + '' + ); +} +export function stringToUint8Array(text: string): Uint8Array { + 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); + }); +} diff --git a/arduino-ide-extension/src/electron-browser/electron-app-service.ts b/arduino-ide-extension/src/electron-browser/electron-app-service.ts new file mode 100644 index 000000000..a564646ca --- /dev/null +++ b/arduino-ide-extension/src/electron-browser/electron-app-service.ts @@ -0,0 +1,26 @@ +import type { Disposable } from '@theia/core/lib/common/disposable'; +import { injectable } from '@theia/core/shared/inversify'; +import type { AppInfo, AppService } from '../browser/app-service'; +import type { Sketch } from '../common/protocol/sketches-service'; +import type { StartupTasks } from '../electron-common/startup-task'; + +@injectable() +export class ElectronAppService implements AppService { + quit(): void { + window.electronArduino.quitApp(); + } + + info(): Promise<AppInfo> { + return window.electronArduino.appInfo(); + } + + registerStartupTasksHandler( + handler: (tasks: StartupTasks) => void + ): Disposable { + return window.electronArduino.registerStartupTasksHandler(handler); + } + + scheduleDeletion(sketch: Sketch): void { + window.electronArduino.scheduleDeletion(sketch); + } +} diff --git a/arduino-ide-extension/src/electron-browser/electron-arduino-module.ts b/arduino-ide-extension/src/electron-browser/electron-arduino-module.ts new file mode 100644 index 000000000..d0f97c1b0 --- /dev/null +++ b/arduino-ide-extension/src/electron-browser/electron-arduino-module.ts @@ -0,0 +1,12 @@ +import { ContainerModule } from '@theia/core/shared/inversify'; +import { AppService } from '../browser/app-service'; +import { DialogService } from '../browser/dialog-service'; +import { ElectronAppService } from './electron-app-service'; +import { ElectronDialogService } from './electron-dialog-service'; + +export default new ContainerModule((bind) => { + bind(ElectronAppService).toSelf().inSingletonScope(); + bind(AppService).toService(ElectronAppService); + bind(ElectronDialogService).toSelf().inSingletonScope(); + bind(DialogService).toService(ElectronDialogService); +}); diff --git a/arduino-ide-extension/src/electron-browser/electron-dialog-service.ts b/arduino-ide-extension/src/electron-browser/electron-dialog-service.ts new file mode 100644 index 000000000..edb4cbd26 --- /dev/null +++ b/arduino-ide-extension/src/electron-browser/electron-dialog-service.ts @@ -0,0 +1,25 @@ +import { injectable } from '@theia/core/shared/inversify'; +import type { DialogService } from '../browser/dialog-service'; +import type { + MessageBoxOptions, + MessageBoxReturnValue, + OpenDialogOptions, + OpenDialogReturnValue, + SaveDialogOptions, + SaveDialogReturnValue, +} from '../electron-common/electron-arduino'; + +@injectable() +export class ElectronDialogService implements DialogService { + showMessageBox(options: MessageBoxOptions): Promise<MessageBoxReturnValue> { + return window.electronArduino.showMessageBox(options); + } + + showOpenDialog(options: OpenDialogOptions): Promise<OpenDialogReturnValue> { + return window.electronArduino.showOpenDialog(options); + } + + showSaveDialog(options: SaveDialogOptions): Promise<SaveDialogReturnValue> { + return window.electronArduino.showSaveDialog(options); + } +} diff --git a/arduino-ide-extension/src/electron-browser/preload.ts b/arduino-ide-extension/src/electron-browser/preload.ts new file mode 100644 index 000000000..ed4d2d11c --- /dev/null +++ b/arduino-ide-extension/src/electron-browser/preload.ts @@ -0,0 +1,131 @@ +import { + contextBridge, + ipcRenderer, +} from '@theia/core/electron-shared/electron'; +import { Disposable } from '@theia/core/lib/common/disposable'; +import { + CHANNEL_REQUEST_RELOAD, + MenuDto, +} from '@theia/core/lib/electron-common/electron-api'; +import { UUID } from '@theia/core/shared/@phosphor/coreutils'; +import type { Sketch } from '../common/protocol/sketches-service'; +import { + CHANNEL_APP_INFO, + CHANNEL_IS_FIRST_WINDOW, + CHANNEL_MAIN_MENU_ITEM_DID_CLICK, + CHANNEL_OPEN_PATH, + CHANNEL_PLOTTER_WINDOW_DID_CLOSE, + CHANNEL_QUIT_APP, + CHANNEL_SCHEDULE_DELETION, + CHANNEL_SEND_STARTUP_TASKS, + CHANNEL_SET_MENU_WITH_NODE_ID, + CHANNEL_SET_REPRESENTED_FILENAME, + CHANNEL_SHOW_MESSAGE_BOX, + CHANNEL_SHOW_OPEN_DIALOG, + CHANNEL_SHOW_PLOTTER_WINDOW, + CHANNEL_SHOW_SAVE_DIALOG, + ElectronArduino, + InternalMenuDto, + MessageBoxOptions, + OpenDialogOptions, + SaveDialogOptions, +} from '../electron-common/electron-arduino'; +import { hasStartupTasks, StartupTasks } from '../electron-common/startup-task'; + +let mainMenuHandlers: Map<string, () => void> = new Map(); + +function convertMenu( + menu: MenuDto[] | undefined, + handlerMap: Map<string, () => void> +): InternalMenuDto[] | undefined { + if (!menu) { + return undefined; + } + + return menu.map((item) => { + let nodeId = UUID.uuid4(); + if (item.execute) { + if (!item.id) { + throw new Error( + "A menu item having the 'execute' property must have an 'id' too." + ); + } + nodeId = item.id; + handlerMap.set(nodeId, item.execute); + } + + return { + id: item.id, + submenu: convertMenu(item.submenu, handlerMap), + accelerator: item.accelerator, + label: item.label, + nodeId, + checked: item.checked, + enabled: item.enabled, + role: item.role, + type: item.type, + visible: item.visible, + }; + }); +} + +const api: ElectronArduino = { + showMessageBox: (options: MessageBoxOptions) => + ipcRenderer.invoke(CHANNEL_SHOW_MESSAGE_BOX, options), + showOpenDialog: (options: OpenDialogOptions) => + ipcRenderer.invoke(CHANNEL_SHOW_OPEN_DIALOG, options), + showSaveDialog: (options: SaveDialogOptions) => + ipcRenderer.invoke(CHANNEL_SHOW_SAVE_DIALOG, options), + appInfo: () => ipcRenderer.invoke(CHANNEL_APP_INFO), + quitApp: () => ipcRenderer.send(CHANNEL_QUIT_APP), + isFirstWindow: () => ipcRenderer.invoke(CHANNEL_IS_FIRST_WINDOW), + requestReload: (options: StartupTasks) => + ipcRenderer.send(CHANNEL_REQUEST_RELOAD, options), + registerStartupTasksHandler: (handler: (tasks: StartupTasks) => void) => { + const listener = (_: Electron.IpcRendererEvent, args: unknown) => { + if (hasStartupTasks(args)) { + handler(args); + } else { + console.warn( + `Events received on the ${CHANNEL_SEND_STARTUP_TASKS} channel expected to have a startup task argument, but it was: ${JSON.stringify( + args + )}` + ); + } + }; + ipcRenderer.on(CHANNEL_SEND_STARTUP_TASKS, listener); + return Disposable.create(() => + ipcRenderer.removeListener(CHANNEL_SEND_STARTUP_TASKS, listener) + ); + }, + scheduleDeletion: (sketch: Sketch) => + ipcRenderer.send(CHANNEL_SCHEDULE_DELETION, sketch), + setRepresentedFilename: (fsPath: string) => + ipcRenderer.send(CHANNEL_SET_REPRESENTED_FILENAME, fsPath), + showPlotterWindow: (params: { url: string; forceReload?: boolean }) => + ipcRenderer.send(CHANNEL_SHOW_PLOTTER_WINDOW, params), + registerPlotterWindowCloseHandler: (handler: () => void) => { + const listener = () => handler(); + ipcRenderer.on(CHANNEL_PLOTTER_WINDOW_DID_CLOSE, listener); + return Disposable.create(() => + ipcRenderer.removeListener(CHANNEL_PLOTTER_WINDOW_DID_CLOSE, listener) + ); + }, + openPath: (fsPath: string) => ipcRenderer.send(CHANNEL_OPEN_PATH, fsPath), + setMenu: (menu: MenuDto[] | undefined): void => { + mainMenuHandlers = new Map(); + const internalMenu = convertMenu(menu, mainMenuHandlers); + ipcRenderer.send(CHANNEL_SET_MENU_WITH_NODE_ID, internalMenu); + }, +}; + +export function preload(): void { + contextBridge.exposeInMainWorld('electronArduino', api); + ipcRenderer.on(CHANNEL_MAIN_MENU_ITEM_DID_CLICK, (_, nodeId: string) => { + const handler = mainMenuHandlers.get(nodeId); + if (handler) { + handler(); + } + }); + console.log('Exposed Arduino IDE electron API'); +} diff --git a/arduino-ide-extension/src/electron-browser/theia/core/electron-context-menu-renderer.ts b/arduino-ide-extension/src/electron-browser/theia/core/electron-context-menu-renderer.ts new file mode 100644 index 000000000..d594d01da --- /dev/null +++ b/arduino-ide-extension/src/electron-browser/theia/core/electron-context-menu-renderer.ts @@ -0,0 +1,55 @@ +import { + ContextMenuAccess, + coordinateFromAnchor, + RenderContextMenuOptions, +} from '@theia/core/lib/browser/context-menu-renderer'; +import { + ElectronContextMenuAccess, + ElectronContextMenuRenderer as TheiaElectronContextMenuRenderer, +} from '@theia/core/lib/electron-browser/menu/electron-context-menu-renderer'; +import { injectable } from '@theia/core/shared/inversify'; + +@injectable() +export class ElectronContextMenuRenderer extends TheiaElectronContextMenuRenderer { + protected override doRender( + options: RenderContextMenuOptions + ): ContextMenuAccess { + if (this.useNativeStyle) { + const { menuPath, anchor, args, onHide, context, contextKeyService } = + options; + const menu = this['electronMenuFactory'].createElectronContextMenu( + menuPath, + args, + context, + contextKeyService, + this.showDisabled(options) + ); + const { x, y } = coordinateFromAnchor(anchor); + const menuHandle = window.electronTheiaCore.popup(menu, x, y, () => { + if (onHide) { + onHide(); + } + }); + // native context menu stops the event loop, so there is no keyboard events + this.context.resetAltPressed(); + return new ElectronContextMenuAccess(menuHandle); + } else { + return super.doRender(options); + } + } + + /** + * Theia does not allow selectively control whether disabled menu items are visible or not. This is a workaround. + * Attach the `showDisabled: true` to the `RenderContextMenuOptions` object, and you can control it. + * https://github.com/eclipse-theia/theia/blob/d59d5279b93e5050c2cbdd4b6726cab40187c50e/packages/core/src/electron-browser/menu/electron-main-menu-factory.ts#L134. + */ + private showDisabled(options: RenderContextMenuOptions): boolean { + if ('showDisabled' in options) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const object = options as any; + const showDisabled = object['showDisabled'] as unknown; + return typeof showDisabled === 'boolean' && Boolean(showDisabled); + } + return false; + } +} diff --git a/arduino-ide-extension/src/electron-browser/theia/core/electron-main-menu-factory.ts b/arduino-ide-extension/src/electron-browser/theia/core/electron-main-menu-factory.ts index 98f8b76e0..cec3f54e6 100644 --- a/arduino-ide-extension/src/electron-browser/theia/core/electron-main-menu-factory.ts +++ b/arduino-ide-extension/src/electron-browser/theia/core/electron-main-menu-factory.ts @@ -1,21 +1,29 @@ -import { inject, injectable } from '@theia/core/shared/inversify'; -import * as remote from '@theia/core/electron-shared/@electron/remote'; -import { isOSX } from '@theia/core/lib/common/os'; +import { ContextMatcher } from '@theia/core/lib/browser/context-key-service'; +import { FrontendApplicationConfigProvider } from '@theia/core/lib/browser/frontend-application-config-provider'; +import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state'; import { - CompositeMenuNode, + CommandMenuNode, + CompoundMenuNode, + CompoundMenuNodeRole, MAIN_MENU_BAR, + MenuNode, MenuPath, } from '@theia/core/lib/common/menu'; +import { isOSX } from '@theia/core/lib/common/os'; import { - ElectronMainMenuFactory as TheiaElectronMainMenuFactory, - ElectronMenuItemRole, ElectronMenuOptions, + ElectronMainMenuFactory as TheiaElectronMainMenuFactory, } from '@theia/core/lib/electron-browser/menu/electron-main-menu-factory'; +import type { + MenuDto, + MenuRole, +} from '@theia/core/lib/electron-common/electron-api'; +import { inject, injectable } from '@theia/core/shared/inversify'; import { ArduinoMenus, PlaceholderMenuNode, } from '../../../browser/menu/arduino-menus'; -import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state'; +import debounce from 'lodash.debounce'; @injectable() export class ElectronMainMenuFactory extends TheiaElectronMainMenuFactory { @@ -26,28 +34,50 @@ export class ElectronMainMenuFactory extends TheiaElectronMainMenuFactory { private updateWhenReady = false; override postConstruct(): void { - super.postConstruct(); + // #region Theia `postConstruct` customizations with calling IDE2 `setMenu` + this.preferencesService.onPreferenceChanged( + debounce((e) => { + if (e.preferenceName === 'window.menuBarVisibility') { + this.doSetMenuBar(); + } + if (this.menu) { + for (const cmd of this.toggledCommands) { + const menuItem = this.findMenuById(this.menu, cmd); + if (menuItem) { + menuItem.checked = this.commandRegistry.isToggled(cmd); + } + } + window.electronArduino.setMenu(this.menu); // calls the IDE2-specific implementation + } + }, 10) + ); + this.keybindingRegistry.onKeybindingsChanged(() => { + this.doSetMenuBar(); + }); + // #endregion Theia `postConstruct` this.appStateService.reachedState('ready').then(() => { this.appReady = true; if (this.updateWhenReady) { - this.setMenuBar(); + this.doSetMenuBar(); } }); } - override createElectronMenuBar(): Electron.Menu { - this._toggledCommands.clear(); // https://github.com/eclipse-theia/theia/issues/8977 + override createElectronMenuBar(): MenuDto[] { + this.toggledCommands.clear(); // https://github.com/eclipse-theia/theia/issues/8977 const menuModel = this.menuProvider.getMenu(MAIN_MENU_BAR); - const template = this.fillMenuTemplate([], menuModel); + const menu = this.fillMenuTemplate([], menuModel, [], { + rootMenuPath: MAIN_MENU_BAR, + }); if (isOSX) { - template.unshift(this.createOSXMenu()); + menu.unshift(this.createOSXMenu()); } - const menu = remote.Menu.buildFromTemplate(this.escapeAmpersand(template)); - this._menu = menu; - return menu; + const escapedMenu = this.escapeAmpersand(menu); + this.menu = escapedMenu; + return escapedMenu; } - override async setMenuBar(): Promise<void> { + override async doSetMenuBar(): Promise<void> { // Avoid updating menu items when the app is not ready. // 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. @@ -57,57 +87,97 @@ export class ElectronMainMenuFactory extends TheiaElectronMainMenuFactory { } await this.preferencesService.ready; const createdMenuBar = this.createElectronMenuBar(); - if (isOSX) { - remote.Menu.setApplicationMenu(createdMenuBar); - } else { - remote.getCurrentWindow().setMenu(createdMenuBar); - } + window.electronArduino.setMenu(createdMenuBar); } override createElectronContextMenu( menuPath: MenuPath, - args?: any[] - ): Electron.Menu { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + args?: any[], + context?: HTMLElement, + contextKeyService?: ContextMatcher, + showDisabled?: boolean + ): MenuDto[] { const menuModel = this.menuProvider.getMenu(menuPath); - const template = this.fillMenuTemplate([], menuModel, args, { - showDisabled: false, + return this.fillMenuTemplate([], menuModel, args, { + showDisabled, + context, + rootMenuPath: menuPath, + contextKeyService, }); - return remote.Menu.buildFromTemplate(this.escapeAmpersand(template)); + } + + protected override async execute( + commandId: string, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + args: any[], + menuPath: MenuPath + ): Promise<void> { + try { + // This is workaround for https://github.com/eclipse-theia/theia/issues/446. + // Electron menus do not update based on the `isEnabled`, `isVisible` property of the command. + // We need to check if we can execute it. + if (this.menuCommandExecutor.isEnabled(menuPath, commandId, ...args)) { + await this.menuCommandExecutor.executeCommand( + menuPath, + commandId, + ...args + ); + if ( + this.menu && + this.menuCommandExecutor.isVisible(menuPath, commandId, ...args) + ) { + const item = this.findMenuById(this.menu, commandId); + if (item) { + item.checked = this.menuCommandExecutor.isToggled( + menuPath, + commandId, + ...args + ); + window.electronArduino.setMenu(this.menu); // overridden to call the IDE2-specific implementation. + } + } + } + } catch { + // no-op + } } // TODO: remove after https://github.com/eclipse-theia/theia/pull/9231 - private escapeAmpersand( - template: Electron.MenuItemConstructorOptions[] - ): Electron.MenuItemConstructorOptions[] { + private escapeAmpersand(template: MenuDto[]): MenuDto[] { for (const option of template) { if (option.label) { option.label = option.label.replace(/\&+/g, '&$&'); } if (option.submenu) { - this.escapeAmpersand( - option.submenu as Electron.MenuItemConstructorOptions[] - ); + this.escapeAmpersand(option.submenu); } } return template; } - protected override createOSXMenu(): Electron.MenuItemConstructorOptions { + protected override createOSXMenu(): MenuDto { const { submenu } = super.createOSXMenu(); - const label = 'Arduino IDE'; + const label = FrontendApplicationConfigProvider.get().applicationName; if (!!submenu && Array.isArray(submenu)) { const [, , /* about */ /* preferences */ ...rest] = submenu; const about = this.fillMenuTemplate( [], - this.menuProvider.getMenu(ArduinoMenus.HELP__ABOUT_GROUP) + this.menuProvider.getMenu(ArduinoMenus.HELP__ABOUT_GROUP), + [], + { rootMenuPath: ArduinoMenus.HELP__ABOUT_GROUP } ); const preferences = this.fillMenuTemplate( [], - this.menuProvider.getMenu(ArduinoMenus.FILE__PREFERENCES_GROUP) + this.menuProvider.getMenu(ArduinoMenus.FILE__PREFERENCES_GROUP), + [], + { rootMenuPath: ArduinoMenus.FILE__PREFERENCES_GROUP } ); const advanced = this.fillMenuTemplate( [], - this.menuProvider.getMenu(ArduinoMenus.FILE__ADVANCED_GROUP) + this.menuProvider.getMenu(ArduinoMenus.FILE__ADVANCED_GROUP), + [], + { rootMenuPath: ArduinoMenus.FILE__ADVANCED_GROUP } ); return { label, @@ -124,8 +194,8 @@ export class ElectronMainMenuFactory extends TheiaElectronMainMenuFactory { return { label, submenu }; } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - protected override roleFor(id: string): ElectronMenuItemRole | undefined { + // eslint-disable-next-line @typescript-eslint/no-unused-vars, unused-imports/no-unused-vars + protected override roleFor(id: string): MenuRole | undefined { // MenuItem `roles` are completely broken on macOS: // - https://github.com/eclipse-theia/theia/issues/11217, // - https://github.com/arduino/arduino-ide/issues/969 @@ -133,20 +203,175 @@ export class ElectronMainMenuFactory extends TheiaElectronMainMenuFactory { return undefined; } - protected override handleElectronDefault( - menuNode: CompositeMenuNode, - args: any[] = [], - options?: ElectronMenuOptions - ): Electron.MenuItemConstructorOptions[] { - if (menuNode instanceof PlaceholderMenuNode) { - return [ - { - label: menuNode.label, - enabled: false, - visible: true, - }, - ]; + protected override fillMenuTemplate( + parentItems: MenuDto[], + menuModel: MenuNode, + args: unknown[] | undefined, + options: ElectronMenuOptions + ): MenuDto[] { + if (menuModel instanceof PlaceholderMenuNode) { + parentItems.push({ + label: menuModel.label, + enabled: false, + visible: true, + }); + } else { + this.superFillMenuTemplate(parentItems, menuModel, args, options); } - return []; + return parentItems; + } + + // Copied from 1.31.1 Theia as is to customize the enablement of the menu items. + // Source: https://github.com/eclipse-theia/theia/blob/5e641750af83383f2ce0cb3432ec333df70778a8/packages/core/src/electron-browser/menu/electron-main-menu-factory.ts#L132-L203 + // See https://github.com/arduino/arduino-ide/issues/1533 + private superFillMenuTemplate( + parentItems: MenuDto[], + menu: MenuNode, + args: unknown[] = [], + options: ElectronMenuOptions + ): MenuDto[] { + const showDisabled = options?.showDisabled !== false; + + if ( + CompoundMenuNode.is(menu) && + this.visibleSubmenu(menu) && // customization for #569 and #655 + this.undefinedOrMatch( + options.contextKeyService ?? this.contextKeyService, + menu.when, + options.context + ) + ) { + const role = CompoundMenuNode.getRole(menu); + if (role === CompoundMenuNodeRole.Group && menu.id === 'inline') { + return parentItems; + } + const children = CompoundMenuNode.getFlatChildren(menu.children); + const myItems: MenuDto[] = []; + children.forEach((child) => + this.fillMenuTemplate(myItems, child, args, options) + ); + if (myItems.length === 0) { + // customization for #569 and #655 + if (!this.visibleLeafSubmenu(menu)) { + return parentItems; + } + } + if (role === CompoundMenuNodeRole.Submenu) { + parentItems.push({ + label: menu.label, + submenu: myItems, + enabled: !this.visibleLeafSubmenu(menu), // customization for #569 and #655 + }); + } else if (role === CompoundMenuNodeRole.Group && menu.id !== 'inline') { + if ( + parentItems.length && + parentItems[parentItems.length - 1].type !== 'separator' + ) { + parentItems.push({ type: 'separator' }); + } + parentItems.push(...myItems); + parentItems.push({ type: 'separator' }); + } + } else if (menu.command) { + const node = + menu.altNode && this.context.altPressed + ? menu.altNode + : (menu as MenuNode & CommandMenuNode); + const commandId = node.command; + + // That is only a sanity check at application startup. + if (!this.commandRegistry.getCommand(commandId)) { + console.debug( + `Skipping menu item with missing command: "${commandId}".` + ); + return parentItems; + } + + if ( + !this.menuCommandExecutor.isVisible( + options.rootMenuPath, + commandId, + ...args + ) || + !this.undefinedOrMatch( + options.contextKeyService ?? this.contextKeyService, + node.when, + options.context + ) + ) { + return parentItems; + } + + // We should omit rendering context-menu items which are disabled. + if ( + !showDisabled && + !this.menuCommandExecutor.isEnabled( + options.rootMenuPath, + commandId, + ...args + ) + ) { + return parentItems; + } + + const bindings = + this.keybindingRegistry.getKeybindingsForCommand(commandId); + + const accelerator = bindings[0] && this.acceleratorFor(bindings[0]); + + const menuItem: MenuDto = { + id: node.id, + label: node.label, + type: this.commandRegistry.getToggledHandler(commandId, ...args) + ? 'checkbox' + : 'normal', + checked: this.commandRegistry.isToggled(commandId, ...args), + enabled: this.commandRegistry.isEnabled(commandId, ...args), // Unlike Theia https://github.com/eclipse-theia/theia/blob/v1.31.1/packages/core/src/electron-browser/menu/electron-main-menu-factory.ts#L183 + visible: true, + accelerator, + execute: () => this.execute(commandId, args, options.rootMenuPath), + }; + + if (isOSX) { + const role = this.roleFor(node.id); + if (role) { + menuItem.role = role; + delete menuItem.execute; + } + } + parentItems.push(menuItem); + + if (this.commandRegistry.getToggledHandler(commandId, ...args)) { + this.toggledCommands.add(commandId); + } + } + return parentItems; + } + + /** + * `true` if either has at least `children`, or was forced to be visible. + */ + private visibleSubmenu(node: MenuNode & CompoundMenuNode): boolean { + return node.children.length > 0 || this.visibleLeafSubmenu(node); + } + + /** + * The node is a visible submenu if is a compound node but has zero children. + */ + private visibleLeafSubmenu(node: MenuNode): boolean { + if (CompoundMenuNode.is(node)) { + return ( + node.children.length === 0 && + AlwaysVisibleSubmenus.findIndex( + (menuPath) => menuPath[menuPath.length - 1] === node.id + ) >= 0 + ); + } + return false; } } + +const AlwaysVisibleSubmenus: MenuPath[] = [ + ArduinoMenus.TOOLS__PORTS_SUBMENU, // #655 + ArduinoMenus.FILE__SKETCHBOOK_SUBMENU, // #569 +]; diff --git a/arduino-ide-extension/src/electron-browser/theia/core/electron-menu-contribution.ts b/arduino-ide-extension/src/electron-browser/theia/core/electron-menu-contribution.ts index 9327637d7..e01898208 100644 --- a/arduino-ide-extension/src/electron-browser/theia/core/electron-menu-contribution.ts +++ b/arduino-ide-extension/src/electron-browser/theia/core/electron-menu-contribution.ts @@ -1,57 +1,40 @@ -import { inject, injectable } from '@theia/core/shared/inversify'; -import { CommandRegistry } from '@theia/core/lib/common/command'; -import { MenuModelRegistry } from '@theia/core/lib/common/menu'; -import { KeybindingRegistry } from '@theia/core/lib/browser/keybinding'; +import type { FrontendApplication } from '@theia/core/lib/browser/frontend-application'; +import type { KeybindingRegistry } from '@theia/core/lib/browser/keybinding'; +import type { CommandRegistry } from '@theia/core/lib/common/command'; +import type { MenuModelRegistry } from '@theia/core/lib/common/menu'; +import { isOSX } from '@theia/core/lib/common/os'; import { - ElectronMenuContribution as TheiaElectronMenuContribution, ElectronCommands, + ElectronMenuContribution as TheiaElectronMenuContribution, } from '@theia/core/lib/electron-browser/menu/electron-menu-contribution'; -import { MainMenuManager } from '../../../common/main-menu-manager'; -import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state'; -import { FrontendApplication } from '@theia/core/lib/browser/frontend-application'; -import { ZoomLevel } from '@theia/core/lib/electron-browser/window/electron-window-preferences'; -import { PreferenceScope } from '@theia/core/lib/browser/preferences/preference-scope'; -import { - getCurrentWindow, - getCurrentWebContents, -} from '@theia/core/electron-shared/@electron/remote'; +import type { MenuDto } from '@theia/core/lib/electron-common/electron-api'; +import { inject, injectable } from '@theia/core/shared/inversify'; +import type { MainMenuManager } from '../../../common/main-menu-manager'; +import { ElectronMainMenuFactory } from './electron-main-menu-factory'; @injectable() -export class ElectronMenuContribution - extends TheiaElectronMenuContribution - implements MainMenuManager -{ - @inject(FrontendApplicationStateService) - private readonly appStateService: FrontendApplicationStateService; +export class ElectronMenuUpdater implements MainMenuManager { + @inject(ElectronMainMenuFactory) + protected readonly factory: ElectronMainMenuFactory; - // private appReady = false; - // private updateWhenReady = false; + public update(): void { + this.setMenu(); + } - override onStart(app: FrontendApplication): void { - super.onStart(app); - this.appStateService.reachedState('ready').then(() => { - // this.appReady = true; - // if (this.updateWhenReady) { - // this.update(); - // } - }); + private setMenu(): void { + window.electronArduino.setMenu(this.factory.createElectronMenuBar()); } +} +@injectable() +export class ElectronMenuContribution extends TheiaElectronMenuContribution { protected override hideTopPanel(): void { // NOOP // We reuse the `div` for the Arduino toolbar. } - update(): void { - // if (this.appReady) { - (this as any).setMenu(); - // } else { - // this.updateWhenReady = true; - // } - } - override registerCommands(registry: CommandRegistry): void { - this.theiaRegisterCommands(registry); + super.registerCommands(registry); registry.unregisterCommand(ElectronCommands.CLOSE_WINDOW); } @@ -67,80 +50,17 @@ export class ElectronMenuContribution registry.unregisterKeybinding(ElectronCommands.ZOOM_OUT.id); } - // Copied from Theia: https://github.com/eclipse-theia/theia/blob/9ec8835cf35d5a46101a62ae93285aeb37a2f382/packages/core/src/electron-browser/menu/electron-menu-contribution.ts#L260-L314 - // Unlike the Theia implementation, this does not require synchronously the browser window, but use a function only when the command handler executes. - private theiaRegisterCommands(registry: CommandRegistry): void { - const currentWindow = () => getCurrentWindow(); - - registry.registerCommand(ElectronCommands.TOGGLE_DEVELOPER_TOOLS, { - execute: () => { - const webContent = getCurrentWebContents(); - if (!webContent.isDevToolsOpened()) { - webContent.openDevTools(); - } else { - webContent.closeDevTools(); - } - }, - }); - - registry.registerCommand(ElectronCommands.RELOAD, { - execute: () => this.windowService.reload(), - }); - registry.registerCommand(ElectronCommands.CLOSE_WINDOW, { - execute: () => currentWindow().close(), - }); - - registry.registerCommand(ElectronCommands.ZOOM_IN, { - execute: () => { - const webContents = currentWindow().webContents; - // When starting at a level that is not a multiple of 0.5, increment by at most 0.5 to reach the next highest multiple of 0.5. - let zoomLevel = - Math.floor(webContents.zoomLevel / ZoomLevel.VARIATION) * - ZoomLevel.VARIATION + - ZoomLevel.VARIATION; - if (zoomLevel > ZoomLevel.MAX) { - zoomLevel = ZoomLevel.MAX; - return; - } - this.preferenceService.set( - 'window.zoomLevel', - zoomLevel, - PreferenceScope.User - ); - }, - }); - registry.registerCommand(ElectronCommands.ZOOM_OUT, { - execute: () => { - const webContents = currentWindow().webContents; - // When starting at a level that is not a multiple of 0.5, decrement by at most 0.5 to reach the next lowest multiple of 0.5. - let zoomLevel = - Math.ceil(webContents.zoomLevel / ZoomLevel.VARIATION) * - ZoomLevel.VARIATION - - ZoomLevel.VARIATION; - if (zoomLevel < ZoomLevel.MIN) { - zoomLevel = ZoomLevel.MIN; - return; - } - this.preferenceService.set( - 'window.zoomLevel', - zoomLevel, - PreferenceScope.User - ); - }, - }); - registry.registerCommand(ElectronCommands.RESET_ZOOM, { - execute: () => - this.preferenceService.set( - 'window.zoomLevel', - ZoomLevel.DEFAULT, - PreferenceScope.User - ), - }); - registry.registerCommand(ElectronCommands.TOGGLE_FULL_SCREEN, { - isEnabled: () => currentWindow().isFullScreenable(), - isVisible: () => currentWindow().isFullScreenable(), - execute: () => - currentWindow().setFullScreen(!currentWindow().isFullScreen()), - }); + protected override setMenu( + app: FrontendApplication, + electronMenu: MenuDto[] | undefined = this.factory.createElectronMenuBar() + ): void { + if (!isOSX) { + this.hideTopPanel(); // no app args. the overridden method is noop in IDE2. + if (this.titleBarStyle === 'custom' && !this.menuBar) { + this.createCustomTitleBar(app); + return; + } + } + window.electronArduino.setMenu(electronMenu); // overridden to call the IDE20-specific implementation. } } diff --git a/arduino-ide-extension/src/electron-browser/theia/core/electron-menu-module.ts b/arduino-ide-extension/src/electron-browser/theia/core/electron-menu-module.ts index 7e827ff4a..d715cc0f1 100644 --- a/arduino-ide-extension/src/electron-browser/theia/core/electron-menu-module.ts +++ b/arduino-ide-extension/src/electron-browser/theia/core/electron-menu-module.ts @@ -1,13 +1,21 @@ -import { ContainerModule } from '@theia/core/shared/inversify'; +import { ContextMenuRenderer } from '@theia/core/lib/browser/context-menu-renderer'; import { ElectronMainMenuFactory as TheiaElectronMainMenuFactory } from '@theia/core/lib/electron-browser/menu/electron-main-menu-factory'; import { ElectronMenuContribution as TheiaElectronMenuContribution } from '@theia/core/lib/electron-browser/menu/electron-menu-contribution'; +import { ContainerModule } from '@theia/core/shared/inversify'; import { MainMenuManager } from '../../../common/main-menu-manager'; +import { ElectronContextMenuRenderer } from './electron-context-menu-renderer'; import { ElectronMainMenuFactory } from './electron-main-menu-factory'; -import { ElectronMenuContribution } from './electron-menu-contribution'; +import { + ElectronMenuContribution, + ElectronMenuUpdater, +} from './electron-menu-contribution'; export default new ContainerModule((bind, unbind, isBound, rebind) => { bind(ElectronMenuContribution).toSelf().inSingletonScope(); - bind(MainMenuManager).toService(ElectronMenuContribution); + bind(ElectronMenuUpdater).toSelf().inSingletonScope(); + bind(MainMenuManager).toService(ElectronMenuUpdater); + bind(ElectronContextMenuRenderer).toSelf().inSingletonScope(); + rebind(ContextMenuRenderer).toService(ElectronContextMenuRenderer); rebind(TheiaElectronMenuContribution).toService(ElectronMenuContribution); bind(ElectronMainMenuFactory).toSelf().inSingletonScope(); rebind(TheiaElectronMainMenuFactory).toService(ElectronMainMenuFactory); diff --git a/arduino-ide-extension/src/electron-browser/theia/core/electron-window-module.ts b/arduino-ide-extension/src/electron-browser/theia/core/electron-window-module.ts index 52a5eb272..ddcfcec1c 100644 --- a/arduino-ide-extension/src/electron-browser/theia/core/electron-window-module.ts +++ b/arduino-ide-extension/src/electron-browser/theia/core/electron-window-module.ts @@ -1,23 +1,10 @@ import { WindowService } from '@theia/core/lib/browser/window/window-service'; -import { ElectronIpcConnectionProvider } from '@theia/core/lib/electron-browser/messaging/electron-ipc-connection-provider'; import { ContainerModule } from '@theia/core/shared/inversify'; import { WindowServiceExt } from '../../../browser/theia/core/window-service-ext'; -import { - ElectronMainWindowServiceExt, - electronMainWindowServiceExtPath, -} from '../../../electron-common/electron-main-window-service-ext'; import { ElectronWindowService } from './electron-window-service'; export default new ContainerModule((bind, unbind, isBound, rebind) => { bind(ElectronWindowService).toSelf().inSingletonScope(); rebind(WindowService).toService(ElectronWindowService); bind(WindowServiceExt).toService(ElectronWindowService); - bind(ElectronMainWindowServiceExt) - .toDynamicValue(({ container }) => - ElectronIpcConnectionProvider.createProxy( - container, - electronMainWindowServiceExtPath - ) - ) - .inSingletonScope(); }); diff --git a/arduino-ide-extension/src/electron-browser/theia/core/electron-window-service.ts b/arduino-ide-extension/src/electron-browser/theia/core/electron-window-service.ts index d0d0a1ef2..67adac604 100644 --- a/arduino-ide-extension/src/electron-browser/theia/core/electron-window-service.ts +++ b/arduino-ide-extension/src/electron-browser/theia/core/electron-window-service.ts @@ -1,73 +1,57 @@ -import * as remote from '@theia/core/electron-shared/@electron/remote'; -import { - ConnectionStatus, - ConnectionStatusService, -} from '@theia/core/lib/browser/connection-status-service'; -import { nls } from '@theia/core/lib/common'; +import { Deferred } from '@theia/core/lib/common/promise-util'; +import type { NewWindowOptions } from '@theia/core/lib/common/window'; import { ElectronWindowService as TheiaElectronWindowService } from '@theia/core/lib/electron-browser/window/electron-window-service'; -import { - inject, - injectable, - postConstruct, -} from '@theia/core/shared/inversify'; +import { injectable, postConstruct } from '@theia/core/shared/inversify'; import { WindowServiceExt } from '../../../browser/theia/core/window-service-ext'; -import { ElectronMainWindowServiceExt } from '../../../electron-common/electron-main-window-service-ext'; +import { + hasStartupTasks, + StartupTasks, +} from '../../../electron-common/startup-task'; +import { WindowReloadOptions } from '@theia/core/lib/browser/window/window-service'; @injectable() export class ElectronWindowService extends TheiaElectronWindowService implements WindowServiceExt { - @inject(ConnectionStatusService) - private readonly connectionStatusService: ConnectionStatusService; - - @inject(ElectronMainWindowServiceExt) - private readonly mainWindowServiceExt: ElectronMainWindowServiceExt; + private _isFirstWindow: Deferred<boolean> | undefined; @postConstruct() protected override init(): void { - // NOOP - // Does not listen on Theia's `window.zoomLevel` changes. - // TODO: IDE2 must switch to the Theia preferences and drop the custom one. - } + // Overridden to avoid calling the zoom level listener in super. + // IDE2 listens on the zoom level changes in `ArduinoFrontendContribution#onStart` - protected shouldUnload(): boolean { - const offline = - this.connectionStatusService.currentStatus === ConnectionStatus.OFFLINE; - const detail = offline - ? nls.localize( - 'arduino/electron/couldNotSave', - 'Could not save the sketch. Please copy your unsaved work into your favorite text editor, and restart the IDE.' - ) - : nls.localize( - 'arduino/electron/unsavedChanges', - 'Any unsaved changes will not be saved.' - ); - const electronWindow = remote.getCurrentWindow(); - const response = remote.dialog.showMessageBoxSync(electronWindow, { - type: 'question', - buttons: [ - nls.localize('vscode/extensionsUtils/yes', 'Yes'), - nls.localize('vscode/extensionsUtils/no', 'No'), - ], - title: nls.localize('vscode/Default/ConfirmTitle', 'Confirm'), - message: nls.localize( - 'arduino/sketch/close', - 'Are you sure you want to close the sketch?' - ), - detail, + window.electronTheiaCore.onAboutToClose(() => { + this.connectionCloseService.markForClose(this.frontendIdProvider.getId()); }); - return response === 0; // 'Yes', close the window. } - private _firstWindow: boolean | undefined; async isFirstWindow(): Promise<boolean> { - if (this._firstWindow === undefined) { - const windowId = remote.getCurrentWindow().id; // This is expensive and synchronous so we check it once per FE. - this._firstWindow = await this.mainWindowServiceExt.isFirstWindow( - windowId - ); + if (!this._isFirstWindow) { + this._isFirstWindow = new Deferred(); + window.electronArduino + .isFirstWindow() + .then((isFirstWindow) => this._isFirstWindow?.resolve(isFirstWindow)); + } + return this._isFirstWindow.promise; + } + + // Overridden because the default Theia implementation destructures the additional properties of the `options` arg, such as `tasks`. + // https://github.com/eclipse-theia/theia/blob/2deedbad70bd4b503bf9c7e733ab9603f492600f/packages/core/src/electron-browser/window/electron-window-service.ts#L43 + override openNewWindow(url: string, options?: NewWindowOptions): undefined { + return this.delegate.openNewWindow(url, options); + } + + // Overridden to support optional task owner params and make `tsc` happy. + override reload(options?: StartupTasks | WindowReloadOptions): void { + if (hasStartupTasks(options)) { + window.electronArduino.requestReload(options); + } else { + super.reload(options); } - return this._firstWindow; + } + + close(): void { + window.electronTheiaCore.close(); } } diff --git a/arduino-ide-extension/src/electron-common/electron-arduino.ts b/arduino-ide-extension/src/electron-common/electron-arduino.ts new file mode 100644 index 000000000..54f76d3c1 --- /dev/null +++ b/arduino-ide-extension/src/electron-common/electron-arduino.ts @@ -0,0 +1,103 @@ +import type { + MessageBoxOptions as ElectronMessageBoxOptions, + MessageBoxReturnValue as ElectronMessageBoxReturnValue, + OpenDialogOptions as ElectronOpenDialogOptions, + OpenDialogReturnValue as ElectronOpenDialogReturnValue, + SaveDialogOptions as ElectronSaveDialogOptions, + SaveDialogReturnValue as ElectronSaveDialogReturnValue, +} from '@theia/core/electron-shared/electron'; +import type { Disposable } from '@theia/core/lib/common/disposable'; +import type { + InternalMenuDto as TheiaInternalMenuDto, + MenuDto, +} from '@theia/core/lib/electron-common/electron-api'; + +export const appInfoPropertyLiterals = [ + 'appVersion', + 'cliVersion', + 'buildDate', +] as const; +export type AppInfoProperty = (typeof appInfoPropertyLiterals)[number]; +export type AppInfo = { + readonly [P in AppInfoProperty]: string; +}; + +import type { Sketch } from '../common/protocol/sketches-service'; +import type { StartupTasks } from './startup-task'; + +export interface InternalMenuDto + extends Omit<TheiaInternalMenuDto, 'handlerId'> { + // Theia handles the menus with a running-index handler ID. https://github.com/eclipse-theia/theia/issues/12493 + // IDE2 keeps the menu `nodeId` instead of the running-index. + nodeId?: string; +} + +export type MessageBoxOptions = Omit< + ElectronMessageBoxOptions, + 'icon' | 'signal' +>; +export type MessageBoxReturnValue = ElectronMessageBoxReturnValue; +export type OpenDialogOptions = ElectronOpenDialogOptions; +export type OpenDialogReturnValue = ElectronOpenDialogReturnValue; +export type SaveDialogOptions = ElectronSaveDialogOptions; +export type SaveDialogReturnValue = ElectronSaveDialogReturnValue; + +export interface ShowPlotterWindowParams { + readonly url: string; + readonly forceReload?: boolean; +} +export function isShowPlotterWindowParams( + arg: unknown +): arg is ShowPlotterWindowParams { + return ( + typeof arg === 'object' && + typeof (<ShowPlotterWindowParams>arg).url === 'string' && + ((<ShowPlotterWindowParams>arg).forceReload === undefined || + typeof (<ShowPlotterWindowParams>arg).forceReload === 'boolean') + ); +} + +export interface ElectronArduino { + showMessageBox(options: MessageBoxOptions): Promise<MessageBoxReturnValue>; + showOpenDialog(options: OpenDialogOptions): Promise<OpenDialogReturnValue>; + showSaveDialog(options: SaveDialogOptions): Promise<SaveDialogReturnValue>; + appInfo(): Promise<AppInfo>; + quitApp(): void; + isFirstWindow(): Promise<boolean>; + requestReload(tasks: StartupTasks): void; + registerStartupTasksHandler( + handler: (tasks: StartupTasks) => void + ): Disposable; + scheduleDeletion(sketch: Sketch): void; + setRepresentedFilename(fsPath: string): void; + showPlotterWindow(params: { url: string; forceReload?: boolean }): void; + registerPlotterWindowCloseHandler(handler: () => void): Disposable; + openPath(fsPath: string): void; + // Unlike the Theia implementation, IDE2 uses the command IDs, and not the running-index handler IDs. + // https://github.com/eclipse-theia/theia/issues/12493 + setMenu(menu: MenuDto[] | undefined): void; +} + +declare global { + interface Window { + electronArduino: ElectronArduino; + } +} + +// renderer to main +export const CHANNEL_SHOW_MESSAGE_BOX = 'Arduino:ShowMessageBox'; +export const CHANNEL_SHOW_OPEN_DIALOG = 'Arduino:ShowOpenDialog'; +export const CHANNEL_SHOW_SAVE_DIALOG = 'Arduino:ShowSaveDialog'; +export const CHANNEL_APP_INFO = 'Arduino:AppInfo'; +export const CHANNEL_QUIT_APP = 'Arduino:QuitApp'; +export const CHANNEL_IS_FIRST_WINDOW = 'Arduino:IsFirstWindow'; +export const CHANNEL_SCHEDULE_DELETION = 'Arduino:ScheduleDeletion'; +export const CHANNEL_SET_REPRESENTED_FILENAME = + 'Arduino:SetRepresentedFilename'; +export const CHANNEL_SHOW_PLOTTER_WINDOW = 'Arduino:ShowPlotterWindow'; +export const CHANNEL_OPEN_PATH = 'Arduino:OpenPath'; +export const CHANNEL_SET_MENU_WITH_NODE_ID = 'Arduino:SetMenuWithNodeId'; +// main to renderer +export const CHANNEL_SEND_STARTUP_TASKS = 'Arduino:SendStartupTasks'; +export const CHANNEL_PLOTTER_WINDOW_DID_CLOSE = 'Arduino:PlotterWindowDidClose'; +export const CHANNEL_MAIN_MENU_ITEM_DID_CLICK = 'Arduino:MainMenuItemDidClick'; diff --git a/arduino-ide-extension/src/electron-common/electron-main-window-service-ext.ts b/arduino-ide-extension/src/electron-common/electron-main-window-service-ext.ts deleted file mode 100644 index c0e52d353..000000000 --- a/arduino-ide-extension/src/electron-common/electron-main-window-service-ext.ts +++ /dev/null @@ -1,7 +0,0 @@ -export const electronMainWindowServiceExtPath = '/services/electron-window-ext'; -export const ElectronMainWindowServiceExt = Symbol( - 'ElectronMainWindowServiceExt' -); -export interface ElectronMainWindowServiceExt { - isFirstWindow(windowId: number): Promise<boolean>; -} diff --git a/arduino-ide-extension/src/electron-common/startup-task.ts b/arduino-ide-extension/src/electron-common/startup-task.ts new file mode 100644 index 000000000..7012e216f --- /dev/null +++ b/arduino-ide-extension/src/electron-common/startup-task.ts @@ -0,0 +1,46 @@ +export const StartupTaskProvider = Symbol('StartupTaskProvider'); +export interface StartupTaskProvider { + tasks(): StartupTask[]; +} + +export interface StartupTask { + readonly command: string; + /** + * Must be JSON serializable. + * See the restrictions [here](https://www.electronjs.org/docs/latest/api/web-contents#contentssendchannel-args). + */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + readonly args?: any[]; +} + +export interface StartupTasks { + readonly tasks: StartupTask[]; +} + +export function isStartupTask(arg: unknown): arg is StartupTask { + if (typeof arg === 'object') { + if ( + (<StartupTask>arg).command !== undefined && + typeof (<StartupTask>arg).command === 'string' + ) { + return ( + (<StartupTask>arg).args === undefined || + ((<StartupTask>arg).args !== undefined && + Array.isArray((<StartupTask>arg).args)) + ); + } + } + return false; +} + +export function hasStartupTasks(arg: unknown): arg is unknown & StartupTasks { + if (typeof arg === 'object') { + return ( + (<StartupTasks>arg).tasks !== undefined && + Array.isArray((<StartupTasks>arg).tasks) && + Boolean((<StartupTasks>arg).tasks.length) && + (<StartupTasks>arg).tasks.every(isStartupTask) + ); + } + return false; +} diff --git a/arduino-ide-extension/src/electron-main/arduino-electron-main-module.ts b/arduino-ide-extension/src/electron-main/arduino-electron-main-module.ts index b6767e57d..f1cd406ef 100644 --- a/arduino-ide-extension/src/electron-main/arduino-electron-main-module.ts +++ b/arduino-ide-extension/src/electron-main/arduino-electron-main-module.ts @@ -1,9 +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 { ElectronConnectionHandler } from '@theia/core/lib/electron-common/messaging/electron-connection-handler'; +import { TheiaMainApi } from '@theia/core/lib/electron-main/electron-api-main'; import { - ElectronMainApplication as TheiaElectronMainApplication, ElectronMainApplicationContribution, + ElectronMainApplication as TheiaElectronMainApplication, } from '@theia/core/lib/electron-main/electron-main-application'; import { TheiaElectronWindow as DefaultTheiaElectronWindow } from '@theia/core/lib/electron-main/theia-electron-window'; import { ContainerModule } from '@theia/core/shared/inversify'; @@ -12,15 +13,13 @@ import { IDEUpdaterClient, IDEUpdaterPath, } from '../common/protocol/ide-updater'; -import { - ElectronMainWindowServiceExt, - electronMainWindowServiceExtPath, -} from '../electron-common/electron-main-window-service-ext'; import { IsTempSketch } from '../node/is-temp-sketch'; -import { ElectronMainWindowServiceExtImpl } from './electron-main-window-service-ext-impl'; +import { ElectronArduino } from './electron-arduino'; +import { FixAppImageIcon } from './fix-app-image-icon'; import { IDEUpdaterImpl } from './ide-updater/ide-updater-impl'; import { ElectronMainApplication } from './theia/electron-main-application'; import { ElectronMainWindowServiceImpl } from './theia/electron-main-window-service'; +import { TheiaMainApiFixFalsyHandlerId } from './theia/theia-api-main'; import { TheiaElectronWindow } from './theia/theia-electron-window'; export default new ContainerModule((bind, unbind, isBound, rebind) => { @@ -37,32 +36,28 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { bind(ElectronConnectionHandler) .toDynamicValue( (context) => - new JsonRpcConnectionHandler<IDEUpdaterClient>( - IDEUpdaterPath, - (client) => { - const server = context.container.get<IDEUpdater>(IDEUpdater); - server.setClient(client); - client.onDidCloseConnection(() => server.disconnectClient(client)); - return server; - } - ) + new RpcConnectionHandler<IDEUpdaterClient>(IDEUpdaterPath, (client) => { + const server = context.container.get<IDEUpdater>(IDEUpdater); + server.setClient(client); + client.onDidCloseConnection(() => server.disconnectClient(client)); + return server; + }) ) .inSingletonScope(); bind(TheiaElectronWindow).toSelf(); rebind(DefaultTheiaElectronWindow).toService(TheiaElectronWindow); - bind(ElectronMainWindowServiceExt) - .to(ElectronMainWindowServiceExtImpl) - .inSingletonScope(); - bind(ElectronConnectionHandler) - .toDynamicValue( - (context) => - new JsonRpcConnectionHandler(electronMainWindowServiceExtPath, () => - context.container.get(ElectronMainWindowServiceExt) - ) - ) - .inSingletonScope(); - bind(IsTempSketch).toSelf().inSingletonScope(); + + bind(ElectronArduino).toSelf().inSingletonScope(); + bind(ElectronMainApplicationContribution).toService(ElectronArduino); + + // eclipse-theia/theia#12500 + bind(TheiaMainApiFixFalsyHandlerId).toSelf().inSingletonScope(); + rebind(TheiaMainApi).toService(TheiaMainApiFixFalsyHandlerId); + + // https://github.com/arduino/arduino-ide/issues/131 + bind(FixAppImageIcon).toSelf().inSingletonScope(); + bind(ElectronMainApplicationContribution).toService(FixAppImageIcon); }); diff --git a/arduino-ide-extension/src/electron-main/electron-arduino.ts b/arduino-ide-extension/src/electron-main/electron-arduino.ts new file mode 100644 index 000000000..2697bf0c1 --- /dev/null +++ b/arduino-ide-extension/src/electron-main/electron-arduino.ts @@ -0,0 +1,190 @@ +import { + BrowserWindow, + dialog, + ipcMain, + IpcMainEvent, + Menu, + MenuItemConstructorOptions, + shell, +} from '@theia/core/electron-shared/electron'; +import { Disposable } from '@theia/core/lib/common/disposable'; +import { isOSX } from '@theia/core/lib/common/os'; +import { CHANNEL_REQUEST_RELOAD } from '@theia/core/lib/electron-common/electron-api'; +import { + ElectronMainApplication as TheiaElectronMainApplication, + ElectronMainApplicationContribution, +} from '@theia/core/lib/electron-main/electron-main-application'; +import { createDisposableListener } from '@theia/core/lib/electron-main/event-utils'; +import { injectable } from '@theia/core/shared/inversify'; +import { WebContents } from '@theia/electron/shared/electron'; +import { + AppInfo, + CHANNEL_APP_INFO, + CHANNEL_IS_FIRST_WINDOW, + CHANNEL_MAIN_MENU_ITEM_DID_CLICK, + CHANNEL_OPEN_PATH, + CHANNEL_QUIT_APP, + CHANNEL_SEND_STARTUP_TASKS, + CHANNEL_SET_MENU_WITH_NODE_ID, + CHANNEL_SET_REPRESENTED_FILENAME, + CHANNEL_SHOW_MESSAGE_BOX, + CHANNEL_SHOW_OPEN_DIALOG, + CHANNEL_SHOW_SAVE_DIALOG, + InternalMenuDto, + MessageBoxOptions, + MessageBoxReturnValue, + OpenDialogOptions, + OpenDialogReturnValue, + SaveDialogOptions, + SaveDialogReturnValue, +} from '../electron-common/electron-arduino'; +import { StartupTasks } from '../electron-common/startup-task'; +import { ElectronMainApplication } from './theia/electron-main-application'; + +@injectable() +export class ElectronArduino implements ElectronMainApplicationContribution { + onStart(app: TheiaElectronMainApplication): void { + if (!(app instanceof ElectronMainApplication)) { + throw new Error('Illegal binding for the electron main application.'); + } + ipcMain.handle( + CHANNEL_SHOW_MESSAGE_BOX, + async (event, options: MessageBoxOptions) => { + const window = BrowserWindow.fromWebContents(event.sender); + let result: MessageBoxReturnValue; + if (window) { + result = await dialog.showMessageBox(window, options); + } else { + result = await dialog.showMessageBox(options); + } + return result; + } + ); + ipcMain.handle( + CHANNEL_SHOW_OPEN_DIALOG, + async (event, options: OpenDialogOptions) => { + const window = BrowserWindow.fromWebContents(event.sender); + let result: OpenDialogReturnValue; + if (window) { + result = await dialog.showOpenDialog(window, options); + } else { + result = await dialog.showOpenDialog(options); + } + return result; + } + ); + ipcMain.handle( + CHANNEL_SHOW_SAVE_DIALOG, + async (event, options: SaveDialogOptions) => { + const window = BrowserWindow.fromWebContents(event.sender); + let result: SaveDialogReturnValue; + if (window) { + result = await dialog.showSaveDialog(window, options); + } else { + result = await dialog.showSaveDialog(options); + } + return result; + } + ); + ipcMain.handle(CHANNEL_APP_INFO, async (): Promise<AppInfo> => { + return app.appInfo; + }); + ipcMain.on(CHANNEL_QUIT_APP, () => app.requestStop()); + ipcMain.handle(CHANNEL_IS_FIRST_WINDOW, async (event) => { + const window = BrowserWindow.fromWebContents(event.sender); + if (!window) { + return false; + } + return app.firstWindowId === window.id; + }); + ipcMain.on(CHANNEL_SET_REPRESENTED_FILENAME, (event, fsPath: string) => { + const window = BrowserWindow.fromWebContents(event.sender); + if (window) { + window.setRepresentedFilename(fsPath); + } + }); + ipcMain.on(CHANNEL_OPEN_PATH, (_, fsPath: string) => { + shell.openPath(fsPath); + }); + ipcMain.on( + CHANNEL_SET_MENU_WITH_NODE_ID, + (event, internalMenu: InternalMenuDto[] | undefined) => { + const electronMenu = internalMenu + ? Menu.buildFromTemplate(fromMenuDto(event.sender, internalMenu)) + : null; + if (isOSX) { + Menu.setApplicationMenu(electronMenu); + } else { + const window = BrowserWindow.fromWebContents(event.sender); + if (!window) { + console.warn( + `Failed to set the application menu. Could not find the browser window from the webContents. Sender ID: ${event.sender.id}` + ); + return; + } + window.setMenu(electronMenu); + } + } + ); + } +} + +function fromMenuDto( + sender: WebContents, + menuDto: InternalMenuDto[] +): MenuItemConstructorOptions[] { + return menuDto.map((dto) => { + const result: MenuItemConstructorOptions = { + id: dto.id, + label: dto.label, + type: dto.type, + checked: dto.checked, + enabled: dto.enabled, + visible: dto.visible, + role: dto.role, + accelerator: dto.accelerator, + }; + if (dto.submenu) { + result.submenu = fromMenuDto(sender, dto.submenu); + } + if (dto.nodeId) { + result.click = () => { + sender.send(CHANNEL_MAIN_MENU_ITEM_DID_CLICK, dto.nodeId); + }; + } + return result; + }); +} + +export namespace ElectronArduinoRenderer { + export function sendStartupTasks( + webContents: WebContents, + tasks: StartupTasks + ): void { + webContents.send(CHANNEL_SEND_STARTUP_TASKS, tasks); + } + + // Same as Theia's `onRequestReload` but can accept an arg from the renderer. + export function onRequestReload( + wc: WebContents, + handler: (arg?: unknown) => void + ): Disposable { + return createWindowListener(wc, CHANNEL_REQUEST_RELOAD, handler); + } + + function createWindowListener( + webContents: WebContents, + channel: string, + handler: (...args: unknown[]) => unknown + ): Disposable { + return createDisposableListener<IpcMainEvent>( + ipcMain, + channel, + (event, ...args) => { + if (webContents.id === event.sender.id) { + handler(...args); + } + } + ); + } +} diff --git a/arduino-ide-extension/src/electron-main/electron-main-window-service-ext-impl.ts b/arduino-ide-extension/src/electron-main/electron-main-window-service-ext-impl.ts deleted file mode 100644 index a0c872786..000000000 --- a/arduino-ide-extension/src/electron-main/electron-main-window-service-ext-impl.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { inject, injectable } from '@theia/core/shared/inversify'; -import { ElectronMainWindowServiceExt } from '../electron-common/electron-main-window-service-ext'; -import { ElectronMainApplication } from './theia/electron-main-application'; - -@injectable() -export class ElectronMainWindowServiceExtImpl - implements ElectronMainWindowServiceExt -{ - @inject(ElectronMainApplication) - private readonly app: ElectronMainApplication; - - async isFirstWindow(windowId: number): Promise<boolean> { - return this.app.firstWindowId === windowId; - } -} diff --git a/arduino-ide-extension/src/electron-main/fix-app-image-icon.ts b/arduino-ide-extension/src/electron-main/fix-app-image-icon.ts new file mode 100644 index 000000000..ab8534596 --- /dev/null +++ b/arduino-ide-extension/src/electron-main/fix-app-image-icon.ts @@ -0,0 +1,31 @@ +import { environment } from '@theia/application-package/lib/environment'; +import { isOSX, isWindows } from '@theia/core/lib/common/os'; +import { + ElectronMainApplication, + ElectronMainApplicationContribution, +} from '@theia/core/lib/electron-main/electron-main-application'; +import { injectable } from '@theia/core/shared/inversify'; +import { join } from 'node:path'; + +// Fixes no application icon for the AppImage on Linux (https://github.com/arduino/arduino-ide/issues/131) +// The fix was based on https://github.com/eclipse-theia/theia-blueprint/pull/180. +// Upstream: https://github.com/electron-userland/electron-builder/issues/4617 +@injectable() +export class FixAppImageIcon implements ElectronMainApplicationContribution { + onStart(application: ElectronMainApplication): void { + if (isOSX || isWindows || environment.electron.isDevMode()) { + return; + } + const windowOptions = application.config.electron.windowOptions; + if (windowOptions && windowOptions.icon === undefined) { + windowOptions.icon = join( + __dirname, + '..', + '..', + 'resources', + 'icons', + '512x512.png' + ); + } + } +} diff --git a/arduino-ide-extension/src/electron-main/theia/electron-main-application.ts b/arduino-ide-extension/src/electron-main/theia/electron-main-application.ts index 981c5ad68..b6d0ff294 100644 --- a/arduino-ide-extension/src/electron-main/theia/electron-main-application.ts +++ b/arduino-ide-extension/src/electron-main/theia/electron-main-application.ts @@ -1,31 +1,109 @@ -import { inject, injectable } from '@theia/core/shared/inversify'; +import type { FrontendApplicationConfig } from '@theia/application-package/lib/application-props'; +import { environment } from '@theia/application-package/lib/environment'; import { app, BrowserWindow, contentTracing, - ipcMain, Event as ElectronEvent, + ipcMain, } from '@theia/core/electron-shared/electron'; -import { fork } from 'child_process'; -import { AddressInfo } from 'net'; -import { join, dirname } from 'path'; -import * as fs from 'fs-extra'; -import { MaybePromise } from '@theia/core/lib/common/types'; +import { + Disposable, + DisposableCollection, +} from '@theia/core/lib/common/disposable'; +import { FileUri } from '@theia/core/lib/common/file-uri'; +import { isOSX } from '@theia/core/lib/common/os'; +import { Deferred } from '@theia/core/lib/common/promise-util'; +import { isObject, MaybePromise, Mutable } from '@theia/core/lib/common/types'; import { ElectronSecurityToken } from '@theia/core/lib/electron-common/electron-token'; -import { FrontendApplicationConfig } from '@theia/application-package/lib/application-props'; import { + ElectronMainCommandOptions, ElectronMainApplication as TheiaElectronMainApplication, - ElectronMainExecutionParams, } from '@theia/core/lib/electron-main/electron-main-application'; +import type { TheiaBrowserWindowOptions } from '@theia/core/lib/electron-main/theia-electron-window'; +import { inject, injectable } from '@theia/core/shared/inversify'; import { URI } from '@theia/core/shared/vscode-uri'; -import { Deferred } from '@theia/core/lib/common/promise-util'; -import * as os from '@theia/core/lib/common/os'; -import { Restart } from '@theia/core/lib/electron-common/messaging/electron-messages'; -import { TheiaBrowserWindowOptions } from '@theia/core/lib/electron-main/theia-electron-window'; +import { log as logToFile, setup as setupFileLog } from 'node-log-rotate'; +import { fork } from 'node:child_process'; +import { promises as fs, readFileSync, rm, rmSync } from 'node:fs'; +import type { AddressInfo } from 'node:net'; +import { isAbsolute, join, resolve } from 'node:path'; +import type { Argv } from 'yargs'; +import { Sketch } from '../../common/protocol'; +import { poolWhile } from '../../common/utils'; +import { + AppInfo, + appInfoPropertyLiterals, + CHANNEL_PLOTTER_WINDOW_DID_CLOSE, + CHANNEL_SCHEDULE_DELETION, + CHANNEL_SHOW_PLOTTER_WINDOW, + isShowPlotterWindowParams, +} from '../../electron-common/electron-arduino'; import { IsTempSketch } from '../../node/is-temp-sketch'; +import { isAccessibleSketchPath } from '../../node/sketches-service-impl'; +import { ErrnoException } from '../../node/utils/errors'; app.commandLine.appendSwitch('disable-http-cache'); +const consoleLogFunctionNames = [ + 'log', + 'trace', + 'debug', + 'info', + 'warn', + 'error', +] as const; +type ConsoleLogSeverity = (typeof consoleLogFunctionNames)[number]; +interface ConsoleLogParams { + readonly severity: ConsoleLogSeverity; + readonly message: string; +} +function isConsoleLogParams(arg: unknown): arg is ConsoleLogParams { + return ( + isObject<ConsoleLogParams>(arg) && + typeof arg.message === 'string' && + typeof arg.severity === 'string' && + consoleLogFunctionNames.includes(arg.severity as ConsoleLogSeverity) + ); +} + +// Patch for on Linux when `XDG_CONFIG_HOME` is not available, `node-log-rotate` creates the folder with `undefined` name. +// See https://github.com/lemon-sour/node-log-rotate/issues/23 and https://github.com/arduino/arduino-ide/issues/394. +// If the IDE2 is running on Linux, and the `XDG_CONFIG_HOME` variable is not available, set it to avoid the `undefined` folder. +// From the specs: https://specifications.freedesktop.org/basedir-spec/latest/ar01s03.html +// "If $XDG_CONFIG_HOME is either not set or empty, a default equal to $HOME/.config should be used." +function enableFileLogger() { + const os = require('os'); + const util = require('util'); + if (os.platform() === 'linux' && !process.env['XDG_CONFIG_HOME']) { + const { join } = require('path'); + const home = process.env['HOME']; + const xdgConfigHome = home + ? join(home, '.config') + : join(os.homedir(), '.config'); + process.env['XDG_CONFIG_HOME'] = xdgConfigHome; + } + setupFileLog({ + appName: 'Arduino IDE', + maxSize: 10 * 1024 * 1024, + }); + for (const name of consoleLogFunctionNames) { + const original = console[name]; + console[name] = function () { + // eslint-disable-next-line prefer-rest-params + const messages = Object.values(arguments); + const message = util.format(...messages); + original(message); + logToFile(message); + }; + } +} + +const isProductionMode = !environment.electron.isDevMode(); +if (isProductionMode) { + enableFileLogger(); +} + interface WorkspaceOptions { file: string; x: number; @@ -53,35 +131,106 @@ const APP_STARTED_WITH_CONTENT_TRACE = typeof process !== 'undefined' && process.argv.indexOf('--content-trace') !== -1; +const createYargs: ( + argv?: string[], + cwd?: string +) => Argv = require('yargs/yargs'); + @injectable() export class ElectronMainApplication extends TheiaElectronMainApplication { @inject(IsTempSketch) private readonly isTempSketch: IsTempSketch; private startup = false; private _firstWindowId: number | undefined; + private _appInfo: AppInfo = { + appVersion: '', + cliVersion: '', + buildDate: '', + }; private openFilePromise = new Deferred(); + /** + * It contains all things the IDE2 must clean up before a normal stop. + * + * When deleting the sketch, the IDE2 must close the browser window and + * recursively delete the sketch folder from the filesystem. The sketch + * cannot be deleted when the window is open because that is the currently + * opened workspace. IDE2 cannot delete the sketch folder from the + * filesystem after closing the browser window because the window can be + * the last, and when the last window closes, the application quits. + * There is no way to clean up the undesired resources. + * + * This array contains disposable instances wrapping synchronous sketch + * delete operations. When IDE2 closes the browser window, it schedules + * the sketch deletion, and the window closes. + * + * When IDE2 schedules a sketch for deletion, it creates a synchronous + * folder deletion as a disposable instance and pushes it into this + * array. After the push, IDE2 starts the sketch deletion in an + * asynchronous way. When the deletion completes, the disposable is + * removed. If the app quits when the asynchronous deletion is still in + * progress, it disposes the elements of this array. Since it is + * synchronous, it is [ensured by Theia](https://github.com/eclipse-theia/theia/blob/678e335644f1b38cb27522cc27a3b8209293cf31/packages/core/src/node/backend-application.ts#L91-L97) + * that IDE2 won't quit before the cleanup is done. It works only in normal + * quit. + */ + // TODO: Why is it here and not in the Theia backend? + // https://github.com/eclipse-theia/theia/discussions/12135 + private readonly scheduledDeletions: Disposable[] = []; override async start(config: FrontendApplicationConfig): Promise<void> { - // Explicitly set the app name to have better menu items on macOS. ("About", "Hide", and "Quit") - // See: https://github.com/electron-userland/electron-builder/issues/2468 - // Regression in Theia: https://github.com/eclipse-theia/theia/issues/8701 - app.on('ready', () => app.setName(config.applicationName)); - this.attachFileAssociations(); - this.useNativeWindowFrame = this.getTitleBarStyle(config) === 'native'; - this._config = config; - this.hookApplicationEvents(); - const [port] = await Promise.all([this.startBackend(), app.whenReady()]); - this.startContentTracing(); - this._backendPort.resolve(port); - await Promise.all([ - this.attachElectronSecurityToken(port), - this.startContributions(), - ]); - return this.launch({ - secondInstance: false, - argv: this.processArgv.getProcessArgvWithoutBin(process.argv), - cwd: process.cwd(), - }); + createYargs(this.argv, process.cwd()) + .command( + '$0 [file]', + false, + (cmd) => + cmd + .option('electronUserData', { + type: 'string', + describe: + 'The area where the electron main process puts its data', + }) + .positional('file', { type: 'string' }), + async (args) => { + if (args.electronUserData) { + console.info( + `using electron user data area : '${args.electronUserData}'` + ); + await fs.mkdir(args.electronUserData, { recursive: true }); + app.setPath('userData', args.electronUserData); + } + // Explicitly set the app name to have better menu items on macOS. ("About", "Hide", and "Quit") + // 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 { @@ -115,7 +264,7 @@ export class ElectronMainApplication extends TheiaElectronMainApplication { let traceFile: string | undefined; if (appPath) { const tracesPath = join(appPath, 'traces'); - await fs.promises.mkdir(tracesPath, { recursive: true }); + await fs.mkdir(tracesPath, { recursive: true }); traceFile = join(tracesPath, `trace-${new Date().toISOString()}.trace`); } console.log('>>> Content tracing has started...'); @@ -131,14 +280,31 @@ export class ElectronMainApplication extends TheiaElectronMainApplication { })(); } - private attachFileAssociations(): void { + private attachFileAssociations(cwd: string): void { // OSX: register open-file event - if (os.isOSX) { - app.on('open-file', async (event, uri) => { + if (isOSX) { + app.on('open-file', async (event, path) => { event.preventDefault(); - if (uri.endsWith('.ino') && (await fs.pathExists(uri))) { - this.openFilePromise.reject(); - await this.openSketch(dirname(uri)); + const resolvedPath = await this.resolvePath(path, cwd); + if (resolvedPath) { + const sketchFolderPath = await isAccessibleSketchPath( + resolvedPath, + true + ); + if (sketchFolderPath) { + 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); + } } }); setTimeout(() => this.openFilePromise.resolve(), 500); @@ -147,24 +313,41 @@ export class ElectronMainApplication extends TheiaElectronMainApplication { } } - private async isValidSketchPath(uri: string): Promise<boolean | undefined> { - return typeof uri === 'string' && (await fs.pathExists(uri)); + private async resolvePath( + maybePath: string, + cwd: string + ): Promise<string | undefined> { + if (isAbsolute(maybePath)) { + return maybePath; + } + try { + const resolved = await fs.realpath(resolve(cwd, maybePath)); + return resolved; + } catch (err) { + if (ErrnoException.isENOENT(err)) { + return undefined; + } + throw err; + } } - protected override async launch( - params: ElectronMainExecutionParams + protected override async handleMainCommand( + options: ElectronMainCommandOptions ): Promise<void> { try { // When running on MacOS, we either have to wait until // 1. The `open-file` command has been received by the app, rejecting the promise // 2. A short timeout resolves the promise automatically, falling back to the usual app launch await this.openFilePromise.promise; - } catch { - // Application has received the `open-file` event and will skip the default application launch - return; + } catch (err) { + if (err instanceof InterruptWorkspaceRestoreError) { + // Application has received the `open-file` event and will skip the default application launch + return; + } + throw err; } - if (!os.isOSX && (await this.launchFromArgs(params))) { + if (await this.launchFromArgs(options)) { // Application has received a file in its arguments and will skip the default application launch return; } @@ -178,7 +361,19 @@ export class ElectronMainApplication extends TheiaElectronMainApplication { `Restoring workspace roots: ${workspaces.map(({ file }) => file)}` ); for (const workspace of workspaces) { - if (await this.isValidSketchPath(workspace.file)) { + const resolvedPath = await this.resolvePath( + workspace.file, + options.cwd + ); + if (!resolvedPath) { + continue; + } + const sketchFolderPath = await isAccessibleSketchPath( + resolvedPath, + true + ); + if (sketchFolderPath) { + workspace.file = sketchFolderPath; if (this.isTempSketch.is(workspace.file)) { console.info( `Skipped opening sketch. The sketch was detected as temporary. Workspace path: ${workspace.file}.` @@ -192,51 +387,58 @@ export class ElectronMainApplication extends TheiaElectronMainApplication { } this.startup = false; if (useDefault) { - super.launch(params); + super.handleMainCommand(options); } } + private get argv(): string[] { + return this.processArgv.getProcessArgvWithoutBin(process.argv).slice(); + } + private async launchFromArgs( - params: ElectronMainExecutionParams + params: ElectronMainCommandOptions, + argv?: string[] ): Promise<boolean> { // Copy to prevent manipulation of original array - const argCopy = [...params.argv]; - let uri: string | undefined; - for (const possibleUri of argCopy) { - if ( - possibleUri.endsWith('.ino') && - (await this.isValidSketchPath(possibleUri)) - ) { - uri = possibleUri; + const argCopy = [...(argv || this.argv)]; + let path: string | undefined; + for (const maybePath of argCopy) { + const resolvedPath = await this.resolvePath(maybePath, params.cwd); + if (!resolvedPath) { + continue; + } + const sketchFolderPath = await isAccessibleSketchPath(resolvedPath, true); + if (sketchFolderPath) { + path = sketchFolderPath; break; } } - if (uri) { - await this.openSketch(dirname(uri)); + if (path) { + await this.openSketch(path); return true; } return false; } private async openSketch( - workspace: WorkspaceOptions | string + workspaceOrPath: WorkspaceOptions | string ): Promise<BrowserWindow> { const options = await this.getLastWindowOptions(); let file: string; - if (typeof workspace === 'object') { - options.x = workspace.x; - options.y = workspace.y; - options.width = workspace.width; - options.height = workspace.height; - options.isMaximized = workspace.isMaximized; - options.isFullScreen = workspace.isFullScreen; - file = workspace.file; + if (typeof workspaceOrPath === 'object') { + options.x = workspaceOrPath.x; + options.y = workspaceOrPath.y; + options.width = workspaceOrPath.width; + options.height = workspaceOrPath.height; + options.isMaximized = workspaceOrPath.isMaximized; + options.isFullScreen = workspaceOrPath.isFullScreen; + file = workspaceOrPath.file; } else { - file = workspace; + file = workspaceOrPath; } const [uri, electronWindow] = await Promise.all([ this.createWindowUri(), - this.createWindow(options), + this.reuseOrCreateWindow(options), ]); electronWindow.loadURL(uri.withFragment(encodeURI(file)).toString(true)); return electronWindow; @@ -262,10 +464,73 @@ export class ElectronMainApplication extends TheiaElectronMainApplication { app.on('will-quit', this.onWillQuit.bind(this)); app.on('second-instance', this.onSecondInstance.bind(this)); app.on('window-all-closed', this.onWindowAllClosed.bind(this)); + ipcMain.on(CHANNEL_SCHEDULE_DELETION, (event, sketch: unknown) => { + if (Sketch.is(sketch)) { + console.log(`Sketch ${sketch.uri} was scheduled for deletion`); + // TODO: remove deleted sketch from closedWorkspaces? + this.delete(sketch); + } + }); + ipcMain.on(CHANNEL_SHOW_PLOTTER_WINDOW, (event, args) => + this.handleShowPlotterWindow(event, args) + ); + } + + // keys are the host window IDs + private readonly plotterWindows = new Map<number, BrowserWindow>(); + private handleShowPlotterWindow( + event: Electron.IpcMainEvent, + args: unknown + ): void { + if (!isShowPlotterWindowParams(args)) { + console.warn( + `Received unexpected params on the '${CHANNEL_SHOW_PLOTTER_WINDOW}' channel. Sender ID: ${ + event.sender.id + }, params: ${JSON.stringify(args)}` + ); + return; + } + const electronWindow = BrowserWindow.fromWebContents(event.sender); + if (!electronWindow) { + console.warn( + `Could not find the host window of event received on the '${CHANNEL_SHOW_PLOTTER_WINDOW}' channel. Sender ID: ${ + event.sender.id + }, params: ${JSON.stringify(args)}` + ); + return; + } - ipcMain.on(Restart, ({ sender }) => { - this.restart(sender.id); + const windowId = electronWindow.id; + let plotterWindow = this.plotterWindows.get(windowId); + if (plotterWindow) { + if (!args.forceReload) { + plotterWindow.focus(); + } else { + plotterWindow.loadURL(args.url); + } + return; + } + + plotterWindow = new BrowserWindow({ + width: 800, + minWidth: 620, + height: 500, + minHeight: 320, + x: 100, + y: 100, + webPreferences: <Electron.WebPreferences>{ + devTools: true, + nativeWindowOpen: true, + openerId: electronWindow.webContents.id, + }, + }); + this.plotterWindows.set(windowId, plotterWindow); + plotterWindow.setMenu(null); + plotterWindow.on('closed', () => { + this.plotterWindows.delete(windowId); + electronWindow.webContents.send(CHANNEL_PLOTTER_WINDOW_DID_CLOSE); }); + plotterWindow.loadURL(args.url); } protected override async onSecondInstance( @@ -273,10 +538,7 @@ export class ElectronMainApplication extends TheiaElectronMainApplication { argv: string[], cwd: string ): Promise<void> { - if ( - !os.isOSX && - (await this.launchFromArgs({ cwd, argv, secondInstance: true })) - ) { + if (await this.launchFromArgs({ cwd, secondInstance: true }, argv)) { // Application has received a file in its arguments return; } @@ -309,34 +571,8 @@ export class ElectronMainApplication extends TheiaElectronMainApplication { } private attachListenersToWindow(electronWindow: BrowserWindow) { - electronWindow.webContents.on( - 'new-window', - (event, url, frameName, disposition, options) => { - if (frameName === 'serialPlotter') { - event.preventDefault(); - Object.assign(options, { - width: 800, - minWidth: 620, - height: 500, - minHeight: 320, - x: 100, - y: 100, - webPreferences: { - devTools: true, - nativeWindowOpen: true, - openerId: electronWindow?.webContents.id, - }, - }); - event.newGuest = new BrowserWindow(options); - event.newGuest.setMenu(null); - event.newGuest?.on('closed', () => { - electronWindow?.webContents.send('CLOSE_CHILD_WINDOW'); - }); - event.newGuest?.loadURL(url); - } - } - ); this.attachClosedWorkspace(electronWindow); + this.attachClosePlotterWindow(electronWindow); } protected override async startBackend(): Promise<number> { @@ -374,9 +610,14 @@ export class ElectronMainApplication extends TheiaElectronMainApplication { ); console.log(`Starting backend process. PID: ${backendProcess.pid}`); return new Promise((resolve, reject) => { - // The backend server main file is also supposed to send the resolved http(s) server port via IPC. - backendProcess.on('message', (address: AddressInfo) => { - resolve(address.port); + // The forked backend process sends the resolved http(s) server port via IPC, and forwards the log messages. + backendProcess.on('message', (arg: unknown) => { + if (isConsoleLogParams(arg)) { + const { message, severity } = arg; + console[severity](message); + } else if (isAddressInfo(arg)) { + resolve(arg.port); + } }); backendProcess.on('error', (error) => { reject(error); @@ -437,6 +678,13 @@ export class ElectronMainApplication extends TheiaElectronMainApplication { }); } + private attachClosePlotterWindow(window: BrowserWindow): void { + window.on('close', () => { + this.plotterWindows.get(window.id)?.close(); + this.plotterWindows.delete(window.id); + }); + } + protected override onWillQuit(event: Electron.Event): void { // Only add workspaces which were closed within the last second (1000 milliseconds) const threshold = Date.now() - 1000; @@ -465,6 +713,26 @@ export class ElectronMainApplication extends TheiaElectronMainApplication { `Stored workspaces roots: ${workspaces.map(({ file }) => file)}` ); + if (this.scheduledDeletions.length) { + console.log( + '>>> Finishing scheduled sketch deletions before app quit...' + ); + new DisposableCollection(...this.scheduledDeletions).dispose(); + console.log('<<< Successfully finishing scheduled sketch deletions.'); + } else { + console.log('No sketches were scheduled for deletion.'); + } + + if (this.plotterWindows.size) { + for (const [ + hostWindowId, + plotterWindow, + ] of this.plotterWindows.entries()) { + plotterWindow.close(); + this.plotterWindows.delete(hostWindowId); + } + } + super.onWillQuit(event); } @@ -475,4 +743,217 @@ export class ElectronMainApplication extends TheiaElectronMainApplication { get firstWindowId(): number | undefined { return this._firstWindowId; } + + get appInfo(): AppInfo { + return this._appInfo; + } + + private async delete(sketch: Sketch): Promise<void> { + const sketchPath = FileUri.fsPath(sketch.uri); + const disposable = Disposable.create(() => { + try { + this.deleteSync(sketchPath); + } catch (err) { + console.error( + `Could not delete sketch ${sketchPath} on app quit.`, + err + ); + } + }); + this.scheduledDeletions.push(disposable); + return new Promise<void>((resolve, reject) => { + rm(sketchPath, { recursive: true, maxRetries: 5 }, (error) => { + if (error) { + console.error(`Failed to delete sketch ${sketchPath}`, error); + reject(error); + } else { + console.info(`Successfully deleted sketch ${sketchPath}`); + resolve(); + const index = this.scheduledDeletions.indexOf(disposable); + if (index >= 0) { + this.scheduledDeletions.splice(index, 1); + console.info( + `Successfully completed the scheduled sketch deletion: ${sketchPath}` + ); + } else { + console.warn( + `Could not find the scheduled sketch deletion: ${sketchPath}` + ); + } + } + }); + }); + } + + private deleteSync(sketchPath: string): void { + console.info( + `>>> Running sketch deletion ${sketchPath} before app quit...` + ); + try { + rmSync(sketchPath, { recursive: true, maxRetries: 5 }); + console.info(`<<< Deleted sketch ${sketchPath}`); + } catch (err) { + if (!ErrnoException.isENOENT(err)) { + throw err; + } else { + console.info(`<<< Sketch ${sketchPath} did not exist.`); + } + } + } + + // Fallback app config when starting IDE2 from an ino file (from Explorer, Finder, etc.) and the app config is not yet set. + // https://github.com/arduino/arduino-ide/issues/2209 + private _fallbackConfig: FrontendApplicationConfig | undefined; + override get config(): FrontendApplicationConfig { + if (!this._config) { + if (!this._fallbackConfig) { + this._fallbackConfig = readFrontendAppConfigSync(); + } + return this._fallbackConfig; + } + return super.config; + } +} + +class InterruptWorkspaceRestoreError extends Error { + constructor() { + super( + "Received 'open-file' event. Interrupting the default launch workflow." + ); + Object.setPrototypeOf(this, InterruptWorkspaceRestoreError.prototype); + } +} + +// This is a workaround for a limitation with the Theia CLI and `electron-builder`. +// It is possible to run the `electron-builder` with `-c.extraMetadata.foo.bar=36` option. +// On the fly, a `package.json` file will be generated for the final bundled application with the additional `{ "foo": { "bar": 36 } }` metadata. +// The Theia build (via the CLI) requires the extra `foo.bar=36` metadata to be in the `package.json` at build time (before `electron-builder` time). +// See the generated `./electron-app/src-gen/backend/electron-main.js` and how this works. +// This method merges in any additional required properties defined in the current! `package.json` of the application. For example, the `buildDate`. +// The current package.json is the package.json of the `electron-app` if running from the source code, +// 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. +async function updateFrontendApplicationConfigFromPackageJson( + config: Mutable<FrontendApplicationConfig> +): Promise<FrontendApplicationConfig> { + if (!isProductionMode) { + console.debug( + 'Skipping frontend application configuration customizations. Running in dev mode.' + ); + return config; + } + try { + console.debug( + `Checking for frontend application configuration customizations. Module path: ${__filename}, destination 'package.json': ${packageJsonPath}` + ); + const rawPackageJson = await fs.readFile(packageJsonPath, { + encoding: 'utf8', + }); + const packageJson = JSON.parse(rawPackageJson); + if (packageJson?.theia?.frontend?.config) { + const packageJsonConfig: Record<string, string> = + packageJson?.theia?.frontend?.config; + for (const property of appInfoPropertyLiterals) { + const value = packageJsonConfig[property]; + if (value && !config[property]) { + if (!config[property]) { + console.debug( + `Setting 'theia.frontend.config.${property}' application configuration value to: ${JSON.stringify( + value + )} (type of ${typeof value})` + ); + } else { + console.warn( + `Overriding 'theia.frontend.config.${property}' application configuration value with: ${JSON.stringify( + value + )} (type of ${typeof value}). Original value: ${JSON.stringify( + config[property] + )}` + ); + } + config[property] = value; + } + } + console.debug( + `Frontend application configuration after modifications: ${JSON.stringify( + config + )}` + ); + return config; + } + } catch (err) { + console.error( + `Could not read the frontend application configuration from the 'package.json' file. Falling back to (the Theia CLI) generated default config: ${JSON.stringify( + config + )}`, + err + ); + } + return config; +} + +const fallbackFrontendAppConfig: FrontendApplicationConfig = { + applicationName: 'Arduino IDE', + defaultTheme: { + light: 'arduino-theme', + dark: 'arduino-theme-dark', + }, + defaultIconTheme: 'none', + validatePreferencesSchema: false, + defaultLocale: '', + 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. +// Only for production mode! +const packageJsonPath = join(__filename, '..', '..', '..', 'package.json'); + +function readFrontendAppConfigSync(): FrontendApplicationConfig { + if (environment.electron.isDevMode()) { + console.debug( + 'Running in dev mode. Using the fallback fronted application config.' + ); + return fallbackFrontendAppConfig; + } + try { + const raw = readFileSync(packageJsonPath, { encoding: 'utf8' }); + const packageJson = JSON.parse(raw); + const config = packageJson?.theia?.frontend?.config; + if (config) { + return config; + } + throw new Error(`Frontend application config not found. ${packageJson}`); + } catch (err) { + console.error( + `Could not read package.json content from ${packageJsonPath}.`, + err + ); + return fallbackFrontendAppConfig; + } +} + +/** + * Mutates the `toUpdate` argument and returns with it. + */ +function updateAppInfo( + toUpdate: Mutable<AppInfo>, + updateWith: Record<string, unknown> +): AppInfo { + appInfoPropertyLiterals.forEach((property) => { + const newValue = updateWith[property]; + if (typeof newValue === 'string') { + toUpdate[property] = newValue; + } + }); + return toUpdate; +} + +function isAddressInfo(arg: unknown): arg is Pick<AddressInfo, 'port'> { + // Cannot do the type-guard on all properties, but the port is sufficient as the address is always `localhost`. + // For example, the `family` might be absent if the address is IPv6. + return isObject<AddressInfo>(arg) && typeof arg.port === 'number'; } diff --git a/arduino-ide-extension/src/electron-main/theia/electron-main-window-service.ts b/arduino-ide-extension/src/electron-main/theia/electron-main-window-service.ts index 2248ac543..832d9db11 100644 --- a/arduino-ide-extension/src/electron-main/theia/electron-main-window-service.ts +++ b/arduino-ide-extension/src/electron-main/theia/electron-main-window-service.ts @@ -1,34 +1,50 @@ -import { inject, injectable } from '@theia/core/shared/inversify'; +import type { NewWindowOptions } from '@theia/core/lib/common/window'; import { ElectronMainWindowServiceImpl as TheiaElectronMainWindowService } from '@theia/core/lib/electron-main/electron-main-window-service-impl'; +import { inject, injectable } from '@theia/core/shared/inversify'; +import { hasStartupTasks } from '../../electron-common/startup-task'; +import { ElectronArduinoRenderer } from '../electron-arduino'; import { ElectronMainApplication } from './electron-main-application'; -import { NewWindowOptions } from '@theia/core/lib/common/window'; +import { TheiaRendererAPI } from '@theia/core/lib/electron-main/electron-api-main'; @injectable() export class ElectronMainWindowServiceImpl extends TheiaElectronMainWindowService { @inject(ElectronMainApplication) protected override readonly app: ElectronMainApplication; - override openNewWindow(url: string, { external }: NewWindowOptions): undefined { - if (!external) { - const sanitizedUrl = this.sanitize(url); - const existing = this.app.browserWindows.find( - (window) => this.sanitize(window.webContents.getURL()) === sanitizedUrl - ); - if (existing) { - existing.focus(); - return; - } + override openNewWindow(url: string, options: NewWindowOptions): undefined { + // External window has highest precedence. + if (options?.external) { + return super.openNewWindow(url, options); } - return super.openNewWindow(url, { external }); - } - private sanitize(url: string): string { - const copy = new URL(url); - const searchParams: string[] = []; - copy.searchParams.forEach((_, key) => searchParams.push(key)); - for (const param of searchParams) { - copy.searchParams.delete(param); + // Look for existing window with the same URL and focus it. + const existing = this.app.browserWindows.find( + ({ webContents }) => webContents.getURL() === url + ); + if (existing) { + existing.focus(); + return undefined; } - return copy.toString(); + + // Default. + if (!hasStartupTasks(options)) { + return super.openNewWindow(url, options); + } + + // Create new window and share the startup tasks. + this.app.createWindow().then((electronWindow) => { + const { webContents } = electronWindow; + const toDisposeOnReady = TheiaRendererAPI.onApplicationStateChanged( + webContents, + (state) => { + if (state === 'ready') { + ElectronArduinoRenderer.sendStartupTasks(webContents, options); + toDisposeOnReady.dispose(); + } + } + ); + return electronWindow.loadURL(url); + }); + return undefined; } } diff --git a/arduino-ide-extension/src/electron-main/theia/theia-api-main.ts b/arduino-ide-extension/src/electron-main/theia/theia-api-main.ts new file mode 100644 index 000000000..90dac13d3 --- /dev/null +++ b/arduino-ide-extension/src/electron-main/theia/theia-api-main.ts @@ -0,0 +1,40 @@ +import { + CHANNEL_INVOKE_MENU, + InternalMenuDto, +} from '@theia/core/lib/electron-common/electron-api'; +import { TheiaMainApi } from '@theia/core/lib/electron-main/electron-api-main'; +import { injectable } from '@theia/core/shared/inversify'; +import { MenuItemConstructorOptions } from '@theia/electron/shared/electron'; + +@injectable() +export class TheiaMainApiFixFalsyHandlerId extends TheiaMainApi { + override fromMenuDto( + sender: Electron.WebContents, + menuId: number, + menuDto: InternalMenuDto[] + ): Electron.MenuItemConstructorOptions[] { + return menuDto.map((dto) => { + const result: MenuItemConstructorOptions = { + id: dto.id, + label: dto.label, + type: dto.type, + checked: dto.checked, + enabled: dto.enabled, + visible: dto.visible, + role: dto.role, + accelerator: dto.accelerator, + }; + if (dto.submenu) { + result.submenu = this.fromMenuDto(sender, menuId, dto.submenu); + } + // Fix for handlerId === 0 + // https://github.com/eclipse-theia/theia/pull/12500#issuecomment-1686074836 + if (typeof dto.handlerId === 'number') { + result.click = () => { + sender.send(CHANNEL_INVOKE_MENU, menuId, dto.handlerId); + }; + } + return result; + }); + } +} diff --git a/arduino-ide-extension/src/electron-main/theia/theia-electron-window.ts b/arduino-ide-extension/src/electron-main/theia/theia-electron-window.ts index 8c5fd03bd..3d3f6629b 100644 --- a/arduino-ide-extension/src/electron-main/theia/theia-electron-window.ts +++ b/arduino-ide-extension/src/electron-main/theia/theia-electron-window.ts @@ -1,67 +1,37 @@ -import { injectable } from '@theia/core/shared/inversify'; -import { ipcMain, IpcMainEvent } from '@theia/electron/shared/electron'; -import { StopReason } from '@theia/core/lib/electron-common/messaging/electron-messages'; +import { StopReason } from '@theia/core/lib/common/frontend-application-state'; +import { TheiaRendererAPI } from '@theia/core/lib/electron-main/electron-api-main'; import { TheiaElectronWindow as DefaultTheiaElectronWindow } from '@theia/core/lib/electron-main/theia-electron-window'; -import { FileUri } from '@theia/core/lib/node'; -import URI from '@theia/core/lib/common/uri'; -import { FrontendApplicationState } from '@theia/core/lib/common/frontend-application-state'; -import { createDisposableListener } from '@theia/core/lib/electron-main/event-utils'; -import { APPLICATION_STATE_CHANGE_SIGNAL } from '@theia/core/lib/electron-common/messaging/electron-messages'; +import { injectable } from '@theia/core/shared/inversify'; +import { hasStartupTasks } from '../../electron-common/startup-task'; +import { ElectronArduinoRenderer } from '../electron-arduino'; @injectable() export class TheiaElectronWindow extends DefaultTheiaElectronWindow { - protected override async handleStopRequest( - onSafeCallback: () => unknown, - reason: StopReason - ): Promise<boolean> { - // Only confirm close to windows that have loaded our frontend. - // Both the windows's URL and the FS path of the `index.html` should be converted to the "same" format to be able to compare them. (#11226) - // Notes: - // - Windows: file:///C:/path/to/somewhere vs file:///c%3A/path/to/somewhere - // - macOS: file:///Applications/App%20Name.app/Contents vs /Applications/App Name.app/Contents - // This URL string comes from electron, we can expect that this is properly encoded URL. For example, a space is `%20` - const currentUrl = new URI(this.window.webContents.getURL()).toString(); - // THEIA_FRONTEND_HTML_PATH is an FS path, we have to covert to an encoded URI string. - const frontendUri = FileUri.create( - this.globals.THEIA_FRONTEND_HTML_PATH - ).toString(); - const safeToClose = - !currentUrl.includes(frontendUri) || (await this.checkSafeToStop(reason)); - if (safeToClose) { - try { - await onSafeCallback(); - return true; - } catch (e) { - console.warn(`Request ${StopReason[reason]} failed.`, e); + protected override reload(args?: unknown): void { + this.handleStopRequest(async () => { + this.applicationState = 'init'; + if (hasStartupTasks(args)) { + const { webContents } = this._window; + const toDisposeOnReady = TheiaRendererAPI.onApplicationStateChanged( + webContents, + (state) => { + if (state === 'ready') { + ElectronArduinoRenderer.sendStartupTasks(webContents, args); + toDisposeOnReady.dispose(); + } + } + ); } - } - return false; + this._window.reload(); + }, StopReason.Reload); } - // Note: does the same as the Theia impl, but logs state changes. - protected override trackApplicationState(): void { - createDisposableListener( - ipcMain, - APPLICATION_STATE_CHANGE_SIGNAL, - (e: IpcMainEvent, state: FrontendApplicationState) => { - console.log( - 'app-state-change', - `>>> new app state <${state} was received from sender <${e.sender.id}>. current window ID: ${this._window.id}` - ); - if (this.isSender(e)) { - this.applicationState = state; - console.log( - 'app-state-change', - `<<< new app state is <${this.applicationState}> for window <${this._window.id}>` - ); - } else { - console.log( - 'app-state-change', - `<<< new app state <${state}> is ignored from <${e.sender.id}>. current window ID is <${this._window.id}>` - ); - } - }, - this.toDispose + protected override attachReloadListener(): void { + this.toDispose.push( + ElectronArduinoRenderer.onRequestReload( + this.window.webContents, + (args?: unknown) => this.reload(args) + ) ); } } diff --git a/arduino-ide-extension/src/node/arduino-core-service-client.ts b/arduino-ide-extension/src/node/arduino-core-service-client.ts new file mode 100644 index 000000000..e753e206c --- /dev/null +++ b/arduino-ide-extension/src/node/arduino-core-service-client.ts @@ -0,0 +1,53 @@ +import { credentials, makeClientConstructor } from '@grpc/grpc-js'; +import * as commandsGrpcPb from './cli-protocol/cc/arduino/cli/commands/v1/commands_grpc_pb'; +import { ArduinoCoreServiceClient } from './cli-protocol/cc/arduino/cli/commands/v1/commands_grpc_pb'; + +export interface CreateClientOptions { + /** + * The port to the Arduino CLI daemon. + */ + readonly port: number; + /** + * Defaults to `'localhost'`. + */ + readonly host?: string; + + /** + * gRCP channel options. Defaults to `createDefaultChannelOptions` with `'0.0.0'` `appVersion` + */ + readonly channelOptions?: Record<string, unknown>; +} + +export function createDefaultChannelOptions( + appVersion = '0.0.0' +): Record<string, unknown> { + return { + 'grpc.max_send_message_length': 512 * 1024 * 1024, + 'grpc.max_receive_message_length': 512 * 1024 * 1024, + 'grpc.primary_user_agent': `arduino-ide/${appVersion}`, + }; +} + +export function createArduinoCoreServiceClient( + options: CreateClientOptions +): ArduinoCoreServiceClient { + const { + port, + host = 'localhost', + channelOptions = createDefaultChannelOptions(), + } = options; + const address = `${host}:${port}`; + // https://github.com/agreatfool/grpc_tools_node_protoc_ts/blob/master/doc/grpcjs_support.md#usage + const ArduinoCoreServiceClient = makeClientConstructor( + // @ts-expect-error: ignore + commandsGrpcPb['cc.arduino.cli.commands.v1.ArduinoCoreService'], + 'ArduinoCoreServiceService' + // eslint-disable-next-line @typescript-eslint/no-explicit-any + ) as any; + const client = new ArduinoCoreServiceClient( + address, + credentials.createInsecure(), + channelOptions + ) as ArduinoCoreServiceClient; + return client; +} diff --git a/arduino-ide-extension/src/node/arduino-daemon-impl.ts b/arduino-ide-extension/src/node/arduino-daemon-impl.ts index f859985e4..fef3c3c4d 100644 --- a/arduino-ide-extension/src/node/arduino-daemon-impl.ts +++ b/arduino-ide-extension/src/node/arduino-daemon-impl.ts @@ -1,8 +1,7 @@ -import { join } from 'path'; -import { promises as fs } from 'fs'; +import { join } from 'node:path'; import { inject, injectable, named } from '@theia/core/shared/inversify'; -import { spawn, ChildProcess } from 'child_process'; -import { FileUri } from '@theia/core/lib/node/file-uri'; +import { spawn, ChildProcess } from 'node:child_process'; +import { FileUri } from '@theia/core/lib/common/file-uri'; import { ILogger } from '@theia/core/lib/common/logger'; import { Deferred, retry } from '@theia/core/lib/common/promise-util'; import { @@ -10,12 +9,14 @@ import { DisposableCollection, } from '@theia/core/lib/common/disposable'; import { Event, Emitter } from '@theia/core/lib/common/event'; -import { environment } from '@theia/application-package/lib/environment'; +import { deepClone } from '@theia/core/lib/common/objects'; import { EnvVariablesServer } from '@theia/core/lib/common/env-variables'; import { BackendApplicationContribution } from '@theia/core/lib/node/backend-application'; import { ArduinoDaemon, NotificationServiceServer } from '../common/protocol'; import { CLI_CONFIG } from './cli-config'; -import { getExecPath, spawnCommand } from './exec-util'; +import { SettingsReader } from './settings-reader'; +import { ProcessUtils } from '@theia/core/lib/node/process-utils'; +import { arduinoCliPath } from './resources'; @injectable() export class ArduinoDaemonImpl @@ -31,13 +32,18 @@ export class ArduinoDaemonImpl @inject(NotificationServiceServer) private readonly notificationService: NotificationServiceServer; + @inject(SettingsReader) + private readonly settingsReader: SettingsReader; + + @inject(ProcessUtils) + private readonly processUtils: ProcessUtils; + private readonly toDispose = new DisposableCollection(); - private readonly onDaemonStartedEmitter = new Emitter<string>(); + private readonly onDaemonStartedEmitter = new Emitter<number>(); private readonly onDaemonStoppedEmitter = new Emitter<void>(); private _running = false; - private _port = new Deferred<string>(); - private _execPath: string | undefined; + private _port = new Deferred<number>(); // Backend application lifecycle. @@ -47,42 +53,34 @@ export class ArduinoDaemonImpl // Daemon API - async getPort(): Promise<string> { + async getPort(): Promise<number> { return this._port.promise; } - async tryGetPort(): Promise<string | undefined> { + async tryGetPort(): Promise<number | undefined> { if (this._running) { return this._port.promise; } return undefined; } - async start(): Promise<string> { + async start(): Promise<number> { try { this.toDispose.dispose(); // This will `kill` the previously started daemon process, if any. - const cliPath = await this.getExecPath(); + const cliPath = this.getExecPath(); this.onData(`Starting daemon from ${cliPath}...`); const { daemon, port } = await this.spawnDaemonProcess(); - // Watchdog process for terminating the daemon process when the backend app terminates. - spawn( - process.execPath, - [ - join(__dirname, 'daemon-watcher.js'), - String(process.pid), - String(daemon.pid), - ], - { - env: environment.electron.runAsNodeEnv(), - detached: true, - stdio: 'ignore', - windowsHide: true, - } - ).unref(); - this.toDispose.pushAll([ - Disposable.create(() => daemon.kill()), - Disposable.create(() => this.fireDaemonStopped()), + Disposable.create(() => { + if (daemon.pid) { + this.processUtils.terminateProcessTree(daemon.pid); + this.fireDaemonStopped(); + } else { + throw new Error( + 'The CLI Daemon process does not have a PID. IDE2 could not stop the CLI daemon.' + ); + } + }), ]); this.fireDaemonStarted(port); this.onData('Daemon is running.'); @@ -103,13 +101,13 @@ export class ArduinoDaemonImpl this.toDispose.dispose(); } - async restart(): Promise<string> { + async restart(): Promise<number> { return this.start(); } // Backend only daemon API - get onDaemonStarted(): Event<string> { + get onDaemonStarted(): Event<number> { return this.onDaemonStartedEmitter.event; } @@ -117,34 +115,8 @@ export class ArduinoDaemonImpl return this.onDaemonStoppedEmitter.event; } - async getExecPath(): Promise<string> { - if (this._execPath) { - return this._execPath; - } - this._execPath = await getExecPath('arduino-cli', this.onError.bind(this)); - return this._execPath; - } - - async getVersion(): Promise< - Readonly<{ version: string; commit: string; status?: string }> - > { - const execPath = await this.getExecPath(); - const raw = await spawnCommand( - `"${execPath}"`, - ['version', '--format', 'json'], - this.onError.bind(this) - ); - try { - // The CLI `Info` object: https://github.com/arduino/arduino-cli/blob/17d24eb901b1fdaa5a4ec7da3417e9e460f84007/version/version.go#L31-L34 - const { VersionString, Commit, Status } = JSON.parse(raw); - return { - version: VersionString, - commit: Commit, - status: Status, - }; - } catch { - return { version: raw, commit: raw }; - } + getExecPath(): string { + return arduinoCliPath; } protected async getSpawnArgs(): Promise<string[]> { @@ -155,15 +127,11 @@ export class ArduinoDaemonImpl const cliConfigPath = join(FileUri.fsPath(configDirUri), CLI_CONFIG); const args = [ 'daemon', - '--format', - 'jsonmini', '--port', '0', '--config-file', - `"${cliConfigPath}"`, + cliConfigPath, '-v', - '--log-format', - 'json', ]; if (debug) { args.push('--debug'); @@ -172,47 +140,25 @@ export class ArduinoDaemonImpl } private async debugDaemon(): Promise<boolean> { - // Poor man's preferences on the backend. (https://github.com/arduino/arduino-ide/issues/1056#issuecomment-1153975064) - const configDirUri = await this.envVariablesServer.getConfigDirUri(); - const configDirPath = FileUri.fsPath(configDirUri); - try { - const raw = await fs.readFile(join(configDirPath, 'settings.json'), { - encoding: 'utf8', - }); - const json = this.tryParse(raw); - if (json) { - const value = json['arduino.cli.daemon.debug']; - return typeof value === 'boolean' && !!value; - } - return false; - } catch (error) { - if ('code' in error && error.code === 'ENOENT') { - return false; - } - throw error; - } - } - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - private tryParse(raw: string): any | undefined { - try { - return JSON.parse(raw); - } catch { - return undefined; + const settings = await this.settingsReader.read(); + if (settings) { + const value = settings['arduino.cli.daemon.debug']; + return value === true; } + return false; } protected async spawnDaemonProcess(): Promise<{ daemon: ChildProcess; - port: string; + port: number; }> { - const [cliPath, args] = await Promise.all([ - this.getExecPath(), - this.getSpawnArgs(), - ]); - const ready = new Deferred<{ daemon: ChildProcess; port: string }>(); - const options = { shell: true }; - const daemon = spawn(`"${cliPath}"`, args, options); + const args = await this.getSpawnArgs(); + const cliPath = this.getExecPath(); + const ready = new Deferred<{ daemon: ChildProcess; port: number }>(); + const options = { + env: { ...deepClone(process.env), NO_COLOR: String(true) }, + }; + const daemon = spawn(cliPath, args, options); // If the process exists right after the daemon gRPC server has started (due to an invalid port, unknown address, TCP port in use, etc.) // we have no idea about the root cause unless we sniff into the first data package and dispatch the logic on that. Note, we get a exit code 1. @@ -220,26 +166,6 @@ export class ArduinoDaemonImpl daemon.stdout.on('data', (data) => { const message = data.toString(); - - let port = ''; - let address = ''; - message - .split('\n') - .filter((line: string) => line.length) - .forEach((line: string) => { - try { - const parsedLine = JSON.parse(line); - if ('Port' in parsedLine) { - port = parsedLine.Port; - } - if ('IP' in parsedLine) { - address = parsedLine.IP; - } - } catch (err) { - // ignore - } - }); - this.onData(message); if (!grpcServerIsReady) { const error = DaemonError.parse(message); @@ -248,9 +174,34 @@ export class ArduinoDaemonImpl return; } + let port = ''; + let address = ''; + message + .split('\n') + .filter((line: string) => line.length) + .forEach((line: string) => { + try { + const parsedLine = JSON.parse(line); + if ('Port' in parsedLine) { + port = parsedLine.Port; + } + if ('IP' in parsedLine) { + address = parsedLine.IP; + } + } catch (err) { + // ignore + } + }); + if (port.length && address.length) { grpcServerIsReady = true; - ready.resolve({ daemon, port }); + const portNumber = Number.parseInt(port, 10); + if (Number.isNaN(portNumber)) { + ready.reject( + new Error(`Received a NaN port from the CLI: ${port}`) + ); + } + ready.resolve({ daemon, port: portNumber }); } } }); @@ -280,7 +231,7 @@ export class ArduinoDaemonImpl return ready.promise; } - private fireDaemonStarted(port: string): void { + private fireDaemonStarted(port: number): void { this._running = true; this._port.resolve(port); this.onDaemonStartedEmitter.fire(port); @@ -293,13 +244,13 @@ export class ArduinoDaemonImpl } this._running = false; this._port.reject(); // Reject all pending. - this._port = new Deferred<string>(); + this._port = new Deferred<number>(); this.onDaemonStoppedEmitter.fire(); this.notificationService.notifyDaemonDidStop(); } protected onData(message: string): void { - this.logger.info(message); + this.logger.info(message.trim()); } // eslint-disable-next-line @typescript-eslint/no-explicit-any diff --git a/arduino-ide-extension/src/node/arduino-firmware-uploader-impl.ts b/arduino-ide-extension/src/node/arduino-firmware-uploader-impl.ts index a14f406d1..5def6a74b 100644 --- a/arduino-ide-extension/src/node/arduino-firmware-uploader-impl.ts +++ b/arduino-ide-extension/src/node/arduino-firmware-uploader-impl.ts @@ -1,46 +1,34 @@ +import { ILogger } from '@theia/core/lib/common/logger'; +import { inject, injectable, named } from '@theia/core/shared/inversify'; +import type { Port } from '../common/protocol'; import { ArduinoFirmwareUploader, FirmwareInfo, + UploadCertificateParams, } from '../common/protocol/arduino-firmware-uploader'; -import { injectable, inject, named } from '@theia/core/shared/inversify'; -import { ExecutableService, Port } from '../common/protocol'; -import { getExecPath, spawnCommand } from './exec-util'; -import { ILogger } from '@theia/core/lib/common/logger'; +import { spawnCommand } from './exec-util'; import { MonitorManager } from './monitor-manager'; +import { arduinoFirmwareUploaderPath } from './resources'; @injectable() export class ArduinoFirmwareUploaderImpl implements ArduinoFirmwareUploader { - @inject(ExecutableService) - protected executableService: ExecutableService; - - protected _execPath: string | undefined; - @inject(ILogger) @named('fwuploader') - protected readonly logger: ILogger; - + private readonly logger: ILogger; @inject(MonitorManager) - protected readonly monitorManager: MonitorManager; - - protected onError(error: any): void { - this.logger.error(error); - } - - async getExecPath(): Promise<string> { - if (this._execPath) { - return this._execPath; - } - this._execPath = await getExecPath('arduino-fwuploader'); - return this._execPath; - } + private readonly monitorManager: MonitorManager; - async runCommand(args: string[]): Promise<any> { - const execPath = await this.getExecPath(); - return await spawnCommand(`"${execPath}"`, args, this.onError.bind(this)); - } - - async uploadCertificates(command: string): Promise<any> { - return await this.runCommand(['certificates', 'flash', command]); + async uploadCertificates(params: UploadCertificateParams): Promise<string> { + const { fqbn, address, urls } = params; + return await this.runCommand([ + 'certificates', + 'flash', + '-b', + fqbn, + '-a', + address, + ...urls.flatMap((url) => ['-u', url]), + ]); } async list(fqbn?: string): Promise<FirmwareInfo[]> { @@ -70,14 +58,13 @@ export class ArduinoFirmwareUploaderImpl implements ArduinoFirmwareUploader { } async flash(firmware: FirmwareInfo, port: Port): Promise<string> { - let output; const board = { name: firmware.board_name, fqbn: firmware.board_fqbn, }; try { await this.monitorManager.notifyUploadStarted(board.fqbn, port); - output = await this.runCommand([ + const output = await this.runCommand([ 'firmware', 'flash', '--fqbn', @@ -87,11 +74,21 @@ export class ArduinoFirmwareUploaderImpl implements ArduinoFirmwareUploader { '--module', `${firmware.module}@${firmware.firmware_version}`, ]); - } catch (e) { - throw e; - } finally { - await this.monitorManager.notifyUploadFinished(board.fqbn, port); return output; + } finally { + await this.monitorManager.notifyUploadFinished(board.fqbn, port, port); // here the before and after ports are assumed to be always the same } } + + private onError(error: Error): void { + this.logger.error(error); + } + + private async runCommand(args: string[]): Promise<string> { + return await spawnCommand( + arduinoFirmwareUploaderPath, + args, + this.onError.bind(this) + ); + } } diff --git a/arduino-ide-extension/src/node/arduino-ide-backend-module.ts b/arduino-ide-extension/src/node/arduino-ide-backend-module.ts index b007b1bc3..9367d4aa9 100644 --- a/arduino-ide-extension/src/node/arduino-ide-backend-module.ts +++ b/arduino-ide-extension/src/node/arduino-ide-backend-module.ts @@ -1,10 +1,9 @@ -import { ContainerModule } from '@theia/core/shared/inversify'; +import { ContainerModule, interfaces } from '@theia/core/shared/inversify'; import { ArduinoDaemonImpl } from './arduino-daemon-impl'; import { ArduinoFirmwareUploader, ArduinoFirmwareUploaderPath, } from '../common/protocol/arduino-firmware-uploader'; - import { ILogger } from '@theia/core/lib/common/logger'; import { BackendApplicationContribution, @@ -26,7 +25,7 @@ import { ConnectionContainerModule } from '@theia/core/lib/node/messaging/connec import { CoreClientProvider } from './core-client-provider'; import { ConnectionHandler, JsonRpcConnectionHandler } from '@theia/core'; import { DefaultWorkspaceServer } from './theia/workspace/default-workspace-server'; -import { WorkspaceServer as TheiaWorkspaceServer } from '@theia/workspace/lib/common'; +import { WorkspaceServer as TheiaWorkspaceServer } from '@theia/workspace/lib/common/workspace-protocol'; import { SketchesServiceImpl } from './sketches-service-impl'; import { SketchesService, @@ -40,10 +39,12 @@ import { ArduinoDaemon, ArduinoDaemonPath, } from '../common/protocol/arduino-daemon'; - import { ConfigServiceImpl } from './config-service-impl'; import { EnvVariablesServer as TheiaEnvVariablesServer } from '@theia/core/lib/common/env-variables'; -import { EnvVariablesServer } from './theia/env-variables/env-variables-server'; +import { + ConfigDirUriProvider, + EnvVariablesServer, +} from './theia/env-variables/env-variables-server'; import { NodeFileSystemExt } from './node-filesystem-ext'; import { FileSystemExt, @@ -102,14 +103,24 @@ import WebSocketProviderImpl from './web-socket/web-socket-provider-impl'; import { WebSocketProvider } from './web-socket/web-socket-provider'; import { ClangFormatter } from './clang-formatter'; import { FormatterPath } from '../common/protocol/formatter'; -import { LocalizationBackendContribution } from './i18n/localization-backend-contribution'; -import { LocalizationBackendContribution as TheiaLocalizationBackendContribution } from '@theia/core/lib/node/i18n/localization-backend-contribution'; -import { SurveyNotificationServiceImpl } from './survey-service-impl'; -import { - SurveyNotificationService, - SurveyNotificationServicePath, -} from '../common/protocol/survey-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 { IsTempSketch } from './is-temp-sketch'; +import { WebsocketEndpoint } from './theia/core/websocket-endpoint'; +import { MessagingService } from '@theia/core/lib/node/messaging/messaging-service'; +import { HostedPluginReader } from './theia/plugin-ext/plugin-reader'; +import { HostedPluginReader as TheiaHostedPluginReader } from '@theia/plugin-ext/lib/hosted/node/plugin-reader'; +import { + PluginDeployer, + PluginScanner, +} from '@theia/plugin-ext/lib/common/plugin-protocol'; +import { + LocalDirectoryPluginDeployerResolverWithFallback, + PluginDeployer_GH_12064, +} from './theia/plugin-ext/plugin-deployer'; +import { SettingsReader } from './settings-reader'; +import { VsCodePluginScanner } from './theia/plugin-ext-vscode/scanner-vscode'; +import { rebindParcelFileSystemWatcher } from './theia/filesystem/parcel-bindings'; export default new ContainerModule((bind, unbind, isBound, rebind) => { bind(BackendApplication).toSelf().inSingletonScope(); @@ -227,6 +238,7 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { bind(DefaultWorkspaceServer).toSelf().inSingletonScope(); rebind(TheiaWorkspaceServer).toService(DefaultWorkspaceServer); + bind(ConfigDirUriProvider).toSelf().inSingletonScope(); bind(EnvVariablesServer).toSelf().inSingletonScope(); rebind(TheiaEnvVariablesServer).toService(EnvVariablesServer); @@ -288,6 +300,7 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { ) ) .inSingletonScope(); + rebindParcelFileSystemWatcher(rebind); // Output service per connection. bind(ConnectionContainerModule).toConstantValue( @@ -325,60 +338,17 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { }) ); - // Logger for the Arduino daemon - bind(ILogger) - .toDynamicValue((ctx) => { - const parentLogger = ctx.container.get<ILogger>(ILogger); - return parentLogger.child('daemon'); - }) - .inSingletonScope() - .whenTargetNamed('daemon'); - - // Logger for the Arduino daemon - bind(ILogger) - .toDynamicValue((ctx) => { - const parentLogger = ctx.container.get<ILogger>(ILogger); - return parentLogger.child('fwuploader'); - }) - .inSingletonScope() - .whenTargetNamed('fwuploader'); - - // Logger for the "serial discovery". - bind(ILogger) - .toDynamicValue((ctx) => { - const parentLogger = ctx.container.get<ILogger>(ILogger); - return parentLogger.child('discovery-log'); // TODO: revert - }) - .inSingletonScope() - .whenTargetNamed('discovery-log'); // TODO: revert - - // Logger for the CLI config service. From the CLI config (FS path aware), we make a URI-aware app config. - bind(ILogger) - .toDynamicValue((ctx) => { - const parentLogger = ctx.container.get<ILogger>(ILogger); - return parentLogger.child('config'); - }) - .inSingletonScope() - .whenTargetNamed('config'); - - // Logger for the monitor manager and its services - bind(ILogger) - .toDynamicValue((ctx) => { - const parentLogger = ctx.container.get<ILogger>(ILogger); - return parentLogger.child(MonitorManagerName); - }) - .inSingletonScope() - .whenTargetNamed(MonitorManagerName); - - bind(ILogger) - .toDynamicValue((ctx) => { - const parentLogger = ctx.container.get<ILogger>(ILogger); - return parentLogger.child(MonitorServiceName); - }) - .inSingletonScope() - .whenTargetNamed(MonitorServiceName); - - // Remote sketchbook bindings + [ + 'daemon', // Logger for the Arduino daemon + 'fwuploader', // Arduino Firmware uploader + 'discovery-log', // Boards discovery + 'config', // Logger for the CLI config reading and manipulation + 'sketches-service', // For creating, loading, and cloning sketches + MonitorManagerName, // Logger for the monitor manager and its services + MonitorServiceName, + ].forEach((name) => bindChildLogger(bind, name)); + + // Cloud sketchbook bindings bind(AuthenticationServiceImpl).toSelf().inSingletonScope(); bind(AuthenticationService).toService(AuthenticationServiceImpl); bind(BackendApplicationContribution).toService(AuthenticationServiceImpl); @@ -403,23 +373,39 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { bind(BackendApplicationContribution).toService(PlotterBackendContribution); bind(ArduinoLocalizationContribution).toSelf().inSingletonScope(); bind(LocalizationContribution).toService(ArduinoLocalizationContribution); - bind(LocalizationBackendContribution).toSelf().inSingletonScope(); - rebind(TheiaLocalizationBackendContribution).toService( - LocalizationBackendContribution + bind(HostedPluginLocalizationService).toSelf().inSingletonScope(); + rebind(TheiaHostedPluginLocalizationService).toService( + 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) - ) - ) + bind(IsTempSketch).toSelf().inSingletonScope(); + rebind(MessagingService.Identifier).to(WebsocketEndpoint).inSingletonScope(); + + // Removed undesired contributions from VS Code extensions + // Such as the RTOS view from the `cortex-debug` extension + // https://github.com/arduino/arduino-ide/pull/1706#pullrequestreview-1195595080 + bind(HostedPluginReader).toSelf().inSingletonScope(); + rebind(TheiaHostedPluginReader).toService(HostedPluginReader); + + // https://github.com/eclipse-theia/theia/issues/12064 + bind(LocalDirectoryPluginDeployerResolverWithFallback) + .toSelf() .inSingletonScope(); + rebind(PluginDeployer).to(PluginDeployer_GH_12064).inSingletonScope(); - bind(IsTempSketch).toSelf().inSingletonScope(); + bind(SettingsReader).toSelf().inSingletonScope(); + + // To read the enablement property of the viewsWelcome + // https://github.com/eclipse-theia/theia/issues/14309 + bind(VsCodePluginScanner).toSelf().inSingletonScope(); + rebind(PluginScanner).toService(VsCodePluginScanner); }); + +function bindChildLogger(bind: interfaces.Bind, name: string): void { + bind(ILogger) + .toDynamicValue(({ container }) => + container.get<ILogger>(ILogger).child(name) + ) + .inSingletonScope() + .whenTargetNamed(name); +} diff --git a/arduino-ide-extension/src/node/auth/arduino-auth-provider.ts b/arduino-ide-extension/src/node/auth/arduino-auth-provider.ts index b3b29d342..39124b374 100644 --- a/arduino-ide-extension/src/node/auth/arduino-auth-provider.ts +++ b/arduino-ide-extension/src/node/auth/arduino-auth-provider.ts @@ -1,6 +1,5 @@ import fetch from 'node-fetch'; import { injectable } from '@theia/core/shared/inversify'; - import { createServer, startServer } from './authentication-server'; import { Keychain } from './keychain'; import { @@ -16,10 +15,10 @@ import { AuthenticationProviderAuthenticationSessionsChangeEvent, AuthenticationSession, AuthenticationProvider, - AuthOptions, } from './types'; import { Event, Emitter } from '@theia/core/lib/common/event'; -import * as open from 'open'; +import open from 'open'; +import { AuthOptions } from '../../common/protocol/authentication-service'; const LOGIN_TIMEOUT = 30 * 1000; const REFRESH_INTERVAL = 10 * 60 * 1000; diff --git a/arduino-ide-extension/src/node/auth/authentication-server.ts b/arduino-ide-extension/src/node/auth/authentication-server.ts index bc9c93e7d..ac9ac6064 100644 --- a/arduino-ide-extension/src/node/auth/authentication-server.ts +++ b/arduino-ide-extension/src/node/auth/authentication-server.ts @@ -1,9 +1,9 @@ -import * as http from 'http'; -import * as url from 'url'; +import http from 'node:http'; +import url from 'node:url'; import { body } from './body'; +import { authServerPort } from '../../common/protocol/authentication-service'; export const authCallbackPath = 'callback'; -export const serverPort = 9876; export function createServer( authCallback: (req: http.IncomingMessage, res: http.ServerResponse) => void @@ -29,7 +29,7 @@ export function createServer( } export async function startServer(server: http.Server): Promise<string> { - let portTimer: NodeJS.Timer; + let portTimer: NodeJS.Timeout; function cancelPortTimer() { clearTimeout(portTimer); @@ -59,7 +59,7 @@ export async function startServer(server: http.Server): Promise<string> { reject(new Error('Closed')); }); - server.listen(serverPort); + server.listen(authServerPort); }); port.then(cancelPortTimer, cancelPortTimer); diff --git a/arduino-ide-extension/src/node/auth/authentication-service-impl.ts b/arduino-ide-extension/src/node/auth/authentication-service-impl.ts index d4be588c2..75e9607b8 100644 --- a/arduino-ide-extension/src/node/auth/authentication-service-impl.ts +++ b/arduino-ide-extension/src/node/auth/authentication-service-impl.ts @@ -5,12 +5,12 @@ import { } from '@theia/core/lib/common/disposable'; import { BackendApplicationContribution } from '@theia/core/lib/node/backend-application'; import { + AuthOptions, AuthenticationService, AuthenticationServiceClient, AuthenticationSession, } from '../../common/protocol/authentication-service'; import { ArduinoAuthenticationProvider } from './arduino-auth-provider'; -import { AuthOptions } from './types'; @injectable() export class AuthenticationServiceImpl @@ -19,7 +19,7 @@ export class AuthenticationServiceImpl protected readonly delegate = new ArduinoAuthenticationProvider(); protected readonly clients: AuthenticationServiceClient[] = []; protected readonly toDispose = new DisposableCollection(); - + private initialized = false; async onStart(): Promise<void> { diff --git a/arduino-ide-extension/src/node/auth/keychain.ts b/arduino-ide-extension/src/node/auth/keychain.ts index 7b7d8c743..d07bcc55a 100644 --- a/arduino-ide-extension/src/node/auth/keychain.ts +++ b/arduino-ide-extension/src/node/auth/keychain.ts @@ -1,4 +1,4 @@ -import type * as keytarType from 'keytar'; +import type keytarType from 'keytar'; export type KeychainConfig = { credentialsSection: string; @@ -6,9 +6,9 @@ export type KeychainConfig = { }; type Keytar = { - getPassword: typeof keytarType['getPassword']; - setPassword: typeof keytarType['setPassword']; - deletePassword: typeof keytarType['deletePassword']; + getPassword: (typeof keytarType)['getPassword']; + setPassword: (typeof keytarType)['setPassword']; + deletePassword: (typeof keytarType)['deletePassword']; }; export class Keychain { diff --git a/arduino-ide-extension/src/node/auth/types.ts b/arduino-ide-extension/src/node/auth/types.ts index 14ff39db1..303d36dc8 100644 --- a/arduino-ide-extension/src/node/auth/types.ts +++ b/arduino-ide-extension/src/node/auth/types.ts @@ -1,16 +1,9 @@ -import { AuthenticationSession } from '../../common/protocol/authentication-service'; +import { + AuthOptions, + AuthenticationSession, +} from '../../common/protocol/authentication-service'; export { AuthenticationSession }; -export type AuthOptions = { - redirectUri: string; - responseType: string; - clientID: string; - domain: string; - audience: string; - registerUri: string; - scopes: string[]; -}; - export interface AuthenticationProviderAuthenticationSessionsChangeEvent { readonly added?: ReadonlyArray<AuthenticationSession>; readonly removed?: ReadonlyArray<AuthenticationSession>; diff --git a/arduino-ide-extension/src/node/auth/utils.ts b/arduino-ide-extension/src/node/auth/utils.ts index f04e938b3..84a4d2250 100644 --- a/arduino-ide-extension/src/node/auth/utils.ts +++ b/arduino-ide-extension/src/node/auth/utils.ts @@ -1,7 +1,7 @@ import jwt_decode from 'jwt-decode'; import { sha256 } from 'hash.js'; -import { randomBytes } from 'crypto'; -import btoa = require('btoa'); // TODO: check why we cannot +import { randomBytes } from 'node:crypto'; +import btoa from 'btoa'; import { AuthenticationSession } from './types'; import { Unknown } from '../../common/nls'; diff --git a/arduino-ide-extension/src/node/board-discovery.ts b/arduino-ide-extension/src/node/board-discovery.ts index 84ac101b6..44a84ec38 100644 --- a/arduino-ide-extension/src/node/board-discovery.ts +++ b/arduino-ide-extension/src/node/board-discovery.ts @@ -1,18 +1,22 @@ -import { ClientDuplexStream } from '@grpc/grpc-js'; -import { DisposableCollection } from '@theia/core/lib/common/disposable'; +import type { ClientReadableStream } from '@grpc/grpc-js'; +import { + Disposable, + DisposableCollection, +} from '@theia/core/lib/common/disposable'; import { Emitter, Event } from '@theia/core/lib/common/event'; import { ILogger } from '@theia/core/lib/common/logger'; import { deepClone } from '@theia/core/lib/common/objects'; import { Deferred } from '@theia/core/lib/common/promise-util'; -import { BackendApplicationContribution } from '@theia/core/lib/node'; +import type { Mutable } from '@theia/core/lib/common/types'; +import { BackendApplicationContribution } from '@theia/core/lib/node/backend-application'; +import { UUID } from '@theia/core/shared/@phosphor/coreutils'; import { inject, injectable, named } from '@theia/core/shared/inversify'; -import { Disposable } from '@theia/core/shared/vscode-languageserver-protocol'; -import { v4 } from 'uuid'; +import { isDeepStrictEqual } from 'util'; import { Unknown } from '../common/nls'; import { - AttachedBoardsChangeEvent, - AvailablePorts, Board, + DetectedPort, + DetectedPorts, NotificationServiceServer, Port, } from '../common/protocol'; @@ -22,13 +26,13 @@ import { DetectedPort as RpcDetectedPort, } from './cli-protocol/cc/arduino/cli/commands/v1/board_pb'; import { ArduinoCoreServiceClient } from './cli-protocol/cc/arduino/cli/commands/v1/commands_grpc_pb'; -import { Port as RpcPort } from './cli-protocol/cc/arduino/cli/commands/v1/port_pb'; +import type { Port as RpcPort } from './cli-protocol/cc/arduino/cli/commands/v1/port_pb'; import { CoreClientAware } from './core-client-provider'; import { ServiceError } from './service-error'; -type Duplex = ClientDuplexStream<BoardListWatchRequest, BoardListWatchResponse>; +type Stream = ClientReadableStream<BoardListWatchResponse>; interface StreamWrapper extends Disposable { - readonly stream: Duplex; + readonly stream: Stream; readonly uuid: string; // For logging only } @@ -57,35 +61,13 @@ export class BoardDiscovery private readonly onStreamDidCancelEmitter = new Emitter<void>(); // when the watcher is canceled by the IDE2 private readonly toDisposeOnStopWatch = new DisposableCollection(); - private uploadInProgress = false; - - /** - * Keys are the `address` of the ports. - * - * The `protocol` is ignored because the board detach event does not carry the protocol information, - * just the address. - * ```json - * { - * "type": "remove", - * "address": "/dev/cu.usbmodem14101" - * } - * ``` - */ - private _availablePorts: AvailablePorts = {}; - get availablePorts(): AvailablePorts { - return this._availablePorts; + private _detectedPorts: DetectedPorts = {}; + get detectedPorts(): DetectedPorts { + return this._detectedPorts; } onStart(): void { this.start(); - this.onClientDidRefresh(() => this.restart()); - } - - private async restart(): Promise<void> { - this.logger.info('restarting before stop'); - await this.stop(); - this.logger.info('restarting after stop'); - return this.start(); } onStop(): void { @@ -128,10 +110,6 @@ export class BoardDiscovery }); } - setUploadInProgress(uploadInProgress: boolean): void { - this.uploadInProgress = uploadInProgress; - } - private createTimeout( after: number, onTimeout: (error: Error) => void @@ -143,34 +121,15 @@ export class BoardDiscovery return Disposable.create(() => clearTimeout(timer)); } - private async requestStartWatch( - req: BoardListWatchRequest, - duplex: Duplex - ): Promise<void> { - return new Promise<void>((resolve, reject) => { - if ( - !duplex.write(req, (err: Error | undefined) => { - if (err) { - reject(err); - return; - } - }) - ) { - duplex.once('drain', resolve); - } else { - process.nextTick(resolve); - } - }); - } - private async createWrapper( - client: ArduinoCoreServiceClient + client: ArduinoCoreServiceClient, + req: BoardListWatchRequest ): Promise<StreamWrapper> { if (this.wrapper) { throw new Error(`Duplex was already set.`); } const stream = client - .boardListWatch() + .boardListWatch(req) .on('end', () => { this.logger.info('received end'); this.onStreamDidEndEmitter.fire(); @@ -190,7 +149,7 @@ export class BoardDiscovery }); const wrapper = { stream, - uuid: v4(), + uuid: UUID.uuid4(), dispose: () => { this.logger.info('disposing requesting cancel'); // Cancelling the stream will kill the discovery `builtin:mdns-discovery process`. @@ -210,18 +169,6 @@ export class BoardDiscovery return wrapper; } - private toJson(arg: BoardListWatchRequest | BoardListWatchResponse): string { - let object: Record<string, unknown> | undefined = undefined; - if (arg instanceof BoardListWatchRequest) { - object = BoardListWatchRequest.toObject(false, arg); - } else if (arg instanceof BoardListWatchResponse) { - object = BoardListWatchResponse.toObject(false, arg); - } else { - throw new Error(`Unhandled object type: ${arg}`); - } - return JSON.stringify(object); - } - async start(): Promise<void> { this.logger.info('start'); if (this.stopping) { @@ -236,21 +183,17 @@ export class BoardDiscovery this.watching = new Deferred(); this.logger.info('start new deferred'); const { client, instance } = await this.coreClient; - const wrapper = await this.createWrapper(client); - wrapper.stream.on('data', (resp) => this.onBoardListWatchResponse(resp)); - this.logger.info('start request start watch'); - await this.requestStartWatch( - new BoardListWatchRequest().setInstance(instance), - wrapper.stream + const wrapper = await this.createWrapper( + client, + new BoardListWatchRequest().setInstance(instance) ); - this.logger.info('start requested start watch'); + wrapper.stream.on('data', (resp) => this.onBoardListWatchResponse(resp)); this.watching.resolve(); this.logger.info('start resolved watching'); } - // XXX: make this `protected` and override for tests if IDE2 wants to mock events from the CLI. - private onBoardListWatchResponse(resp: BoardListWatchResponse): void { - this.logger.info(this.toJson(resp)); + protected onBoardListWatchResponse(resp: BoardListWatchResponse): void { + this.logger.info(JSON.stringify(resp.toObject(false))); const eventType = EventType.parse(resp.getEventType()); if (eventType === EventType.Quit) { @@ -259,69 +202,36 @@ export class BoardDiscovery return; } - const detectedPort = resp.getPort(); - if (detectedPort) { - const { port, boards } = this.fromRpc(detectedPort); - if (!port) { - if (!!boards.length) { - console.warn( - `Could not detect the port, but unexpectedly received discovered boards. This is most likely a bug! Response was: ${this.toJson( - resp - )}` - ); - } - return; - } - const oldState = deepClone(this._availablePorts); - const newState = deepClone(this._availablePorts); - const key = Port.keyOf(port); - - if (eventType === EventType.Add) { - if (newState[key]) { - const [, knownBoards] = newState[key]; - this.logger.warn( - `Port '${Port.toString( - port - )}' was already available. Known boards before override: ${JSON.stringify( - knownBoards - )}` - ); - } - newState[key] = [port, boards]; - } else if (eventType === EventType.Remove) { - if (!newState[key]) { - this.logger.warn( - `Port '${Port.toString(port)}' was not available. Skipping` - ); - return; - } - delete newState[key]; + const rpcDetectedPort = resp.getPort(); + if (rpcDetectedPort) { + const detectedPort = this.fromRpc(rpcDetectedPort); + if (detectedPort) { + this.fireSoon({ detectedPort, eventType }); + } else { + this.logger.warn( + `Could not extract the detected port from ${rpcDetectedPort.toObject( + false + )}` + ); } - - const event: AttachedBoardsChangeEvent = { - oldState: { - ...AvailablePorts.split(oldState), - }, - newState: { - ...AvailablePorts.split(newState), - }, - uploadInProgress: this.uploadInProgress, - }; - - this._availablePorts = newState; - this.notificationService.notifyAttachedBoardsDidChange(event); + } else if (resp.getError()) { + this.logger.error( + `Could not extract any detected 'port' from the board list watch response. An 'error' has occurred: ${resp.getError()}` + ); } } - private fromRpc(detectedPort: RpcDetectedPort): DetectedPort { + private fromRpc(detectedPort: RpcDetectedPort): DetectedPort | undefined { const rpcPort = detectedPort.getPort(); - const port = rpcPort && this.fromRpcPort(rpcPort); + if (!rpcPort) { + return undefined; + } + const port = createApiPort(rpcPort); const boards = detectedPort.getMatchingBoardsList().map( (board) => ({ - fqbn: board.getFqbn(), + fqbn: board.getFqbn() || undefined, // prefer undefined fqbn over empty string name: board.getName() || Unknown, - port, } as Board) ); return { @@ -330,15 +240,43 @@ export class BoardDiscovery }; } - private fromRpcPort(rpcPort: RpcPort): Port { - const port = { - address: rpcPort.getAddress(), - addressLabel: rpcPort.getLabel(), - protocol: rpcPort.getProtocol(), - protocolLabel: rpcPort.getProtocolLabel(), - properties: Port.Properties.create(rpcPort.getPropertiesMap().toObject()), - }; - return port; + private fireSoonHandle: NodeJS.Timeout | undefined; + private readonly bufferedEvents: DetectedPortChangeEvent[] = []; + private fireSoon(event: DetectedPortChangeEvent): void { + this.bufferedEvents.push(event); + clearTimeout(this.fireSoonHandle); + this.fireSoonHandle = setTimeout(() => { + const current = deepClone(this.detectedPorts); + const newState = this.calculateNewState(this.bufferedEvents, current); + if (!isDeepStrictEqual(current, newState)) { + this._detectedPorts = newState; + this.notificationService.notifyDetectedPortsDidChange({ + detectedPorts: this._detectedPorts, + }); + } + this.bufferedEvents.length = 0; + }, 100); + } + + private calculateNewState( + events: DetectedPortChangeEvent[], + prevState: Mutable<DetectedPorts> + ): DetectedPorts { + const newState = deepClone(prevState); + for (const { detectedPort, eventType } of events) { + const { port, boards } = detectedPort; + const key = Port.keyOf(port); + if (eventType === EventType.Add) { + // Note that, the serial discovery might detect port details (such as addressLabel) in chunks. + // For example, first, the Teensy 4.1 port is detected with the `[no_device] Triple Serial` address label, + // Then, when more refinements are available, the same port is detected with `/dev/cu.usbmodem127902301 Triple Serial` address label. + // In such cases, an `add` event is received from the CLI, and the the detected port is overridden in the state. + newState[key] = { port, boards }; + } else if (eventType === EventType.Remove) { + delete newState[key]; + } + } + return newState; } } @@ -365,7 +303,18 @@ namespace EventType { } } -interface DetectedPort { - port: Port | undefined; - boards: Board[]; +interface DetectedPortChangeEvent { + readonly detectedPort: DetectedPort; + readonly eventType: EventType.Add | EventType.Remove; +} + +export function createApiPort(rpcPort: RpcPort): Port { + return { + address: rpcPort.getAddress(), + addressLabel: rpcPort.getLabel(), + protocol: rpcPort.getProtocol(), + protocolLabel: rpcPort.getProtocolLabel(), + properties: Port.Properties.create(rpcPort.getPropertiesMap().toObject()), + hardwareId: rpcPort.getHardwareId() || undefined, // prefer undefined over empty string + }; } diff --git a/arduino-ide-extension/src/node/boards-service-impl.ts b/arduino-ide-extension/src/node/boards-service-impl.ts index 12c3fe354..a5572a1f6 100644 --- a/arduino-ide-extension/src/node/boards-service-impl.ts +++ b/arduino-ide-extension/src/node/boards-service-impl.ts @@ -1,48 +1,54 @@ -import { injectable, inject } from '@theia/core/shared/inversify'; import { ILogger } from '@theia/core/lib/common/logger'; +import { nls } from '@theia/core/lib/common/nls'; import { notEmpty } from '@theia/core/lib/common/objects'; +import { Mutable } from '@theia/core/lib/common/types'; +import { inject, injectable } from '@theia/core/shared/inversify'; import { - BoardsService, - Installable, - BoardsPackage, - Board, BoardDetails, - Tool, + BoardSearch, + BoardUserField, + BoardWithPackage, + BoardsPackage, + BoardsService, + CheckDebugEnabledParams, ConfigOption, ConfigValue, + DetectedPorts, + Installable, + NotificationServiceServer, Programmer, ResponseService, - NotificationServiceServer, - AvailablePorts, - BoardWithPackage, - BoardUserField, - BoardSearch, + SortGroup, + createPlatformIdentifier, + platformIdentifierEquals, + platformInstallFailed, + sortComponents, } from '../common/protocol'; -import { - PlatformInstallRequest, - PlatformListRequest, - PlatformListResponse, - PlatformSearchRequest, - PlatformSearchResponse, - PlatformUninstallRequest, -} from './cli-protocol/cc/arduino/cli/commands/v1/core_pb'; -import { Platform } from './cli-protocol/cc/arduino/cli/commands/v1/common_pb'; import { BoardDiscovery } from './board-discovery'; -import { CoreClientAware } from './core-client-provider'; import { BoardDetailsRequest, BoardDetailsResponse, + BoardListAllRequest, + BoardListAllResponse, BoardSearchRequest, } from './cli-protocol/cc/arduino/cli/commands/v1/board_pb'; +import { PlatformSummary } from './cli-protocol/cc/arduino/cli/commands/v1/common_pb'; +import { + PlatformInstallRequest, + PlatformSearchRequest, + PlatformSearchResponse, + PlatformUninstallRequest, +} from './cli-protocol/cc/arduino/cli/commands/v1/core_pb'; +import { IsDebugSupportedRequest } from './cli-protocol/cc/arduino/cli/commands/v1/debug_pb'; import { ListProgrammersAvailableForUploadRequest, ListProgrammersAvailableForUploadResponse, SupportedUserFieldsRequest, SupportedUserFieldsResponse, } from './cli-protocol/cc/arduino/cli/commands/v1/upload_pb'; +import { CoreClientAware } from './core-client-provider'; import { ExecuteWithProgress } from './grpc-progressible'; import { ServiceError } from './service-error'; -import { nls } from '@theia/core/lib/common'; @injectable() export class BoardsServiceImpl @@ -61,13 +67,17 @@ export class BoardsServiceImpl @inject(BoardDiscovery) protected readonly boardDiscovery: BoardDiscovery; - async getState(): Promise<AvailablePorts> { - return this.boardDiscovery.availablePorts; + async getDetectedPorts(): Promise<DetectedPorts> { + return this.boardDiscovery.detectedPorts; } async getBoardDetails(options: { fqbn: string; + forceRefresh?: boolean; }): Promise<BoardDetails | undefined> { + if (options.forceRefresh) { + await this.refresh(); + } const coreClient = await this.coreClient; const { client, instance } = coreClient; const { fqbn } = options; @@ -93,16 +103,11 @@ export class BoardsServiceImpl return undefined; } - const debuggingSupported = detailsResp.getDebuggingSupported(); - - const requiredTools = detailsResp.getToolsDependenciesList().map( - (t) => - <Tool>{ - name: t.getName(), - packager: t.getPackager(), - version: t.getVersion(), - } - ); + const requiredTools = detailsResp.getToolsDependenciesList().map((t) => ({ + name: t.getName(), + packager: t.getPackager(), + version: t.getVersion(), + })); const configOptions = detailsResp.getConfigOptionsList().map( (c) => @@ -143,6 +148,7 @@ export class BoardsServiceImpl platform: p.getPlatform(), } ); + const defaultProgrammerId = detailsResp.getDefaultProgrammerId(); let VID = 'N/A'; let PID = 'N/A'; @@ -154,18 +160,50 @@ export class BoardsServiceImpl VID = prop.get('vid') || ''; PID = prop.get('pid') || ''; } + const buildProperties = detailsResp.getBuildPropertiesList(); return { fqbn, requiredTools, configOptions, programmers, - debuggingSupported, VID, PID, + buildProperties, + ...(defaultProgrammerId ? { defaultProgrammerId } : {}), }; } + async checkDebugEnabled(params: CheckDebugEnabledParams): Promise<string> { + const { fqbn, programmer } = params; + const { client, instance } = await this.coreClient; + const req = new IsDebugSupportedRequest() + .setInstance(instance) + .setFqbn(fqbn) + .setProgrammer(programmer ?? ''); + try { + const debugFqbn = await new Promise<string>((resolve, reject) => + client.isDebugSupported(req, (err, resp) => { + if (err) { + reject(err); + return; + } + if (resp.getDebuggingSupported()) { + const debugFqbn = resp.getDebugFqbn(); + if (debugFqbn) { + resolve(debugFqbn); + } + } + reject(new Error(`Debugging is not supported.`)); + }) + ); + return debugFqbn; + } catch (err) { + console.error(`Failed to get debug config: ${fqbn}, ${programmer}`, err); + throw err; + } + } + async getBoardPackage(options: { id: string; }): Promise<BoardsPackage | undefined> { @@ -199,8 +237,48 @@ export class BoardsServiceImpl const req = new BoardSearchRequest(); req.setSearchArgs(query || ''); req.setInstance(instance); + return this.handleListBoards(client.boardSearch.bind(client), req); + } + + async getInstalledBoards(): Promise<BoardWithPackage[]> { + const { instance, client } = await this.coreClient; + const req = new BoardListAllRequest(); + req.setInstance(instance); + return this.handleListBoards(client.boardListAll.bind(client), req); + } + + async getInstalledPlatforms(): Promise<BoardsPackage[]> { + const { instance, client } = await this.coreClient; + const resp = await new Promise<PlatformSearchResponse>( + (resolve, reject) => { + client.platformSearch( + new PlatformSearchRequest() + .setInstance(instance) + .setManuallyInstalled(true), // include core manually installed to the sketchbook + (err, resp) => (err ? reject(err) : resolve(resp)) + ); + } + ); + const searchOutput = resp.getSearchOutputList(); + return searchOutput + .map((message) => message.toObject(false)) + .filter((summary) => summary.installedVersion) // only installed ones + .map(createBoardsPackage) + .filter(notEmpty); + } + + private async handleListBoards( + getBoards: ( + request: BoardListAllRequest | BoardSearchRequest, + callback: ( + error: ServiceError | null, + response: BoardListAllResponse + ) => void + ) => void, + request: BoardListAllRequest | BoardSearchRequest + ): Promise<BoardWithPackage[]> { const boards = await new Promise<BoardWithPackage[]>((resolve, reject) => { - client.boardSearch(req, (error, resp) => { + getBoards(request, (error, resp) => { if (error) { reject(error); return; @@ -209,12 +287,56 @@ export class BoardsServiceImpl for (const board of resp.getBoardsList()) { const platform = board.getPlatform(); if (platform) { + const metadata = platform.getMetadata(); + if (!metadata) { + console.warn( + `Platform metadata is missing for platform: ${JSON.stringify( + platform.toObject(false) + )}. Skipping` + ); + continue; + } + const platformId = metadata.getId(); + const release = platform.getRelease(); + if (!release) { + console.warn( + `Platform release is missing for platform: ${platformId}. Skipping` + ); + continue; + } + const fqbn = board.getFqbn() || undefined; // prefer undefined over empty string + const parsedPlatformId = createPlatformIdentifier(platformId); + if (!parsedPlatformId) { + console.warn( + `Could not create platform identifier from platform ID input: ${platformId}. Skipping` + ); + continue; + } + if (fqbn) { + const checkPlatformId = createPlatformIdentifier(board.getFqbn()); + if (!checkPlatformId) { + console.warn( + `Could not create platform identifier from FQBN input: ${board.getFqbn()}. Skipping` + ); + continue; + } + if ( + !platformIdentifierEquals(parsedPlatformId, checkPlatformId) + ) { + console.warn( + `Mismatching platform identifiers. Platform: ${JSON.stringify( + parsedPlatformId + )}, FQBN: ${JSON.stringify(checkPlatformId)}. Skipping` + ); + continue; + } + } boards.push({ name: board.getName(), fqbn: board.getFqbn(), - packageId: platform.getId(), - packageName: platform.getName(), - manuallyInstalled: platform.getManuallyInstalled(), + packageId: parsedPlatformId, + packageName: release.getName(), + manuallyInstalled: metadata.getManuallyInstalled(), }); } } @@ -269,121 +391,26 @@ export class BoardsServiceImpl const coreClient = await this.coreClient; const { client, instance } = coreClient; - const installedPlatformsReq = new PlatformListRequest(); - installedPlatformsReq.setInstance(instance); - const installedPlatformsResp = await new Promise<PlatformListResponse>( - (resolve, reject) => { - client.platformList(installedPlatformsReq, (err, resp) => { - !!err ? reject(err) : resolve(resp); - }); - } - ); - const installedPlatforms = - installedPlatformsResp.getInstalledPlatformsList(); - - const req = new PlatformSearchRequest(); - req.setSearchArgs(options.query || ''); - req.setAllVersions(true); - req.setInstance(instance); + // `core search` returns with all platform versions when the command is executed via gRPC or with `--format json` + // The `--all` flag is applicable only when filtering for the human-readable (`--format text`) output of the CLI const resp = await new Promise<PlatformSearchResponse>( (resolve, reject) => { - client.platformSearch(req, (err, resp) => { - !!err ? reject(err) : resolve(resp); - }); + client.platformSearch( + new PlatformSearchRequest() + .setInstance(instance) + .setSearchArgs(options.query ?? ''), + (err, resp) => (err ? reject(err) : resolve(resp)) + ); } ); - const packages = new Map<string, BoardsPackage>(); - const toPackage = (platform: Platform) => { - let installedVersion: string | undefined; - const matchingPlatform = installedPlatforms.find( - (ip) => ip.getId() === platform.getId() - ); - if (!!matchingPlatform) { - installedVersion = matchingPlatform.getInstalled(); - } - return { - id: platform.getId(), - name: platform.getName(), - author: platform.getMaintainer(), - availableVersions: [platform.getLatest()], - description: platform - .getBoardsList() - .map((b) => b.getName()) - .join(', '), - installable: true, - types: platform.getTypeList(), - deprecated: platform.getDeprecated(), - summary: nls.localize( - 'arduino/component/boardsIncluded', - 'Boards included in this package:' - ), - installedVersion, - boards: platform - .getBoardsList() - .map((b) => <Board>{ name: b.getName(), fqbn: b.getFqbn() }), - moreInfoLink: platform.getWebsite(), - }; - }; - - // We must group the cores by ID, and sort platforms by, first the installed version, then version alphabetical order. - // Otherwise we lose the FQBN information. - const groupedById: Map<string, Platform[]> = new Map(); - for (const platform of resp.getSearchOutputList()) { - const id = platform.getId(); - const idGroup = groupedById.get(id); - if (idGroup) { - idGroup.push(platform); - } else { - groupedById.set(id, [platform]); - } - } - const installedAwareVersionComparator = ( - left: Platform, - right: Platform - ) => { - // XXX: we cannot rely on `platform.getInstalled()`, it is always an empty string. - const leftInstalled = !!installedPlatforms.find( - (ip) => - ip.getId() === left.getId() && ip.getInstalled() === left.getLatest() - ); - const rightInstalled = !!installedPlatforms.find( - (ip) => - ip.getId() === right.getId() && - ip.getInstalled() === right.getLatest() - ); - if (leftInstalled && !rightInstalled) { - return -1; - } - if (!leftInstalled && rightInstalled) { - return 1; - } - - const invertedVersionComparator = - Installable.Version.COMPARATOR(left.getLatest(), right.getLatest()) * - -1; - // Higher version comes first. - - return invertedVersionComparator; - }; - for (const value of groupedById.values()) { - value.sort(installedAwareVersionComparator); - } - - for (const value of groupedById.values()) { - for (const platform of value) { - const id = platform.getId(); - const pkg = packages.get(id); - if (pkg) { - pkg.availableVersions.push(platform.getLatest()); - pkg.availableVersions.sort(Installable.Version.COMPARATOR).reverse(); - } else { - packages.set(id, toPackage(platform)); - } - } - } - - const filter = this.typePredicate(options); - return [...packages.values()].filter(filter); + const typeFilter = this.typePredicate(options); + const searchOutput = resp.getSearchOutputList(); + const boardsPackages = searchOutput + .map((message) => message.toObject(false)) + .map(createBoardsPackage) + .filter(notEmpty) + .filter(typeFilter); + return sortComponents(boardsPackages, boardsPackageSortGroup); } private typePredicate( @@ -412,6 +439,7 @@ export class BoardsServiceImpl progressId?: string; version?: Installable.Version; noOverwrite?: boolean; + skipPostInstall?: boolean; }): Promise<void> { const item = options.item; const version = !!options.version @@ -428,6 +456,9 @@ export class BoardsServiceImpl req.setPlatformPackage(platform); req.setVersion(version); req.setNoOverwrite(Boolean(options.noOverwrite)); + if (options.skipPostInstall) { + req.setSkipPostInstall(true); + } console.info('>>> Starting boards package installation...', item); @@ -449,7 +480,7 @@ export class BoardsServiceImpl }); resp.on('error', (error) => { this.responseService.appendToOutput({ - chunk: `Failed to install platform: ${item.id}.\n`, + chunk: `${platformInstallFailed(item.id, version)}\n`, }); this.responseService.appendToOutput({ chunk: `${error.toString()}\n`, @@ -533,3 +564,64 @@ function isMissingPlatformError(error: unknown): boolean { } return false; } + +function boardsPackageSortGroup(boardsPackage: BoardsPackage): SortGroup { + const types: string[] = []; + if (boardsPackage.types.includes('Arduino')) { + types.push('Arduino'); + } + if (boardsPackage.deprecated) { + types.push('Retired'); + } + return types.join('-') as SortGroup; +} + +function createBoardsPackage( + summary: PlatformSummary.AsObject +): BoardsPackage | undefined { + if (!isPlatformSummaryWithMetadata(summary)) { + return undefined; + } + const versionReleaseMap = new Map(summary.releasesMap); + const actualRelease = + versionReleaseMap.get(summary.installedVersion) ?? + versionReleaseMap.get(summary.latestVersion); + if (!actualRelease) { + return undefined; + } + const { name, typesList, boardsList, deprecated, compatible } = actualRelease; + if (!compatible) { + return undefined; // never show incompatible platforms + } + const { id, website, maintainer } = summary.metadata; + const availableVersions = Array.from(versionReleaseMap.keys()) + .sort(Installable.Version.COMPARATOR) + .reverse(); + const boardsPackage: Mutable<BoardsPackage> = { + id, + name, + summary: nls.localize( + 'arduino/component/boardsIncluded', + 'Boards included in this package:' + ), + description: boardsList.map(({ name }) => name).join(', '), + boards: boardsList, + types: typesList, + moreInfoLink: website, + author: maintainer, + deprecated, + availableVersions, + }; + if (summary.installedVersion) { + boardsPackage.installedVersion = summary.installedVersion; + } + return boardsPackage; +} + +type PlatformSummaryWithMetadata = PlatformSummary.AsObject & + Required<Pick<PlatformSummary.AsObject, 'metadata'>>; +function isPlatformSummaryWithMetadata( + summary: PlatformSummary.AsObject +): summary is PlatformSummaryWithMetadata { + return Boolean(summary.metadata); +} diff --git a/arduino-ide-extension/src/node/clang-formatter.ts b/arduino-ide-extension/src/node/clang-formatter.ts index a1ba2345e..c2b778e61 100644 --- a/arduino-ide-extension/src/node/clang-formatter.ts +++ b/arduino-ide-extension/src/node/clang-formatter.ts @@ -1,13 +1,14 @@ -import * as os from 'os'; import { EnvVariablesServer } from '@theia/core/lib/common/env-variables'; 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 { constants, promises as fs } from 'fs'; -import { join } from 'path'; +import { constants, promises as fs } from 'node:fs'; +import { join } from 'node:path'; import { ConfigService } from '../common/protocol'; import { Formatter, FormatterOptions } from '../common/protocol/formatter'; -import { getExecPath, spawnCommand } from './exec-util'; +import { spawnCommand } from './exec-util'; +import { clangFormatPath } from './resources'; +import defaultClangFormat from './default-formatter-config.json'; @injectable() export class ClangFormatter implements Formatter { @@ -15,7 +16,7 @@ export class ClangFormatter implements Formatter { private readonly configService: ConfigService; @inject(EnvVariablesServer) - private readonly envVariableServer: EnvVariablesServer; + private readonly envVariablesServer: EnvVariablesServer; async format({ content, @@ -26,26 +27,19 @@ export class ClangFormatter implements Formatter { formatterConfigFolderUris: string[]; options?: FormatterOptions; }): Promise<string> { - const [execPath, style] = await Promise.all([ - this.execPath(), - this.style(formatterConfigFolderUris, options), - ]); + const execPath = this.execPath(); + const args = await this.styleArgs(formatterConfigFolderUris, options); const formatted = await spawnCommand( - `"${execPath}"`, - [style], + execPath, + args, console.error, content ); return formatted; } - private _execPath: string | undefined; - private async execPath(): Promise<string> { - if (this._execPath) { - return this._execPath; - } - this._execPath = await getExecPath('clang-format'); - return this._execPath; + private execPath(): string { + return clangFormatPath; } /** @@ -60,10 +54,10 @@ export class ClangFormatter implements Formatter { * * See: https://github.com/arduino/arduino-ide/issues/566 */ - private async style( + private async styleArgs( formatterConfigFolderUris: string[], options?: FormatterOptions - ): Promise<string> { + ): Promise<string[]> { const clangFormatPaths = await Promise.all([ ...formatterConfigFolderUris.map((uri) => this.clangConfigPath(uri)), this.clangConfigPath(this.configDirPath()), @@ -72,28 +66,35 @@ export class ClangFormatter implements Formatter { const first = clangFormatPaths.filter(Boolean).shift(); if (first) { console.debug( - `Using ${ClangFormatFile} style configuration from '${first}'.` + `Using ${clangFormatFilename} style configuration from '${first}'.` ); - return `-style=file:"${first}"`; + return ['-style', `file:${first}`]; } - return `-style="${style(toClangOptions(options))}"`; + return ['-style', style(toClangOptions(options))]; } - private async dataDirPath(): Promise<string> { - const { dataDirUri } = await this.configService.getConfiguration(); - return FileUri.fsPath(dataDirUri); + private async dataDirPath(): Promise<string | undefined> { + const { config } = await this.configService.getConfiguration(); + if (!config?.dataDirUri) { + return undefined; + } + return FileUri.fsPath(config.dataDirUri); } private async configDirPath(): Promise<string> { - const configDirUri = await this.envVariableServer.getConfigDirUri(); + const configDirUri = await this.envVariablesServer.getConfigDirUri(); return FileUri.fsPath(configDirUri); } private async clangConfigPath( - folderUri: MaybePromise<string> + folderUri: MaybePromise<string | undefined> ): Promise<string | undefined> { - const folderPath = FileUri.fsPath(await folderUri); - const clangFormatPath = join(folderPath, ClangFormatFile); + const uri = await folderUri; + if (!uri) { + return undefined; + } + const folderPath = FileUri.fsPath(uri); + const clangFormatPath = join(folderPath, clangFormatFilename); try { await fs.access(clangFormatPath, constants.R_OK); return clangFormatPath; @@ -108,7 +109,7 @@ interface ClangFormatOptions { readonly TabWidth: number; } -const ClangFormatFile = '.clang-format'; +export const clangFormatFilename = '.clang-format'; function toClangOptions( options?: FormatterOptions | undefined @@ -122,34 +123,17 @@ function toClangOptions( return { UseTab: 'Never', TabWidth: 2 }; } -export function style({ TabWidth, UseTab }: ClangFormatOptions): string { - let styleArgument = JSON.stringify(styleJson({ TabWidth, UseTab })).replace( - /[\\"]/g, - '\\$&' - ); - if (os.platform() === 'win32') { - // Windows command interpreter does not use backslash escapes. This causes the argument to have alternate quoted and - // unquoted sections. - // Special characters in the unquoted sections must be caret escaped. - const styleArgumentSplit = styleArgument.split('"'); - for (let i = 1; i < styleArgumentSplit.length; i += 2) { - styleArgumentSplit[i] = styleArgumentSplit[i].replace(/[<>^|]/g, '^$&'); - } - - styleArgument = styleArgumentSplit.join('"'); - } - - return styleArgument; +function style({ TabWidth, UseTab }: ClangFormatOptions): string { + return JSON.stringify(styleJson({ TabWidth, UseTab })); } function styleJson({ TabWidth, UseTab, }: ClangFormatOptions): Record<string, unknown> { - // Source: https://github.com/arduino/tooling-project-assets/tree/main/other/clang-format-configuration - const defaultConfig = require('../../src/node/default-formatter-config.json'); return { - ...defaultConfig, + // Source: https://github.com/arduino/tooling-project-assets/tree/main/other/clang-format-configuration + ...defaultClangFormat, TabWidth, UseTab, }; diff --git a/arduino-ide-extension/src/node/cli-error-parser.ts b/arduino-ide-extension/src/node/cli-error-parser.ts index d60ecb88e..9fbdaa8cd 100644 --- a/arduino-ide-extension/src/node/cli-error-parser.ts +++ b/arduino-ide-extension/src/node/cli-error-parser.ts @@ -1,6 +1,6 @@ import { notEmpty } from '@theia/core/lib/common/objects'; 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 { Range, Position, diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/board_pb.d.ts b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/board_pb.d.ts index 8b39c5085..01ff287d4 100644 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/board_pb.d.ts +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/board_pb.d.ts @@ -14,10 +14,10 @@ export class BoardDetailsRequest extends jspb.Message { clearInstance(): void; getInstance(): cc_arduino_cli_commands_v1_common_pb.Instance | undefined; setInstance(value?: cc_arduino_cli_commands_v1_common_pb.Instance): BoardDetailsRequest; - getFqbn(): string; setFqbn(value: string): BoardDetailsRequest; - + getDoNotExpandBuildProperties(): boolean; + setDoNotExpandBuildProperties(value: boolean): BoardDetailsRequest; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): BoardDetailsRequest.AsObject; @@ -33,66 +33,57 @@ export namespace BoardDetailsRequest { export type AsObject = { instance?: cc_arduino_cli_commands_v1_common_pb.Instance.AsObject, fqbn: string, + doNotExpandBuildProperties: boolean, } } export class BoardDetailsResponse extends jspb.Message { getFqbn(): string; setFqbn(value: string): BoardDetailsResponse; - getName(): string; setName(value: string): BoardDetailsResponse; - getVersion(): string; setVersion(value: string): BoardDetailsResponse; - getPropertiesId(): string; setPropertiesId(value: string): BoardDetailsResponse; - getAlias(): string; setAlias(value: string): BoardDetailsResponse; - getOfficial(): boolean; setOfficial(value: boolean): BoardDetailsResponse; - getPinout(): string; setPinout(value: string): BoardDetailsResponse; - hasPackage(): boolean; clearPackage(): void; getPackage(): Package | undefined; setPackage(value?: Package): BoardDetailsResponse; - hasPlatform(): boolean; clearPlatform(): void; getPlatform(): BoardPlatform | undefined; setPlatform(value?: BoardPlatform): BoardDetailsResponse; - clearToolsDependenciesList(): void; getToolsDependenciesList(): Array<ToolsDependencies>; setToolsDependenciesList(value: Array<ToolsDependencies>): BoardDetailsResponse; addToolsDependencies(value?: ToolsDependencies, index?: number): ToolsDependencies; - clearConfigOptionsList(): void; getConfigOptionsList(): Array<ConfigOption>; setConfigOptionsList(value: Array<ConfigOption>): BoardDetailsResponse; addConfigOptions(value?: ConfigOption, index?: number): ConfigOption; - clearProgrammersList(): void; getProgrammersList(): Array<cc_arduino_cli_commands_v1_common_pb.Programmer>; setProgrammersList(value: Array<cc_arduino_cli_commands_v1_common_pb.Programmer>): BoardDetailsResponse; addProgrammers(value?: cc_arduino_cli_commands_v1_common_pb.Programmer, index?: number): cc_arduino_cli_commands_v1_common_pb.Programmer; - - getDebuggingSupported(): boolean; - setDebuggingSupported(value: boolean): BoardDetailsResponse; - clearIdentificationPropertiesList(): void; getIdentificationPropertiesList(): Array<BoardIdentificationProperties>; setIdentificationPropertiesList(value: Array<BoardIdentificationProperties>): BoardDetailsResponse; addIdentificationProperties(value?: BoardIdentificationProperties, index?: number): BoardIdentificationProperties; - + clearBuildPropertiesList(): void; + getBuildPropertiesList(): Array<string>; + setBuildPropertiesList(value: Array<string>): BoardDetailsResponse; + addBuildProperties(value: string, index?: number): string; + getDefaultProgrammerId(): string; + setDefaultProgrammerId(value: string): BoardDetailsResponse; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): BoardDetailsResponse.AsObject; @@ -118,8 +109,9 @@ export namespace BoardDetailsResponse { toolsDependenciesList: Array<ToolsDependencies.AsObject>, configOptionsList: Array<ConfigOption.AsObject>, programmersList: Array<cc_arduino_cli_commands_v1_common_pb.Programmer.AsObject>, - debuggingSupported: boolean, identificationPropertiesList: Array<BoardIdentificationProperties.AsObject>, + buildPropertiesList: Array<string>, + defaultProgrammerId: string, } } @@ -128,7 +120,6 @@ export class BoardIdentificationProperties extends jspb.Message { getPropertiesMap(): jspb.Map<string, string>; clearPropertiesMap(): void; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): BoardIdentificationProperties.AsObject; static toObject(includeInstance: boolean, msg: BoardIdentificationProperties): BoardIdentificationProperties.AsObject; @@ -149,26 +140,20 @@ export namespace BoardIdentificationProperties { export class Package extends jspb.Message { getMaintainer(): string; setMaintainer(value: string): Package; - getUrl(): string; setUrl(value: string): Package; - getWebsiteUrl(): string; setWebsiteUrl(value: string): Package; - getEmail(): string; setEmail(value: string): Package; - getName(): string; setName(value: string): Package; - hasHelp(): boolean; clearHelp(): void; getHelp(): Help | undefined; setHelp(value?: Help): Package; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): Package.AsObject; static toObject(includeInstance: boolean, msg: Package): Package.AsObject; @@ -194,7 +179,6 @@ export class Help extends jspb.Message { getOnline(): string; setOnline(value: string): Help; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): Help.AsObject; static toObject(includeInstance: boolean, msg: Help): Help.AsObject; @@ -214,26 +198,19 @@ export namespace Help { export class BoardPlatform extends jspb.Message { getArchitecture(): string; setArchitecture(value: string): BoardPlatform; - getCategory(): string; setCategory(value: string): BoardPlatform; - getUrl(): string; setUrl(value: string): BoardPlatform; - getArchiveFilename(): string; setArchiveFilename(value: string): BoardPlatform; - getChecksum(): string; setChecksum(value: string): BoardPlatform; - getSize(): number; setSize(value: number): BoardPlatform; - getName(): string; setName(value: string): BoardPlatform; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): BoardPlatform.AsObject; static toObject(includeInstance: boolean, msg: BoardPlatform): BoardPlatform.AsObject; @@ -259,19 +236,15 @@ export namespace BoardPlatform { export class ToolsDependencies extends jspb.Message { getPackager(): string; setPackager(value: string): ToolsDependencies; - getName(): string; setName(value: string): ToolsDependencies; - getVersion(): string; setVersion(value: string): ToolsDependencies; - clearSystemsList(): void; getSystemsList(): Array<Systems>; setSystemsList(value: Array<Systems>): ToolsDependencies; addSystems(value?: Systems, index?: number): Systems; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): ToolsDependencies.AsObject; static toObject(includeInstance: boolean, msg: ToolsDependencies): ToolsDependencies.AsObject; @@ -294,20 +267,15 @@ export namespace ToolsDependencies { export class Systems extends jspb.Message { getChecksum(): string; setChecksum(value: string): Systems; - getHost(): string; setHost(value: string): Systems; - getArchiveFilename(): string; setArchiveFilename(value: string): Systems; - getUrl(): string; setUrl(value: string): Systems; - getSize(): number; setSize(value: number): Systems; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): Systems.AsObject; static toObject(includeInstance: boolean, msg: Systems): Systems.AsObject; @@ -331,16 +299,13 @@ export namespace Systems { export class ConfigOption extends jspb.Message { getOption(): string; setOption(value: string): ConfigOption; - getOptionLabel(): string; setOptionLabel(value: string): ConfigOption; - clearValuesList(): void; getValuesList(): Array<ConfigValue>; setValuesList(value: Array<ConfigValue>): ConfigOption; addValues(value?: ConfigValue, index?: number): ConfigValue; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): ConfigOption.AsObject; static toObject(includeInstance: boolean, msg: ConfigOption): ConfigOption.AsObject; @@ -362,14 +327,11 @@ export namespace ConfigOption { export class ConfigValue extends jspb.Message { getValue(): string; setValue(value: string): ConfigValue; - getValueLabel(): string; setValueLabel(value: string): ConfigValue; - getSelected(): boolean; setSelected(value: boolean): ConfigValue; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): ConfigValue.AsObject; static toObject(includeInstance: boolean, msg: ConfigValue): ConfigValue.AsObject; @@ -388,76 +350,18 @@ export namespace ConfigValue { } } -export class BoardAttachRequest 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): BoardAttachRequest; - - getBoardUri(): string; - setBoardUri(value: string): BoardAttachRequest; - - getSketchPath(): string; - setSketchPath(value: string): BoardAttachRequest; - - getSearchTimeout(): string; - setSearchTimeout(value: string): BoardAttachRequest; - - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): BoardAttachRequest.AsObject; - static toObject(includeInstance: boolean, msg: BoardAttachRequest): BoardAttachRequest.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: BoardAttachRequest, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): BoardAttachRequest; - static deserializeBinaryFromReader(message: BoardAttachRequest, reader: jspb.BinaryReader): BoardAttachRequest; -} - -export namespace BoardAttachRequest { - export type AsObject = { - instance?: cc_arduino_cli_commands_v1_common_pb.Instance.AsObject, - boardUri: string, - sketchPath: string, - searchTimeout: string, - } -} - -export class BoardAttachResponse extends jspb.Message { - - hasTaskProgress(): boolean; - clearTaskProgress(): void; - getTaskProgress(): cc_arduino_cli_commands_v1_common_pb.TaskProgress | undefined; - setTaskProgress(value?: cc_arduino_cli_commands_v1_common_pb.TaskProgress): BoardAttachResponse; - - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): BoardAttachResponse.AsObject; - static toObject(includeInstance: boolean, msg: BoardAttachResponse): BoardAttachResponse.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: BoardAttachResponse, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): BoardAttachResponse; - static deserializeBinaryFromReader(message: BoardAttachResponse, reader: jspb.BinaryReader): BoardAttachResponse; -} - -export namespace BoardAttachResponse { - export type AsObject = { - taskProgress?: cc_arduino_cli_commands_v1_common_pb.TaskProgress.AsObject, - } -} - export class BoardListRequest 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): BoardListRequest; - getTimeout(): number; setTimeout(value: number): BoardListRequest; - + getFqbn(): string; + setFqbn(value: string): BoardListRequest; + getSkipCloudApiForBoardDetection(): boolean; + setSkipCloudApiForBoardDetection(value: boolean): BoardListRequest; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): BoardListRequest.AsObject; @@ -473,6 +377,8 @@ export namespace BoardListRequest { export type AsObject = { instance?: cc_arduino_cli_commands_v1_common_pb.Instance.AsObject, timeout: number, + fqbn: string, + skipCloudApiForBoardDetection: boolean, } } @@ -481,7 +387,10 @@ export class BoardListResponse extends jspb.Message { getPortsList(): Array<DetectedPort>; setPortsList(value: Array<DetectedPort>): BoardListResponse; addPorts(value?: DetectedPort, index?: number): DetectedPort; - + clearWarningsList(): void; + getWarningsList(): Array<string>; + setWarningsList(value: Array<string>): BoardListResponse; + addWarnings(value: string, index?: number): string; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): BoardListResponse.AsObject; @@ -496,6 +405,7 @@ export class BoardListResponse extends jspb.Message { export namespace BoardListResponse { export type AsObject = { portsList: Array<DetectedPort.AsObject>, + warningsList: Array<string>, } } @@ -505,13 +415,11 @@ export class DetectedPort extends jspb.Message { setMatchingBoardsList(value: Array<BoardListItem>): DetectedPort; addMatchingBoards(value?: BoardListItem, index?: number): BoardListItem; - hasPort(): boolean; clearPort(): void; getPort(): cc_arduino_cli_commands_v1_port_pb.Port | undefined; setPort(value?: cc_arduino_cli_commands_v1_port_pb.Port): DetectedPort; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): DetectedPort.AsObject; static toObject(includeInstance: boolean, msg: DetectedPort): DetectedPort.AsObject; @@ -535,16 +443,13 @@ export class BoardListAllRequest extends jspb.Message { clearInstance(): void; getInstance(): cc_arduino_cli_commands_v1_common_pb.Instance | undefined; setInstance(value?: cc_arduino_cli_commands_v1_common_pb.Instance): BoardListAllRequest; - clearSearchArgsList(): void; getSearchArgsList(): Array<string>; setSearchArgsList(value: Array<string>): BoardListAllRequest; addSearchArgs(value: string, index?: number): string; - getIncludeHiddenBoards(): boolean; setIncludeHiddenBoards(value: boolean): BoardListAllRequest; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): BoardListAllRequest.AsObject; static toObject(includeInstance: boolean, msg: BoardListAllRequest): BoardListAllRequest.AsObject; @@ -569,7 +474,6 @@ export class BoardListAllResponse extends jspb.Message { setBoardsList(value: Array<BoardListItem>): BoardListAllResponse; addBoards(value?: BoardListItem, index?: number): BoardListItem; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): BoardListAllResponse.AsObject; static toObject(includeInstance: boolean, msg: BoardListAllResponse): BoardListAllResponse.AsObject; @@ -592,10 +496,8 @@ export class BoardListWatchRequest extends jspb.Message { clearInstance(): void; getInstance(): cc_arduino_cli_commands_v1_common_pb.Instance | undefined; setInstance(value?: cc_arduino_cli_commands_v1_common_pb.Instance): BoardListWatchRequest; - - getInterrupt(): boolean; - setInterrupt(value: boolean): BoardListWatchRequest; - + getSkipCloudApiForBoardDetection(): boolean; + setSkipCloudApiForBoardDetection(value: boolean): BoardListWatchRequest; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): BoardListWatchRequest.AsObject; @@ -610,7 +512,7 @@ export class BoardListWatchRequest extends jspb.Message { export namespace BoardListWatchRequest { export type AsObject = { instance?: cc_arduino_cli_commands_v1_common_pb.Instance.AsObject, - interrupt: boolean, + skipCloudApiForBoardDetection: boolean, } } @@ -618,16 +520,13 @@ export class BoardListWatchResponse extends jspb.Message { getEventType(): string; setEventType(value: string): BoardListWatchResponse; - hasPort(): boolean; clearPort(): void; getPort(): DetectedPort | undefined; setPort(value?: DetectedPort): BoardListWatchResponse; - getError(): string; setError(value: string): BoardListWatchResponse; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): BoardListWatchResponse.AsObject; static toObject(includeInstance: boolean, msg: BoardListWatchResponse): BoardListWatchResponse.AsObject; @@ -649,20 +548,16 @@ export namespace BoardListWatchResponse { export class BoardListItem extends jspb.Message { getName(): string; setName(value: string): BoardListItem; - getFqbn(): string; setFqbn(value: string): BoardListItem; - getIsHidden(): boolean; setIsHidden(value: boolean): BoardListItem; - hasPlatform(): boolean; clearPlatform(): void; getPlatform(): cc_arduino_cli_commands_v1_common_pb.Platform | undefined; setPlatform(value?: cc_arduino_cli_commands_v1_common_pb.Platform): BoardListItem; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): BoardListItem.AsObject; static toObject(includeInstance: boolean, msg: BoardListItem): BoardListItem.AsObject; @@ -688,14 +583,11 @@ export class BoardSearchRequest extends jspb.Message { clearInstance(): void; getInstance(): cc_arduino_cli_commands_v1_common_pb.Instance | undefined; setInstance(value?: cc_arduino_cli_commands_v1_common_pb.Instance): BoardSearchRequest; - getSearchArgs(): string; setSearchArgs(value: string): BoardSearchRequest; - getIncludeHiddenBoards(): boolean; setIncludeHiddenBoards(value: boolean): BoardSearchRequest; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): BoardSearchRequest.AsObject; static toObject(includeInstance: boolean, msg: BoardSearchRequest): BoardSearchRequest.AsObject; @@ -720,7 +612,6 @@ export class BoardSearchResponse extends jspb.Message { setBoardsList(value: Array<BoardListItem>): BoardSearchResponse; addBoards(value?: BoardListItem, index?: number): BoardListItem; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): BoardSearchResponse.AsObject; static toObject(includeInstance: boolean, msg: BoardSearchResponse): BoardSearchResponse.AsObject; @@ -736,3 +627,56 @@ export namespace BoardSearchResponse { 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>, + } +} diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/board_pb.js b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/board_pb.js index 3753037cb..81abe9a99 100644 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/board_pb.js +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/board_pb.js @@ -13,17 +13,23 @@ var jspb = require('google-protobuf'); var goog = jspb; -var global = Function('return this')(); +var global = (function() { + if (this) { return this; } + if (typeof window !== 'undefined') { return window; } + if (typeof global !== 'undefined') { return global; } + if (typeof self !== 'undefined') { return self; } + return Function('return this')(); +}.call(null)); var cc_arduino_cli_commands_v1_common_pb = require('../../../../../cc/arduino/cli/commands/v1/common_pb.js'); goog.object.extend(proto, cc_arduino_cli_commands_v1_common_pb); var cc_arduino_cli_commands_v1_port_pb = require('../../../../../cc/arduino/cli/commands/v1/port_pb.js'); goog.object.extend(proto, cc_arduino_cli_commands_v1_port_pb); -goog.exportSymbol('proto.cc.arduino.cli.commands.v1.BoardAttachRequest', null, global); -goog.exportSymbol('proto.cc.arduino.cli.commands.v1.BoardAttachResponse', 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.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.BoardListAllResponse', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.BoardListItem', null, global); @@ -251,48 +257,6 @@ if (goog.DEBUG && !COMPILED) { */ proto.cc.arduino.cli.commands.v1.ConfigValue.displayName = 'proto.cc.arduino.cli.commands.v1.ConfigValue'; } -/** - * 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.BoardAttachRequest = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.cc.arduino.cli.commands.v1.BoardAttachRequest, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.cc.arduino.cli.commands.v1.BoardAttachRequest.displayName = 'proto.cc.arduino.cli.commands.v1.BoardAttachRequest'; -} -/** - * 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.BoardAttachResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.cc.arduino.cli.commands.v1.BoardAttachResponse, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.cc.arduino.cli.commands.v1.BoardAttachResponse.displayName = 'proto.cc.arduino.cli.commands.v1.BoardAttachResponse'; -} /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -503,6 +467,48 @@ if (goog.DEBUG && !COMPILED) { */ 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'; +} @@ -536,7 +542,8 @@ proto.cc.arduino.cli.commands.v1.BoardDetailsRequest.prototype.toObject = functi proto.cc.arduino.cli.commands.v1.BoardDetailsRequest.toObject = function(includeInstance, msg) { var f, obj = { instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f), - fqbn: jspb.Message.getFieldWithDefault(msg, 2, "") + fqbn: jspb.Message.getFieldWithDefault(msg, 2, ""), + doNotExpandBuildProperties: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) }; if (includeInstance) { @@ -582,6 +589,10 @@ proto.cc.arduino.cli.commands.v1.BoardDetailsRequest.deserializeBinaryFromReader var value = /** @type {string} */ (reader.readString()); msg.setFqbn(value); break; + case 3: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setDoNotExpandBuildProperties(value); + break; default: reader.skipField(); break; @@ -626,6 +637,13 @@ proto.cc.arduino.cli.commands.v1.BoardDetailsRequest.serializeBinaryToWriter = f f ); } + f = message.getDoNotExpandBuildProperties(); + if (f) { + writer.writeBool( + 3, + f + ); + } }; @@ -684,13 +702,31 @@ proto.cc.arduino.cli.commands.v1.BoardDetailsRequest.prototype.setFqbn = functio }; +/** + * optional bool do_not_expand_build_properties = 3; + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.BoardDetailsRequest.prototype.getDoNotExpandBuildProperties = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.BoardDetailsRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.BoardDetailsRequest.prototype.setDoNotExpandBuildProperties = 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.BoardDetailsResponse.repeatedFields_ = [10,11,13,15]; +proto.cc.arduino.cli.commands.v1.BoardDetailsResponse.repeatedFields_ = [10,11,13,15,16]; @@ -738,9 +774,10 @@ proto.cc.arduino.cli.commands.v1.BoardDetailsResponse.toObject = function(includ proto.cc.arduino.cli.commands.v1.ConfigOption.toObject, includeInstance), programmersList: jspb.Message.toObjectList(msg.getProgrammersList(), cc_arduino_cli_commands_v1_common_pb.Programmer.toObject, includeInstance), - debuggingSupported: jspb.Message.getBooleanFieldWithDefault(msg, 14, false), identificationPropertiesList: jspb.Message.toObjectList(msg.getIdentificationPropertiesList(), - proto.cc.arduino.cli.commands.v1.BoardIdentificationProperties.toObject, includeInstance) + proto.cc.arduino.cli.commands.v1.BoardIdentificationProperties.toObject, includeInstance), + buildPropertiesList: (f = jspb.Message.getRepeatedField(msg, 16)) == null ? undefined : f, + defaultProgrammerId: jspb.Message.getFieldWithDefault(msg, 17, "") }; if (includeInstance) { @@ -830,15 +867,19 @@ proto.cc.arduino.cli.commands.v1.BoardDetailsResponse.deserializeBinaryFromReade reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.Programmer.deserializeBinaryFromReader); msg.addProgrammers(value); break; - case 14: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setDebuggingSupported(value); - break; case 15: var value = new proto.cc.arduino.cli.commands.v1.BoardIdentificationProperties; reader.readMessage(value,proto.cc.arduino.cli.commands.v1.BoardIdentificationProperties.deserializeBinaryFromReader); msg.addIdentificationProperties(value); break; + case 16: + var value = /** @type {string} */ (reader.readString()); + msg.addBuildProperties(value); + break; + case 17: + var value = /** @type {string} */ (reader.readString()); + msg.setDefaultProgrammerId(value); + break; default: reader.skipField(); break; @@ -957,13 +998,6 @@ proto.cc.arduino.cli.commands.v1.BoardDetailsResponse.serializeBinaryToWriter = cc_arduino_cli_commands_v1_common_pb.Programmer.serializeBinaryToWriter ); } - f = message.getDebuggingSupported(); - if (f) { - writer.writeBool( - 14, - f - ); - } f = message.getIdentificationPropertiesList(); if (f.length > 0) { writer.writeRepeatedMessage( @@ -972,6 +1006,20 @@ proto.cc.arduino.cli.commands.v1.BoardDetailsResponse.serializeBinaryToWriter = proto.cc.arduino.cli.commands.v1.BoardIdentificationProperties.serializeBinaryToWriter ); } + f = message.getBuildPropertiesList(); + if (f.length > 0) { + writer.writeRepeatedString( + 16, + f + ); + } + f = message.getDefaultProgrammerId(); + if (f.length > 0) { + writer.writeString( + 17, + f + ); + } }; @@ -1289,24 +1337,6 @@ proto.cc.arduino.cli.commands.v1.BoardDetailsResponse.prototype.clearProgrammers }; -/** - * optional bool debugging_supported = 14; - * @return {boolean} - */ -proto.cc.arduino.cli.commands.v1.BoardDetailsResponse.prototype.getDebuggingSupported = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 14, false)); -}; - - -/** - * @param {boolean} value - * @return {!proto.cc.arduino.cli.commands.v1.BoardDetailsResponse} returns this - */ -proto.cc.arduino.cli.commands.v1.BoardDetailsResponse.prototype.setDebuggingSupported = function(value) { - return jspb.Message.setProto3BooleanField(this, 14, value); -}; - - /** * repeated BoardIdentificationProperties identification_properties = 15; * @return {!Array<!proto.cc.arduino.cli.commands.v1.BoardIdentificationProperties>} @@ -1345,6 +1375,61 @@ proto.cc.arduino.cli.commands.v1.BoardDetailsResponse.prototype.clearIdentificat }; +/** + * repeated string build_properties = 16; + * @return {!Array<string>} + */ +proto.cc.arduino.cli.commands.v1.BoardDetailsResponse.prototype.getBuildPropertiesList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 16)); +}; + + +/** + * @param {!Array<string>} value + * @return {!proto.cc.arduino.cli.commands.v1.BoardDetailsResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.BoardDetailsResponse.prototype.setBuildPropertiesList = function(value) { + return jspb.Message.setField(this, 16, value || []); +}; + + +/** + * @param {string} value + * @param {number=} opt_index + * @return {!proto.cc.arduino.cli.commands.v1.BoardDetailsResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.BoardDetailsResponse.prototype.addBuildProperties = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 16, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.cc.arduino.cli.commands.v1.BoardDetailsResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.BoardDetailsResponse.prototype.clearBuildPropertiesList = function() { + return this.setBuildPropertiesList([]); +}; + + +/** + * optional string default_programmer_id = 17; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.BoardDetailsResponse.prototype.getDefaultProgrammerId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 17, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.BoardDetailsResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.BoardDetailsResponse.prototype.setDefaultProgrammerId = function(value) { + return jspb.Message.setProto3StringField(this, 17, value); +}; + + @@ -3145,8 +3230,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.BoardAttachRequest.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.BoardAttachRequest.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.BoardListRequest.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.BoardListRequest.toObject(opt_includeInstance, this); }; @@ -3155,16 +3240,16 @@ proto.cc.arduino.cli.commands.v1.BoardAttachRequest.prototype.toObject = functio * @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.BoardAttachRequest} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.BoardListRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.BoardAttachRequest.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.BoardListRequest.toObject = function(includeInstance, msg) { var f, obj = { instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f), - boardUri: jspb.Message.getFieldWithDefault(msg, 2, ""), - sketchPath: jspb.Message.getFieldWithDefault(msg, 3, ""), - searchTimeout: jspb.Message.getFieldWithDefault(msg, 4, "") + timeout: jspb.Message.getFieldWithDefault(msg, 2, 0), + fqbn: jspb.Message.getFieldWithDefault(msg, 3, ""), + skipCloudApiForBoardDetection: jspb.Message.getBooleanFieldWithDefault(msg, 4, false) }; if (includeInstance) { @@ -3178,23 +3263,23 @@ proto.cc.arduino.cli.commands.v1.BoardAttachRequest.toObject = function(includeI /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.BoardAttachRequest} + * @return {!proto.cc.arduino.cli.commands.v1.BoardListRequest} */ -proto.cc.arduino.cli.commands.v1.BoardAttachRequest.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.BoardListRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.BoardAttachRequest; - return proto.cc.arduino.cli.commands.v1.BoardAttachRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.BoardListRequest; + return proto.cc.arduino.cli.commands.v1.BoardListRequest.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.BoardAttachRequest} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.BoardListRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.BoardAttachRequest} + * @return {!proto.cc.arduino.cli.commands.v1.BoardListRequest} */ -proto.cc.arduino.cli.commands.v1.BoardAttachRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.BoardListRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -3207,16 +3292,16 @@ proto.cc.arduino.cli.commands.v1.BoardAttachRequest.deserializeBinaryFromReader msg.setInstance(value); break; case 2: - var value = /** @type {string} */ (reader.readString()); - msg.setBoardUri(value); + var value = /** @type {number} */ (reader.readInt64()); + msg.setTimeout(value); break; case 3: var value = /** @type {string} */ (reader.readString()); - msg.setSketchPath(value); + msg.setFqbn(value); break; case 4: - var value = /** @type {string} */ (reader.readString()); - msg.setSearchTimeout(value); + var value = /** @type {boolean} */ (reader.readBool()); + msg.setSkipCloudApiForBoardDetection(value); break; default: reader.skipField(); @@ -3231,9 +3316,9 @@ proto.cc.arduino.cli.commands.v1.BoardAttachRequest.deserializeBinaryFromReader * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.BoardAttachRequest.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.BoardListRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.BoardAttachRequest.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.BoardListRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -3241,11 +3326,11 @@ proto.cc.arduino.cli.commands.v1.BoardAttachRequest.prototype.serializeBinary = /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.BoardAttachRequest} message + * @param {!proto.cc.arduino.cli.commands.v1.BoardListRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.BoardAttachRequest.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.BoardListRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getInstance(); if (f != null) { @@ -3255,23 +3340,23 @@ proto.cc.arduino.cli.commands.v1.BoardAttachRequest.serializeBinaryToWriter = fu cc_arduino_cli_commands_v1_common_pb.Instance.serializeBinaryToWriter ); } - f = message.getBoardUri(); - if (f.length > 0) { - writer.writeString( + f = message.getTimeout(); + if (f !== 0) { + writer.writeInt64( 2, f ); } - f = message.getSketchPath(); + f = message.getFqbn(); if (f.length > 0) { writer.writeString( 3, f ); } - f = message.getSearchTimeout(); - if (f.length > 0) { - writer.writeString( + f = message.getSkipCloudApiForBoardDetection(); + if (f) { + writer.writeBool( 4, f ); @@ -3283,7 +3368,7 @@ proto.cc.arduino.cli.commands.v1.BoardAttachRequest.serializeBinaryToWriter = fu * optional Instance instance = 1; * @return {?proto.cc.arduino.cli.commands.v1.Instance} */ -proto.cc.arduino.cli.commands.v1.BoardAttachRequest.prototype.getInstance = function() { +proto.cc.arduino.cli.commands.v1.BoardListRequest.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)); }; @@ -3291,18 +3376,18 @@ proto.cc.arduino.cli.commands.v1.BoardAttachRequest.prototype.getInstance = func /** * @param {?proto.cc.arduino.cli.commands.v1.Instance|undefined} value - * @return {!proto.cc.arduino.cli.commands.v1.BoardAttachRequest} returns this + * @return {!proto.cc.arduino.cli.commands.v1.BoardListRequest} returns this */ -proto.cc.arduino.cli.commands.v1.BoardAttachRequest.prototype.setInstance = function(value) { +proto.cc.arduino.cli.commands.v1.BoardListRequest.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.BoardAttachRequest} returns this + * @return {!proto.cc.arduino.cli.commands.v1.BoardListRequest} returns this */ -proto.cc.arduino.cli.commands.v1.BoardAttachRequest.prototype.clearInstance = function() { +proto.cc.arduino.cli.commands.v1.BoardListRequest.prototype.clearInstance = function() { return this.setInstance(undefined); }; @@ -3311,66 +3396,73 @@ proto.cc.arduino.cli.commands.v1.BoardAttachRequest.prototype.clearInstance = fu * Returns whether this field is set. * @return {boolean} */ -proto.cc.arduino.cli.commands.v1.BoardAttachRequest.prototype.hasInstance = function() { +proto.cc.arduino.cli.commands.v1.BoardListRequest.prototype.hasInstance = function() { return jspb.Message.getField(this, 1) != null; }; /** - * optional string board_uri = 2; - * @return {string} + * optional int64 timeout = 2; + * @return {number} */ -proto.cc.arduino.cli.commands.v1.BoardAttachRequest.prototype.getBoardUri = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +proto.cc.arduino.cli.commands.v1.BoardListRequest.prototype.getTimeout = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); }; /** - * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.BoardAttachRequest} returns this + * @param {number} value + * @return {!proto.cc.arduino.cli.commands.v1.BoardListRequest} returns this */ -proto.cc.arduino.cli.commands.v1.BoardAttachRequest.prototype.setBoardUri = function(value) { - return jspb.Message.setProto3StringField(this, 2, value); +proto.cc.arduino.cli.commands.v1.BoardListRequest.prototype.setTimeout = function(value) { + return jspb.Message.setProto3IntField(this, 2, value); }; /** - * optional string sketch_path = 3; + * optional string fqbn = 3; * @return {string} */ -proto.cc.arduino.cli.commands.v1.BoardAttachRequest.prototype.getSketchPath = function() { +proto.cc.arduino.cli.commands.v1.BoardListRequest.prototype.getFqbn = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); }; /** * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.BoardAttachRequest} returns this + * @return {!proto.cc.arduino.cli.commands.v1.BoardListRequest} returns this */ -proto.cc.arduino.cli.commands.v1.BoardAttachRequest.prototype.setSketchPath = function(value) { +proto.cc.arduino.cli.commands.v1.BoardListRequest.prototype.setFqbn = function(value) { return jspb.Message.setProto3StringField(this, 3, value); }; /** - * optional string search_timeout = 4; - * @return {string} + * optional bool skip_cloud_api_for_board_detection = 4; + * @return {boolean} */ -proto.cc.arduino.cli.commands.v1.BoardAttachRequest.prototype.getSearchTimeout = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); +proto.cc.arduino.cli.commands.v1.BoardListRequest.prototype.getSkipCloudApiForBoardDetection = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 4, false)); }; /** - * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.BoardAttachRequest} returns this + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.BoardListRequest} returns this */ -proto.cc.arduino.cli.commands.v1.BoardAttachRequest.prototype.setSearchTimeout = function(value) { - return jspb.Message.setProto3StringField(this, 4, value); +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. + * @private {!Array<number>} + * @const + */ +proto.cc.arduino.cli.commands.v1.BoardListResponse.repeatedFields_ = [1,2]; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -3386,8 +3478,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.BoardAttachResponse.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.BoardAttachResponse.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.BoardListResponse.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.BoardListResponse.toObject(opt_includeInstance, this); }; @@ -3396,13 +3488,15 @@ proto.cc.arduino.cli.commands.v1.BoardAttachResponse.prototype.toObject = functi * @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.BoardAttachResponse} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.BoardListResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.BoardAttachResponse.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.BoardListResponse.toObject = function(includeInstance, msg) { var f, obj = { - taskProgress: (f = msg.getTaskProgress()) && cc_arduino_cli_commands_v1_common_pb.TaskProgress.toObject(includeInstance, f) + portsList: jspb.Message.toObjectList(msg.getPortsList(), + proto.cc.arduino.cli.commands.v1.DetectedPort.toObject, includeInstance), + warningsList: (f = jspb.Message.getRepeatedField(msg, 2)) == null ? undefined : f }; if (includeInstance) { @@ -3416,23 +3510,23 @@ proto.cc.arduino.cli.commands.v1.BoardAttachResponse.toObject = function(include /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.BoardAttachResponse} + * @return {!proto.cc.arduino.cli.commands.v1.BoardListResponse} */ -proto.cc.arduino.cli.commands.v1.BoardAttachResponse.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.BoardListResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.BoardAttachResponse; - return proto.cc.arduino.cli.commands.v1.BoardAttachResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.BoardListResponse; + return proto.cc.arduino.cli.commands.v1.BoardListResponse.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.BoardAttachResponse} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.BoardListResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.BoardAttachResponse} + * @return {!proto.cc.arduino.cli.commands.v1.BoardListResponse} */ -proto.cc.arduino.cli.commands.v1.BoardAttachResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.BoardListResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -3440,9 +3534,13 @@ proto.cc.arduino.cli.commands.v1.BoardAttachResponse.deserializeBinaryFromReader var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new cc_arduino_cli_commands_v1_common_pb.TaskProgress; - reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.TaskProgress.deserializeBinaryFromReader); - msg.setTaskProgress(value); + var value = new proto.cc.arduino.cli.commands.v1.DetectedPort; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.DetectedPort.deserializeBinaryFromReader); + msg.addPorts(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.addWarnings(value); break; default: reader.skipField(); @@ -3457,9 +3555,9 @@ proto.cc.arduino.cli.commands.v1.BoardAttachResponse.deserializeBinaryFromReader * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.BoardAttachResponse.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.BoardListResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.BoardAttachResponse.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.BoardListResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -3467,61 +3565,113 @@ proto.cc.arduino.cli.commands.v1.BoardAttachResponse.prototype.serializeBinary = /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.BoardAttachResponse} message + * @param {!proto.cc.arduino.cli.commands.v1.BoardListResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.BoardAttachResponse.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.BoardListResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getTaskProgress(); - if (f != null) { - writer.writeMessage( + f = message.getPortsList(); + if (f.length > 0) { + writer.writeRepeatedMessage( 1, f, - cc_arduino_cli_commands_v1_common_pb.TaskProgress.serializeBinaryToWriter + proto.cc.arduino.cli.commands.v1.DetectedPort.serializeBinaryToWriter + ); + } + f = message.getWarningsList(); + if (f.length > 0) { + writer.writeRepeatedString( + 2, + f ); } }; /** - * optional TaskProgress task_progress = 1; - * @return {?proto.cc.arduino.cli.commands.v1.TaskProgress} + * repeated DetectedPort ports = 1; + * @return {!Array<!proto.cc.arduino.cli.commands.v1.DetectedPort>} */ -proto.cc.arduino.cli.commands.v1.BoardAttachResponse.prototype.getTaskProgress = function() { - return /** @type{?proto.cc.arduino.cli.commands.v1.TaskProgress} */ ( - jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.TaskProgress, 1)); +proto.cc.arduino.cli.commands.v1.BoardListResponse.prototype.getPortsList = function() { + return /** @type{!Array<!proto.cc.arduino.cli.commands.v1.DetectedPort>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.cc.arduino.cli.commands.v1.DetectedPort, 1)); }; /** - * @param {?proto.cc.arduino.cli.commands.v1.TaskProgress|undefined} value - * @return {!proto.cc.arduino.cli.commands.v1.BoardAttachResponse} returns this + * @param {!Array<!proto.cc.arduino.cli.commands.v1.DetectedPort>} value + * @return {!proto.cc.arduino.cli.commands.v1.BoardListResponse} returns this */ -proto.cc.arduino.cli.commands.v1.BoardAttachResponse.prototype.setTaskProgress = function(value) { - return jspb.Message.setWrapperField(this, 1, value); +proto.cc.arduino.cli.commands.v1.BoardListResponse.prototype.setPortsList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 1, value); }; /** - * Clears the message field making it undefined. - * @return {!proto.cc.arduino.cli.commands.v1.BoardAttachResponse} returns this + * @param {!proto.cc.arduino.cli.commands.v1.DetectedPort=} opt_value + * @param {number=} opt_index + * @return {!proto.cc.arduino.cli.commands.v1.DetectedPort} */ -proto.cc.arduino.cli.commands.v1.BoardAttachResponse.prototype.clearTaskProgress = function() { - return this.setTaskProgress(undefined); +proto.cc.arduino.cli.commands.v1.BoardListResponse.prototype.addPorts = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.cc.arduino.cli.commands.v1.DetectedPort, opt_index); }; /** - * Returns whether this field is set. - * @return {boolean} + * Clears the list making it empty but non-null. + * @return {!proto.cc.arduino.cli.commands.v1.BoardListResponse} returns this */ -proto.cc.arduino.cli.commands.v1.BoardAttachResponse.prototype.hasTaskProgress = function() { - return jspb.Message.getField(this, 1) != null; +proto.cc.arduino.cli.commands.v1.BoardListResponse.prototype.clearPortsList = function() { + return this.setPortsList([]); +}; + + +/** + * repeated string warnings = 2; + * @return {!Array<string>} + */ +proto.cc.arduino.cli.commands.v1.BoardListResponse.prototype.getWarningsList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 2)); +}; + + +/** + * @param {!Array<string>} value + * @return {!proto.cc.arduino.cli.commands.v1.BoardListResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.BoardListResponse.prototype.setWarningsList = function(value) { + return jspb.Message.setField(this, 2, value || []); +}; + + +/** + * @param {string} value + * @param {number=} opt_index + * @return {!proto.cc.arduino.cli.commands.v1.BoardListResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.BoardListResponse.prototype.addWarnings = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 2, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.cc.arduino.cli.commands.v1.BoardListResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.BoardListResponse.prototype.clearWarningsList = function() { + return this.setWarningsList([]); }; +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.cc.arduino.cli.commands.v1.DetectedPort.repeatedFields_ = [1]; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -3537,8 +3687,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.BoardListRequest.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.BoardListRequest.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.DetectedPort.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.DetectedPort.toObject(opt_includeInstance, this); }; @@ -3547,14 +3697,15 @@ proto.cc.arduino.cli.commands.v1.BoardListRequest.prototype.toObject = function( * @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.BoardListRequest} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.DetectedPort} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.BoardListRequest.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.DetectedPort.toObject = function(includeInstance, msg) { var f, obj = { - instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f), - timeout: jspb.Message.getFieldWithDefault(msg, 2, 0) + matchingBoardsList: jspb.Message.toObjectList(msg.getMatchingBoardsList(), + proto.cc.arduino.cli.commands.v1.BoardListItem.toObject, includeInstance), + port: (f = msg.getPort()) && cc_arduino_cli_commands_v1_port_pb.Port.toObject(includeInstance, f) }; if (includeInstance) { @@ -3568,23 +3719,23 @@ proto.cc.arduino.cli.commands.v1.BoardListRequest.toObject = function(includeIns /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.BoardListRequest} + * @return {!proto.cc.arduino.cli.commands.v1.DetectedPort} */ -proto.cc.arduino.cli.commands.v1.BoardListRequest.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.DetectedPort.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.BoardListRequest; - return proto.cc.arduino.cli.commands.v1.BoardListRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.DetectedPort; + return proto.cc.arduino.cli.commands.v1.DetectedPort.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.BoardListRequest} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.DetectedPort} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.BoardListRequest} + * @return {!proto.cc.arduino.cli.commands.v1.DetectedPort} */ -proto.cc.arduino.cli.commands.v1.BoardListRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.DetectedPort.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -3592,13 +3743,14 @@ proto.cc.arduino.cli.commands.v1.BoardListRequest.deserializeBinaryFromReader = 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); + var value = new proto.cc.arduino.cli.commands.v1.BoardListItem; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.BoardListItem.deserializeBinaryFromReader); + msg.addMatchingBoards(value); break; case 2: - var value = /** @type {number} */ (reader.readInt64()); - msg.setTimeout(value); + var value = new cc_arduino_cli_commands_v1_port_pb.Port; + reader.readMessage(value,cc_arduino_cli_commands_v1_port_pb.Port.deserializeBinaryFromReader); + msg.setPort(value); break; default: reader.skipField(); @@ -3613,9 +3765,9 @@ proto.cc.arduino.cli.commands.v1.BoardListRequest.deserializeBinaryFromReader = * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.BoardListRequest.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.DetectedPort.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.BoardListRequest.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.DetectedPort.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -3623,82 +3775,103 @@ proto.cc.arduino.cli.commands.v1.BoardListRequest.prototype.serializeBinary = fu /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.BoardListRequest} message + * @param {!proto.cc.arduino.cli.commands.v1.DetectedPort} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.BoardListRequest.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.DetectedPort.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getInstance(); - if (f != null) { - writer.writeMessage( + f = message.getMatchingBoardsList(); + if (f.length > 0) { + writer.writeRepeatedMessage( 1, f, - cc_arduino_cli_commands_v1_common_pb.Instance.serializeBinaryToWriter + proto.cc.arduino.cli.commands.v1.BoardListItem.serializeBinaryToWriter ); } - f = message.getTimeout(); - if (f !== 0) { - writer.writeInt64( + f = message.getPort(); + if (f != null) { + writer.writeMessage( 2, - f + f, + cc_arduino_cli_commands_v1_port_pb.Port.serializeBinaryToWriter ); } }; /** - * optional Instance instance = 1; - * @return {?proto.cc.arduino.cli.commands.v1.Instance} + * repeated BoardListItem matching_boards = 1; + * @return {!Array<!proto.cc.arduino.cli.commands.v1.BoardListItem>} */ -proto.cc.arduino.cli.commands.v1.BoardListRequest.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)); +proto.cc.arduino.cli.commands.v1.DetectedPort.prototype.getMatchingBoardsList = function() { + return /** @type{!Array<!proto.cc.arduino.cli.commands.v1.BoardListItem>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.cc.arduino.cli.commands.v1.BoardListItem, 1)); }; /** - * @param {?proto.cc.arduino.cli.commands.v1.Instance|undefined} value - * @return {!proto.cc.arduino.cli.commands.v1.BoardListRequest} returns this + * @param {!Array<!proto.cc.arduino.cli.commands.v1.BoardListItem>} value + * @return {!proto.cc.arduino.cli.commands.v1.DetectedPort} returns this */ -proto.cc.arduino.cli.commands.v1.BoardListRequest.prototype.setInstance = function(value) { - return jspb.Message.setWrapperField(this, 1, value); +proto.cc.arduino.cli.commands.v1.DetectedPort.prototype.setMatchingBoardsList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 1, value); }; /** - * Clears the message field making it undefined. - * @return {!proto.cc.arduino.cli.commands.v1.BoardListRequest} returns this + * @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.BoardListRequest.prototype.clearInstance = function() { - return this.setInstance(undefined); +proto.cc.arduino.cli.commands.v1.DetectedPort.prototype.addMatchingBoards = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.cc.arduino.cli.commands.v1.BoardListItem, opt_index); }; /** - * Returns whether this field is set. - * @return {boolean} + * Clears the list making it empty but non-null. + * @return {!proto.cc.arduino.cli.commands.v1.DetectedPort} returns this */ -proto.cc.arduino.cli.commands.v1.BoardListRequest.prototype.hasInstance = function() { - return jspb.Message.getField(this, 1) != null; +proto.cc.arduino.cli.commands.v1.DetectedPort.prototype.clearMatchingBoardsList = function() { + return this.setMatchingBoardsList([]); }; /** - * optional int64 timeout = 2; - * @return {number} + * optional Port port = 2; + * @return {?proto.cc.arduino.cli.commands.v1.Port} */ -proto.cc.arduino.cli.commands.v1.BoardListRequest.prototype.getTimeout = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +proto.cc.arduino.cli.commands.v1.DetectedPort.prototype.getPort = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.Port} */ ( + jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_port_pb.Port, 2)); }; /** - * @param {number} value - * @return {!proto.cc.arduino.cli.commands.v1.BoardListRequest} returns this + * @param {?proto.cc.arduino.cli.commands.v1.Port|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.DetectedPort} returns this +*/ +proto.cc.arduino.cli.commands.v1.DetectedPort.prototype.setPort = function(value) { + return jspb.Message.setWrapperField(this, 2, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.DetectedPort} returns this */ -proto.cc.arduino.cli.commands.v1.BoardListRequest.prototype.setTimeout = function(value) { - return jspb.Message.setProto3IntField(this, 2, value); +proto.cc.arduino.cli.commands.v1.DetectedPort.prototype.clearPort = function() { + return this.setPort(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.DetectedPort.prototype.hasPort = function() { + return jspb.Message.getField(this, 2) != null; }; @@ -3708,7 +3881,7 @@ proto.cc.arduino.cli.commands.v1.BoardListRequest.prototype.setTimeout = functio * @private {!Array<number>} * @const */ -proto.cc.arduino.cli.commands.v1.BoardListResponse.repeatedFields_ = [1]; +proto.cc.arduino.cli.commands.v1.BoardListAllRequest.repeatedFields_ = [2]; @@ -3725,8 +3898,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.BoardListResponse.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.BoardListResponse.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.BoardListAllRequest.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.BoardListAllRequest.toObject(opt_includeInstance, this); }; @@ -3735,14 +3908,15 @@ proto.cc.arduino.cli.commands.v1.BoardListResponse.prototype.toObject = function * @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.BoardListResponse} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.BoardListAllRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.BoardListResponse.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.BoardListAllRequest.toObject = function(includeInstance, msg) { var f, obj = { - portsList: jspb.Message.toObjectList(msg.getPortsList(), - proto.cc.arduino.cli.commands.v1.DetectedPort.toObject, includeInstance) + instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f), + searchArgsList: (f = jspb.Message.getRepeatedField(msg, 2)) == null ? undefined : f, + includeHiddenBoards: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) }; if (includeInstance) { @@ -3756,23 +3930,23 @@ proto.cc.arduino.cli.commands.v1.BoardListResponse.toObject = function(includeIn /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.BoardListResponse} + * @return {!proto.cc.arduino.cli.commands.v1.BoardListAllRequest} */ -proto.cc.arduino.cli.commands.v1.BoardListResponse.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.BoardListAllRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.BoardListResponse; - return proto.cc.arduino.cli.commands.v1.BoardListResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.BoardListAllRequest; + return proto.cc.arduino.cli.commands.v1.BoardListAllRequest.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.BoardListResponse} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.BoardListAllRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.BoardListResponse} + * @return {!proto.cc.arduino.cli.commands.v1.BoardListAllRequest} */ -proto.cc.arduino.cli.commands.v1.BoardListResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.BoardListAllRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -3780,9 +3954,17 @@ proto.cc.arduino.cli.commands.v1.BoardListResponse.deserializeBinaryFromReader = var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.cc.arduino.cli.commands.v1.DetectedPort; - reader.readMessage(value,proto.cc.arduino.cli.commands.v1.DetectedPort.deserializeBinaryFromReader); - msg.addPorts(value); + 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 = /** @type {string} */ (reader.readString()); + msg.addSearchArgs(value); + break; + case 3: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setIncludeHiddenBoards(value); break; default: reader.skipField(); @@ -3797,9 +3979,9 @@ proto.cc.arduino.cli.commands.v1.BoardListResponse.deserializeBinaryFromReader = * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.BoardListResponse.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.BoardListAllRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.BoardListResponse.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.BoardListAllRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -3807,58 +3989,126 @@ proto.cc.arduino.cli.commands.v1.BoardListResponse.prototype.serializeBinary = f /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.BoardListResponse} message + * @param {!proto.cc.arduino.cli.commands.v1.BoardListAllRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.BoardListResponse.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.BoardListAllRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getPortsList(); - if (f.length > 0) { - writer.writeRepeatedMessage( + f = message.getInstance(); + if (f != null) { + writer.writeMessage( 1, f, - proto.cc.arduino.cli.commands.v1.DetectedPort.serializeBinaryToWriter + cc_arduino_cli_commands_v1_common_pb.Instance.serializeBinaryToWriter + ); + } + f = message.getSearchArgsList(); + if (f.length > 0) { + writer.writeRepeatedString( + 2, + f + ); + } + f = message.getIncludeHiddenBoards(); + if (f) { + writer.writeBool( + 3, + f ); } }; /** - * repeated DetectedPort ports = 1; - * @return {!Array<!proto.cc.arduino.cli.commands.v1.DetectedPort>} + * optional Instance instance = 1; + * @return {?proto.cc.arduino.cli.commands.v1.Instance} */ -proto.cc.arduino.cli.commands.v1.BoardListResponse.prototype.getPortsList = function() { - return /** @type{!Array<!proto.cc.arduino.cli.commands.v1.DetectedPort>} */ ( - jspb.Message.getRepeatedWrapperField(this, proto.cc.arduino.cli.commands.v1.DetectedPort, 1)); +proto.cc.arduino.cli.commands.v1.BoardListAllRequest.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 {!Array<!proto.cc.arduino.cli.commands.v1.DetectedPort>} value - * @return {!proto.cc.arduino.cli.commands.v1.BoardListResponse} returns this + * @param {?proto.cc.arduino.cli.commands.v1.Instance|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.BoardListAllRequest} returns this */ -proto.cc.arduino.cli.commands.v1.BoardListResponse.prototype.setPortsList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 1, value); +proto.cc.arduino.cli.commands.v1.BoardListAllRequest.prototype.setInstance = function(value) { + return jspb.Message.setWrapperField(this, 1, value); }; /** - * @param {!proto.cc.arduino.cli.commands.v1.DetectedPort=} opt_value + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.BoardListAllRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.BoardListAllRequest.prototype.clearInstance = function() { + return this.setInstance(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.BoardListAllRequest.prototype.hasInstance = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * repeated string search_args = 2; + * @return {!Array<string>} + */ +proto.cc.arduino.cli.commands.v1.BoardListAllRequest.prototype.getSearchArgsList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 2)); +}; + + +/** + * @param {!Array<string>} value + * @return {!proto.cc.arduino.cli.commands.v1.BoardListAllRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.BoardListAllRequest.prototype.setSearchArgsList = function(value) { + return jspb.Message.setField(this, 2, value || []); +}; + + +/** + * @param {string} value * @param {number=} opt_index - * @return {!proto.cc.arduino.cli.commands.v1.DetectedPort} + * @return {!proto.cc.arduino.cli.commands.v1.BoardListAllRequest} returns this */ -proto.cc.arduino.cli.commands.v1.BoardListResponse.prototype.addPorts = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.cc.arduino.cli.commands.v1.DetectedPort, opt_index); +proto.cc.arduino.cli.commands.v1.BoardListAllRequest.prototype.addSearchArgs = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 2, value, opt_index); }; /** * Clears the list making it empty but non-null. - * @return {!proto.cc.arduino.cli.commands.v1.BoardListResponse} returns this + * @return {!proto.cc.arduino.cli.commands.v1.BoardListAllRequest} returns this */ -proto.cc.arduino.cli.commands.v1.BoardListResponse.prototype.clearPortsList = function() { - return this.setPortsList([]); +proto.cc.arduino.cli.commands.v1.BoardListAllRequest.prototype.clearSearchArgsList = function() { + return this.setSearchArgsList([]); +}; + + +/** + * optional bool include_hidden_boards = 3; + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.BoardListAllRequest.prototype.getIncludeHiddenBoards = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.BoardListAllRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.BoardListAllRequest.prototype.setIncludeHiddenBoards = function(value) { + return jspb.Message.setProto3BooleanField(this, 3, value); }; @@ -3868,7 +4118,7 @@ proto.cc.arduino.cli.commands.v1.BoardListResponse.prototype.clearPortsList = fu * @private {!Array<number>} * @const */ -proto.cc.arduino.cli.commands.v1.DetectedPort.repeatedFields_ = [1]; +proto.cc.arduino.cli.commands.v1.BoardListAllResponse.repeatedFields_ = [1]; @@ -3885,8 +4135,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.DetectedPort.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.DetectedPort.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.BoardListAllResponse.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.BoardListAllResponse.toObject(opt_includeInstance, this); }; @@ -3895,15 +4145,14 @@ proto.cc.arduino.cli.commands.v1.DetectedPort.prototype.toObject = function(opt_ * @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.DetectedPort} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.BoardListAllResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.DetectedPort.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.BoardListAllResponse.toObject = function(includeInstance, msg) { var f, obj = { - matchingBoardsList: jspb.Message.toObjectList(msg.getMatchingBoardsList(), - proto.cc.arduino.cli.commands.v1.BoardListItem.toObject, includeInstance), - port: (f = msg.getPort()) && cc_arduino_cli_commands_v1_port_pb.Port.toObject(includeInstance, f) + boardsList: jspb.Message.toObjectList(msg.getBoardsList(), + proto.cc.arduino.cli.commands.v1.BoardListItem.toObject, includeInstance) }; if (includeInstance) { @@ -3917,23 +4166,23 @@ proto.cc.arduino.cli.commands.v1.DetectedPort.toObject = function(includeInstanc /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.DetectedPort} + * @return {!proto.cc.arduino.cli.commands.v1.BoardListAllResponse} */ -proto.cc.arduino.cli.commands.v1.DetectedPort.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.BoardListAllResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.DetectedPort; - return proto.cc.arduino.cli.commands.v1.DetectedPort.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.BoardListAllResponse; + return proto.cc.arduino.cli.commands.v1.BoardListAllResponse.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.DetectedPort} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.BoardListAllResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.DetectedPort} + * @return {!proto.cc.arduino.cli.commands.v1.BoardListAllResponse} */ -proto.cc.arduino.cli.commands.v1.DetectedPort.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.BoardListAllResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -3943,12 +4192,7 @@ proto.cc.arduino.cli.commands.v1.DetectedPort.deserializeBinaryFromReader = func case 1: var value = new proto.cc.arduino.cli.commands.v1.BoardListItem; reader.readMessage(value,proto.cc.arduino.cli.commands.v1.BoardListItem.deserializeBinaryFromReader); - msg.addMatchingBoards(value); - break; - case 2: - var value = new cc_arduino_cli_commands_v1_port_pb.Port; - reader.readMessage(value,cc_arduino_cli_commands_v1_port_pb.Port.deserializeBinaryFromReader); - msg.setPort(value); + msg.addBoards(value); break; default: reader.skipField(); @@ -3963,9 +4207,9 @@ proto.cc.arduino.cli.commands.v1.DetectedPort.deserializeBinaryFromReader = func * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.DetectedPort.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.BoardListAllResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.DetectedPort.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.BoardListAllResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -3973,13 +4217,13 @@ proto.cc.arduino.cli.commands.v1.DetectedPort.prototype.serializeBinary = functi /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.DetectedPort} message + * @param {!proto.cc.arduino.cli.commands.v1.BoardListAllResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.DetectedPort.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.BoardListAllResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getMatchingBoardsList(); + f = message.getBoardsList(); if (f.length > 0) { writer.writeRepeatedMessage( 1, @@ -3987,22 +4231,14 @@ proto.cc.arduino.cli.commands.v1.DetectedPort.serializeBinaryToWriter = function proto.cc.arduino.cli.commands.v1.BoardListItem.serializeBinaryToWriter ); } - f = message.getPort(); - if (f != null) { - writer.writeMessage( - 2, - f, - cc_arduino_cli_commands_v1_port_pb.Port.serializeBinaryToWriter - ); - } }; /** - * repeated BoardListItem matching_boards = 1; + * repeated BoardListItem boards = 1; * @return {!Array<!proto.cc.arduino.cli.commands.v1.BoardListItem>} */ -proto.cc.arduino.cli.commands.v1.DetectedPort.prototype.getMatchingBoardsList = function() { +proto.cc.arduino.cli.commands.v1.BoardListAllResponse.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)); }; @@ -4010,9 +4246,9 @@ proto.cc.arduino.cli.commands.v1.DetectedPort.prototype.getMatchingBoardsList = /** * @param {!Array<!proto.cc.arduino.cli.commands.v1.BoardListItem>} value - * @return {!proto.cc.arduino.cli.commands.v1.DetectedPort} returns this + * @return {!proto.cc.arduino.cli.commands.v1.BoardListAllResponse} returns this */ -proto.cc.arduino.cli.commands.v1.DetectedPort.prototype.setMatchingBoardsList = function(value) { +proto.cc.arduino.cli.commands.v1.BoardListAllResponse.prototype.setBoardsList = function(value) { return jspb.Message.setRepeatedWrapperField(this, 1, value); }; @@ -4022,65 +4258,21 @@ proto.cc.arduino.cli.commands.v1.DetectedPort.prototype.setMatchingBoardsList = * @param {number=} opt_index * @return {!proto.cc.arduino.cli.commands.v1.BoardListItem} */ -proto.cc.arduino.cli.commands.v1.DetectedPort.prototype.addMatchingBoards = function(opt_value, opt_index) { +proto.cc.arduino.cli.commands.v1.BoardListAllResponse.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.DetectedPort} returns this - */ -proto.cc.arduino.cli.commands.v1.DetectedPort.prototype.clearMatchingBoardsList = function() { - return this.setMatchingBoardsList([]); -}; - - -/** - * optional Port port = 2; - * @return {?proto.cc.arduino.cli.commands.v1.Port} - */ -proto.cc.arduino.cli.commands.v1.DetectedPort.prototype.getPort = function() { - return /** @type{?proto.cc.arduino.cli.commands.v1.Port} */ ( - jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_port_pb.Port, 2)); -}; - - -/** - * @param {?proto.cc.arduino.cli.commands.v1.Port|undefined} value - * @return {!proto.cc.arduino.cli.commands.v1.DetectedPort} returns this -*/ -proto.cc.arduino.cli.commands.v1.DetectedPort.prototype.setPort = function(value) { - return jspb.Message.setWrapperField(this, 2, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.cc.arduino.cli.commands.v1.DetectedPort} returns this - */ -proto.cc.arduino.cli.commands.v1.DetectedPort.prototype.clearPort = function() { - return this.setPort(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} + * @return {!proto.cc.arduino.cli.commands.v1.BoardListAllResponse} returns this */ -proto.cc.arduino.cli.commands.v1.DetectedPort.prototype.hasPort = function() { - return jspb.Message.getField(this, 2) != null; +proto.cc.arduino.cli.commands.v1.BoardListAllResponse.prototype.clearBoardsList = function() { + return this.setBoardsList([]); }; -/** - * List of repeated fields within this message type. - * @private {!Array<number>} - * @const - */ -proto.cc.arduino.cli.commands.v1.BoardListAllRequest.repeatedFields_ = [2]; - if (jspb.Message.GENERATE_TO_OBJECT) { @@ -4096,8 +4288,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.BoardListAllRequest.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.BoardListAllRequest.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.BoardListWatchRequest.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.BoardListWatchRequest.toObject(opt_includeInstance, this); }; @@ -4106,15 +4298,14 @@ proto.cc.arduino.cli.commands.v1.BoardListAllRequest.prototype.toObject = functi * @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.BoardListAllRequest} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.BoardListWatchRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.BoardListAllRequest.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.BoardListWatchRequest.toObject = function(includeInstance, msg) { var f, obj = { instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f), - searchArgsList: (f = jspb.Message.getRepeatedField(msg, 2)) == null ? undefined : f, - includeHiddenBoards: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) + skipCloudApiForBoardDetection: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) }; if (includeInstance) { @@ -4128,23 +4319,23 @@ proto.cc.arduino.cli.commands.v1.BoardListAllRequest.toObject = function(include /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.BoardListAllRequest} + * @return {!proto.cc.arduino.cli.commands.v1.BoardListWatchRequest} */ -proto.cc.arduino.cli.commands.v1.BoardListAllRequest.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.BoardListWatchRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.BoardListAllRequest; - return proto.cc.arduino.cli.commands.v1.BoardListAllRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.BoardListWatchRequest; + return proto.cc.arduino.cli.commands.v1.BoardListWatchRequest.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.BoardListAllRequest} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.BoardListWatchRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.BoardListAllRequest} + * @return {!proto.cc.arduino.cli.commands.v1.BoardListWatchRequest} */ -proto.cc.arduino.cli.commands.v1.BoardListAllRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.BoardListWatchRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -4157,12 +4348,8 @@ proto.cc.arduino.cli.commands.v1.BoardListAllRequest.deserializeBinaryFromReader msg.setInstance(value); break; case 2: - var value = /** @type {string} */ (reader.readString()); - msg.addSearchArgs(value); - break; - case 3: var value = /** @type {boolean} */ (reader.readBool()); - msg.setIncludeHiddenBoards(value); + msg.setSkipCloudApiForBoardDetection(value); break; default: reader.skipField(); @@ -4177,9 +4364,9 @@ proto.cc.arduino.cli.commands.v1.BoardListAllRequest.deserializeBinaryFromReader * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.BoardListAllRequest.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.BoardListWatchRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.BoardListAllRequest.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.BoardListWatchRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -4187,11 +4374,11 @@ proto.cc.arduino.cli.commands.v1.BoardListAllRequest.prototype.serializeBinary = /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.BoardListAllRequest} message + * @param {!proto.cc.arduino.cli.commands.v1.BoardListWatchRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.BoardListAllRequest.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.BoardListWatchRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getInstance(); if (f != null) { @@ -4201,17 +4388,10 @@ proto.cc.arduino.cli.commands.v1.BoardListAllRequest.serializeBinaryToWriter = f cc_arduino_cli_commands_v1_common_pb.Instance.serializeBinaryToWriter ); } - f = message.getSearchArgsList(); - if (f.length > 0) { - writer.writeRepeatedString( - 2, - f - ); - } - f = message.getIncludeHiddenBoards(); + f = message.getSkipCloudApiForBoardDetection(); if (f) { writer.writeBool( - 3, + 2, f ); } @@ -4222,7 +4402,7 @@ proto.cc.arduino.cli.commands.v1.BoardListAllRequest.serializeBinaryToWriter = f * optional Instance instance = 1; * @return {?proto.cc.arduino.cli.commands.v1.Instance} */ -proto.cc.arduino.cli.commands.v1.BoardListAllRequest.prototype.getInstance = function() { +proto.cc.arduino.cli.commands.v1.BoardListWatchRequest.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)); }; @@ -4230,18 +4410,18 @@ proto.cc.arduino.cli.commands.v1.BoardListAllRequest.prototype.getInstance = fun /** * @param {?proto.cc.arduino.cli.commands.v1.Instance|undefined} value - * @return {!proto.cc.arduino.cli.commands.v1.BoardListAllRequest} returns this + * @return {!proto.cc.arduino.cli.commands.v1.BoardListWatchRequest} returns this */ -proto.cc.arduino.cli.commands.v1.BoardListAllRequest.prototype.setInstance = function(value) { +proto.cc.arduino.cli.commands.v1.BoardListWatchRequest.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.BoardListAllRequest} returns this + * @return {!proto.cc.arduino.cli.commands.v1.BoardListWatchRequest} returns this */ -proto.cc.arduino.cli.commands.v1.BoardListAllRequest.prototype.clearInstance = function() { +proto.cc.arduino.cli.commands.v1.BoardListWatchRequest.prototype.clearInstance = function() { return this.setInstance(undefined); }; @@ -4250,74 +4430,30 @@ proto.cc.arduino.cli.commands.v1.BoardListAllRequest.prototype.clearInstance = f * Returns whether this field is set. * @return {boolean} */ -proto.cc.arduino.cli.commands.v1.BoardListAllRequest.prototype.hasInstance = function() { +proto.cc.arduino.cli.commands.v1.BoardListWatchRequest.prototype.hasInstance = function() { return jspb.Message.getField(this, 1) != null; }; /** - * repeated string search_args = 2; - * @return {!Array<string>} - */ -proto.cc.arduino.cli.commands.v1.BoardListAllRequest.prototype.getSearchArgsList = function() { - return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 2)); -}; - - -/** - * @param {!Array<string>} value - * @return {!proto.cc.arduino.cli.commands.v1.BoardListAllRequest} returns this - */ -proto.cc.arduino.cli.commands.v1.BoardListAllRequest.prototype.setSearchArgsList = function(value) { - return jspb.Message.setField(this, 2, value || []); -}; - - -/** - * @param {string} value - * @param {number=} opt_index - * @return {!proto.cc.arduino.cli.commands.v1.BoardListAllRequest} returns this - */ -proto.cc.arduino.cli.commands.v1.BoardListAllRequest.prototype.addSearchArgs = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 2, value, opt_index); -}; - - -/** - * Clears the list making it empty but non-null. - * @return {!proto.cc.arduino.cli.commands.v1.BoardListAllRequest} returns this - */ -proto.cc.arduino.cli.commands.v1.BoardListAllRequest.prototype.clearSearchArgsList = function() { - return this.setSearchArgsList([]); -}; - - -/** - * optional bool include_hidden_boards = 3; + * optional bool skip_cloud_api_for_board_detection = 2; * @return {boolean} */ -proto.cc.arduino.cli.commands.v1.BoardListAllRequest.prototype.getIncludeHiddenBoards = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); +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.BoardListAllRequest} returns this + * @return {!proto.cc.arduino.cli.commands.v1.BoardListWatchRequest} returns this */ -proto.cc.arduino.cli.commands.v1.BoardListAllRequest.prototype.setIncludeHiddenBoards = function(value) { - return jspb.Message.setProto3BooleanField(this, 3, value); +proto.cc.arduino.cli.commands.v1.BoardListWatchRequest.prototype.setSkipCloudApiForBoardDetection = function(value) { + return jspb.Message.setProto3BooleanField(this, 2, value); }; -/** - * List of repeated fields within this message type. - * @private {!Array<number>} - * @const - */ -proto.cc.arduino.cli.commands.v1.BoardListAllResponse.repeatedFields_ = [1]; - if (jspb.Message.GENERATE_TO_OBJECT) { @@ -4333,8 +4469,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.BoardListAllResponse.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.BoardListAllResponse.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.BoardListWatchResponse.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.BoardListWatchResponse.toObject(opt_includeInstance, this); }; @@ -4343,14 +4479,15 @@ proto.cc.arduino.cli.commands.v1.BoardListAllResponse.prototype.toObject = funct * @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.BoardListAllResponse} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.BoardListWatchResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.BoardListAllResponse.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.BoardListWatchResponse.toObject = function(includeInstance, msg) { var f, obj = { - boardsList: jspb.Message.toObjectList(msg.getBoardsList(), - proto.cc.arduino.cli.commands.v1.BoardListItem.toObject, includeInstance) + eventType: jspb.Message.getFieldWithDefault(msg, 1, ""), + port: (f = msg.getPort()) && proto.cc.arduino.cli.commands.v1.DetectedPort.toObject(includeInstance, f), + error: jspb.Message.getFieldWithDefault(msg, 3, "") }; if (includeInstance) { @@ -4364,23 +4501,23 @@ proto.cc.arduino.cli.commands.v1.BoardListAllResponse.toObject = function(includ /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.BoardListAllResponse} + * @return {!proto.cc.arduino.cli.commands.v1.BoardListWatchResponse} */ -proto.cc.arduino.cli.commands.v1.BoardListAllResponse.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.BoardListWatchResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.BoardListAllResponse; - return proto.cc.arduino.cli.commands.v1.BoardListAllResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.BoardListWatchResponse; + return proto.cc.arduino.cli.commands.v1.BoardListWatchResponse.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.BoardListAllResponse} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.BoardListWatchResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.BoardListAllResponse} + * @return {!proto.cc.arduino.cli.commands.v1.BoardListWatchResponse} */ -proto.cc.arduino.cli.commands.v1.BoardListAllResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.BoardListWatchResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -4388,9 +4525,17 @@ proto.cc.arduino.cli.commands.v1.BoardListAllResponse.deserializeBinaryFromReade 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); + var value = /** @type {string} */ (reader.readString()); + msg.setEventType(value); + break; + case 2: + var value = new proto.cc.arduino.cli.commands.v1.DetectedPort; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.DetectedPort.deserializeBinaryFromReader); + msg.setPort(value); + break; + case 3: + var value = /** @type {string} */ (reader.readString()); + msg.setError(value); break; default: reader.skipField(); @@ -4405,9 +4550,9 @@ proto.cc.arduino.cli.commands.v1.BoardListAllResponse.deserializeBinaryFromReade * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.BoardListAllResponse.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.BoardListWatchResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.BoardListAllResponse.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.BoardListWatchResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -4415,58 +4560,107 @@ proto.cc.arduino.cli.commands.v1.BoardListAllResponse.prototype.serializeBinary /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.BoardListAllResponse} message + * @param {!proto.cc.arduino.cli.commands.v1.BoardListWatchResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.BoardListAllResponse.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.BoardListWatchResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getBoardsList(); + f = message.getEventType(); if (f.length > 0) { - writer.writeRepeatedMessage( + writer.writeString( 1, + f + ); + } + f = message.getPort(); + if (f != null) { + writer.writeMessage( + 2, f, - proto.cc.arduino.cli.commands.v1.BoardListItem.serializeBinaryToWriter + proto.cc.arduino.cli.commands.v1.DetectedPort.serializeBinaryToWriter + ); + } + f = message.getError(); + if (f.length > 0) { + writer.writeString( + 3, + f ); } }; /** - * repeated BoardListItem boards = 1; - * @return {!Array<!proto.cc.arduino.cli.commands.v1.BoardListItem>} + * optional string event_type = 1; + * @return {string} */ -proto.cc.arduino.cli.commands.v1.BoardListAllResponse.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)); +proto.cc.arduino.cli.commands.v1.BoardListWatchResponse.prototype.getEventType = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * @param {!Array<!proto.cc.arduino.cli.commands.v1.BoardListItem>} value - * @return {!proto.cc.arduino.cli.commands.v1.BoardListAllResponse} returns this + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.BoardListWatchResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.BoardListWatchResponse.prototype.setEventType = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + +/** + * optional DetectedPort port = 2; + * @return {?proto.cc.arduino.cli.commands.v1.DetectedPort} + */ +proto.cc.arduino.cli.commands.v1.BoardListWatchResponse.prototype.getPort = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.DetectedPort} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.DetectedPort, 2)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.DetectedPort|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.BoardListWatchResponse} returns this */ -proto.cc.arduino.cli.commands.v1.BoardListAllResponse.prototype.setBoardsList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 1, value); +proto.cc.arduino.cli.commands.v1.BoardListWatchResponse.prototype.setPort = function(value) { + return jspb.Message.setWrapperField(this, 2, value); }; /** - * @param {!proto.cc.arduino.cli.commands.v1.BoardListItem=} opt_value - * @param {number=} opt_index - * @return {!proto.cc.arduino.cli.commands.v1.BoardListItem} + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.BoardListWatchResponse} returns this */ -proto.cc.arduino.cli.commands.v1.BoardListAllResponse.prototype.addBoards = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.cc.arduino.cli.commands.v1.BoardListItem, opt_index); +proto.cc.arduino.cli.commands.v1.BoardListWatchResponse.prototype.clearPort = function() { + return this.setPort(undefined); }; /** - * Clears the list making it empty but non-null. - * @return {!proto.cc.arduino.cli.commands.v1.BoardListAllResponse} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.cc.arduino.cli.commands.v1.BoardListAllResponse.prototype.clearBoardsList = function() { - return this.setBoardsList([]); +proto.cc.arduino.cli.commands.v1.BoardListWatchResponse.prototype.hasPort = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional string error = 3; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.BoardListWatchResponse.prototype.getError = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.BoardListWatchResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.BoardListWatchResponse.prototype.setError = function(value) { + return jspb.Message.setProto3StringField(this, 3, value); }; @@ -4486,8 +4680,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.BoardListWatchRequest.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.BoardListWatchRequest.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.BoardListItem.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.BoardListItem.toObject(opt_includeInstance, this); }; @@ -4496,14 +4690,16 @@ proto.cc.arduino.cli.commands.v1.BoardListWatchRequest.prototype.toObject = func * @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.BoardListWatchRequest} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.BoardListItem} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.BoardListWatchRequest.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.BoardListItem.toObject = function(includeInstance, msg) { var f, obj = { - instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f), - interrupt: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + name: jspb.Message.getFieldWithDefault(msg, 1, ""), + fqbn: jspb.Message.getFieldWithDefault(msg, 2, ""), + isHidden: jspb.Message.getBooleanFieldWithDefault(msg, 3, false), + platform: (f = msg.getPlatform()) && cc_arduino_cli_commands_v1_common_pb.Platform.toObject(includeInstance, f) }; if (includeInstance) { @@ -4517,23 +4713,23 @@ proto.cc.arduino.cli.commands.v1.BoardListWatchRequest.toObject = function(inclu /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.BoardListWatchRequest} + * @return {!proto.cc.arduino.cli.commands.v1.BoardListItem} */ -proto.cc.arduino.cli.commands.v1.BoardListWatchRequest.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.BoardListItem.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.BoardListWatchRequest; - return proto.cc.arduino.cli.commands.v1.BoardListWatchRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.BoardListItem; + return proto.cc.arduino.cli.commands.v1.BoardListItem.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.BoardListWatchRequest} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.BoardListItem} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.BoardListWatchRequest} + * @return {!proto.cc.arduino.cli.commands.v1.BoardListItem} */ -proto.cc.arduino.cli.commands.v1.BoardListWatchRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.BoardListItem.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -4541,16 +4737,24 @@ proto.cc.arduino.cli.commands.v1.BoardListWatchRequest.deserializeBinaryFromRead 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); + var value = /** @type {string} */ (reader.readString()); + msg.setName(value); break; case 2: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setInterrupt(value); + var value = /** @type {string} */ (reader.readString()); + msg.setFqbn(value); break; - default: - reader.skipField(); + case 3: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setIsHidden(value); + break; + case 6: + var value = new cc_arduino_cli_commands_v1_common_pb.Platform; + reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.Platform.deserializeBinaryFromReader); + msg.setPlatform(value); + break; + default: + reader.skipField(); break; } } @@ -4562,9 +4766,9 @@ proto.cc.arduino.cli.commands.v1.BoardListWatchRequest.deserializeBinaryFromRead * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.BoardListWatchRequest.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.BoardListItem.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.BoardListWatchRequest.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.BoardListItem.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -4572,82 +4776,132 @@ proto.cc.arduino.cli.commands.v1.BoardListWatchRequest.prototype.serializeBinary /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.BoardListWatchRequest} message + * @param {!proto.cc.arduino.cli.commands.v1.BoardListItem} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.BoardListWatchRequest.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.BoardListItem.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getInstance(); - if (f != null) { - writer.writeMessage( + f = message.getName(); + if (f.length > 0) { + writer.writeString( 1, - f, - cc_arduino_cli_commands_v1_common_pb.Instance.serializeBinaryToWriter + f ); } - f = message.getInterrupt(); + f = message.getFqbn(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } + f = message.getIsHidden(); if (f) { writer.writeBool( - 2, + 3, f ); } + f = message.getPlatform(); + if (f != null) { + writer.writeMessage( + 6, + f, + cc_arduino_cli_commands_v1_common_pb.Platform.serializeBinaryToWriter + ); + } }; /** - * optional Instance instance = 1; - * @return {?proto.cc.arduino.cli.commands.v1.Instance} + * optional string name = 1; + * @return {string} */ -proto.cc.arduino.cli.commands.v1.BoardListWatchRequest.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)); +proto.cc.arduino.cli.commands.v1.BoardListItem.prototype.getName = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * @param {?proto.cc.arduino.cli.commands.v1.Instance|undefined} value - * @return {!proto.cc.arduino.cli.commands.v1.BoardListWatchRequest} returns this -*/ -proto.cc.arduino.cli.commands.v1.BoardListWatchRequest.prototype.setInstance = function(value) { - return jspb.Message.setWrapperField(this, 1, value); + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.BoardListItem} returns this + */ +proto.cc.arduino.cli.commands.v1.BoardListItem.prototype.setName = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); }; /** - * Clears the message field making it undefined. - * @return {!proto.cc.arduino.cli.commands.v1.BoardListWatchRequest} returns this + * optional string fqbn = 2; + * @return {string} */ -proto.cc.arduino.cli.commands.v1.BoardListWatchRequest.prototype.clearInstance = function() { - return this.setInstance(undefined); +proto.cc.arduino.cli.commands.v1.BoardListItem.prototype.getFqbn = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.BoardListItem} returns this */ -proto.cc.arduino.cli.commands.v1.BoardListWatchRequest.prototype.hasInstance = function() { - return jspb.Message.getField(this, 1) != null; +proto.cc.arduino.cli.commands.v1.BoardListItem.prototype.setFqbn = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); }; /** - * optional bool interrupt = 2; + * optional bool is_hidden = 3; * @return {boolean} */ -proto.cc.arduino.cli.commands.v1.BoardListWatchRequest.prototype.getInterrupt = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +proto.cc.arduino.cli.commands.v1.BoardListItem.prototype.getIsHidden = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); }; /** * @param {boolean} value - * @return {!proto.cc.arduino.cli.commands.v1.BoardListWatchRequest} returns this + * @return {!proto.cc.arduino.cli.commands.v1.BoardListItem} returns this */ -proto.cc.arduino.cli.commands.v1.BoardListWatchRequest.prototype.setInterrupt = function(value) { - return jspb.Message.setProto3BooleanField(this, 2, value); +proto.cc.arduino.cli.commands.v1.BoardListItem.prototype.setIsHidden = function(value) { + return jspb.Message.setProto3BooleanField(this, 3, value); +}; + + +/** + * optional Platform platform = 6; + * @return {?proto.cc.arduino.cli.commands.v1.Platform} + */ +proto.cc.arduino.cli.commands.v1.BoardListItem.prototype.getPlatform = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.Platform} */ ( + jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.Platform, 6)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.Platform|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.BoardListItem} returns this +*/ +proto.cc.arduino.cli.commands.v1.BoardListItem.prototype.setPlatform = function(value) { + return jspb.Message.setWrapperField(this, 6, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.BoardListItem} returns this + */ +proto.cc.arduino.cli.commands.v1.BoardListItem.prototype.clearPlatform = function() { + return this.setPlatform(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.BoardListItem.prototype.hasPlatform = function() { + return jspb.Message.getField(this, 6) != null; }; @@ -4667,8 +4921,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.BoardListWatchResponse.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.BoardListWatchResponse.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.BoardSearchRequest.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.BoardSearchRequest.toObject(opt_includeInstance, this); }; @@ -4677,15 +4931,15 @@ proto.cc.arduino.cli.commands.v1.BoardListWatchResponse.prototype.toObject = fun * @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.BoardListWatchResponse} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.BoardSearchRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.BoardListWatchResponse.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.BoardSearchRequest.toObject = function(includeInstance, msg) { var f, obj = { - eventType: jspb.Message.getFieldWithDefault(msg, 1, ""), - port: (f = msg.getPort()) && proto.cc.arduino.cli.commands.v1.DetectedPort.toObject(includeInstance, f), - error: jspb.Message.getFieldWithDefault(msg, 3, "") + instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f), + searchArgs: jspb.Message.getFieldWithDefault(msg, 2, ""), + includeHiddenBoards: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) }; if (includeInstance) { @@ -4699,23 +4953,23 @@ proto.cc.arduino.cli.commands.v1.BoardListWatchResponse.toObject = function(incl /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.BoardListWatchResponse} + * @return {!proto.cc.arduino.cli.commands.v1.BoardSearchRequest} */ -proto.cc.arduino.cli.commands.v1.BoardListWatchResponse.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.BoardSearchRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.BoardListWatchResponse; - return proto.cc.arduino.cli.commands.v1.BoardListWatchResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.BoardSearchRequest; + return proto.cc.arduino.cli.commands.v1.BoardSearchRequest.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.BoardListWatchResponse} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.BoardSearchRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.BoardListWatchResponse} + * @return {!proto.cc.arduino.cli.commands.v1.BoardSearchRequest} */ -proto.cc.arduino.cli.commands.v1.BoardListWatchResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.BoardSearchRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -4723,17 +4977,17 @@ proto.cc.arduino.cli.commands.v1.BoardListWatchResponse.deserializeBinaryFromRea var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {string} */ (reader.readString()); - msg.setEventType(value); + 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 = new proto.cc.arduino.cli.commands.v1.DetectedPort; - reader.readMessage(value,proto.cc.arduino.cli.commands.v1.DetectedPort.deserializeBinaryFromReader); - msg.setPort(value); + var value = /** @type {string} */ (reader.readString()); + msg.setSearchArgs(value); break; case 3: - var value = /** @type {string} */ (reader.readString()); - msg.setError(value); + var value = /** @type {boolean} */ (reader.readBool()); + msg.setIncludeHiddenBoards(value); break; default: reader.skipField(); @@ -4748,9 +5002,9 @@ proto.cc.arduino.cli.commands.v1.BoardListWatchResponse.deserializeBinaryFromRea * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.BoardListWatchResponse.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.BoardSearchRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.BoardListWatchResponse.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.BoardSearchRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -4758,30 +5012,30 @@ proto.cc.arduino.cli.commands.v1.BoardListWatchResponse.prototype.serializeBinar /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.BoardListWatchResponse} message + * @param {!proto.cc.arduino.cli.commands.v1.BoardSearchRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.BoardListWatchResponse.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.BoardSearchRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getEventType(); - if (f.length > 0) { - writer.writeString( - 1, - f - ); - } - f = message.getPort(); + f = message.getInstance(); if (f != null) { writer.writeMessage( - 2, + 1, f, - proto.cc.arduino.cli.commands.v1.DetectedPort.serializeBinaryToWriter + cc_arduino_cli_commands_v1_common_pb.Instance.serializeBinaryToWriter ); } - f = message.getError(); + f = message.getSearchArgs(); if (f.length > 0) { writer.writeString( + 2, + f + ); + } + f = message.getIncludeHiddenBoards(); + if (f) { + writer.writeBool( 3, f ); @@ -4790,79 +5044,86 @@ proto.cc.arduino.cli.commands.v1.BoardListWatchResponse.serializeBinaryToWriter /** - * optional string event_type = 1; - * @return {string} + * optional Instance instance = 1; + * @return {?proto.cc.arduino.cli.commands.v1.Instance} */ -proto.cc.arduino.cli.commands.v1.BoardListWatchResponse.prototype.getEventType = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +proto.cc.arduino.cli.commands.v1.BoardSearchRequest.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 {string} value - * @return {!proto.cc.arduino.cli.commands.v1.BoardListWatchResponse} returns this - */ -proto.cc.arduino.cli.commands.v1.BoardListWatchResponse.prototype.setEventType = function(value) { - return jspb.Message.setProto3StringField(this, 1, value); + * @param {?proto.cc.arduino.cli.commands.v1.Instance|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.BoardSearchRequest} returns this +*/ +proto.cc.arduino.cli.commands.v1.BoardSearchRequest.prototype.setInstance = function(value) { + return jspb.Message.setWrapperField(this, 1, value); }; /** - * optional DetectedPort port = 2; - * @return {?proto.cc.arduino.cli.commands.v1.DetectedPort} + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.BoardSearchRequest} returns this */ -proto.cc.arduino.cli.commands.v1.BoardListWatchResponse.prototype.getPort = function() { - return /** @type{?proto.cc.arduino.cli.commands.v1.DetectedPort} */ ( - jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.DetectedPort, 2)); +proto.cc.arduino.cli.commands.v1.BoardSearchRequest.prototype.clearInstance = function() { + return this.setInstance(undefined); }; /** - * @param {?proto.cc.arduino.cli.commands.v1.DetectedPort|undefined} value - * @return {!proto.cc.arduino.cli.commands.v1.BoardListWatchResponse} returns this -*/ -proto.cc.arduino.cli.commands.v1.BoardListWatchResponse.prototype.setPort = function(value) { - return jspb.Message.setWrapperField(this, 2, value); + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.BoardSearchRequest.prototype.hasInstance = function() { + return jspb.Message.getField(this, 1) != null; }; /** - * Clears the message field making it undefined. - * @return {!proto.cc.arduino.cli.commands.v1.BoardListWatchResponse} returns this + * optional string search_args = 2; + * @return {string} */ -proto.cc.arduino.cli.commands.v1.BoardListWatchResponse.prototype.clearPort = function() { - return this.setPort(undefined); +proto.cc.arduino.cli.commands.v1.BoardSearchRequest.prototype.getSearchArgs = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.BoardSearchRequest} returns this */ -proto.cc.arduino.cli.commands.v1.BoardListWatchResponse.prototype.hasPort = function() { - return jspb.Message.getField(this, 2) != null; +proto.cc.arduino.cli.commands.v1.BoardSearchRequest.prototype.setSearchArgs = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); }; /** - * optional string error = 3; - * @return {string} + * optional bool include_hidden_boards = 3; + * @return {boolean} */ -proto.cc.arduino.cli.commands.v1.BoardListWatchResponse.prototype.getError = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +proto.cc.arduino.cli.commands.v1.BoardSearchRequest.prototype.getIncludeHiddenBoards = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); }; /** - * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.BoardListWatchResponse} returns this + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.BoardSearchRequest} returns this */ -proto.cc.arduino.cli.commands.v1.BoardListWatchResponse.prototype.setError = function(value) { - return jspb.Message.setProto3StringField(this, 3, value); +proto.cc.arduino.cli.commands.v1.BoardSearchRequest.prototype.setIncludeHiddenBoards = 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.BoardSearchResponse.repeatedFields_ = [1]; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -4878,8 +5139,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.BoardListItem.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.BoardListItem.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.BoardSearchResponse.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.BoardSearchResponse.toObject(opt_includeInstance, this); }; @@ -4888,16 +5149,14 @@ proto.cc.arduino.cli.commands.v1.BoardListItem.prototype.toObject = function(opt * @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.BoardListItem} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.BoardSearchResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.BoardListItem.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.BoardSearchResponse.toObject = function(includeInstance, msg) { var f, obj = { - name: jspb.Message.getFieldWithDefault(msg, 1, ""), - fqbn: jspb.Message.getFieldWithDefault(msg, 2, ""), - isHidden: jspb.Message.getBooleanFieldWithDefault(msg, 3, false), - platform: (f = msg.getPlatform()) && cc_arduino_cli_commands_v1_common_pb.Platform.toObject(includeInstance, f) + boardsList: jspb.Message.toObjectList(msg.getBoardsList(), + proto.cc.arduino.cli.commands.v1.BoardListItem.toObject, includeInstance) }; if (includeInstance) { @@ -4911,23 +5170,23 @@ proto.cc.arduino.cli.commands.v1.BoardListItem.toObject = function(includeInstan /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.BoardListItem} + * @return {!proto.cc.arduino.cli.commands.v1.BoardSearchResponse} */ -proto.cc.arduino.cli.commands.v1.BoardListItem.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.BoardSearchResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.BoardListItem; - return proto.cc.arduino.cli.commands.v1.BoardListItem.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.BoardSearchResponse; + return proto.cc.arduino.cli.commands.v1.BoardSearchResponse.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.BoardListItem} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.BoardSearchResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.BoardListItem} + * @return {!proto.cc.arduino.cli.commands.v1.BoardSearchResponse} */ -proto.cc.arduino.cli.commands.v1.BoardListItem.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.BoardSearchResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -4935,21 +5194,9 @@ proto.cc.arduino.cli.commands.v1.BoardListItem.deserializeBinaryFromReader = fun var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {string} */ (reader.readString()); - msg.setName(value); - break; - case 2: - var value = /** @type {string} */ (reader.readString()); - msg.setFqbn(value); - break; - case 3: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setIsHidden(value); - break; - case 6: - var value = new cc_arduino_cli_commands_v1_common_pb.Platform; - reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.Platform.deserializeBinaryFromReader); - msg.setPlatform(value); + 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(); @@ -4964,9 +5211,9 @@ proto.cc.arduino.cli.commands.v1.BoardListItem.deserializeBinaryFromReader = fun * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.BoardListItem.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.BoardSearchResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.BoardListItem.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.BoardSearchResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -4974,132 +5221,58 @@ proto.cc.arduino.cli.commands.v1.BoardListItem.prototype.serializeBinary = funct /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.BoardListItem} message + * @param {!proto.cc.arduino.cli.commands.v1.BoardSearchResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.BoardListItem.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.BoardSearchResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getName(); + f = message.getBoardsList(); if (f.length > 0) { - writer.writeString( + writer.writeRepeatedMessage( 1, - f - ); - } - f = message.getFqbn(); - if (f.length > 0) { - writer.writeString( - 2, - f - ); - } - f = message.getIsHidden(); - if (f) { - writer.writeBool( - 3, - f - ); - } - f = message.getPlatform(); - if (f != null) { - writer.writeMessage( - 6, f, - cc_arduino_cli_commands_v1_common_pb.Platform.serializeBinaryToWriter + proto.cc.arduino.cli.commands.v1.BoardListItem.serializeBinaryToWriter ); } }; /** - * optional string name = 1; - * @return {string} - */ -proto.cc.arduino.cli.commands.v1.BoardListItem.prototype.getName = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.BoardListItem} returns this - */ -proto.cc.arduino.cli.commands.v1.BoardListItem.prototype.setName = function(value) { - return jspb.Message.setProto3StringField(this, 1, value); -}; - - -/** - * optional string fqbn = 2; - * @return {string} - */ -proto.cc.arduino.cli.commands.v1.BoardListItem.prototype.getFqbn = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); -}; - - -/** - * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.BoardListItem} returns this - */ -proto.cc.arduino.cli.commands.v1.BoardListItem.prototype.setFqbn = function(value) { - return jspb.Message.setProto3StringField(this, 2, value); -}; - - -/** - * optional bool is_hidden = 3; - * @return {boolean} - */ -proto.cc.arduino.cli.commands.v1.BoardListItem.prototype.getIsHidden = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); -}; - - -/** - * @param {boolean} value - * @return {!proto.cc.arduino.cli.commands.v1.BoardListItem} returns this - */ -proto.cc.arduino.cli.commands.v1.BoardListItem.prototype.setIsHidden = function(value) { - return jspb.Message.setProto3BooleanField(this, 3, value); -}; - - -/** - * optional Platform platform = 6; - * @return {?proto.cc.arduino.cli.commands.v1.Platform} + * repeated BoardListItem boards = 1; + * @return {!Array<!proto.cc.arduino.cli.commands.v1.BoardListItem>} */ -proto.cc.arduino.cli.commands.v1.BoardListItem.prototype.getPlatform = function() { - return /** @type{?proto.cc.arduino.cli.commands.v1.Platform} */ ( - jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.Platform, 6)); +proto.cc.arduino.cli.commands.v1.BoardSearchResponse.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 {?proto.cc.arduino.cli.commands.v1.Platform|undefined} value - * @return {!proto.cc.arduino.cli.commands.v1.BoardListItem} returns this + * @param {!Array<!proto.cc.arduino.cli.commands.v1.BoardListItem>} value + * @return {!proto.cc.arduino.cli.commands.v1.BoardSearchResponse} returns this */ -proto.cc.arduino.cli.commands.v1.BoardListItem.prototype.setPlatform = function(value) { - return jspb.Message.setWrapperField(this, 6, value); +proto.cc.arduino.cli.commands.v1.BoardSearchResponse.prototype.setBoardsList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 1, value); }; /** - * Clears the message field making it undefined. - * @return {!proto.cc.arduino.cli.commands.v1.BoardListItem} returns this + * @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.BoardListItem.prototype.clearPlatform = function() { - return this.setPlatform(undefined); +proto.cc.arduino.cli.commands.v1.BoardSearchResponse.prototype.addBoards = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.cc.arduino.cli.commands.v1.BoardListItem, opt_index); }; /** - * Returns whether this field is set. - * @return {boolean} + * Clears the list making it empty but non-null. + * @return {!proto.cc.arduino.cli.commands.v1.BoardSearchResponse} returns this */ -proto.cc.arduino.cli.commands.v1.BoardListItem.prototype.hasPlatform = function() { - return jspb.Message.getField(this, 6) != null; +proto.cc.arduino.cli.commands.v1.BoardSearchResponse.prototype.clearBoardsList = function() { + return this.setBoardsList([]); }; @@ -5119,8 +5292,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.BoardSearchRequest.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.BoardSearchRequest.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest.toObject(opt_includeInstance, this); }; @@ -5129,15 +5302,15 @@ proto.cc.arduino.cli.commands.v1.BoardSearchRequest.prototype.toObject = functio * @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.BoardSearchRequest} msg The msg instance to transform. + * @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.BoardSearchRequest.toObject = function(includeInstance, msg) { +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), - searchArgs: jspb.Message.getFieldWithDefault(msg, 2, ""), - includeHiddenBoards: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) + propertiesMap: (f = msg.getPropertiesMap()) ? f.toObject(includeInstance, undefined) : [], + useCloudApiForUnknownBoardDetection: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) }; if (includeInstance) { @@ -5151,23 +5324,23 @@ proto.cc.arduino.cli.commands.v1.BoardSearchRequest.toObject = function(includeI /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.BoardSearchRequest} + * @return {!proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest} */ -proto.cc.arduino.cli.commands.v1.BoardSearchRequest.deserializeBinary = function(bytes) { +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.BoardSearchRequest; - return proto.cc.arduino.cli.commands.v1.BoardSearchRequest.deserializeBinaryFromReader(msg, reader); + 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.BoardSearchRequest} msg The message object to deserialize into. + * @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.BoardSearchRequest} + * @return {!proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest} */ -proto.cc.arduino.cli.commands.v1.BoardSearchRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -5180,12 +5353,14 @@ proto.cc.arduino.cli.commands.v1.BoardSearchRequest.deserializeBinaryFromReader msg.setInstance(value); break; case 2: - var value = /** @type {string} */ (reader.readString()); - msg.setSearchArgs(value); + 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.setIncludeHiddenBoards(value); + msg.setUseCloudApiForUnknownBoardDetection(value); break; default: reader.skipField(); @@ -5200,9 +5375,9 @@ proto.cc.arduino.cli.commands.v1.BoardSearchRequest.deserializeBinaryFromReader * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.BoardSearchRequest.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.BoardSearchRequest.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -5210,11 +5385,11 @@ proto.cc.arduino.cli.commands.v1.BoardSearchRequest.prototype.serializeBinary = /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.BoardSearchRequest} message + * @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.BoardSearchRequest.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getInstance(); if (f != null) { @@ -5224,14 +5399,11 @@ proto.cc.arduino.cli.commands.v1.BoardSearchRequest.serializeBinaryToWriter = fu cc_arduino_cli_commands_v1_common_pb.Instance.serializeBinaryToWriter ); } - f = message.getSearchArgs(); - if (f.length > 0) { - writer.writeString( - 2, - f - ); + f = message.getPropertiesMap(true); + if (f && f.getLength() > 0) { + f.serializeBinary(2, writer, jspb.BinaryWriter.prototype.writeString, jspb.BinaryWriter.prototype.writeString); } - f = message.getIncludeHiddenBoards(); + f = message.getUseCloudApiForUnknownBoardDetection(); if (f) { writer.writeBool( 3, @@ -5245,7 +5417,7 @@ proto.cc.arduino.cli.commands.v1.BoardSearchRequest.serializeBinaryToWriter = fu * optional Instance instance = 1; * @return {?proto.cc.arduino.cli.commands.v1.Instance} */ -proto.cc.arduino.cli.commands.v1.BoardSearchRequest.prototype.getInstance = function() { +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)); }; @@ -5253,18 +5425,18 @@ proto.cc.arduino.cli.commands.v1.BoardSearchRequest.prototype.getInstance = func /** * @param {?proto.cc.arduino.cli.commands.v1.Instance|undefined} value - * @return {!proto.cc.arduino.cli.commands.v1.BoardSearchRequest} returns this + * @return {!proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest} returns this */ -proto.cc.arduino.cli.commands.v1.BoardSearchRequest.prototype.setInstance = function(value) { +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.BoardSearchRequest} returns this + * @return {!proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest} returns this */ -proto.cc.arduino.cli.commands.v1.BoardSearchRequest.prototype.clearInstance = function() { +proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest.prototype.clearInstance = function() { return this.setInstance(undefined); }; @@ -5273,43 +5445,47 @@ proto.cc.arduino.cli.commands.v1.BoardSearchRequest.prototype.clearInstance = fu * Returns whether this field is set. * @return {boolean} */ -proto.cc.arduino.cli.commands.v1.BoardSearchRequest.prototype.hasInstance = function() { +proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest.prototype.hasInstance = function() { return jspb.Message.getField(this, 1) != null; }; /** - * optional string search_args = 2; - * @return {string} + * 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.BoardSearchRequest.prototype.getSearchArgs = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +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)); }; /** - * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.BoardSearchRequest} returns this + * 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.BoardSearchRequest.prototype.setSearchArgs = function(value) { - return jspb.Message.setProto3StringField(this, 2, value); -}; +proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest.prototype.clearPropertiesMap = function() { + this.getPropertiesMap().clear(); + return this;}; /** - * optional bool include_hidden_boards = 3; + * optional bool use_cloud_api_for_unknown_board_detection = 3; * @return {boolean} */ -proto.cc.arduino.cli.commands.v1.BoardSearchRequest.prototype.getIncludeHiddenBoards = function() { +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.BoardSearchRequest} returns this + * @return {!proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest} returns this */ -proto.cc.arduino.cli.commands.v1.BoardSearchRequest.prototype.setIncludeHiddenBoards = function(value) { +proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest.prototype.setUseCloudApiForUnknownBoardDetection = function(value) { return jspb.Message.setProto3BooleanField(this, 3, value); }; @@ -5320,7 +5496,7 @@ proto.cc.arduino.cli.commands.v1.BoardSearchRequest.prototype.setIncludeHiddenBo * @private {!Array<number>} * @const */ -proto.cc.arduino.cli.commands.v1.BoardSearchResponse.repeatedFields_ = [1]; +proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse.repeatedFields_ = [1]; @@ -5337,8 +5513,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.BoardSearchResponse.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.BoardSearchResponse.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse.toObject(opt_includeInstance, this); }; @@ -5347,11 +5523,11 @@ proto.cc.arduino.cli.commands.v1.BoardSearchResponse.prototype.toObject = functi * @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.BoardSearchResponse} msg The msg instance to transform. + * @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.BoardSearchResponse.toObject = function(includeInstance, msg) { +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) @@ -5368,23 +5544,23 @@ proto.cc.arduino.cli.commands.v1.BoardSearchResponse.toObject = function(include /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.BoardSearchResponse} + * @return {!proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse} */ -proto.cc.arduino.cli.commands.v1.BoardSearchResponse.deserializeBinary = function(bytes) { +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.BoardSearchResponse; - return proto.cc.arduino.cli.commands.v1.BoardSearchResponse.deserializeBinaryFromReader(msg, reader); + 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.BoardSearchResponse} msg The message object to deserialize into. + * @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.BoardSearchResponse} + * @return {!proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse} */ -proto.cc.arduino.cli.commands.v1.BoardSearchResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -5409,9 +5585,9 @@ proto.cc.arduino.cli.commands.v1.BoardSearchResponse.deserializeBinaryFromReader * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.BoardSearchResponse.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.BoardSearchResponse.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -5419,11 +5595,11 @@ proto.cc.arduino.cli.commands.v1.BoardSearchResponse.prototype.serializeBinary = /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.BoardSearchResponse} message + * @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.BoardSearchResponse.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getBoardsList(); if (f.length > 0) { @@ -5440,7 +5616,7 @@ proto.cc.arduino.cli.commands.v1.BoardSearchResponse.serializeBinaryToWriter = f * repeated BoardListItem boards = 1; * @return {!Array<!proto.cc.arduino.cli.commands.v1.BoardListItem>} */ -proto.cc.arduino.cli.commands.v1.BoardSearchResponse.prototype.getBoardsList = function() { +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)); }; @@ -5448,9 +5624,9 @@ proto.cc.arduino.cli.commands.v1.BoardSearchResponse.prototype.getBoardsList = f /** * @param {!Array<!proto.cc.arduino.cli.commands.v1.BoardListItem>} value - * @return {!proto.cc.arduino.cli.commands.v1.BoardSearchResponse} returns this + * @return {!proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse} returns this */ -proto.cc.arduino.cli.commands.v1.BoardSearchResponse.prototype.setBoardsList = function(value) { +proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse.prototype.setBoardsList = function(value) { return jspb.Message.setRepeatedWrapperField(this, 1, value); }; @@ -5460,16 +5636,16 @@ proto.cc.arduino.cli.commands.v1.BoardSearchResponse.prototype.setBoardsList = f * @param {number=} opt_index * @return {!proto.cc.arduino.cli.commands.v1.BoardListItem} */ -proto.cc.arduino.cli.commands.v1.BoardSearchResponse.prototype.addBoards = function(opt_value, opt_index) { +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.BoardSearchResponse} returns this + * @return {!proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse} returns this */ -proto.cc.arduino.cli.commands.v1.BoardSearchResponse.prototype.clearBoardsList = function() { +proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse.prototype.clearBoardsList = function() { return this.setBoardsList([]); }; diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/commands_grpc_pb.d.ts b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/commands_grpc_pb.d.ts index 65af18363..d41e71c12 100644 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/commands_grpc_pb.d.ts +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/commands_grpc_pb.d.ts @@ -5,16 +5,17 @@ /* eslint-disable */ import * as grpc from "@grpc/grpc-js"; -import {handleClientStreamingCall} from "@grpc/grpc-js/build/src/server-call"; import * as cc_arduino_cli_commands_v1_commands_pb from "../../../../../cc/arduino/cli/commands/v1/commands_pb"; -import * as google_rpc_status_pb from "../../../../../google/rpc/status_pb"; -import * as cc_arduino_cli_commands_v1_common_pb from "../../../../../cc/arduino/cli/commands/v1/common_pb"; import * as cc_arduino_cli_commands_v1_board_pb from "../../../../../cc/arduino/cli/commands/v1/board_pb"; +import * as cc_arduino_cli_commands_v1_common_pb from "../../../../../cc/arduino/cli/commands/v1/common_pb"; import * as cc_arduino_cli_commands_v1_compile_pb from "../../../../../cc/arduino/cli/commands/v1/compile_pb"; import * as cc_arduino_cli_commands_v1_core_pb from "../../../../../cc/arduino/cli/commands/v1/core_pb"; +import * as cc_arduino_cli_commands_v1_debug_pb from "../../../../../cc/arduino/cli/commands/v1/debug_pb"; +import * as cc_arduino_cli_commands_v1_lib_pb from "../../../../../cc/arduino/cli/commands/v1/lib_pb"; import * as cc_arduino_cli_commands_v1_monitor_pb from "../../../../../cc/arduino/cli/commands/v1/monitor_pb"; +import * as cc_arduino_cli_commands_v1_settings_pb from "../../../../../cc/arduino/cli/commands/v1/settings_pb"; import * as cc_arduino_cli_commands_v1_upload_pb from "../../../../../cc/arduino/cli/commands/v1/upload_pb"; -import * as cc_arduino_cli_commands_v1_lib_pb from "../../../../../cc/arduino/cli/commands/v1/lib_pb"; +import * as google_rpc_status_pb from "../../../../../google/rpc/status_pb"; interface IArduinoCoreServiceService extends grpc.ServiceDefinition<grpc.UntypedServiceImplementation> { create: IArduinoCoreServiceService_ICreate; @@ -22,18 +23,16 @@ interface IArduinoCoreServiceService extends grpc.ServiceDefinition<grpc.Untyped destroy: IArduinoCoreServiceService_IDestroy; updateIndex: IArduinoCoreServiceService_IUpdateIndex; updateLibrariesIndex: IArduinoCoreServiceService_IUpdateLibrariesIndex; - updateCoreLibrariesIndex: IArduinoCoreServiceService_IUpdateCoreLibrariesIndex; - outdated: IArduinoCoreServiceService_IOutdated; - upgrade: IArduinoCoreServiceService_IUpgrade; version: IArduinoCoreServiceService_IVersion; newSketch: IArduinoCoreServiceService_INewSketch; loadSketch: IArduinoCoreServiceService_ILoadSketch; archiveSketch: IArduinoCoreServiceService_IArchiveSketch; + setSketchDefaults: IArduinoCoreServiceService_ISetSketchDefaults; boardDetails: IArduinoCoreServiceService_IBoardDetails; - boardAttach: IArduinoCoreServiceService_IBoardAttach; boardList: IArduinoCoreServiceService_IBoardList; boardListAll: IArduinoCoreServiceService_IBoardListAll; boardSearch: IArduinoCoreServiceService_IBoardSearch; + boardIdentify: IArduinoCoreServiceService_IBoardIdentify; boardListWatch: IArduinoCoreServiceService_IBoardListWatch; compile: IArduinoCoreServiceService_ICompile; platformInstall: IArduinoCoreServiceService_IPlatformInstall; @@ -46,7 +45,6 @@ interface IArduinoCoreServiceService extends grpc.ServiceDefinition<grpc.Untyped listProgrammersAvailableForUpload: IArduinoCoreServiceService_IListProgrammersAvailableForUpload; burnBootloader: IArduinoCoreServiceService_IBurnBootloader; platformSearch: IArduinoCoreServiceService_IPlatformSearch; - platformList: IArduinoCoreServiceService_IPlatformList; libraryDownload: IArduinoCoreServiceService_ILibraryDownload; libraryInstall: IArduinoCoreServiceService_ILibraryInstall; libraryUpgrade: IArduinoCoreServiceService_ILibraryUpgrade; @@ -59,6 +57,17 @@ interface IArduinoCoreServiceService extends grpc.ServiceDefinition<grpc.Untyped libraryList: IArduinoCoreServiceService_ILibraryList; monitor: IArduinoCoreServiceService_IMonitor; enumerateMonitorPortSettings: IArduinoCoreServiceService_IEnumerateMonitorPortSettings; + debug: IArduinoCoreServiceService_IDebug; + isDebugSupported: IArduinoCoreServiceService_IIsDebugSupported; + getDebugConfig: IArduinoCoreServiceService_IGetDebugConfig; + checkForArduinoCLIUpdates: IArduinoCoreServiceService_ICheckForArduinoCLIUpdates; + cleanDownloadCacheDirectory: IArduinoCoreServiceService_ICleanDownloadCacheDirectory; + configurationSave: IArduinoCoreServiceService_IConfigurationSave; + configurationOpen: IArduinoCoreServiceService_IConfigurationOpen; + configurationGet: IArduinoCoreServiceService_IConfigurationGet; + settingsEnumerate: IArduinoCoreServiceService_ISettingsEnumerate; + settingsGetValue: IArduinoCoreServiceService_ISettingsGetValue; + settingsSetValue: IArduinoCoreServiceService_ISettingsSetValue; } interface IArduinoCoreServiceService_ICreate extends grpc.MethodDefinition<cc_arduino_cli_commands_v1_commands_pb.CreateRequest, cc_arduino_cli_commands_v1_commands_pb.CreateResponse> { @@ -106,33 +115,6 @@ interface IArduinoCoreServiceService_IUpdateLibrariesIndex extends grpc.MethodDe responseSerialize: grpc.serialize<cc_arduino_cli_commands_v1_commands_pb.UpdateLibrariesIndexResponse>; responseDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_commands_pb.UpdateLibrariesIndexResponse>; } -interface IArduinoCoreServiceService_IUpdateCoreLibrariesIndex extends grpc.MethodDefinition<cc_arduino_cli_commands_v1_commands_pb.UpdateCoreLibrariesIndexRequest, cc_arduino_cli_commands_v1_commands_pb.UpdateCoreLibrariesIndexResponse> { - path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/UpdateCoreLibrariesIndex"; - requestStream: false; - responseStream: true; - requestSerialize: grpc.serialize<cc_arduino_cli_commands_v1_commands_pb.UpdateCoreLibrariesIndexRequest>; - requestDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_commands_pb.UpdateCoreLibrariesIndexRequest>; - responseSerialize: grpc.serialize<cc_arduino_cli_commands_v1_commands_pb.UpdateCoreLibrariesIndexResponse>; - responseDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_commands_pb.UpdateCoreLibrariesIndexResponse>; -} -interface IArduinoCoreServiceService_IOutdated extends grpc.MethodDefinition<cc_arduino_cli_commands_v1_commands_pb.OutdatedRequest, cc_arduino_cli_commands_v1_commands_pb.OutdatedResponse> { - path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/Outdated"; - requestStream: false; - responseStream: false; - requestSerialize: grpc.serialize<cc_arduino_cli_commands_v1_commands_pb.OutdatedRequest>; - requestDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_commands_pb.OutdatedRequest>; - responseSerialize: grpc.serialize<cc_arduino_cli_commands_v1_commands_pb.OutdatedResponse>; - responseDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_commands_pb.OutdatedResponse>; -} -interface IArduinoCoreServiceService_IUpgrade extends grpc.MethodDefinition<cc_arduino_cli_commands_v1_commands_pb.UpgradeRequest, cc_arduino_cli_commands_v1_commands_pb.UpgradeResponse> { - path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/Upgrade"; - requestStream: false; - responseStream: true; - requestSerialize: grpc.serialize<cc_arduino_cli_commands_v1_commands_pb.UpgradeRequest>; - requestDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_commands_pb.UpgradeRequest>; - responseSerialize: grpc.serialize<cc_arduino_cli_commands_v1_commands_pb.UpgradeResponse>; - responseDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_commands_pb.UpgradeResponse>; -} interface IArduinoCoreServiceService_IVersion extends grpc.MethodDefinition<cc_arduino_cli_commands_v1_commands_pb.VersionRequest, cc_arduino_cli_commands_v1_commands_pb.VersionResponse> { path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/Version"; requestStream: false; @@ -169,6 +151,15 @@ interface IArduinoCoreServiceService_IArchiveSketch extends grpc.MethodDefinitio responseSerialize: grpc.serialize<cc_arduino_cli_commands_v1_commands_pb.ArchiveSketchResponse>; responseDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_commands_pb.ArchiveSketchResponse>; } +interface IArduinoCoreServiceService_ISetSketchDefaults extends grpc.MethodDefinition<cc_arduino_cli_commands_v1_commands_pb.SetSketchDefaultsRequest, cc_arduino_cli_commands_v1_commands_pb.SetSketchDefaultsResponse> { + path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/SetSketchDefaults"; + requestStream: false; + responseStream: false; + requestSerialize: grpc.serialize<cc_arduino_cli_commands_v1_commands_pb.SetSketchDefaultsRequest>; + requestDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_commands_pb.SetSketchDefaultsRequest>; + responseSerialize: grpc.serialize<cc_arduino_cli_commands_v1_commands_pb.SetSketchDefaultsResponse>; + responseDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_commands_pb.SetSketchDefaultsResponse>; +} interface IArduinoCoreServiceService_IBoardDetails extends grpc.MethodDefinition<cc_arduino_cli_commands_v1_board_pb.BoardDetailsRequest, cc_arduino_cli_commands_v1_board_pb.BoardDetailsResponse> { path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/BoardDetails"; requestStream: false; @@ -178,15 +169,6 @@ interface IArduinoCoreServiceService_IBoardDetails extends grpc.MethodDefinition responseSerialize: grpc.serialize<cc_arduino_cli_commands_v1_board_pb.BoardDetailsResponse>; responseDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_board_pb.BoardDetailsResponse>; } -interface IArduinoCoreServiceService_IBoardAttach extends grpc.MethodDefinition<cc_arduino_cli_commands_v1_board_pb.BoardAttachRequest, cc_arduino_cli_commands_v1_board_pb.BoardAttachResponse> { - path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/BoardAttach"; - requestStream: false; - responseStream: true; - requestSerialize: grpc.serialize<cc_arduino_cli_commands_v1_board_pb.BoardAttachRequest>; - requestDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_board_pb.BoardAttachRequest>; - responseSerialize: grpc.serialize<cc_arduino_cli_commands_v1_board_pb.BoardAttachResponse>; - responseDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_board_pb.BoardAttachResponse>; -} interface IArduinoCoreServiceService_IBoardList extends grpc.MethodDefinition<cc_arduino_cli_commands_v1_board_pb.BoardListRequest, cc_arduino_cli_commands_v1_board_pb.BoardListResponse> { path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/BoardList"; requestStream: false; @@ -214,9 +196,18 @@ interface IArduinoCoreServiceService_IBoardSearch extends grpc.MethodDefinition< responseSerialize: grpc.serialize<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> { path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/BoardListWatch"; - requestStream: true; + requestStream: false; responseStream: true; requestSerialize: grpc.serialize<cc_arduino_cli_commands_v1_board_pb.BoardListWatchRequest>; requestDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_board_pb.BoardListWatchRequest>; @@ -322,15 +313,6 @@ interface IArduinoCoreServiceService_IPlatformSearch extends grpc.MethodDefiniti responseSerialize: grpc.serialize<cc_arduino_cli_commands_v1_core_pb.PlatformSearchResponse>; responseDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_core_pb.PlatformSearchResponse>; } -interface IArduinoCoreServiceService_IPlatformList extends grpc.MethodDefinition<cc_arduino_cli_commands_v1_core_pb.PlatformListRequest, cc_arduino_cli_commands_v1_core_pb.PlatformListResponse> { - path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/PlatformList"; - requestStream: false; - responseStream: false; - requestSerialize: grpc.serialize<cc_arduino_cli_commands_v1_core_pb.PlatformListRequest>; - requestDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_core_pb.PlatformListRequest>; - responseSerialize: grpc.serialize<cc_arduino_cli_commands_v1_core_pb.PlatformListResponse>; - responseDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_core_pb.PlatformListResponse>; -} interface IArduinoCoreServiceService_ILibraryDownload extends grpc.MethodDefinition<cc_arduino_cli_commands_v1_lib_pb.LibraryDownloadRequest, cc_arduino_cli_commands_v1_lib_pb.LibraryDownloadResponse> { path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/LibraryDownload"; requestStream: false; @@ -439,28 +421,125 @@ interface IArduinoCoreServiceService_IEnumerateMonitorPortSettings extends grpc. responseSerialize: grpc.serialize<cc_arduino_cli_commands_v1_monitor_pb.EnumerateMonitorPortSettingsResponse>; responseDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_monitor_pb.EnumerateMonitorPortSettingsResponse>; } +interface IArduinoCoreServiceService_IDebug extends grpc.MethodDefinition<cc_arduino_cli_commands_v1_debug_pb.DebugRequest, cc_arduino_cli_commands_v1_debug_pb.DebugResponse> { + path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/Debug"; + requestStream: true; + responseStream: true; + requestSerialize: grpc.serialize<cc_arduino_cli_commands_v1_debug_pb.DebugRequest>; + requestDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_debug_pb.DebugRequest>; + responseSerialize: grpc.serialize<cc_arduino_cli_commands_v1_debug_pb.DebugResponse>; + responseDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_debug_pb.DebugResponse>; +} +interface IArduinoCoreServiceService_IIsDebugSupported extends grpc.MethodDefinition<cc_arduino_cli_commands_v1_debug_pb.IsDebugSupportedRequest, cc_arduino_cli_commands_v1_debug_pb.IsDebugSupportedResponse> { + path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/IsDebugSupported"; + requestStream: false; + responseStream: false; + requestSerialize: grpc.serialize<cc_arduino_cli_commands_v1_debug_pb.IsDebugSupportedRequest>; + requestDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_debug_pb.IsDebugSupportedRequest>; + responseSerialize: grpc.serialize<cc_arduino_cli_commands_v1_debug_pb.IsDebugSupportedResponse>; + responseDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_debug_pb.IsDebugSupportedResponse>; +} +interface IArduinoCoreServiceService_IGetDebugConfig extends grpc.MethodDefinition<cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigRequest, cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigResponse> { + path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/GetDebugConfig"; + requestStream: false; + responseStream: false; + requestSerialize: grpc.serialize<cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigRequest>; + requestDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigRequest>; + responseSerialize: grpc.serialize<cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigResponse>; + responseDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigResponse>; +} +interface IArduinoCoreServiceService_ICheckForArduinoCLIUpdates extends grpc.MethodDefinition<cc_arduino_cli_commands_v1_commands_pb.CheckForArduinoCLIUpdatesRequest, cc_arduino_cli_commands_v1_commands_pb.CheckForArduinoCLIUpdatesResponse> { + path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/CheckForArduinoCLIUpdates"; + requestStream: false; + responseStream: false; + requestSerialize: grpc.serialize<cc_arduino_cli_commands_v1_commands_pb.CheckForArduinoCLIUpdatesRequest>; + requestDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_commands_pb.CheckForArduinoCLIUpdatesRequest>; + responseSerialize: grpc.serialize<cc_arduino_cli_commands_v1_commands_pb.CheckForArduinoCLIUpdatesResponse>; + responseDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_commands_pb.CheckForArduinoCLIUpdatesResponse>; +} +interface IArduinoCoreServiceService_ICleanDownloadCacheDirectory extends grpc.MethodDefinition<cc_arduino_cli_commands_v1_commands_pb.CleanDownloadCacheDirectoryRequest, cc_arduino_cli_commands_v1_commands_pb.CleanDownloadCacheDirectoryResponse> { + path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/CleanDownloadCacheDirectory"; + requestStream: false; + responseStream: false; + requestSerialize: grpc.serialize<cc_arduino_cli_commands_v1_commands_pb.CleanDownloadCacheDirectoryRequest>; + requestDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_commands_pb.CleanDownloadCacheDirectoryRequest>; + responseSerialize: grpc.serialize<cc_arduino_cli_commands_v1_commands_pb.CleanDownloadCacheDirectoryResponse>; + responseDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_commands_pb.CleanDownloadCacheDirectoryResponse>; +} +interface IArduinoCoreServiceService_IConfigurationSave extends grpc.MethodDefinition<cc_arduino_cli_commands_v1_settings_pb.ConfigurationSaveRequest, cc_arduino_cli_commands_v1_settings_pb.ConfigurationSaveResponse> { + path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/ConfigurationSave"; + requestStream: false; + responseStream: false; + requestSerialize: grpc.serialize<cc_arduino_cli_commands_v1_settings_pb.ConfigurationSaveRequest>; + requestDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_settings_pb.ConfigurationSaveRequest>; + responseSerialize: grpc.serialize<cc_arduino_cli_commands_v1_settings_pb.ConfigurationSaveResponse>; + responseDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_settings_pb.ConfigurationSaveResponse>; +} +interface IArduinoCoreServiceService_IConfigurationOpen extends grpc.MethodDefinition<cc_arduino_cli_commands_v1_settings_pb.ConfigurationOpenRequest, cc_arduino_cli_commands_v1_settings_pb.ConfigurationOpenResponse> { + path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/ConfigurationOpen"; + requestStream: false; + responseStream: false; + requestSerialize: grpc.serialize<cc_arduino_cli_commands_v1_settings_pb.ConfigurationOpenRequest>; + requestDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_settings_pb.ConfigurationOpenRequest>; + responseSerialize: grpc.serialize<cc_arduino_cli_commands_v1_settings_pb.ConfigurationOpenResponse>; + responseDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_settings_pb.ConfigurationOpenResponse>; +} +interface IArduinoCoreServiceService_IConfigurationGet extends grpc.MethodDefinition<cc_arduino_cli_commands_v1_settings_pb.ConfigurationGetRequest, cc_arduino_cli_commands_v1_settings_pb.ConfigurationGetResponse> { + path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/ConfigurationGet"; + requestStream: false; + responseStream: false; + requestSerialize: grpc.serialize<cc_arduino_cli_commands_v1_settings_pb.ConfigurationGetRequest>; + requestDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_settings_pb.ConfigurationGetRequest>; + responseSerialize: grpc.serialize<cc_arduino_cli_commands_v1_settings_pb.ConfigurationGetResponse>; + responseDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_settings_pb.ConfigurationGetResponse>; +} +interface IArduinoCoreServiceService_ISettingsEnumerate extends grpc.MethodDefinition<cc_arduino_cli_commands_v1_settings_pb.SettingsEnumerateRequest, cc_arduino_cli_commands_v1_settings_pb.SettingsEnumerateResponse> { + path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/SettingsEnumerate"; + requestStream: false; + responseStream: false; + requestSerialize: grpc.serialize<cc_arduino_cli_commands_v1_settings_pb.SettingsEnumerateRequest>; + requestDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_settings_pb.SettingsEnumerateRequest>; + responseSerialize: grpc.serialize<cc_arduino_cli_commands_v1_settings_pb.SettingsEnumerateResponse>; + responseDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_settings_pb.SettingsEnumerateResponse>; +} +interface IArduinoCoreServiceService_ISettingsGetValue extends grpc.MethodDefinition<cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueRequest, cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueResponse> { + path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/SettingsGetValue"; + requestStream: false; + responseStream: false; + requestSerialize: grpc.serialize<cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueRequest>; + requestDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueRequest>; + responseSerialize: grpc.serialize<cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueResponse>; + responseDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueResponse>; +} +interface IArduinoCoreServiceService_ISettingsSetValue extends grpc.MethodDefinition<cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueRequest, cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueResponse> { + path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/SettingsSetValue"; + requestStream: false; + responseStream: false; + requestSerialize: grpc.serialize<cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueRequest>; + requestDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueRequest>; + responseSerialize: grpc.serialize<cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueResponse>; + responseDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueResponse>; +} export const ArduinoCoreServiceService: IArduinoCoreServiceService; -export interface IArduinoCoreServiceServer { +export interface IArduinoCoreServiceServer extends grpc.UntypedServiceImplementation { create: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_commands_pb.CreateRequest, cc_arduino_cli_commands_v1_commands_pb.CreateResponse>; init: grpc.handleServerStreamingCall<cc_arduino_cli_commands_v1_commands_pb.InitRequest, cc_arduino_cli_commands_v1_commands_pb.InitResponse>; destroy: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_commands_pb.DestroyRequest, cc_arduino_cli_commands_v1_commands_pb.DestroyResponse>; updateIndex: grpc.handleServerStreamingCall<cc_arduino_cli_commands_v1_commands_pb.UpdateIndexRequest, cc_arduino_cli_commands_v1_commands_pb.UpdateIndexResponse>; updateLibrariesIndex: grpc.handleServerStreamingCall<cc_arduino_cli_commands_v1_commands_pb.UpdateLibrariesIndexRequest, cc_arduino_cli_commands_v1_commands_pb.UpdateLibrariesIndexResponse>; - updateCoreLibrariesIndex: grpc.handleServerStreamingCall<cc_arduino_cli_commands_v1_commands_pb.UpdateCoreLibrariesIndexRequest, cc_arduino_cli_commands_v1_commands_pb.UpdateCoreLibrariesIndexResponse>; - outdated: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_commands_pb.OutdatedRequest, cc_arduino_cli_commands_v1_commands_pb.OutdatedResponse>; - upgrade: grpc.handleServerStreamingCall<cc_arduino_cli_commands_v1_commands_pb.UpgradeRequest, cc_arduino_cli_commands_v1_commands_pb.UpgradeResponse>; version: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_commands_pb.VersionRequest, cc_arduino_cli_commands_v1_commands_pb.VersionResponse>; newSketch: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_commands_pb.NewSketchRequest, cc_arduino_cli_commands_v1_commands_pb.NewSketchResponse>; loadSketch: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_commands_pb.LoadSketchRequest, cc_arduino_cli_commands_v1_commands_pb.LoadSketchResponse>; archiveSketch: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_commands_pb.ArchiveSketchRequest, cc_arduino_cli_commands_v1_commands_pb.ArchiveSketchResponse>; + setSketchDefaults: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_commands_pb.SetSketchDefaultsRequest, cc_arduino_cli_commands_v1_commands_pb.SetSketchDefaultsResponse>; boardDetails: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_board_pb.BoardDetailsRequest, cc_arduino_cli_commands_v1_board_pb.BoardDetailsResponse>; - boardAttach: grpc.handleServerStreamingCall<cc_arduino_cli_commands_v1_board_pb.BoardAttachRequest, cc_arduino_cli_commands_v1_board_pb.BoardAttachResponse>; 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>; boardSearch: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_board_pb.BoardSearchRequest, cc_arduino_cli_commands_v1_board_pb.BoardSearchResponse>; - boardListWatch: grpc.handleBidiStreamingCall<cc_arduino_cli_commands_v1_board_pb.BoardListWatchRequest, cc_arduino_cli_commands_v1_board_pb.BoardListWatchResponse>; + 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>; 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>; platformDownload: grpc.handleServerStreamingCall<cc_arduino_cli_commands_v1_core_pb.PlatformDownloadRequest, cc_arduino_cli_commands_v1_core_pb.PlatformDownloadResponse>; @@ -472,7 +551,6 @@ export interface IArduinoCoreServiceServer { listProgrammersAvailableForUpload: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_upload_pb.ListProgrammersAvailableForUploadRequest, cc_arduino_cli_commands_v1_upload_pb.ListProgrammersAvailableForUploadResponse>; burnBootloader: grpc.handleServerStreamingCall<cc_arduino_cli_commands_v1_upload_pb.BurnBootloaderRequest, cc_arduino_cli_commands_v1_upload_pb.BurnBootloaderResponse>; platformSearch: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_core_pb.PlatformSearchRequest, cc_arduino_cli_commands_v1_core_pb.PlatformSearchResponse>; - platformList: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_core_pb.PlatformListRequest, cc_arduino_cli_commands_v1_core_pb.PlatformListResponse>; libraryDownload: grpc.handleServerStreamingCall<cc_arduino_cli_commands_v1_lib_pb.LibraryDownloadRequest, cc_arduino_cli_commands_v1_lib_pb.LibraryDownloadResponse>; libraryInstall: grpc.handleServerStreamingCall<cc_arduino_cli_commands_v1_lib_pb.LibraryInstallRequest, cc_arduino_cli_commands_v1_lib_pb.LibraryInstallResponse>; libraryUpgrade: grpc.handleServerStreamingCall<cc_arduino_cli_commands_v1_lib_pb.LibraryUpgradeRequest, cc_arduino_cli_commands_v1_lib_pb.LibraryUpgradeResponse>; @@ -485,6 +563,17 @@ export interface IArduinoCoreServiceServer { libraryList: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_lib_pb.LibraryListRequest, cc_arduino_cli_commands_v1_lib_pb.LibraryListResponse>; monitor: grpc.handleBidiStreamingCall<cc_arduino_cli_commands_v1_monitor_pb.MonitorRequest, cc_arduino_cli_commands_v1_monitor_pb.MonitorResponse>; enumerateMonitorPortSettings: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_monitor_pb.EnumerateMonitorPortSettingsRequest, cc_arduino_cli_commands_v1_monitor_pb.EnumerateMonitorPortSettingsResponse>; + debug: grpc.handleBidiStreamingCall<cc_arduino_cli_commands_v1_debug_pb.DebugRequest, cc_arduino_cli_commands_v1_debug_pb.DebugResponse>; + isDebugSupported: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_debug_pb.IsDebugSupportedRequest, cc_arduino_cli_commands_v1_debug_pb.IsDebugSupportedResponse>; + getDebugConfig: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigRequest, cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigResponse>; + checkForArduinoCLIUpdates: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_commands_pb.CheckForArduinoCLIUpdatesRequest, cc_arduino_cli_commands_v1_commands_pb.CheckForArduinoCLIUpdatesResponse>; + cleanDownloadCacheDirectory: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_commands_pb.CleanDownloadCacheDirectoryRequest, cc_arduino_cli_commands_v1_commands_pb.CleanDownloadCacheDirectoryResponse>; + configurationSave: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_settings_pb.ConfigurationSaveRequest, cc_arduino_cli_commands_v1_settings_pb.ConfigurationSaveResponse>; + configurationOpen: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_settings_pb.ConfigurationOpenRequest, cc_arduino_cli_commands_v1_settings_pb.ConfigurationOpenResponse>; + configurationGet: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_settings_pb.ConfigurationGetRequest, cc_arduino_cli_commands_v1_settings_pb.ConfigurationGetResponse>; + settingsEnumerate: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_settings_pb.SettingsEnumerateRequest, cc_arduino_cli_commands_v1_settings_pb.SettingsEnumerateResponse>; + settingsGetValue: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueRequest, cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueResponse>; + settingsSetValue: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueRequest, cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueResponse>; } export interface IArduinoCoreServiceClient { @@ -500,13 +589,6 @@ export interface IArduinoCoreServiceClient { updateIndex(request: cc_arduino_cli_commands_v1_commands_pb.UpdateIndexRequest, metadata?: grpc.Metadata, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_commands_pb.UpdateIndexResponse>; updateLibrariesIndex(request: cc_arduino_cli_commands_v1_commands_pb.UpdateLibrariesIndexRequest, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_commands_pb.UpdateLibrariesIndexResponse>; updateLibrariesIndex(request: cc_arduino_cli_commands_v1_commands_pb.UpdateLibrariesIndexRequest, metadata?: grpc.Metadata, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_commands_pb.UpdateLibrariesIndexResponse>; - updateCoreLibrariesIndex(request: cc_arduino_cli_commands_v1_commands_pb.UpdateCoreLibrariesIndexRequest, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_commands_pb.UpdateCoreLibrariesIndexResponse>; - updateCoreLibrariesIndex(request: cc_arduino_cli_commands_v1_commands_pb.UpdateCoreLibrariesIndexRequest, metadata?: grpc.Metadata, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_commands_pb.UpdateCoreLibrariesIndexResponse>; - outdated(request: cc_arduino_cli_commands_v1_commands_pb.OutdatedRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.OutdatedResponse) => void): grpc.ClientUnaryCall; - outdated(request: cc_arduino_cli_commands_v1_commands_pb.OutdatedRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.OutdatedResponse) => void): grpc.ClientUnaryCall; - outdated(request: cc_arduino_cli_commands_v1_commands_pb.OutdatedRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.OutdatedResponse) => void): grpc.ClientUnaryCall; - upgrade(request: cc_arduino_cli_commands_v1_commands_pb.UpgradeRequest, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_commands_pb.UpgradeResponse>; - upgrade(request: cc_arduino_cli_commands_v1_commands_pb.UpgradeRequest, metadata?: grpc.Metadata, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_commands_pb.UpgradeResponse>; version(request: cc_arduino_cli_commands_v1_commands_pb.VersionRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.VersionResponse) => void): grpc.ClientUnaryCall; version(request: cc_arduino_cli_commands_v1_commands_pb.VersionRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.VersionResponse) => void): grpc.ClientUnaryCall; version(request: cc_arduino_cli_commands_v1_commands_pb.VersionRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.VersionResponse) => void): grpc.ClientUnaryCall; @@ -519,11 +601,12 @@ export interface IArduinoCoreServiceClient { archiveSketch(request: cc_arduino_cli_commands_v1_commands_pb.ArchiveSketchRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.ArchiveSketchResponse) => void): grpc.ClientUnaryCall; archiveSketch(request: cc_arduino_cli_commands_v1_commands_pb.ArchiveSketchRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.ArchiveSketchResponse) => void): grpc.ClientUnaryCall; archiveSketch(request: cc_arduino_cli_commands_v1_commands_pb.ArchiveSketchRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.ArchiveSketchResponse) => void): grpc.ClientUnaryCall; + setSketchDefaults(request: cc_arduino_cli_commands_v1_commands_pb.SetSketchDefaultsRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.SetSketchDefaultsResponse) => void): grpc.ClientUnaryCall; + setSketchDefaults(request: cc_arduino_cli_commands_v1_commands_pb.SetSketchDefaultsRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.SetSketchDefaultsResponse) => void): grpc.ClientUnaryCall; + setSketchDefaults(request: cc_arduino_cli_commands_v1_commands_pb.SetSketchDefaultsRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.SetSketchDefaultsResponse) => void): grpc.ClientUnaryCall; boardDetails(request: cc_arduino_cli_commands_v1_board_pb.BoardDetailsRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_board_pb.BoardDetailsResponse) => void): grpc.ClientUnaryCall; boardDetails(request: cc_arduino_cli_commands_v1_board_pb.BoardDetailsRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_board_pb.BoardDetailsResponse) => void): grpc.ClientUnaryCall; boardDetails(request: cc_arduino_cli_commands_v1_board_pb.BoardDetailsRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_board_pb.BoardDetailsResponse) => void): grpc.ClientUnaryCall; - boardAttach(request: cc_arduino_cli_commands_v1_board_pb.BoardAttachRequest, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_board_pb.BoardAttachResponse>; - boardAttach(request: cc_arduino_cli_commands_v1_board_pb.BoardAttachRequest, metadata?: grpc.Metadata, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_board_pb.BoardAttachResponse>; boardList(request: cc_arduino_cli_commands_v1_board_pb.BoardListRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_board_pb.BoardListResponse) => void): grpc.ClientUnaryCall; boardList(request: cc_arduino_cli_commands_v1_board_pb.BoardListRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_board_pb.BoardListResponse) => void): grpc.ClientUnaryCall; boardList(request: cc_arduino_cli_commands_v1_board_pb.BoardListRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_board_pb.BoardListResponse) => void): grpc.ClientUnaryCall; @@ -533,9 +616,11 @@ 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, 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; - boardListWatch(): grpc.ClientDuplexStream<cc_arduino_cli_commands_v1_board_pb.BoardListWatchRequest, cc_arduino_cli_commands_v1_board_pb.BoardListWatchResponse>; - boardListWatch(options: Partial<grpc.CallOptions>): grpc.ClientDuplexStream<cc_arduino_cli_commands_v1_board_pb.BoardListWatchRequest, cc_arduino_cli_commands_v1_board_pb.BoardListWatchResponse>; - boardListWatch(metadata: grpc.Metadata, options?: Partial<grpc.CallOptions>): grpc.ClientDuplexStream<cc_arduino_cli_commands_v1_board_pb.BoardListWatchRequest, cc_arduino_cli_commands_v1_board_pb.BoardListWatchResponse>; + 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, 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, metadata?: grpc.Metadata, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_compile_pb.CompileResponse>; platformInstall(request: cc_arduino_cli_commands_v1_core_pb.PlatformInstallRequest, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_core_pb.PlatformInstallResponse>; @@ -561,9 +646,6 @@ export interface IArduinoCoreServiceClient { platformSearch(request: cc_arduino_cli_commands_v1_core_pb.PlatformSearchRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_core_pb.PlatformSearchResponse) => void): grpc.ClientUnaryCall; platformSearch(request: cc_arduino_cli_commands_v1_core_pb.PlatformSearchRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_core_pb.PlatformSearchResponse) => void): grpc.ClientUnaryCall; platformSearch(request: cc_arduino_cli_commands_v1_core_pb.PlatformSearchRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_core_pb.PlatformSearchResponse) => void): grpc.ClientUnaryCall; - platformList(request: cc_arduino_cli_commands_v1_core_pb.PlatformListRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_core_pb.PlatformListResponse) => void): grpc.ClientUnaryCall; - platformList(request: cc_arduino_cli_commands_v1_core_pb.PlatformListRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_core_pb.PlatformListResponse) => void): grpc.ClientUnaryCall; - platformList(request: cc_arduino_cli_commands_v1_core_pb.PlatformListRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_core_pb.PlatformListResponse) => void): grpc.ClientUnaryCall; libraryDownload(request: cc_arduino_cli_commands_v1_lib_pb.LibraryDownloadRequest, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_lib_pb.LibraryDownloadResponse>; libraryDownload(request: cc_arduino_cli_commands_v1_lib_pb.LibraryDownloadRequest, metadata?: grpc.Metadata, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_lib_pb.LibraryDownloadResponse>; libraryInstall(request: cc_arduino_cli_commands_v1_lib_pb.LibraryInstallRequest, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_lib_pb.LibraryInstallResponse>; @@ -593,6 +675,39 @@ export interface IArduinoCoreServiceClient { enumerateMonitorPortSettings(request: cc_arduino_cli_commands_v1_monitor_pb.EnumerateMonitorPortSettingsRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_monitor_pb.EnumerateMonitorPortSettingsResponse) => void): grpc.ClientUnaryCall; enumerateMonitorPortSettings(request: cc_arduino_cli_commands_v1_monitor_pb.EnumerateMonitorPortSettingsRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_monitor_pb.EnumerateMonitorPortSettingsResponse) => void): grpc.ClientUnaryCall; enumerateMonitorPortSettings(request: cc_arduino_cli_commands_v1_monitor_pb.EnumerateMonitorPortSettingsRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_monitor_pb.EnumerateMonitorPortSettingsResponse) => void): grpc.ClientUnaryCall; + debug(): grpc.ClientDuplexStream<cc_arduino_cli_commands_v1_debug_pb.DebugRequest, cc_arduino_cli_commands_v1_debug_pb.DebugResponse>; + debug(options: Partial<grpc.CallOptions>): grpc.ClientDuplexStream<cc_arduino_cli_commands_v1_debug_pb.DebugRequest, cc_arduino_cli_commands_v1_debug_pb.DebugResponse>; + debug(metadata: grpc.Metadata, options?: Partial<grpc.CallOptions>): grpc.ClientDuplexStream<cc_arduino_cli_commands_v1_debug_pb.DebugRequest, cc_arduino_cli_commands_v1_debug_pb.DebugResponse>; + isDebugSupported(request: cc_arduino_cli_commands_v1_debug_pb.IsDebugSupportedRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_debug_pb.IsDebugSupportedResponse) => void): grpc.ClientUnaryCall; + isDebugSupported(request: cc_arduino_cli_commands_v1_debug_pb.IsDebugSupportedRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_debug_pb.IsDebugSupportedResponse) => void): grpc.ClientUnaryCall; + isDebugSupported(request: cc_arduino_cli_commands_v1_debug_pb.IsDebugSupportedRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_debug_pb.IsDebugSupportedResponse) => void): grpc.ClientUnaryCall; + getDebugConfig(request: cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigResponse) => void): grpc.ClientUnaryCall; + getDebugConfig(request: cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigResponse) => void): grpc.ClientUnaryCall; + getDebugConfig(request: cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigResponse) => void): grpc.ClientUnaryCall; + checkForArduinoCLIUpdates(request: cc_arduino_cli_commands_v1_commands_pb.CheckForArduinoCLIUpdatesRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.CheckForArduinoCLIUpdatesResponse) => void): grpc.ClientUnaryCall; + checkForArduinoCLIUpdates(request: cc_arduino_cli_commands_v1_commands_pb.CheckForArduinoCLIUpdatesRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.CheckForArduinoCLIUpdatesResponse) => void): grpc.ClientUnaryCall; + checkForArduinoCLIUpdates(request: cc_arduino_cli_commands_v1_commands_pb.CheckForArduinoCLIUpdatesRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.CheckForArduinoCLIUpdatesResponse) => void): grpc.ClientUnaryCall; + cleanDownloadCacheDirectory(request: cc_arduino_cli_commands_v1_commands_pb.CleanDownloadCacheDirectoryRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.CleanDownloadCacheDirectoryResponse) => void): grpc.ClientUnaryCall; + cleanDownloadCacheDirectory(request: cc_arduino_cli_commands_v1_commands_pb.CleanDownloadCacheDirectoryRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.CleanDownloadCacheDirectoryResponse) => void): grpc.ClientUnaryCall; + cleanDownloadCacheDirectory(request: cc_arduino_cli_commands_v1_commands_pb.CleanDownloadCacheDirectoryRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.CleanDownloadCacheDirectoryResponse) => void): grpc.ClientUnaryCall; + configurationSave(request: cc_arduino_cli_commands_v1_settings_pb.ConfigurationSaveRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.ConfigurationSaveResponse) => void): grpc.ClientUnaryCall; + configurationSave(request: cc_arduino_cli_commands_v1_settings_pb.ConfigurationSaveRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.ConfigurationSaveResponse) => void): grpc.ClientUnaryCall; + configurationSave(request: cc_arduino_cli_commands_v1_settings_pb.ConfigurationSaveRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.ConfigurationSaveResponse) => void): grpc.ClientUnaryCall; + configurationOpen(request: cc_arduino_cli_commands_v1_settings_pb.ConfigurationOpenRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.ConfigurationOpenResponse) => void): grpc.ClientUnaryCall; + configurationOpen(request: cc_arduino_cli_commands_v1_settings_pb.ConfigurationOpenRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.ConfigurationOpenResponse) => void): grpc.ClientUnaryCall; + configurationOpen(request: cc_arduino_cli_commands_v1_settings_pb.ConfigurationOpenRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.ConfigurationOpenResponse) => void): grpc.ClientUnaryCall; + configurationGet(request: cc_arduino_cli_commands_v1_settings_pb.ConfigurationGetRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.ConfigurationGetResponse) => void): grpc.ClientUnaryCall; + configurationGet(request: cc_arduino_cli_commands_v1_settings_pb.ConfigurationGetRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.ConfigurationGetResponse) => void): grpc.ClientUnaryCall; + configurationGet(request: cc_arduino_cli_commands_v1_settings_pb.ConfigurationGetRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.ConfigurationGetResponse) => void): grpc.ClientUnaryCall; + settingsEnumerate(request: cc_arduino_cli_commands_v1_settings_pb.SettingsEnumerateRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsEnumerateResponse) => void): grpc.ClientUnaryCall; + settingsEnumerate(request: cc_arduino_cli_commands_v1_settings_pb.SettingsEnumerateRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsEnumerateResponse) => void): grpc.ClientUnaryCall; + settingsEnumerate(request: cc_arduino_cli_commands_v1_settings_pb.SettingsEnumerateRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsEnumerateResponse) => void): grpc.ClientUnaryCall; + settingsGetValue(request: cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueResponse) => void): grpc.ClientUnaryCall; + settingsGetValue(request: cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueResponse) => void): grpc.ClientUnaryCall; + settingsGetValue(request: cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueResponse) => void): grpc.ClientUnaryCall; + settingsSetValue(request: cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueResponse) => void): grpc.ClientUnaryCall; + settingsSetValue(request: cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueResponse) => void): grpc.ClientUnaryCall; + settingsSetValue(request: cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueResponse) => void): grpc.ClientUnaryCall; } export class ArduinoCoreServiceClient extends grpc.Client implements IArduinoCoreServiceClient { @@ -609,13 +724,6 @@ export class ArduinoCoreServiceClient extends grpc.Client implements IArduinoCor public updateIndex(request: cc_arduino_cli_commands_v1_commands_pb.UpdateIndexRequest, metadata?: grpc.Metadata, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_commands_pb.UpdateIndexResponse>; public updateLibrariesIndex(request: cc_arduino_cli_commands_v1_commands_pb.UpdateLibrariesIndexRequest, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_commands_pb.UpdateLibrariesIndexResponse>; public updateLibrariesIndex(request: cc_arduino_cli_commands_v1_commands_pb.UpdateLibrariesIndexRequest, metadata?: grpc.Metadata, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_commands_pb.UpdateLibrariesIndexResponse>; - public updateCoreLibrariesIndex(request: cc_arduino_cli_commands_v1_commands_pb.UpdateCoreLibrariesIndexRequest, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_commands_pb.UpdateCoreLibrariesIndexResponse>; - public updateCoreLibrariesIndex(request: cc_arduino_cli_commands_v1_commands_pb.UpdateCoreLibrariesIndexRequest, metadata?: grpc.Metadata, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_commands_pb.UpdateCoreLibrariesIndexResponse>; - public outdated(request: cc_arduino_cli_commands_v1_commands_pb.OutdatedRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.OutdatedResponse) => void): grpc.ClientUnaryCall; - public outdated(request: cc_arduino_cli_commands_v1_commands_pb.OutdatedRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.OutdatedResponse) => void): grpc.ClientUnaryCall; - public outdated(request: cc_arduino_cli_commands_v1_commands_pb.OutdatedRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.OutdatedResponse) => void): grpc.ClientUnaryCall; - public upgrade(request: cc_arduino_cli_commands_v1_commands_pb.UpgradeRequest, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_commands_pb.UpgradeResponse>; - public upgrade(request: cc_arduino_cli_commands_v1_commands_pb.UpgradeRequest, metadata?: grpc.Metadata, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_commands_pb.UpgradeResponse>; public version(request: cc_arduino_cli_commands_v1_commands_pb.VersionRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.VersionResponse) => void): grpc.ClientUnaryCall; public version(request: cc_arduino_cli_commands_v1_commands_pb.VersionRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.VersionResponse) => void): grpc.ClientUnaryCall; public version(request: cc_arduino_cli_commands_v1_commands_pb.VersionRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.VersionResponse) => void): grpc.ClientUnaryCall; @@ -628,11 +736,12 @@ export class ArduinoCoreServiceClient extends grpc.Client implements IArduinoCor public archiveSketch(request: cc_arduino_cli_commands_v1_commands_pb.ArchiveSketchRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.ArchiveSketchResponse) => void): grpc.ClientUnaryCall; public archiveSketch(request: cc_arduino_cli_commands_v1_commands_pb.ArchiveSketchRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.ArchiveSketchResponse) => void): grpc.ClientUnaryCall; public archiveSketch(request: cc_arduino_cli_commands_v1_commands_pb.ArchiveSketchRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.ArchiveSketchResponse) => void): grpc.ClientUnaryCall; + public setSketchDefaults(request: cc_arduino_cli_commands_v1_commands_pb.SetSketchDefaultsRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.SetSketchDefaultsResponse) => void): grpc.ClientUnaryCall; + public setSketchDefaults(request: cc_arduino_cli_commands_v1_commands_pb.SetSketchDefaultsRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.SetSketchDefaultsResponse) => void): grpc.ClientUnaryCall; + public setSketchDefaults(request: cc_arduino_cli_commands_v1_commands_pb.SetSketchDefaultsRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.SetSketchDefaultsResponse) => void): grpc.ClientUnaryCall; public boardDetails(request: cc_arduino_cli_commands_v1_board_pb.BoardDetailsRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_board_pb.BoardDetailsResponse) => void): grpc.ClientUnaryCall; public boardDetails(request: cc_arduino_cli_commands_v1_board_pb.BoardDetailsRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_board_pb.BoardDetailsResponse) => void): grpc.ClientUnaryCall; public boardDetails(request: cc_arduino_cli_commands_v1_board_pb.BoardDetailsRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_board_pb.BoardDetailsResponse) => void): grpc.ClientUnaryCall; - public boardAttach(request: cc_arduino_cli_commands_v1_board_pb.BoardAttachRequest, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_board_pb.BoardAttachResponse>; - public boardAttach(request: cc_arduino_cli_commands_v1_board_pb.BoardAttachRequest, metadata?: grpc.Metadata, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_board_pb.BoardAttachResponse>; public boardList(request: cc_arduino_cli_commands_v1_board_pb.BoardListRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_board_pb.BoardListResponse) => void): grpc.ClientUnaryCall; public boardList(request: cc_arduino_cli_commands_v1_board_pb.BoardListRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_board_pb.BoardListResponse) => void): grpc.ClientUnaryCall; public boardList(request: cc_arduino_cli_commands_v1_board_pb.BoardListRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_board_pb.BoardListResponse) => void): grpc.ClientUnaryCall; @@ -642,8 +751,11 @@ 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, 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 boardListWatch(options?: Partial<grpc.CallOptions>): grpc.ClientDuplexStream<cc_arduino_cli_commands_v1_board_pb.BoardListWatchRequest, cc_arduino_cli_commands_v1_board_pb.BoardListWatchResponse>; - public boardListWatch(metadata?: grpc.Metadata, options?: Partial<grpc.CallOptions>): grpc.ClientDuplexStream<cc_arduino_cli_commands_v1_board_pb.BoardListWatchRequest, cc_arduino_cli_commands_v1_board_pb.BoardListWatchResponse>; + 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, 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, metadata?: grpc.Metadata, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_compile_pb.CompileResponse>; public platformInstall(request: cc_arduino_cli_commands_v1_core_pb.PlatformInstallRequest, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_core_pb.PlatformInstallResponse>; @@ -669,9 +781,6 @@ export class ArduinoCoreServiceClient extends grpc.Client implements IArduinoCor public platformSearch(request: cc_arduino_cli_commands_v1_core_pb.PlatformSearchRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_core_pb.PlatformSearchResponse) => void): grpc.ClientUnaryCall; public platformSearch(request: cc_arduino_cli_commands_v1_core_pb.PlatformSearchRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_core_pb.PlatformSearchResponse) => void): grpc.ClientUnaryCall; public platformSearch(request: cc_arduino_cli_commands_v1_core_pb.PlatformSearchRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_core_pb.PlatformSearchResponse) => void): grpc.ClientUnaryCall; - public platformList(request: cc_arduino_cli_commands_v1_core_pb.PlatformListRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_core_pb.PlatformListResponse) => void): grpc.ClientUnaryCall; - public platformList(request: cc_arduino_cli_commands_v1_core_pb.PlatformListRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_core_pb.PlatformListResponse) => void): grpc.ClientUnaryCall; - public platformList(request: cc_arduino_cli_commands_v1_core_pb.PlatformListRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_core_pb.PlatformListResponse) => void): grpc.ClientUnaryCall; public libraryDownload(request: cc_arduino_cli_commands_v1_lib_pb.LibraryDownloadRequest, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_lib_pb.LibraryDownloadResponse>; public libraryDownload(request: cc_arduino_cli_commands_v1_lib_pb.LibraryDownloadRequest, metadata?: grpc.Metadata, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_lib_pb.LibraryDownloadResponse>; public libraryInstall(request: cc_arduino_cli_commands_v1_lib_pb.LibraryInstallRequest, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_lib_pb.LibraryInstallResponse>; @@ -700,4 +809,36 @@ export class ArduinoCoreServiceClient extends grpc.Client implements IArduinoCor public enumerateMonitorPortSettings(request: cc_arduino_cli_commands_v1_monitor_pb.EnumerateMonitorPortSettingsRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_monitor_pb.EnumerateMonitorPortSettingsResponse) => void): grpc.ClientUnaryCall; public enumerateMonitorPortSettings(request: cc_arduino_cli_commands_v1_monitor_pb.EnumerateMonitorPortSettingsRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_monitor_pb.EnumerateMonitorPortSettingsResponse) => void): grpc.ClientUnaryCall; public enumerateMonitorPortSettings(request: cc_arduino_cli_commands_v1_monitor_pb.EnumerateMonitorPortSettingsRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_monitor_pb.EnumerateMonitorPortSettingsResponse) => void): grpc.ClientUnaryCall; + public debug(options?: Partial<grpc.CallOptions>): grpc.ClientDuplexStream<cc_arduino_cli_commands_v1_debug_pb.DebugRequest, cc_arduino_cli_commands_v1_debug_pb.DebugResponse>; + public debug(metadata?: grpc.Metadata, options?: Partial<grpc.CallOptions>): grpc.ClientDuplexStream<cc_arduino_cli_commands_v1_debug_pb.DebugRequest, cc_arduino_cli_commands_v1_debug_pb.DebugResponse>; + public isDebugSupported(request: cc_arduino_cli_commands_v1_debug_pb.IsDebugSupportedRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_debug_pb.IsDebugSupportedResponse) => void): grpc.ClientUnaryCall; + public isDebugSupported(request: cc_arduino_cli_commands_v1_debug_pb.IsDebugSupportedRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_debug_pb.IsDebugSupportedResponse) => void): grpc.ClientUnaryCall; + public isDebugSupported(request: cc_arduino_cli_commands_v1_debug_pb.IsDebugSupportedRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_debug_pb.IsDebugSupportedResponse) => void): grpc.ClientUnaryCall; + public getDebugConfig(request: cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigResponse) => void): grpc.ClientUnaryCall; + public getDebugConfig(request: cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigResponse) => void): grpc.ClientUnaryCall; + public getDebugConfig(request: cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigResponse) => void): grpc.ClientUnaryCall; + public checkForArduinoCLIUpdates(request: cc_arduino_cli_commands_v1_commands_pb.CheckForArduinoCLIUpdatesRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.CheckForArduinoCLIUpdatesResponse) => void): grpc.ClientUnaryCall; + public checkForArduinoCLIUpdates(request: cc_arduino_cli_commands_v1_commands_pb.CheckForArduinoCLIUpdatesRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.CheckForArduinoCLIUpdatesResponse) => void): grpc.ClientUnaryCall; + public checkForArduinoCLIUpdates(request: cc_arduino_cli_commands_v1_commands_pb.CheckForArduinoCLIUpdatesRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.CheckForArduinoCLIUpdatesResponse) => void): grpc.ClientUnaryCall; + public cleanDownloadCacheDirectory(request: cc_arduino_cli_commands_v1_commands_pb.CleanDownloadCacheDirectoryRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.CleanDownloadCacheDirectoryResponse) => void): grpc.ClientUnaryCall; + public cleanDownloadCacheDirectory(request: cc_arduino_cli_commands_v1_commands_pb.CleanDownloadCacheDirectoryRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.CleanDownloadCacheDirectoryResponse) => void): grpc.ClientUnaryCall; + public cleanDownloadCacheDirectory(request: cc_arduino_cli_commands_v1_commands_pb.CleanDownloadCacheDirectoryRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.CleanDownloadCacheDirectoryResponse) => void): grpc.ClientUnaryCall; + public configurationSave(request: cc_arduino_cli_commands_v1_settings_pb.ConfigurationSaveRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.ConfigurationSaveResponse) => void): grpc.ClientUnaryCall; + public configurationSave(request: cc_arduino_cli_commands_v1_settings_pb.ConfigurationSaveRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.ConfigurationSaveResponse) => void): grpc.ClientUnaryCall; + public configurationSave(request: cc_arduino_cli_commands_v1_settings_pb.ConfigurationSaveRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.ConfigurationSaveResponse) => void): grpc.ClientUnaryCall; + public configurationOpen(request: cc_arduino_cli_commands_v1_settings_pb.ConfigurationOpenRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.ConfigurationOpenResponse) => void): grpc.ClientUnaryCall; + public configurationOpen(request: cc_arduino_cli_commands_v1_settings_pb.ConfigurationOpenRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.ConfigurationOpenResponse) => void): grpc.ClientUnaryCall; + public configurationOpen(request: cc_arduino_cli_commands_v1_settings_pb.ConfigurationOpenRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.ConfigurationOpenResponse) => void): grpc.ClientUnaryCall; + public configurationGet(request: cc_arduino_cli_commands_v1_settings_pb.ConfigurationGetRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.ConfigurationGetResponse) => void): grpc.ClientUnaryCall; + public configurationGet(request: cc_arduino_cli_commands_v1_settings_pb.ConfigurationGetRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.ConfigurationGetResponse) => void): grpc.ClientUnaryCall; + public configurationGet(request: cc_arduino_cli_commands_v1_settings_pb.ConfigurationGetRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.ConfigurationGetResponse) => void): grpc.ClientUnaryCall; + public settingsEnumerate(request: cc_arduino_cli_commands_v1_settings_pb.SettingsEnumerateRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsEnumerateResponse) => void): grpc.ClientUnaryCall; + public settingsEnumerate(request: cc_arduino_cli_commands_v1_settings_pb.SettingsEnumerateRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsEnumerateResponse) => void): grpc.ClientUnaryCall; + public settingsEnumerate(request: cc_arduino_cli_commands_v1_settings_pb.SettingsEnumerateRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsEnumerateResponse) => void): grpc.ClientUnaryCall; + public settingsGetValue(request: cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueResponse) => void): grpc.ClientUnaryCall; + public settingsGetValue(request: cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueResponse) => void): grpc.ClientUnaryCall; + public settingsGetValue(request: cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueResponse) => void): grpc.ClientUnaryCall; + public settingsSetValue(request: cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueResponse) => void): grpc.ClientUnaryCall; + public settingsSetValue(request: cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueResponse) => void): grpc.ClientUnaryCall; + public settingsSetValue(request: cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueResponse) => void): grpc.ClientUnaryCall; } diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/commands_grpc_pb.js b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/commands_grpc_pb.js index 2251692b1..70dd7a851 100644 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/commands_grpc_pb.js +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/commands_grpc_pb.js @@ -3,29 +3,32 @@ // Original file comments: // This file is part of arduino-cli. // -// Copyright 2020 ARDUINO SA (http://www.arduino.cc/) +// Copyright 2024 ARDUINO SA (https://www.arduino.cc/) // -// This software is released under the GNU General Public License version 3, -// which covers the main part of arduino-cli. -// The terms of this license can be found at: -// https://www.gnu.org/licenses/gpl-3.0.en.html +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at // -// You can be released from the requirements of the above licenses by purchasing -// a commercial license. Buying such a license is mandatory if you want to -// modify or otherwise use the software for commercial activities involving the -// Arduino software without disclosing the source code of your own applications. -// To purchase a commercial license, send an email to license@arduino.cc. +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. // 'use strict'; var cc_arduino_cli_commands_v1_commands_pb = require('../../../../../cc/arduino/cli/commands/v1/commands_pb.js'); -var google_rpc_status_pb = require('../../../../../google/rpc/status_pb.js'); -var cc_arduino_cli_commands_v1_common_pb = require('../../../../../cc/arduino/cli/commands/v1/common_pb.js'); var cc_arduino_cli_commands_v1_board_pb = require('../../../../../cc/arduino/cli/commands/v1/board_pb.js'); +var cc_arduino_cli_commands_v1_common_pb = require('../../../../../cc/arduino/cli/commands/v1/common_pb.js'); var cc_arduino_cli_commands_v1_compile_pb = require('../../../../../cc/arduino/cli/commands/v1/compile_pb.js'); var cc_arduino_cli_commands_v1_core_pb = require('../../../../../cc/arduino/cli/commands/v1/core_pb.js'); +var cc_arduino_cli_commands_v1_debug_pb = require('../../../../../cc/arduino/cli/commands/v1/debug_pb.js'); +var cc_arduino_cli_commands_v1_lib_pb = require('../../../../../cc/arduino/cli/commands/v1/lib_pb.js'); var cc_arduino_cli_commands_v1_monitor_pb = require('../../../../../cc/arduino/cli/commands/v1/monitor_pb.js'); +var cc_arduino_cli_commands_v1_settings_pb = require('../../../../../cc/arduino/cli/commands/v1/settings_pb.js'); var cc_arduino_cli_commands_v1_upload_pb = require('../../../../../cc/arduino/cli/commands/v1/upload_pb.js'); -var cc_arduino_cli_commands_v1_lib_pb = require('../../../../../cc/arduino/cli/commands/v1/lib_pb.js'); +var google_rpc_status_pb = require('../../../../../google/rpc/status_pb.js'); function serialize_cc_arduino_cli_commands_v1_ArchiveSketchRequest(arg) { if (!(arg instanceof cc_arduino_cli_commands_v1_commands_pb.ArchiveSketchRequest)) { @@ -49,48 +52,48 @@ function deserialize_cc_arduino_cli_commands_v1_ArchiveSketchResponse(buffer_arg return cc_arduino_cli_commands_v1_commands_pb.ArchiveSketchResponse.deserializeBinary(new Uint8Array(buffer_arg)); } -function serialize_cc_arduino_cli_commands_v1_BoardAttachRequest(arg) { - if (!(arg instanceof cc_arduino_cli_commands_v1_board_pb.BoardAttachRequest)) { - throw new Error('Expected argument of type cc.arduino.cli.commands.v1.BoardAttachRequest'); +function serialize_cc_arduino_cli_commands_v1_BoardDetailsRequest(arg) { + if (!(arg instanceof cc_arduino_cli_commands_v1_board_pb.BoardDetailsRequest)) { + throw new Error('Expected argument of type cc.arduino.cli.commands.v1.BoardDetailsRequest'); } return Buffer.from(arg.serializeBinary()); } -function deserialize_cc_arduino_cli_commands_v1_BoardAttachRequest(buffer_arg) { - return cc_arduino_cli_commands_v1_board_pb.BoardAttachRequest.deserializeBinary(new Uint8Array(buffer_arg)); +function deserialize_cc_arduino_cli_commands_v1_BoardDetailsRequest(buffer_arg) { + return cc_arduino_cli_commands_v1_board_pb.BoardDetailsRequest.deserializeBinary(new Uint8Array(buffer_arg)); } -function serialize_cc_arduino_cli_commands_v1_BoardAttachResponse(arg) { - if (!(arg instanceof cc_arduino_cli_commands_v1_board_pb.BoardAttachResponse)) { - throw new Error('Expected argument of type cc.arduino.cli.commands.v1.BoardAttachResponse'); +function serialize_cc_arduino_cli_commands_v1_BoardDetailsResponse(arg) { + if (!(arg instanceof cc_arduino_cli_commands_v1_board_pb.BoardDetailsResponse)) { + throw new Error('Expected argument of type cc.arduino.cli.commands.v1.BoardDetailsResponse'); } return Buffer.from(arg.serializeBinary()); } -function deserialize_cc_arduino_cli_commands_v1_BoardAttachResponse(buffer_arg) { - return cc_arduino_cli_commands_v1_board_pb.BoardAttachResponse.deserializeBinary(new Uint8Array(buffer_arg)); +function deserialize_cc_arduino_cli_commands_v1_BoardDetailsResponse(buffer_arg) { + return cc_arduino_cli_commands_v1_board_pb.BoardDetailsResponse.deserializeBinary(new Uint8Array(buffer_arg)); } -function serialize_cc_arduino_cli_commands_v1_BoardDetailsRequest(arg) { - if (!(arg instanceof cc_arduino_cli_commands_v1_board_pb.BoardDetailsRequest)) { - throw new Error('Expected argument of type cc.arduino.cli.commands.v1.BoardDetailsRequest'); +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_BoardDetailsRequest(buffer_arg) { - return cc_arduino_cli_commands_v1_board_pb.BoardDetailsRequest.deserializeBinary(new Uint8Array(buffer_arg)); +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_BoardDetailsResponse(arg) { - if (!(arg instanceof cc_arduino_cli_commands_v1_board_pb.BoardDetailsResponse)) { - throw new Error('Expected argument of type cc.arduino.cli.commands.v1.BoardDetailsResponse'); +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_BoardDetailsResponse(buffer_arg) { - return cc_arduino_cli_commands_v1_board_pb.BoardDetailsResponse.deserializeBinary(new Uint8Array(buffer_arg)); +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) { @@ -203,6 +206,50 @@ function deserialize_cc_arduino_cli_commands_v1_BurnBootloaderResponse(buffer_ar return cc_arduino_cli_commands_v1_upload_pb.BurnBootloaderResponse.deserializeBinary(new Uint8Array(buffer_arg)); } +function serialize_cc_arduino_cli_commands_v1_CheckForArduinoCLIUpdatesRequest(arg) { + if (!(arg instanceof cc_arduino_cli_commands_v1_commands_pb.CheckForArduinoCLIUpdatesRequest)) { + throw new Error('Expected argument of type cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesRequest'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_cc_arduino_cli_commands_v1_CheckForArduinoCLIUpdatesRequest(buffer_arg) { + return cc_arduino_cli_commands_v1_commands_pb.CheckForArduinoCLIUpdatesRequest.deserializeBinary(new Uint8Array(buffer_arg)); +} + +function serialize_cc_arduino_cli_commands_v1_CheckForArduinoCLIUpdatesResponse(arg) { + if (!(arg instanceof cc_arduino_cli_commands_v1_commands_pb.CheckForArduinoCLIUpdatesResponse)) { + throw new Error('Expected argument of type cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesResponse'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_cc_arduino_cli_commands_v1_CheckForArduinoCLIUpdatesResponse(buffer_arg) { + return cc_arduino_cli_commands_v1_commands_pb.CheckForArduinoCLIUpdatesResponse.deserializeBinary(new Uint8Array(buffer_arg)); +} + +function serialize_cc_arduino_cli_commands_v1_CleanDownloadCacheDirectoryRequest(arg) { + if (!(arg instanceof cc_arduino_cli_commands_v1_commands_pb.CleanDownloadCacheDirectoryRequest)) { + throw new Error('Expected argument of type cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryRequest'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_cc_arduino_cli_commands_v1_CleanDownloadCacheDirectoryRequest(buffer_arg) { + return cc_arduino_cli_commands_v1_commands_pb.CleanDownloadCacheDirectoryRequest.deserializeBinary(new Uint8Array(buffer_arg)); +} + +function serialize_cc_arduino_cli_commands_v1_CleanDownloadCacheDirectoryResponse(arg) { + if (!(arg instanceof cc_arduino_cli_commands_v1_commands_pb.CleanDownloadCacheDirectoryResponse)) { + throw new Error('Expected argument of type cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryResponse'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_cc_arduino_cli_commands_v1_CleanDownloadCacheDirectoryResponse(buffer_arg) { + return cc_arduino_cli_commands_v1_commands_pb.CleanDownloadCacheDirectoryResponse.deserializeBinary(new Uint8Array(buffer_arg)); +} + function serialize_cc_arduino_cli_commands_v1_CompileRequest(arg) { if (!(arg instanceof cc_arduino_cli_commands_v1_compile_pb.CompileRequest)) { throw new Error('Expected argument of type cc.arduino.cli.commands.v1.CompileRequest'); @@ -225,6 +272,72 @@ function deserialize_cc_arduino_cli_commands_v1_CompileResponse(buffer_arg) { return cc_arduino_cli_commands_v1_compile_pb.CompileResponse.deserializeBinary(new Uint8Array(buffer_arg)); } +function serialize_cc_arduino_cli_commands_v1_ConfigurationGetRequest(arg) { + if (!(arg instanceof cc_arduino_cli_commands_v1_settings_pb.ConfigurationGetRequest)) { + throw new Error('Expected argument of type cc.arduino.cli.commands.v1.ConfigurationGetRequest'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_cc_arduino_cli_commands_v1_ConfigurationGetRequest(buffer_arg) { + return cc_arduino_cli_commands_v1_settings_pb.ConfigurationGetRequest.deserializeBinary(new Uint8Array(buffer_arg)); +} + +function serialize_cc_arduino_cli_commands_v1_ConfigurationGetResponse(arg) { + if (!(arg instanceof cc_arduino_cli_commands_v1_settings_pb.ConfigurationGetResponse)) { + throw new Error('Expected argument of type cc.arduino.cli.commands.v1.ConfigurationGetResponse'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_cc_arduino_cli_commands_v1_ConfigurationGetResponse(buffer_arg) { + return cc_arduino_cli_commands_v1_settings_pb.ConfigurationGetResponse.deserializeBinary(new Uint8Array(buffer_arg)); +} + +function serialize_cc_arduino_cli_commands_v1_ConfigurationOpenRequest(arg) { + if (!(arg instanceof cc_arduino_cli_commands_v1_settings_pb.ConfigurationOpenRequest)) { + throw new Error('Expected argument of type cc.arduino.cli.commands.v1.ConfigurationOpenRequest'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_cc_arduino_cli_commands_v1_ConfigurationOpenRequest(buffer_arg) { + return cc_arduino_cli_commands_v1_settings_pb.ConfigurationOpenRequest.deserializeBinary(new Uint8Array(buffer_arg)); +} + +function serialize_cc_arduino_cli_commands_v1_ConfigurationOpenResponse(arg) { + if (!(arg instanceof cc_arduino_cli_commands_v1_settings_pb.ConfigurationOpenResponse)) { + throw new Error('Expected argument of type cc.arduino.cli.commands.v1.ConfigurationOpenResponse'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_cc_arduino_cli_commands_v1_ConfigurationOpenResponse(buffer_arg) { + return cc_arduino_cli_commands_v1_settings_pb.ConfigurationOpenResponse.deserializeBinary(new Uint8Array(buffer_arg)); +} + +function serialize_cc_arduino_cli_commands_v1_ConfigurationSaveRequest(arg) { + if (!(arg instanceof cc_arduino_cli_commands_v1_settings_pb.ConfigurationSaveRequest)) { + throw new Error('Expected argument of type cc.arduino.cli.commands.v1.ConfigurationSaveRequest'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_cc_arduino_cli_commands_v1_ConfigurationSaveRequest(buffer_arg) { + return cc_arduino_cli_commands_v1_settings_pb.ConfigurationSaveRequest.deserializeBinary(new Uint8Array(buffer_arg)); +} + +function serialize_cc_arduino_cli_commands_v1_ConfigurationSaveResponse(arg) { + if (!(arg instanceof cc_arduino_cli_commands_v1_settings_pb.ConfigurationSaveResponse)) { + throw new Error('Expected argument of type cc.arduino.cli.commands.v1.ConfigurationSaveResponse'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_cc_arduino_cli_commands_v1_ConfigurationSaveResponse(buffer_arg) { + return cc_arduino_cli_commands_v1_settings_pb.ConfigurationSaveResponse.deserializeBinary(new Uint8Array(buffer_arg)); +} + function serialize_cc_arduino_cli_commands_v1_CreateRequest(arg) { if (!(arg instanceof cc_arduino_cli_commands_v1_commands_pb.CreateRequest)) { throw new Error('Expected argument of type cc.arduino.cli.commands.v1.CreateRequest'); @@ -247,6 +360,28 @@ function deserialize_cc_arduino_cli_commands_v1_CreateResponse(buffer_arg) { return cc_arduino_cli_commands_v1_commands_pb.CreateResponse.deserializeBinary(new Uint8Array(buffer_arg)); } +function serialize_cc_arduino_cli_commands_v1_DebugRequest(arg) { + if (!(arg instanceof cc_arduino_cli_commands_v1_debug_pb.DebugRequest)) { + throw new Error('Expected argument of type cc.arduino.cli.commands.v1.DebugRequest'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_cc_arduino_cli_commands_v1_DebugRequest(buffer_arg) { + return cc_arduino_cli_commands_v1_debug_pb.DebugRequest.deserializeBinary(new Uint8Array(buffer_arg)); +} + +function serialize_cc_arduino_cli_commands_v1_DebugResponse(arg) { + if (!(arg instanceof cc_arduino_cli_commands_v1_debug_pb.DebugResponse)) { + throw new Error('Expected argument of type cc.arduino.cli.commands.v1.DebugResponse'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_cc_arduino_cli_commands_v1_DebugResponse(buffer_arg) { + return cc_arduino_cli_commands_v1_debug_pb.DebugResponse.deserializeBinary(new Uint8Array(buffer_arg)); +} + function serialize_cc_arduino_cli_commands_v1_DestroyRequest(arg) { if (!(arg instanceof cc_arduino_cli_commands_v1_commands_pb.DestroyRequest)) { throw new Error('Expected argument of type cc.arduino.cli.commands.v1.DestroyRequest'); @@ -291,6 +426,28 @@ function deserialize_cc_arduino_cli_commands_v1_EnumerateMonitorPortSettingsResp return cc_arduino_cli_commands_v1_monitor_pb.EnumerateMonitorPortSettingsResponse.deserializeBinary(new Uint8Array(buffer_arg)); } +function serialize_cc_arduino_cli_commands_v1_GetDebugConfigRequest(arg) { + if (!(arg instanceof cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigRequest)) { + throw new Error('Expected argument of type cc.arduino.cli.commands.v1.GetDebugConfigRequest'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_cc_arduino_cli_commands_v1_GetDebugConfigRequest(buffer_arg) { + return cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigRequest.deserializeBinary(new Uint8Array(buffer_arg)); +} + +function serialize_cc_arduino_cli_commands_v1_GetDebugConfigResponse(arg) { + if (!(arg instanceof cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigResponse)) { + throw new Error('Expected argument of type cc.arduino.cli.commands.v1.GetDebugConfigResponse'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_cc_arduino_cli_commands_v1_GetDebugConfigResponse(buffer_arg) { + return cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigResponse.deserializeBinary(new Uint8Array(buffer_arg)); +} + function serialize_cc_arduino_cli_commands_v1_GitLibraryInstallRequest(arg) { if (!(arg instanceof cc_arduino_cli_commands_v1_lib_pb.GitLibraryInstallRequest)) { throw new Error('Expected argument of type cc.arduino.cli.commands.v1.GitLibraryInstallRequest'); @@ -335,6 +492,28 @@ function deserialize_cc_arduino_cli_commands_v1_InitResponse(buffer_arg) { return cc_arduino_cli_commands_v1_commands_pb.InitResponse.deserializeBinary(new Uint8Array(buffer_arg)); } +function serialize_cc_arduino_cli_commands_v1_IsDebugSupportedRequest(arg) { + if (!(arg instanceof cc_arduino_cli_commands_v1_debug_pb.IsDebugSupportedRequest)) { + throw new Error('Expected argument of type cc.arduino.cli.commands.v1.IsDebugSupportedRequest'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_cc_arduino_cli_commands_v1_IsDebugSupportedRequest(buffer_arg) { + return cc_arduino_cli_commands_v1_debug_pb.IsDebugSupportedRequest.deserializeBinary(new Uint8Array(buffer_arg)); +} + +function serialize_cc_arduino_cli_commands_v1_IsDebugSupportedResponse(arg) { + if (!(arg instanceof cc_arduino_cli_commands_v1_debug_pb.IsDebugSupportedResponse)) { + throw new Error('Expected argument of type cc.arduino.cli.commands.v1.IsDebugSupportedResponse'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_cc_arduino_cli_commands_v1_IsDebugSupportedResponse(buffer_arg) { + return cc_arduino_cli_commands_v1_debug_pb.IsDebugSupportedResponse.deserializeBinary(new Uint8Array(buffer_arg)); +} + function serialize_cc_arduino_cli_commands_v1_LibraryDownloadRequest(arg) { if (!(arg instanceof cc_arduino_cli_commands_v1_lib_pb.LibraryDownloadRequest)) { throw new Error('Expected argument of type cc.arduino.cli.commands.v1.LibraryDownloadRequest'); @@ -599,28 +778,6 @@ function deserialize_cc_arduino_cli_commands_v1_NewSketchResponse(buffer_arg) { return cc_arduino_cli_commands_v1_commands_pb.NewSketchResponse.deserializeBinary(new Uint8Array(buffer_arg)); } -function serialize_cc_arduino_cli_commands_v1_OutdatedRequest(arg) { - if (!(arg instanceof cc_arduino_cli_commands_v1_commands_pb.OutdatedRequest)) { - throw new Error('Expected argument of type cc.arduino.cli.commands.v1.OutdatedRequest'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_cc_arduino_cli_commands_v1_OutdatedRequest(buffer_arg) { - return cc_arduino_cli_commands_v1_commands_pb.OutdatedRequest.deserializeBinary(new Uint8Array(buffer_arg)); -} - -function serialize_cc_arduino_cli_commands_v1_OutdatedResponse(arg) { - if (!(arg instanceof cc_arduino_cli_commands_v1_commands_pb.OutdatedResponse)) { - throw new Error('Expected argument of type cc.arduino.cli.commands.v1.OutdatedResponse'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_cc_arduino_cli_commands_v1_OutdatedResponse(buffer_arg) { - return cc_arduino_cli_commands_v1_commands_pb.OutdatedResponse.deserializeBinary(new Uint8Array(buffer_arg)); -} - function serialize_cc_arduino_cli_commands_v1_PlatformDownloadRequest(arg) { if (!(arg instanceof cc_arduino_cli_commands_v1_core_pb.PlatformDownloadRequest)) { throw new Error('Expected argument of type cc.arduino.cli.commands.v1.PlatformDownloadRequest'); @@ -665,28 +822,6 @@ function deserialize_cc_arduino_cli_commands_v1_PlatformInstallResponse(buffer_a return cc_arduino_cli_commands_v1_core_pb.PlatformInstallResponse.deserializeBinary(new Uint8Array(buffer_arg)); } -function serialize_cc_arduino_cli_commands_v1_PlatformListRequest(arg) { - if (!(arg instanceof cc_arduino_cli_commands_v1_core_pb.PlatformListRequest)) { - throw new Error('Expected argument of type cc.arduino.cli.commands.v1.PlatformListRequest'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_cc_arduino_cli_commands_v1_PlatformListRequest(buffer_arg) { - return cc_arduino_cli_commands_v1_core_pb.PlatformListRequest.deserializeBinary(new Uint8Array(buffer_arg)); -} - -function serialize_cc_arduino_cli_commands_v1_PlatformListResponse(arg) { - if (!(arg instanceof cc_arduino_cli_commands_v1_core_pb.PlatformListResponse)) { - throw new Error('Expected argument of type cc.arduino.cli.commands.v1.PlatformListResponse'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_cc_arduino_cli_commands_v1_PlatformListResponse(buffer_arg) { - return cc_arduino_cli_commands_v1_core_pb.PlatformListResponse.deserializeBinary(new Uint8Array(buffer_arg)); -} - function serialize_cc_arduino_cli_commands_v1_PlatformSearchRequest(arg) { if (!(arg instanceof cc_arduino_cli_commands_v1_core_pb.PlatformSearchRequest)) { throw new Error('Expected argument of type cc.arduino.cli.commands.v1.PlatformSearchRequest'); @@ -753,48 +888,114 @@ function deserialize_cc_arduino_cli_commands_v1_PlatformUpgradeResponse(buffer_a return cc_arduino_cli_commands_v1_core_pb.PlatformUpgradeResponse.deserializeBinary(new Uint8Array(buffer_arg)); } -function serialize_cc_arduino_cli_commands_v1_SupportedUserFieldsRequest(arg) { - if (!(arg instanceof cc_arduino_cli_commands_v1_upload_pb.SupportedUserFieldsRequest)) { - throw new Error('Expected argument of type cc.arduino.cli.commands.v1.SupportedUserFieldsRequest'); +function serialize_cc_arduino_cli_commands_v1_SetSketchDefaultsRequest(arg) { + if (!(arg instanceof cc_arduino_cli_commands_v1_commands_pb.SetSketchDefaultsRequest)) { + throw new Error('Expected argument of type cc.arduino.cli.commands.v1.SetSketchDefaultsRequest'); } return Buffer.from(arg.serializeBinary()); } -function deserialize_cc_arduino_cli_commands_v1_SupportedUserFieldsRequest(buffer_arg) { - return cc_arduino_cli_commands_v1_upload_pb.SupportedUserFieldsRequest.deserializeBinary(new Uint8Array(buffer_arg)); +function deserialize_cc_arduino_cli_commands_v1_SetSketchDefaultsRequest(buffer_arg) { + return cc_arduino_cli_commands_v1_commands_pb.SetSketchDefaultsRequest.deserializeBinary(new Uint8Array(buffer_arg)); } -function serialize_cc_arduino_cli_commands_v1_SupportedUserFieldsResponse(arg) { - if (!(arg instanceof cc_arduino_cli_commands_v1_upload_pb.SupportedUserFieldsResponse)) { - throw new Error('Expected argument of type cc.arduino.cli.commands.v1.SupportedUserFieldsResponse'); +function serialize_cc_arduino_cli_commands_v1_SetSketchDefaultsResponse(arg) { + if (!(arg instanceof cc_arduino_cli_commands_v1_commands_pb.SetSketchDefaultsResponse)) { + throw new Error('Expected argument of type cc.arduino.cli.commands.v1.SetSketchDefaultsResponse'); } return Buffer.from(arg.serializeBinary()); } -function deserialize_cc_arduino_cli_commands_v1_SupportedUserFieldsResponse(buffer_arg) { - return cc_arduino_cli_commands_v1_upload_pb.SupportedUserFieldsResponse.deserializeBinary(new Uint8Array(buffer_arg)); +function deserialize_cc_arduino_cli_commands_v1_SetSketchDefaultsResponse(buffer_arg) { + return cc_arduino_cli_commands_v1_commands_pb.SetSketchDefaultsResponse.deserializeBinary(new Uint8Array(buffer_arg)); +} + +function serialize_cc_arduino_cli_commands_v1_SettingsEnumerateRequest(arg) { + if (!(arg instanceof cc_arduino_cli_commands_v1_settings_pb.SettingsEnumerateRequest)) { + throw new Error('Expected argument of type cc.arduino.cli.commands.v1.SettingsEnumerateRequest'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_cc_arduino_cli_commands_v1_SettingsEnumerateRequest(buffer_arg) { + return cc_arduino_cli_commands_v1_settings_pb.SettingsEnumerateRequest.deserializeBinary(new Uint8Array(buffer_arg)); +} + +function serialize_cc_arduino_cli_commands_v1_SettingsEnumerateResponse(arg) { + if (!(arg instanceof cc_arduino_cli_commands_v1_settings_pb.SettingsEnumerateResponse)) { + throw new Error('Expected argument of type cc.arduino.cli.commands.v1.SettingsEnumerateResponse'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_cc_arduino_cli_commands_v1_SettingsEnumerateResponse(buffer_arg) { + return cc_arduino_cli_commands_v1_settings_pb.SettingsEnumerateResponse.deserializeBinary(new Uint8Array(buffer_arg)); +} + +function serialize_cc_arduino_cli_commands_v1_SettingsGetValueRequest(arg) { + if (!(arg instanceof cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueRequest)) { + throw new Error('Expected argument of type cc.arduino.cli.commands.v1.SettingsGetValueRequest'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_cc_arduino_cli_commands_v1_SettingsGetValueRequest(buffer_arg) { + return cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueRequest.deserializeBinary(new Uint8Array(buffer_arg)); +} + +function serialize_cc_arduino_cli_commands_v1_SettingsGetValueResponse(arg) { + if (!(arg instanceof cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueResponse)) { + throw new Error('Expected argument of type cc.arduino.cli.commands.v1.SettingsGetValueResponse'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_cc_arduino_cli_commands_v1_SettingsGetValueResponse(buffer_arg) { + return cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueResponse.deserializeBinary(new Uint8Array(buffer_arg)); +} + +function serialize_cc_arduino_cli_commands_v1_SettingsSetValueRequest(arg) { + if (!(arg instanceof cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueRequest)) { + throw new Error('Expected argument of type cc.arduino.cli.commands.v1.SettingsSetValueRequest'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_cc_arduino_cli_commands_v1_SettingsSetValueRequest(buffer_arg) { + return cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueRequest.deserializeBinary(new Uint8Array(buffer_arg)); } -function serialize_cc_arduino_cli_commands_v1_UpdateCoreLibrariesIndexRequest(arg) { - if (!(arg instanceof cc_arduino_cli_commands_v1_commands_pb.UpdateCoreLibrariesIndexRequest)) { - throw new Error('Expected argument of type cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexRequest'); +function serialize_cc_arduino_cli_commands_v1_SettingsSetValueResponse(arg) { + if (!(arg instanceof cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueResponse)) { + throw new Error('Expected argument of type cc.arduino.cli.commands.v1.SettingsSetValueResponse'); } return Buffer.from(arg.serializeBinary()); } -function deserialize_cc_arduino_cli_commands_v1_UpdateCoreLibrariesIndexRequest(buffer_arg) { - return cc_arduino_cli_commands_v1_commands_pb.UpdateCoreLibrariesIndexRequest.deserializeBinary(new Uint8Array(buffer_arg)); +function deserialize_cc_arduino_cli_commands_v1_SettingsSetValueResponse(buffer_arg) { + return cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueResponse.deserializeBinary(new Uint8Array(buffer_arg)); } -function serialize_cc_arduino_cli_commands_v1_UpdateCoreLibrariesIndexResponse(arg) { - if (!(arg instanceof cc_arduino_cli_commands_v1_commands_pb.UpdateCoreLibrariesIndexResponse)) { - throw new Error('Expected argument of type cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexResponse'); +function serialize_cc_arduino_cli_commands_v1_SupportedUserFieldsRequest(arg) { + if (!(arg instanceof cc_arduino_cli_commands_v1_upload_pb.SupportedUserFieldsRequest)) { + throw new Error('Expected argument of type cc.arduino.cli.commands.v1.SupportedUserFieldsRequest'); } return Buffer.from(arg.serializeBinary()); } -function deserialize_cc_arduino_cli_commands_v1_UpdateCoreLibrariesIndexResponse(buffer_arg) { - return cc_arduino_cli_commands_v1_commands_pb.UpdateCoreLibrariesIndexResponse.deserializeBinary(new Uint8Array(buffer_arg)); +function deserialize_cc_arduino_cli_commands_v1_SupportedUserFieldsRequest(buffer_arg) { + return cc_arduino_cli_commands_v1_upload_pb.SupportedUserFieldsRequest.deserializeBinary(new Uint8Array(buffer_arg)); +} + +function serialize_cc_arduino_cli_commands_v1_SupportedUserFieldsResponse(arg) { + if (!(arg instanceof cc_arduino_cli_commands_v1_upload_pb.SupportedUserFieldsResponse)) { + throw new Error('Expected argument of type cc.arduino.cli.commands.v1.SupportedUserFieldsResponse'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_cc_arduino_cli_commands_v1_SupportedUserFieldsResponse(buffer_arg) { + return cc_arduino_cli_commands_v1_upload_pb.SupportedUserFieldsResponse.deserializeBinary(new Uint8Array(buffer_arg)); } function serialize_cc_arduino_cli_commands_v1_UpdateIndexRequest(arg) { @@ -841,28 +1042,6 @@ function deserialize_cc_arduino_cli_commands_v1_UpdateLibrariesIndexResponse(buf return cc_arduino_cli_commands_v1_commands_pb.UpdateLibrariesIndexResponse.deserializeBinary(new Uint8Array(buffer_arg)); } -function serialize_cc_arduino_cli_commands_v1_UpgradeRequest(arg) { - if (!(arg instanceof cc_arduino_cli_commands_v1_commands_pb.UpgradeRequest)) { - throw new Error('Expected argument of type cc.arduino.cli.commands.v1.UpgradeRequest'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_cc_arduino_cli_commands_v1_UpgradeRequest(buffer_arg) { - return cc_arduino_cli_commands_v1_commands_pb.UpgradeRequest.deserializeBinary(new Uint8Array(buffer_arg)); -} - -function serialize_cc_arduino_cli_commands_v1_UpgradeResponse(arg) { - if (!(arg instanceof cc_arduino_cli_commands_v1_commands_pb.UpgradeResponse)) { - throw new Error('Expected argument of type cc.arduino.cli.commands.v1.UpgradeResponse'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_cc_arduino_cli_commands_v1_UpgradeResponse(buffer_arg) { - return cc_arduino_cli_commands_v1_commands_pb.UpgradeResponse.deserializeBinary(new Uint8Array(buffer_arg)); -} - function serialize_cc_arduino_cli_commands_v1_UploadRequest(arg) { if (!(arg instanceof cc_arduino_cli_commands_v1_upload_pb.UploadRequest)) { throw new Error('Expected argument of type cc.arduino.cli.commands.v1.UploadRequest'); @@ -952,9 +1131,9 @@ function deserialize_cc_arduino_cli_commands_v1_ZipLibraryInstallResponse(buffer } -// The main Arduino Platform service API +// The main Arduino Platform service API. var ArduinoCoreServiceService = exports['cc.arduino.cli.commands.v1.ArduinoCoreService'] = { - // Create a new Arduino Core instance + // Create a new Arduino Core instance. create: { path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/Create', requestStream: false, @@ -967,7 +1146,7 @@ create: { responseDeserialize: deserialize_cc_arduino_cli_commands_v1_CreateResponse, }, // Initializes an existing Arduino Core instance by loading platforms and -// libraries +// libraries. init: { path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/Init', requestStream: false, @@ -979,7 +1158,7 @@ init: { responseSerialize: serialize_cc_arduino_cli_commands_v1_InitResponse, responseDeserialize: deserialize_cc_arduino_cli_commands_v1_InitResponse, }, - // Destroy an instance of the Arduino Core Service + // Destroy an instance of the Arduino Core Service. destroy: { path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/Destroy', requestStream: false, @@ -991,7 +1170,7 @@ destroy: { responseSerialize: serialize_cc_arduino_cli_commands_v1_DestroyResponse, responseDeserialize: deserialize_cc_arduino_cli_commands_v1_DestroyResponse, }, - // Update package index of the Arduino Core Service + // Update package index of the Arduino Core Service. updateIndex: { path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/UpdateIndex', requestStream: false, @@ -1003,7 +1182,7 @@ updateIndex: { responseSerialize: serialize_cc_arduino_cli_commands_v1_UpdateIndexResponse, responseDeserialize: deserialize_cc_arduino_cli_commands_v1_UpdateIndexResponse, }, - // Update libraries index + // Update libraries index. updateLibrariesIndex: { path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/UpdateLibrariesIndex', requestStream: false, @@ -1015,42 +1194,6 @@ updateLibrariesIndex: { responseSerialize: serialize_cc_arduino_cli_commands_v1_UpdateLibrariesIndexResponse, responseDeserialize: deserialize_cc_arduino_cli_commands_v1_UpdateLibrariesIndexResponse, }, - // Update packages indexes for both Cores and Libraries -updateCoreLibrariesIndex: { - path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/UpdateCoreLibrariesIndex', - requestStream: false, - responseStream: true, - requestType: cc_arduino_cli_commands_v1_commands_pb.UpdateCoreLibrariesIndexRequest, - responseType: cc_arduino_cli_commands_v1_commands_pb.UpdateCoreLibrariesIndexResponse, - requestSerialize: serialize_cc_arduino_cli_commands_v1_UpdateCoreLibrariesIndexRequest, - requestDeserialize: deserialize_cc_arduino_cli_commands_v1_UpdateCoreLibrariesIndexRequest, - responseSerialize: serialize_cc_arduino_cli_commands_v1_UpdateCoreLibrariesIndexResponse, - responseDeserialize: deserialize_cc_arduino_cli_commands_v1_UpdateCoreLibrariesIndexResponse, - }, - // Outdated returns a message with a list of outdated Cores and Libraries -outdated: { - path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/Outdated', - requestStream: false, - responseStream: false, - requestType: cc_arduino_cli_commands_v1_commands_pb.OutdatedRequest, - responseType: cc_arduino_cli_commands_v1_commands_pb.OutdatedResponse, - requestSerialize: serialize_cc_arduino_cli_commands_v1_OutdatedRequest, - requestDeserialize: deserialize_cc_arduino_cli_commands_v1_OutdatedRequest, - responseSerialize: serialize_cc_arduino_cli_commands_v1_OutdatedResponse, - responseDeserialize: deserialize_cc_arduino_cli_commands_v1_OutdatedResponse, - }, - // Upgrade both Cores and Libraries -upgrade: { - path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/Upgrade', - requestStream: false, - responseStream: true, - requestType: cc_arduino_cli_commands_v1_commands_pb.UpgradeRequest, - responseType: cc_arduino_cli_commands_v1_commands_pb.UpgradeResponse, - requestSerialize: serialize_cc_arduino_cli_commands_v1_UpgradeRequest, - requestDeserialize: deserialize_cc_arduino_cli_commands_v1_UpgradeRequest, - responseSerialize: serialize_cc_arduino_cli_commands_v1_UpgradeResponse, - responseDeserialize: deserialize_cc_arduino_cli_commands_v1_UpgradeResponse, - }, // Get the version of Arduino CLI in use. version: { path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/Version', @@ -1063,7 +1206,7 @@ version: { responseSerialize: serialize_cc_arduino_cli_commands_v1_VersionResponse, responseDeserialize: deserialize_cc_arduino_cli_commands_v1_VersionResponse, }, - // Create a new Sketch + // Create a new Sketch. newSketch: { path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/NewSketch', requestStream: false, @@ -1075,7 +1218,7 @@ newSketch: { responseSerialize: serialize_cc_arduino_cli_commands_v1_NewSketchResponse, responseDeserialize: deserialize_cc_arduino_cli_commands_v1_NewSketchResponse, }, - // Returns all files composing a Sketch + // Returns all files composing a Sketch. loadSketch: { path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/LoadSketch', requestStream: false, @@ -1087,7 +1230,7 @@ loadSketch: { responseSerialize: serialize_cc_arduino_cli_commands_v1_LoadSketchResponse, responseDeserialize: deserialize_cc_arduino_cli_commands_v1_LoadSketchResponse, }, - // Creates a zip file containing all files of specified Sketch + // Creates a zip file containing all files of specified Sketch. archiveSketch: { path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/ArchiveSketch', requestStream: false, @@ -1099,10 +1242,21 @@ archiveSketch: { responseSerialize: serialize_cc_arduino_cli_commands_v1_ArchiveSketchResponse, responseDeserialize: deserialize_cc_arduino_cli_commands_v1_ArchiveSketchResponse, }, - // BOARD COMMANDS -// -------------- -// -// Requests details about a board + // Sets the sketch default FQBN and Port Address/Protocol in +// the sketch project file (sketch.yaml). These metadata can be retrieved +// using LoadSketch. +setSketchDefaults: { + path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/SetSketchDefaults', + requestStream: false, + responseStream: false, + requestType: cc_arduino_cli_commands_v1_commands_pb.SetSketchDefaultsRequest, + responseType: cc_arduino_cli_commands_v1_commands_pb.SetSketchDefaultsResponse, + requestSerialize: serialize_cc_arduino_cli_commands_v1_SetSketchDefaultsRequest, + requestDeserialize: deserialize_cc_arduino_cli_commands_v1_SetSketchDefaultsRequest, + responseSerialize: serialize_cc_arduino_cli_commands_v1_SetSketchDefaultsResponse, + responseDeserialize: deserialize_cc_arduino_cli_commands_v1_SetSketchDefaultsResponse, + }, + // Requests details about a board. boardDetails: { path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/BoardDetails', requestStream: false, @@ -1114,19 +1268,6 @@ boardDetails: { responseSerialize: serialize_cc_arduino_cli_commands_v1_BoardDetailsResponse, responseDeserialize: deserialize_cc_arduino_cli_commands_v1_BoardDetailsResponse, }, - // Attach a board to a sketch. When the `fqbn` field of a request is not -// provided, the FQBN of the attached board will be used. -boardAttach: { - path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/BoardAttach', - requestStream: false, - responseStream: true, - requestType: cc_arduino_cli_commands_v1_board_pb.BoardAttachRequest, - responseType: cc_arduino_cli_commands_v1_board_pb.BoardAttachResponse, - requestSerialize: serialize_cc_arduino_cli_commands_v1_BoardAttachRequest, - requestDeserialize: deserialize_cc_arduino_cli_commands_v1_BoardAttachRequest, - responseSerialize: serialize_cc_arduino_cli_commands_v1_BoardAttachResponse, - responseDeserialize: deserialize_cc_arduino_cli_commands_v1_BoardAttachResponse, - }, // List the boards currently connected to the computer. boardList: { path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/BoardList', @@ -1163,10 +1304,22 @@ boardSearch: { responseSerialize: serialize_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. boardListWatch: { path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/BoardListWatch', - requestStream: true, + requestStream: false, responseStream: true, requestType: cc_arduino_cli_commands_v1_board_pb.BoardListWatchRequest, responseType: cc_arduino_cli_commands_v1_board_pb.BoardListWatchResponse, @@ -1310,18 +1463,6 @@ platformSearch: { responseSerialize: serialize_cc_arduino_cli_commands_v1_PlatformSearchResponse, responseDeserialize: deserialize_cc_arduino_cli_commands_v1_PlatformSearchResponse, }, - // List all installed platforms. -platformList: { - path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/PlatformList', - requestStream: false, - responseStream: false, - requestType: cc_arduino_cli_commands_v1_core_pb.PlatformListRequest, - responseType: cc_arduino_cli_commands_v1_core_pb.PlatformListResponse, - requestSerialize: serialize_cc_arduino_cli_commands_v1_PlatformListRequest, - requestDeserialize: deserialize_cc_arduino_cli_commands_v1_PlatformListRequest, - responseSerialize: serialize_cc_arduino_cli_commands_v1_PlatformListResponse, - responseDeserialize: deserialize_cc_arduino_cli_commands_v1_PlatformListResponse, - }, // Download the archive file of an Arduino library in the libraries index to // the staging directory. libraryDownload: { @@ -1359,7 +1500,7 @@ libraryUpgrade: { responseSerialize: serialize_cc_arduino_cli_commands_v1_LibraryUpgradeResponse, responseDeserialize: deserialize_cc_arduino_cli_commands_v1_LibraryUpgradeResponse, }, - // Install a library from a Zip File + // Install a library from a Zip File. zipLibraryInstall: { path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/ZipLibraryInstall', requestStream: false, @@ -1371,7 +1512,7 @@ zipLibraryInstall: { responseSerialize: serialize_cc_arduino_cli_commands_v1_ZipLibraryInstallResponse, responseDeserialize: deserialize_cc_arduino_cli_commands_v1_ZipLibraryInstallResponse, }, - // Download and install a library from a git url + // Download and install a library from a git url. gitLibraryInstall: { path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/GitLibraryInstall', requestStream: false, @@ -1444,7 +1585,7 @@ libraryList: { responseSerialize: serialize_cc_arduino_cli_commands_v1_LibraryListResponse, responseDeserialize: deserialize_cc_arduino_cli_commands_v1_LibraryListResponse, }, - // Open a monitor connection to a board port + // Open a monitor connection to a board port. monitor: { path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/Monitor', requestStream: true, @@ -1456,7 +1597,7 @@ monitor: { responseSerialize: serialize_cc_arduino_cli_commands_v1_MonitorResponse, responseDeserialize: deserialize_cc_arduino_cli_commands_v1_MonitorResponse, }, - // Returns the parameters that can be set in the MonitorRequest calls + // Returns the parameters that can be set in the MonitorRequest calls. enumerateMonitorPortSettings: { path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/EnumerateMonitorPortSettings', requestStream: false, @@ -1468,7 +1609,137 @@ enumerateMonitorPortSettings: { responseSerialize: serialize_cc_arduino_cli_commands_v1_EnumerateMonitorPortSettingsResponse, responseDeserialize: deserialize_cc_arduino_cli_commands_v1_EnumerateMonitorPortSettingsResponse, }, + // Start a debug session and communicate with the debugger tool. +debug: { + path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/Debug', + requestStream: true, + responseStream: true, + requestType: cc_arduino_cli_commands_v1_debug_pb.DebugRequest, + responseType: cc_arduino_cli_commands_v1_debug_pb.DebugResponse, + requestSerialize: serialize_cc_arduino_cli_commands_v1_DebugRequest, + requestDeserialize: deserialize_cc_arduino_cli_commands_v1_DebugRequest, + responseSerialize: serialize_cc_arduino_cli_commands_v1_DebugResponse, + responseDeserialize: deserialize_cc_arduino_cli_commands_v1_DebugResponse, + }, + // Determine if debugging is suported given a specific configuration. +isDebugSupported: { + path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/IsDebugSupported', + requestStream: false, + responseStream: false, + requestType: cc_arduino_cli_commands_v1_debug_pb.IsDebugSupportedRequest, + responseType: cc_arduino_cli_commands_v1_debug_pb.IsDebugSupportedResponse, + requestSerialize: serialize_cc_arduino_cli_commands_v1_IsDebugSupportedRequest, + requestDeserialize: deserialize_cc_arduino_cli_commands_v1_IsDebugSupportedRequest, + responseSerialize: serialize_cc_arduino_cli_commands_v1_IsDebugSupportedResponse, + responseDeserialize: deserialize_cc_arduino_cli_commands_v1_IsDebugSupportedResponse, + }, + // Query the debugger information given a specific configuration. +getDebugConfig: { + path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/GetDebugConfig', + requestStream: false, + responseStream: false, + requestType: cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigRequest, + responseType: cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigResponse, + requestSerialize: serialize_cc_arduino_cli_commands_v1_GetDebugConfigRequest, + requestDeserialize: deserialize_cc_arduino_cli_commands_v1_GetDebugConfigRequest, + responseSerialize: serialize_cc_arduino_cli_commands_v1_GetDebugConfigResponse, + responseDeserialize: deserialize_cc_arduino_cli_commands_v1_GetDebugConfigResponse, + }, + // Check for updates to the Arduino CLI. +checkForArduinoCLIUpdates: { + path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/CheckForArduinoCLIUpdates', + requestStream: false, + responseStream: false, + requestType: cc_arduino_cli_commands_v1_commands_pb.CheckForArduinoCLIUpdatesRequest, + responseType: cc_arduino_cli_commands_v1_commands_pb.CheckForArduinoCLIUpdatesResponse, + requestSerialize: serialize_cc_arduino_cli_commands_v1_CheckForArduinoCLIUpdatesRequest, + requestDeserialize: deserialize_cc_arduino_cli_commands_v1_CheckForArduinoCLIUpdatesRequest, + responseSerialize: serialize_cc_arduino_cli_commands_v1_CheckForArduinoCLIUpdatesResponse, + responseDeserialize: deserialize_cc_arduino_cli_commands_v1_CheckForArduinoCLIUpdatesResponse, + }, + // Clean the download cache directory (where archives are downloaded). +cleanDownloadCacheDirectory: { + path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/CleanDownloadCacheDirectory', + requestStream: false, + responseStream: false, + requestType: cc_arduino_cli_commands_v1_commands_pb.CleanDownloadCacheDirectoryRequest, + responseType: cc_arduino_cli_commands_v1_commands_pb.CleanDownloadCacheDirectoryResponse, + requestSerialize: serialize_cc_arduino_cli_commands_v1_CleanDownloadCacheDirectoryRequest, + requestDeserialize: deserialize_cc_arduino_cli_commands_v1_CleanDownloadCacheDirectoryRequest, + responseSerialize: serialize_cc_arduino_cli_commands_v1_CleanDownloadCacheDirectoryResponse, + responseDeserialize: deserialize_cc_arduino_cli_commands_v1_CleanDownloadCacheDirectoryResponse, + }, + // Writes the settings currently stored in memory in a YAML file. +configurationSave: { + path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/ConfigurationSave', + requestStream: false, + responseStream: false, + requestType: cc_arduino_cli_commands_v1_settings_pb.ConfigurationSaveRequest, + responseType: cc_arduino_cli_commands_v1_settings_pb.ConfigurationSaveResponse, + requestSerialize: serialize_cc_arduino_cli_commands_v1_ConfigurationSaveRequest, + requestDeserialize: deserialize_cc_arduino_cli_commands_v1_ConfigurationSaveRequest, + responseSerialize: serialize_cc_arduino_cli_commands_v1_ConfigurationSaveResponse, + responseDeserialize: deserialize_cc_arduino_cli_commands_v1_ConfigurationSaveResponse, + }, + // Read the settings from a YAML file. +configurationOpen: { + path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/ConfigurationOpen', + requestStream: false, + responseStream: false, + requestType: cc_arduino_cli_commands_v1_settings_pb.ConfigurationOpenRequest, + responseType: cc_arduino_cli_commands_v1_settings_pb.ConfigurationOpenResponse, + requestSerialize: serialize_cc_arduino_cli_commands_v1_ConfigurationOpenRequest, + requestDeserialize: deserialize_cc_arduino_cli_commands_v1_ConfigurationOpenRequest, + responseSerialize: serialize_cc_arduino_cli_commands_v1_ConfigurationOpenResponse, + responseDeserialize: deserialize_cc_arduino_cli_commands_v1_ConfigurationOpenResponse, + }, + // Get the current configuration. +configurationGet: { + path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/ConfigurationGet', + requestStream: false, + responseStream: false, + requestType: cc_arduino_cli_commands_v1_settings_pb.ConfigurationGetRequest, + responseType: cc_arduino_cli_commands_v1_settings_pb.ConfigurationGetResponse, + requestSerialize: serialize_cc_arduino_cli_commands_v1_ConfigurationGetRequest, + requestDeserialize: deserialize_cc_arduino_cli_commands_v1_ConfigurationGetRequest, + responseSerialize: serialize_cc_arduino_cli_commands_v1_ConfigurationGetResponse, + responseDeserialize: deserialize_cc_arduino_cli_commands_v1_ConfigurationGetResponse, + }, + // Enumerate all the keys/values pairs available in the configuration. +settingsEnumerate: { + path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/SettingsEnumerate', + requestStream: false, + responseStream: false, + requestType: cc_arduino_cli_commands_v1_settings_pb.SettingsEnumerateRequest, + responseType: cc_arduino_cli_commands_v1_settings_pb.SettingsEnumerateResponse, + requestSerialize: serialize_cc_arduino_cli_commands_v1_SettingsEnumerateRequest, + requestDeserialize: deserialize_cc_arduino_cli_commands_v1_SettingsEnumerateRequest, + responseSerialize: serialize_cc_arduino_cli_commands_v1_SettingsEnumerateResponse, + responseDeserialize: deserialize_cc_arduino_cli_commands_v1_SettingsEnumerateResponse, + }, + // Get a single configuration value. +settingsGetValue: { + path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/SettingsGetValue', + requestStream: false, + responseStream: false, + requestType: cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueRequest, + responseType: cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueResponse, + requestSerialize: serialize_cc_arduino_cli_commands_v1_SettingsGetValueRequest, + requestDeserialize: deserialize_cc_arduino_cli_commands_v1_SettingsGetValueRequest, + responseSerialize: serialize_cc_arduino_cli_commands_v1_SettingsGetValueResponse, + responseDeserialize: deserialize_cc_arduino_cli_commands_v1_SettingsGetValueResponse, + }, + // Set a single configuration value. +settingsSetValue: { + path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/SettingsSetValue', + requestStream: false, + responseStream: false, + requestType: cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueRequest, + responseType: cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueResponse, + requestSerialize: serialize_cc_arduino_cli_commands_v1_SettingsSetValueRequest, + requestDeserialize: deserialize_cc_arduino_cli_commands_v1_SettingsSetValueRequest, + responseSerialize: serialize_cc_arduino_cli_commands_v1_SettingsSetValueResponse, + responseDeserialize: deserialize_cc_arduino_cli_commands_v1_SettingsSetValueResponse, + }, }; -// BOOTSTRAP COMMANDS -// ------------------- diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/commands_pb.d.ts b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/commands_pb.d.ts index a15ce4719..f8f4155ca 100644 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/commands_pb.d.ts +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/commands_pb.d.ts @@ -5,14 +5,16 @@ /* eslint-disable */ import * as jspb from "google-protobuf"; -import * as google_rpc_status_pb from "../../../../../google/rpc/status_pb"; -import * as cc_arduino_cli_commands_v1_common_pb from "../../../../../cc/arduino/cli/commands/v1/common_pb"; import * as cc_arduino_cli_commands_v1_board_pb from "../../../../../cc/arduino/cli/commands/v1/board_pb"; +import * as cc_arduino_cli_commands_v1_common_pb from "../../../../../cc/arduino/cli/commands/v1/common_pb"; import * as cc_arduino_cli_commands_v1_compile_pb from "../../../../../cc/arduino/cli/commands/v1/compile_pb"; import * as cc_arduino_cli_commands_v1_core_pb from "../../../../../cc/arduino/cli/commands/v1/core_pb"; +import * as cc_arduino_cli_commands_v1_debug_pb from "../../../../../cc/arduino/cli/commands/v1/debug_pb"; +import * as cc_arduino_cli_commands_v1_lib_pb from "../../../../../cc/arduino/cli/commands/v1/lib_pb"; import * as cc_arduino_cli_commands_v1_monitor_pb from "../../../../../cc/arduino/cli/commands/v1/monitor_pb"; +import * as cc_arduino_cli_commands_v1_settings_pb from "../../../../../cc/arduino/cli/commands/v1/settings_pb"; import * as cc_arduino_cli_commands_v1_upload_pb from "../../../../../cc/arduino/cli/commands/v1/upload_pb"; -import * as cc_arduino_cli_commands_v1_lib_pb from "../../../../../cc/arduino/cli/commands/v1/lib_pb"; +import * as google_rpc_status_pb from "../../../../../google/rpc/status_pb"; export class CreateRequest extends jspb.Message { @@ -38,7 +40,6 @@ export class CreateResponse extends jspb.Message { getInstance(): cc_arduino_cli_commands_v1_common_pb.Instance | undefined; setInstance(value?: cc_arduino_cli_commands_v1_common_pb.Instance): CreateResponse; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): CreateResponse.AsObject; static toObject(includeInstance: boolean, msg: CreateResponse): CreateResponse.AsObject; @@ -61,14 +62,11 @@ export class InitRequest extends jspb.Message { clearInstance(): void; getInstance(): cc_arduino_cli_commands_v1_common_pb.Instance | undefined; setInstance(value?: cc_arduino_cli_commands_v1_common_pb.Instance): InitRequest; - getProfile(): string; setProfile(value: string): InitRequest; - getSketchPath(): string; setSketchPath(value: string): InitRequest; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): InitRequest.AsObject; static toObject(includeInstance: boolean, msg: InitRequest): InitRequest.AsObject; @@ -94,18 +92,15 @@ export class InitResponse extends jspb.Message { getInitProgress(): InitResponse.Progress | undefined; setInitProgress(value?: InitResponse.Progress): InitResponse; - hasError(): boolean; clearError(): void; getError(): google_rpc_status_pb.Status | undefined; setError(value?: google_rpc_status_pb.Status): InitResponse; - hasProfile(): boolean; clearProfile(): void; - getProfile(): cc_arduino_cli_commands_v1_common_pb.Profile | undefined; - setProfile(value?: cc_arduino_cli_commands_v1_common_pb.Profile): InitResponse; - + getProfile(): cc_arduino_cli_commands_v1_common_pb.SketchProfile | undefined; + setProfile(value?: cc_arduino_cli_commands_v1_common_pb.SketchProfile): InitResponse; getMessageCase(): InitResponse.MessageCase; @@ -123,7 +118,7 @@ export namespace InitResponse { export type AsObject = { initProgress?: InitResponse.Progress.AsObject, error?: google_rpc_status_pb.Status.AsObject, - profile?: cc_arduino_cli_commands_v1_common_pb.Profile.AsObject, + profile?: cc_arduino_cli_commands_v1_common_pb.SketchProfile.AsObject, } @@ -134,13 +129,11 @@ export namespace InitResponse { getDownloadProgress(): cc_arduino_cli_commands_v1_common_pb.DownloadProgress | undefined; setDownloadProgress(value?: cc_arduino_cli_commands_v1_common_pb.DownloadProgress): Progress; - hasTaskProgress(): boolean; clearTaskProgress(): void; getTaskProgress(): cc_arduino_cli_commands_v1_common_pb.TaskProgress | undefined; setTaskProgress(value?: cc_arduino_cli_commands_v1_common_pb.TaskProgress): Progress; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): Progress.AsObject; static toObject(includeInstance: boolean, msg: Progress): Progress.AsObject; @@ -161,15 +154,34 @@ export namespace InitResponse { export enum MessageCase { MESSAGE_NOT_SET = 0, - - INIT_PROGRESS = 1, + INIT_PROGRESS = 1, + ERROR = 2, + PROFILE = 3, + } - ERROR = 2, +} - PROFILE = 3, +export class FailedInstanceInitError extends jspb.Message { + getReason(): FailedInstanceInitReason; + setReason(value: FailedInstanceInitReason): FailedInstanceInitError; + getMessage(): string; + setMessage(value: string): FailedInstanceInitError; - } + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): FailedInstanceInitError.AsObject; + static toObject(includeInstance: boolean, msg: FailedInstanceInitError): FailedInstanceInitError.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: FailedInstanceInitError, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): FailedInstanceInitError; + static deserializeBinaryFromReader(message: FailedInstanceInitError, reader: jspb.BinaryReader): FailedInstanceInitError; +} +export namespace FailedInstanceInitError { + export type AsObject = { + reason: FailedInstanceInitReason, + message: string, + } } export class DestroyRequest extends jspb.Message { @@ -179,7 +191,6 @@ export class DestroyRequest extends jspb.Message { getInstance(): cc_arduino_cli_commands_v1_common_pb.Instance | undefined; setInstance(value?: cc_arduino_cli_commands_v1_common_pb.Instance): DestroyRequest; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): DestroyRequest.AsObject; static toObject(includeInstance: boolean, msg: DestroyRequest): DestroyRequest.AsObject; @@ -219,7 +230,10 @@ export class UpdateIndexRequest extends jspb.Message { clearInstance(): void; getInstance(): cc_arduino_cli_commands_v1_common_pb.Instance | undefined; setInstance(value?: cc_arduino_cli_commands_v1_common_pb.Instance): UpdateIndexRequest; - + getIgnoreCustomPackageIndexes(): boolean; + setIgnoreCustomPackageIndexes(value: boolean): UpdateIndexRequest; + getUpdateIfOlderThanSecs(): number; + setUpdateIfOlderThanSecs(value: number): UpdateIndexRequest; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): UpdateIndexRequest.AsObject; @@ -234,6 +248,8 @@ export class UpdateIndexRequest extends jspb.Message { export namespace UpdateIndexRequest { export type AsObject = { instance?: cc_arduino_cli_commands_v1_common_pb.Instance.AsObject, + ignoreCustomPackageIndexes: boolean, + updateIfOlderThanSecs: number, } } @@ -244,6 +260,12 @@ export class UpdateIndexResponse extends jspb.Message { getDownloadProgress(): cc_arduino_cli_commands_v1_common_pb.DownloadProgress | undefined; setDownloadProgress(value?: cc_arduino_cli_commands_v1_common_pb.DownloadProgress): UpdateIndexResponse; + hasResult(): boolean; + clearResult(): void; + getResult(): UpdateIndexResponse.Result | undefined; + setResult(value?: UpdateIndexResponse.Result): UpdateIndexResponse; + + getMessageCase(): UpdateIndexResponse.MessageCase; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): UpdateIndexResponse.AsObject; @@ -258,7 +280,39 @@ export class UpdateIndexResponse extends jspb.Message { export namespace UpdateIndexResponse { export type AsObject = { downloadProgress?: cc_arduino_cli_commands_v1_common_pb.DownloadProgress.AsObject, + result?: UpdateIndexResponse.Result.AsObject, } + + + export class Result extends jspb.Message { + clearUpdatedIndexesList(): void; + getUpdatedIndexesList(): Array<IndexUpdateReport>; + setUpdatedIndexesList(value: Array<IndexUpdateReport>): Result; + addUpdatedIndexes(value?: IndexUpdateReport, index?: number): IndexUpdateReport; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Result.AsObject; + static toObject(includeInstance: boolean, msg: Result): Result.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: Result, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Result; + static deserializeBinaryFromReader(message: Result, reader: jspb.BinaryReader): Result; + } + + export namespace Result { + export type AsObject = { + updatedIndexesList: Array<IndexUpdateReport.AsObject>, + } + } + + + export enum MessageCase { + MESSAGE_NOT_SET = 0, + DOWNLOAD_PROGRESS = 1, + RESULT = 2, + } + } export class UpdateLibrariesIndexRequest extends jspb.Message { @@ -267,7 +321,8 @@ export class UpdateLibrariesIndexRequest extends jspb.Message { clearInstance(): void; getInstance(): cc_arduino_cli_commands_v1_common_pb.Instance | undefined; setInstance(value?: cc_arduino_cli_commands_v1_common_pb.Instance): UpdateLibrariesIndexRequest; - + getUpdateIfOlderThanSecs(): number; + setUpdateIfOlderThanSecs(value: number): UpdateLibrariesIndexRequest; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): UpdateLibrariesIndexRequest.AsObject; @@ -282,6 +337,7 @@ export class UpdateLibrariesIndexRequest extends jspb.Message { export namespace UpdateLibrariesIndexRequest { export type AsObject = { instance?: cc_arduino_cli_commands_v1_common_pb.Instance.AsObject, + updateIfOlderThanSecs: number, } } @@ -292,6 +348,12 @@ export class UpdateLibrariesIndexResponse extends jspb.Message { getDownloadProgress(): cc_arduino_cli_commands_v1_common_pb.DownloadProgress | undefined; setDownloadProgress(value?: cc_arduino_cli_commands_v1_common_pb.DownloadProgress): UpdateLibrariesIndexResponse; + hasResult(): boolean; + clearResult(): void; + getResult(): UpdateLibrariesIndexResponse.Result | undefined; + setResult(value?: UpdateLibrariesIndexResponse.Result): UpdateLibrariesIndexResponse; + + getMessageCase(): UpdateLibrariesIndexResponse.MessageCase; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): UpdateLibrariesIndexResponse.AsObject; @@ -306,167 +368,72 @@ export class UpdateLibrariesIndexResponse extends jspb.Message { export namespace UpdateLibrariesIndexResponse { export type AsObject = { downloadProgress?: cc_arduino_cli_commands_v1_common_pb.DownloadProgress.AsObject, + result?: UpdateLibrariesIndexResponse.Result.AsObject, } -} -export class UpdateCoreLibrariesIndexRequest 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): UpdateCoreLibrariesIndexRequest; + export class Result extends jspb.Message { - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): UpdateCoreLibrariesIndexRequest.AsObject; - static toObject(includeInstance: boolean, msg: UpdateCoreLibrariesIndexRequest): UpdateCoreLibrariesIndexRequest.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: UpdateCoreLibrariesIndexRequest, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): UpdateCoreLibrariesIndexRequest; - static deserializeBinaryFromReader(message: UpdateCoreLibrariesIndexRequest, reader: jspb.BinaryReader): UpdateCoreLibrariesIndexRequest; -} + hasLibrariesIndex(): boolean; + clearLibrariesIndex(): void; + getLibrariesIndex(): IndexUpdateReport | undefined; + setLibrariesIndex(value?: IndexUpdateReport): Result; -export namespace UpdateCoreLibrariesIndexRequest { - export type AsObject = { - instance?: cc_arduino_cli_commands_v1_common_pb.Instance.AsObject, + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Result.AsObject; + static toObject(includeInstance: boolean, msg: Result): Result.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: Result, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Result; + static deserializeBinaryFromReader(message: Result, reader: jspb.BinaryReader): Result; } -} - -export class UpdateCoreLibrariesIndexResponse extends jspb.Message { - hasDownloadProgress(): boolean; - clearDownloadProgress(): void; - getDownloadProgress(): cc_arduino_cli_commands_v1_common_pb.DownloadProgress | undefined; - setDownloadProgress(value?: cc_arduino_cli_commands_v1_common_pb.DownloadProgress): UpdateCoreLibrariesIndexResponse; - - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): UpdateCoreLibrariesIndexResponse.AsObject; - static toObject(includeInstance: boolean, msg: UpdateCoreLibrariesIndexResponse): UpdateCoreLibrariesIndexResponse.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: UpdateCoreLibrariesIndexResponse, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): UpdateCoreLibrariesIndexResponse; - static deserializeBinaryFromReader(message: UpdateCoreLibrariesIndexResponse, reader: jspb.BinaryReader): UpdateCoreLibrariesIndexResponse; -} - -export namespace UpdateCoreLibrariesIndexResponse { - export type AsObject = { - downloadProgress?: cc_arduino_cli_commands_v1_common_pb.DownloadProgress.AsObject, + export namespace Result { + export type AsObject = { + librariesIndex?: IndexUpdateReport.AsObject, + } } -} - -export class OutdatedRequest 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): OutdatedRequest; - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): OutdatedRequest.AsObject; - static toObject(includeInstance: boolean, msg: OutdatedRequest): OutdatedRequest.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: OutdatedRequest, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): OutdatedRequest; - static deserializeBinaryFromReader(message: OutdatedRequest, reader: jspb.BinaryReader): OutdatedRequest; -} - -export namespace OutdatedRequest { - export type AsObject = { - instance?: cc_arduino_cli_commands_v1_common_pb.Instance.AsObject, + export enum MessageCase { + MESSAGE_NOT_SET = 0, + DOWNLOAD_PROGRESS = 1, + RESULT = 2, } -} - -export class OutdatedResponse extends jspb.Message { - clearOutdatedLibrariesList(): void; - getOutdatedLibrariesList(): Array<cc_arduino_cli_commands_v1_lib_pb.InstalledLibrary>; - setOutdatedLibrariesList(value: Array<cc_arduino_cli_commands_v1_lib_pb.InstalledLibrary>): OutdatedResponse; - addOutdatedLibraries(value?: cc_arduino_cli_commands_v1_lib_pb.InstalledLibrary, index?: number): cc_arduino_cli_commands_v1_lib_pb.InstalledLibrary; - clearOutdatedPlatformsList(): void; - getOutdatedPlatformsList(): Array<cc_arduino_cli_commands_v1_common_pb.Platform>; - setOutdatedPlatformsList(value: Array<cc_arduino_cli_commands_v1_common_pb.Platform>): OutdatedResponse; - addOutdatedPlatforms(value?: cc_arduino_cli_commands_v1_common_pb.Platform, index?: number): cc_arduino_cli_commands_v1_common_pb.Platform; - - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): OutdatedResponse.AsObject; - static toObject(includeInstance: boolean, msg: OutdatedResponse): OutdatedResponse.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: OutdatedResponse, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): OutdatedResponse; - static deserializeBinaryFromReader(message: OutdatedResponse, reader: jspb.BinaryReader): OutdatedResponse; } -export namespace OutdatedResponse { - export type AsObject = { - outdatedLibrariesList: Array<cc_arduino_cli_commands_v1_lib_pb.InstalledLibrary.AsObject>, - outdatedPlatformsList: Array<cc_arduino_cli_commands_v1_common_pb.Platform.AsObject>, - } -} - -export class UpgradeRequest 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): UpgradeRequest; - - getSkipPostInstall(): boolean; - setSkipPostInstall(value: boolean): UpgradeRequest; - +export class IndexUpdateReport extends jspb.Message { + getIndexUrl(): string; + setIndexUrl(value: string): IndexUpdateReport; + getStatus(): IndexUpdateReport.Status; + setStatus(value: IndexUpdateReport.Status): IndexUpdateReport; serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): UpgradeRequest.AsObject; - static toObject(includeInstance: boolean, msg: UpgradeRequest): UpgradeRequest.AsObject; + toObject(includeInstance?: boolean): IndexUpdateReport.AsObject; + static toObject(includeInstance: boolean, msg: IndexUpdateReport): IndexUpdateReport.AsObject; static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: UpgradeRequest, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): UpgradeRequest; - static deserializeBinaryFromReader(message: UpgradeRequest, reader: jspb.BinaryReader): UpgradeRequest; + static serializeBinaryToWriter(message: IndexUpdateReport, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): IndexUpdateReport; + static deserializeBinaryFromReader(message: IndexUpdateReport, reader: jspb.BinaryReader): IndexUpdateReport; } -export namespace UpgradeRequest { +export namespace IndexUpdateReport { export type AsObject = { - instance?: cc_arduino_cli_commands_v1_common_pb.Instance.AsObject, - skipPostInstall: boolean, + indexUrl: string, + status: IndexUpdateReport.Status, } -} - -export class UpgradeResponse extends jspb.Message { - - hasProgress(): boolean; - clearProgress(): void; - getProgress(): cc_arduino_cli_commands_v1_common_pb.DownloadProgress | undefined; - setProgress(value?: cc_arduino_cli_commands_v1_common_pb.DownloadProgress): UpgradeResponse; - - - hasTaskProgress(): boolean; - clearTaskProgress(): void; - getTaskProgress(): cc_arduino_cli_commands_v1_common_pb.TaskProgress | undefined; - setTaskProgress(value?: cc_arduino_cli_commands_v1_common_pb.TaskProgress): UpgradeResponse; - - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): UpgradeResponse.AsObject; - static toObject(includeInstance: boolean, msg: UpgradeResponse): UpgradeResponse.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: UpgradeResponse, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): UpgradeResponse; - static deserializeBinaryFromReader(message: UpgradeResponse, reader: jspb.BinaryReader): UpgradeResponse; -} -export namespace UpgradeResponse { - export type AsObject = { - progress?: cc_arduino_cli_commands_v1_common_pb.DownloadProgress.AsObject, - taskProgress?: cc_arduino_cli_commands_v1_common_pb.TaskProgress.AsObject, + export enum Status { + STATUS_UNSPECIFIED = 0, + STATUS_UPDATED = 1, + STATUS_ALREADY_UP_TO_DATE = 2, + STATUS_FAILED = 3, + STATUS_SKIPPED = 4, } + } export class VersionRequest extends jspb.Message { @@ -490,7 +457,6 @@ export class VersionResponse extends jspb.Message { getVersion(): string; setVersion(value: string): VersionResponse; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): VersionResponse.AsObject; static toObject(includeInstance: boolean, msg: VersionResponse): VersionResponse.AsObject; @@ -508,18 +474,12 @@ export namespace VersionResponse { } export class NewSketchRequest 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): NewSketchRequest; - getSketchName(): string; setSketchName(value: string): NewSketchRequest; - getSketchDir(): string; setSketchDir(value: string): NewSketchRequest; - + getOverwrite(): boolean; + setOverwrite(value: boolean): NewSketchRequest; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): NewSketchRequest.AsObject; @@ -533,9 +493,9 @@ export class NewSketchRequest extends jspb.Message { export namespace NewSketchRequest { export type AsObject = { - instance?: cc_arduino_cli_commands_v1_common_pb.Instance.AsObject, sketchName: string, sketchDir: string, + overwrite: boolean, } } @@ -543,7 +503,6 @@ export class NewSketchResponse extends jspb.Message { getMainFile(): string; setMainFile(value: string): NewSketchResponse; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): NewSketchResponse.AsObject; static toObject(includeInstance: boolean, msg: NewSketchResponse): NewSketchResponse.AsObject; @@ -561,16 +520,9 @@ export namespace NewSketchResponse { } export class LoadSketchRequest 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): LoadSketchRequest; - getSketchPath(): string; setSketchPath(value: string): LoadSketchRequest; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): LoadSketchRequest.AsObject; static toObject(includeInstance: boolean, msg: LoadSketchRequest): LoadSketchRequest.AsObject; @@ -583,33 +535,16 @@ export class LoadSketchRequest extends jspb.Message { export namespace LoadSketchRequest { export type AsObject = { - instance?: cc_arduino_cli_commands_v1_common_pb.Instance.AsObject, sketchPath: string, } } export class LoadSketchResponse extends jspb.Message { - getMainFile(): string; - setMainFile(value: string): LoadSketchResponse; - - getLocationPath(): string; - setLocationPath(value: string): LoadSketchResponse; - - clearOtherSketchFilesList(): void; - getOtherSketchFilesList(): Array<string>; - setOtherSketchFilesList(value: Array<string>): LoadSketchResponse; - addOtherSketchFiles(value: string, index?: number): string; - - clearAdditionalFilesList(): void; - getAdditionalFilesList(): Array<string>; - setAdditionalFilesList(value: Array<string>): LoadSketchResponse; - addAdditionalFiles(value: string, index?: number): string; - - clearRootFolderFilesList(): void; - getRootFolderFilesList(): Array<string>; - setRootFolderFilesList(value: Array<string>): LoadSketchResponse; - addRootFolderFiles(value: string, index?: number): string; + hasSketch(): boolean; + clearSketch(): void; + getSketch(): cc_arduino_cli_commands_v1_common_pb.Sketch | undefined; + setSketch(value?: cc_arduino_cli_commands_v1_common_pb.Sketch): LoadSketchResponse; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): LoadSketchResponse.AsObject; @@ -623,24 +558,19 @@ export class LoadSketchResponse extends jspb.Message { export namespace LoadSketchResponse { export type AsObject = { - mainFile: string, - locationPath: string, - otherSketchFilesList: Array<string>, - additionalFilesList: Array<string>, - rootFolderFilesList: Array<string>, + sketch?: cc_arduino_cli_commands_v1_common_pb.Sketch.AsObject, } } export class ArchiveSketchRequest extends jspb.Message { getSketchPath(): string; setSketchPath(value: string): ArchiveSketchRequest; - getArchivePath(): string; setArchivePath(value: string): ArchiveSketchRequest; - getIncludeBuildDir(): boolean; setIncludeBuildDir(value: boolean): ArchiveSketchRequest; - + getOverwrite(): boolean; + setOverwrite(value: boolean): ArchiveSketchRequest; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): ArchiveSketchRequest.AsObject; @@ -657,6 +587,7 @@ export namespace ArchiveSketchRequest { sketchPath: string, archivePath: string, includeBuildDir: boolean, + overwrite: boolean, } } @@ -676,3 +607,152 @@ export namespace ArchiveSketchResponse { export type AsObject = { } } + +export class SetSketchDefaultsRequest extends jspb.Message { + getSketchPath(): string; + setSketchPath(value: string): SetSketchDefaultsRequest; + getDefaultFqbn(): string; + setDefaultFqbn(value: string): SetSketchDefaultsRequest; + getDefaultPortAddress(): string; + setDefaultPortAddress(value: string): SetSketchDefaultsRequest; + getDefaultPortProtocol(): string; + setDefaultPortProtocol(value: string): SetSketchDefaultsRequest; + getDefaultProgrammer(): string; + setDefaultProgrammer(value: string): SetSketchDefaultsRequest; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): SetSketchDefaultsRequest.AsObject; + static toObject(includeInstance: boolean, msg: SetSketchDefaultsRequest): SetSketchDefaultsRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: SetSketchDefaultsRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): SetSketchDefaultsRequest; + static deserializeBinaryFromReader(message: SetSketchDefaultsRequest, reader: jspb.BinaryReader): SetSketchDefaultsRequest; +} + +export namespace SetSketchDefaultsRequest { + export type AsObject = { + sketchPath: string, + defaultFqbn: string, + defaultPortAddress: string, + defaultPortProtocol: string, + defaultProgrammer: string, + } +} + +export class SetSketchDefaultsResponse extends jspb.Message { + getDefaultFqbn(): string; + setDefaultFqbn(value: string): SetSketchDefaultsResponse; + getDefaultPortAddress(): string; + setDefaultPortAddress(value: string): SetSketchDefaultsResponse; + getDefaultPortProtocol(): string; + setDefaultPortProtocol(value: string): SetSketchDefaultsResponse; + getDefaultProgrammer(): string; + setDefaultProgrammer(value: string): SetSketchDefaultsResponse; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): SetSketchDefaultsResponse.AsObject; + static toObject(includeInstance: boolean, msg: SetSketchDefaultsResponse): SetSketchDefaultsResponse.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: SetSketchDefaultsResponse, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): SetSketchDefaultsResponse; + static deserializeBinaryFromReader(message: SetSketchDefaultsResponse, reader: jspb.BinaryReader): SetSketchDefaultsResponse; +} + +export namespace SetSketchDefaultsResponse { + export type AsObject = { + defaultFqbn: string, + defaultPortAddress: string, + defaultPortProtocol: string, + defaultProgrammer: string, + } +} + +export class CheckForArduinoCLIUpdatesRequest extends jspb.Message { + getForceCheck(): boolean; + setForceCheck(value: boolean): CheckForArduinoCLIUpdatesRequest; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): CheckForArduinoCLIUpdatesRequest.AsObject; + static toObject(includeInstance: boolean, msg: CheckForArduinoCLIUpdatesRequest): CheckForArduinoCLIUpdatesRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: CheckForArduinoCLIUpdatesRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): CheckForArduinoCLIUpdatesRequest; + static deserializeBinaryFromReader(message: CheckForArduinoCLIUpdatesRequest, reader: jspb.BinaryReader): CheckForArduinoCLIUpdatesRequest; +} + +export namespace CheckForArduinoCLIUpdatesRequest { + export type AsObject = { + forceCheck: boolean, + } +} + +export class CheckForArduinoCLIUpdatesResponse extends jspb.Message { + getNewestVersion(): string; + setNewestVersion(value: string): CheckForArduinoCLIUpdatesResponse; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): CheckForArduinoCLIUpdatesResponse.AsObject; + static toObject(includeInstance: boolean, msg: CheckForArduinoCLIUpdatesResponse): CheckForArduinoCLIUpdatesResponse.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: CheckForArduinoCLIUpdatesResponse, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): CheckForArduinoCLIUpdatesResponse; + static deserializeBinaryFromReader(message: CheckForArduinoCLIUpdatesResponse, reader: jspb.BinaryReader): CheckForArduinoCLIUpdatesResponse; +} + +export namespace CheckForArduinoCLIUpdatesResponse { + export type AsObject = { + newestVersion: string, + } +} + +export class CleanDownloadCacheDirectoryRequest 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): CleanDownloadCacheDirectoryRequest; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): CleanDownloadCacheDirectoryRequest.AsObject; + static toObject(includeInstance: boolean, msg: CleanDownloadCacheDirectoryRequest): CleanDownloadCacheDirectoryRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: CleanDownloadCacheDirectoryRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): CleanDownloadCacheDirectoryRequest; + static deserializeBinaryFromReader(message: CleanDownloadCacheDirectoryRequest, reader: jspb.BinaryReader): CleanDownloadCacheDirectoryRequest; +} + +export namespace CleanDownloadCacheDirectoryRequest { + export type AsObject = { + instance?: cc_arduino_cli_commands_v1_common_pb.Instance.AsObject, + } +} + +export class CleanDownloadCacheDirectoryResponse extends jspb.Message { + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): CleanDownloadCacheDirectoryResponse.AsObject; + static toObject(includeInstance: boolean, msg: CleanDownloadCacheDirectoryResponse): CleanDownloadCacheDirectoryResponse.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: CleanDownloadCacheDirectoryResponse, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): CleanDownloadCacheDirectoryResponse; + static deserializeBinaryFromReader(message: CleanDownloadCacheDirectoryResponse, reader: jspb.BinaryReader): CleanDownloadCacheDirectoryResponse; +} + +export namespace CleanDownloadCacheDirectoryResponse { + export type AsObject = { + } +} + +export enum FailedInstanceInitReason { + FAILED_INSTANCE_INIT_REASON_UNSPECIFIED = 0, + FAILED_INSTANCE_INIT_REASON_INVALID_INDEX_URL = 1, + FAILED_INSTANCE_INIT_REASON_INDEX_LOAD_ERROR = 2, + FAILED_INSTANCE_INIT_REASON_TOOL_LOAD_ERROR = 3, + FAILED_INSTANCE_INIT_REASON_INDEX_DOWNLOAD_ERROR = 4, +} diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/commands_pb.js b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/commands_pb.js index 820634067..447cb5f9c 100644 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/commands_pb.js +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/commands_pb.js @@ -13,30 +13,48 @@ var jspb = require('google-protobuf'); var goog = jspb; -var global = Function('return this')(); +var global = (function() { + if (this) { return this; } + if (typeof window !== 'undefined') { return window; } + if (typeof global !== 'undefined') { return global; } + if (typeof self !== 'undefined') { return self; } + return Function('return this')(); +}.call(null)); -var google_rpc_status_pb = require('../../../../../google/rpc/status_pb.js'); -goog.object.extend(proto, google_rpc_status_pb); -var cc_arduino_cli_commands_v1_common_pb = require('../../../../../cc/arduino/cli/commands/v1/common_pb.js'); -goog.object.extend(proto, cc_arduino_cli_commands_v1_common_pb); var cc_arduino_cli_commands_v1_board_pb = require('../../../../../cc/arduino/cli/commands/v1/board_pb.js'); goog.object.extend(proto, cc_arduino_cli_commands_v1_board_pb); +var cc_arduino_cli_commands_v1_common_pb = require('../../../../../cc/arduino/cli/commands/v1/common_pb.js'); +goog.object.extend(proto, cc_arduino_cli_commands_v1_common_pb); var cc_arduino_cli_commands_v1_compile_pb = require('../../../../../cc/arduino/cli/commands/v1/compile_pb.js'); goog.object.extend(proto, cc_arduino_cli_commands_v1_compile_pb); var cc_arduino_cli_commands_v1_core_pb = require('../../../../../cc/arduino/cli/commands/v1/core_pb.js'); goog.object.extend(proto, cc_arduino_cli_commands_v1_core_pb); +var cc_arduino_cli_commands_v1_debug_pb = require('../../../../../cc/arduino/cli/commands/v1/debug_pb.js'); +goog.object.extend(proto, cc_arduino_cli_commands_v1_debug_pb); +var cc_arduino_cli_commands_v1_lib_pb = require('../../../../../cc/arduino/cli/commands/v1/lib_pb.js'); +goog.object.extend(proto, cc_arduino_cli_commands_v1_lib_pb); var cc_arduino_cli_commands_v1_monitor_pb = require('../../../../../cc/arduino/cli/commands/v1/monitor_pb.js'); goog.object.extend(proto, cc_arduino_cli_commands_v1_monitor_pb); +var cc_arduino_cli_commands_v1_settings_pb = require('../../../../../cc/arduino/cli/commands/v1/settings_pb.js'); +goog.object.extend(proto, cc_arduino_cli_commands_v1_settings_pb); var cc_arduino_cli_commands_v1_upload_pb = require('../../../../../cc/arduino/cli/commands/v1/upload_pb.js'); goog.object.extend(proto, cc_arduino_cli_commands_v1_upload_pb); -var cc_arduino_cli_commands_v1_lib_pb = require('../../../../../cc/arduino/cli/commands/v1/lib_pb.js'); -goog.object.extend(proto, cc_arduino_cli_commands_v1_lib_pb); +var google_rpc_status_pb = require('../../../../../google/rpc/status_pb.js'); +goog.object.extend(proto, google_rpc_status_pb); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesRequest', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryRequest', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryResponse', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.CreateRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.CreateResponse', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.DestroyRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.DestroyResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.FailedInstanceInitError', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.FailedInstanceInitReason', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.IndexUpdateReport', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.IndexUpdateReport.Status', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.InitRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.InitResponse', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.InitResponse.MessageCase', null, global); @@ -45,16 +63,16 @@ goog.exportSymbol('proto.cc.arduino.cli.commands.v1.LoadSketchRequest', null, gl goog.exportSymbol('proto.cc.arduino.cli.commands.v1.LoadSketchResponse', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.NewSketchRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.NewSketchResponse', null, global); -goog.exportSymbol('proto.cc.arduino.cli.commands.v1.OutdatedRequest', null, global); -goog.exportSymbol('proto.cc.arduino.cli.commands.v1.OutdatedResponse', null, global); -goog.exportSymbol('proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexRequest', null, global); -goog.exportSymbol('proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.UpdateIndexRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.UpdateIndexResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.MessageCase', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse', null, global); -goog.exportSymbol('proto.cc.arduino.cli.commands.v1.UpgradeRequest', null, global); -goog.exportSymbol('proto.cc.arduino.cli.commands.v1.UpgradeResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.MessageCase', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.VersionRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.VersionResponse', null, global); /** @@ -162,6 +180,27 @@ if (goog.DEBUG && !COMPILED) { */ proto.cc.arduino.cli.commands.v1.InitResponse.Progress.displayName = 'proto.cc.arduino.cli.commands.v1.InitResponse.Progress'; } +/** + * 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.FailedInstanceInitError = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.FailedInstanceInitError, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.FailedInstanceInitError.displayName = 'proto.cc.arduino.cli.commands.v1.FailedInstanceInitError'; +} /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -236,7 +275,7 @@ if (goog.DEBUG && !COMPILED) { * @constructor */ proto.cc.arduino.cli.commands.v1.UpdateIndexResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.oneofGroups_); }; goog.inherits(proto.cc.arduino.cli.commands.v1.UpdateIndexResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { @@ -246,6 +285,27 @@ if (goog.DEBUG && !COMPILED) { */ proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.displayName = 'proto.cc.arduino.cli.commands.v1.UpdateIndexResponse'; } +/** + * 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.UpdateIndexResponse.Result = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result.repeatedFields_, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result.displayName = 'proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result'; +} /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -278,7 +338,7 @@ if (goog.DEBUG && !COMPILED) { * @constructor */ proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.oneofGroups_); }; goog.inherits(proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { @@ -298,16 +358,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexRequest = function(opt_data) { +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result = function(opt_data) { jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexRequest, jspb.Message); +goog.inherits(proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexRequest.displayName = 'proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexRequest'; + proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result.displayName = 'proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result'; } /** * Generated by JsPbCodeGenerator. @@ -319,16 +379,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexResponse = function(opt_data) { +proto.cc.arduino.cli.commands.v1.IndexUpdateReport = function(opt_data) { jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexResponse, jspb.Message); +goog.inherits(proto.cc.arduino.cli.commands.v1.IndexUpdateReport, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexResponse.displayName = 'proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexResponse'; + proto.cc.arduino.cli.commands.v1.IndexUpdateReport.displayName = 'proto.cc.arduino.cli.commands.v1.IndexUpdateReport'; } /** * Generated by JsPbCodeGenerator. @@ -340,16 +400,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.cc.arduino.cli.commands.v1.OutdatedRequest = function(opt_data) { +proto.cc.arduino.cli.commands.v1.VersionRequest = function(opt_data) { jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.cc.arduino.cli.commands.v1.OutdatedRequest, jspb.Message); +goog.inherits(proto.cc.arduino.cli.commands.v1.VersionRequest, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.cc.arduino.cli.commands.v1.OutdatedRequest.displayName = 'proto.cc.arduino.cli.commands.v1.OutdatedRequest'; + proto.cc.arduino.cli.commands.v1.VersionRequest.displayName = 'proto.cc.arduino.cli.commands.v1.VersionRequest'; } /** * Generated by JsPbCodeGenerator. @@ -361,16 +421,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.cc.arduino.cli.commands.v1.OutdatedResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, proto.cc.arduino.cli.commands.v1.OutdatedResponse.repeatedFields_, null); +proto.cc.arduino.cli.commands.v1.VersionResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.cc.arduino.cli.commands.v1.OutdatedResponse, jspb.Message); +goog.inherits(proto.cc.arduino.cli.commands.v1.VersionResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.cc.arduino.cli.commands.v1.OutdatedResponse.displayName = 'proto.cc.arduino.cli.commands.v1.OutdatedResponse'; + proto.cc.arduino.cli.commands.v1.VersionResponse.displayName = 'proto.cc.arduino.cli.commands.v1.VersionResponse'; } /** * Generated by JsPbCodeGenerator. @@ -382,16 +442,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.cc.arduino.cli.commands.v1.UpgradeRequest = function(opt_data) { +proto.cc.arduino.cli.commands.v1.NewSketchRequest = function(opt_data) { jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.cc.arduino.cli.commands.v1.UpgradeRequest, jspb.Message); +goog.inherits(proto.cc.arduino.cli.commands.v1.NewSketchRequest, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.cc.arduino.cli.commands.v1.UpgradeRequest.displayName = 'proto.cc.arduino.cli.commands.v1.UpgradeRequest'; + proto.cc.arduino.cli.commands.v1.NewSketchRequest.displayName = 'proto.cc.arduino.cli.commands.v1.NewSketchRequest'; } /** * Generated by JsPbCodeGenerator. @@ -403,16 +463,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.cc.arduino.cli.commands.v1.UpgradeResponse = function(opt_data) { +proto.cc.arduino.cli.commands.v1.NewSketchResponse = function(opt_data) { jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.cc.arduino.cli.commands.v1.UpgradeResponse, jspb.Message); +goog.inherits(proto.cc.arduino.cli.commands.v1.NewSketchResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.cc.arduino.cli.commands.v1.UpgradeResponse.displayName = 'proto.cc.arduino.cli.commands.v1.UpgradeResponse'; + proto.cc.arduino.cli.commands.v1.NewSketchResponse.displayName = 'proto.cc.arduino.cli.commands.v1.NewSketchResponse'; } /** * Generated by JsPbCodeGenerator. @@ -424,16 +484,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.cc.arduino.cli.commands.v1.VersionRequest = function(opt_data) { +proto.cc.arduino.cli.commands.v1.LoadSketchRequest = function(opt_data) { jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.cc.arduino.cli.commands.v1.VersionRequest, jspb.Message); +goog.inherits(proto.cc.arduino.cli.commands.v1.LoadSketchRequest, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.cc.arduino.cli.commands.v1.VersionRequest.displayName = 'proto.cc.arduino.cli.commands.v1.VersionRequest'; + proto.cc.arduino.cli.commands.v1.LoadSketchRequest.displayName = 'proto.cc.arduino.cli.commands.v1.LoadSketchRequest'; } /** * Generated by JsPbCodeGenerator. @@ -445,16 +505,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.cc.arduino.cli.commands.v1.VersionResponse = function(opt_data) { +proto.cc.arduino.cli.commands.v1.LoadSketchResponse = function(opt_data) { jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.cc.arduino.cli.commands.v1.VersionResponse, jspb.Message); +goog.inherits(proto.cc.arduino.cli.commands.v1.LoadSketchResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.cc.arduino.cli.commands.v1.VersionResponse.displayName = 'proto.cc.arduino.cli.commands.v1.VersionResponse'; + proto.cc.arduino.cli.commands.v1.LoadSketchResponse.displayName = 'proto.cc.arduino.cli.commands.v1.LoadSketchResponse'; } /** * Generated by JsPbCodeGenerator. @@ -466,16 +526,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.cc.arduino.cli.commands.v1.NewSketchRequest = function(opt_data) { +proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest = function(opt_data) { jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.cc.arduino.cli.commands.v1.NewSketchRequest, jspb.Message); +goog.inherits(proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.cc.arduino.cli.commands.v1.NewSketchRequest.displayName = 'proto.cc.arduino.cli.commands.v1.NewSketchRequest'; + proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.displayName = 'proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest'; } /** * Generated by JsPbCodeGenerator. @@ -487,16 +547,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.cc.arduino.cli.commands.v1.NewSketchResponse = function(opt_data) { +proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse = function(opt_data) { jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.cc.arduino.cli.commands.v1.NewSketchResponse, jspb.Message); +goog.inherits(proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.cc.arduino.cli.commands.v1.NewSketchResponse.displayName = 'proto.cc.arduino.cli.commands.v1.NewSketchResponse'; + proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse.displayName = 'proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse'; } /** * Generated by JsPbCodeGenerator. @@ -508,16 +568,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.cc.arduino.cli.commands.v1.LoadSketchRequest = function(opt_data) { +proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest = function(opt_data) { jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.cc.arduino.cli.commands.v1.LoadSketchRequest, jspb.Message); +goog.inherits(proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.cc.arduino.cli.commands.v1.LoadSketchRequest.displayName = 'proto.cc.arduino.cli.commands.v1.LoadSketchRequest'; + proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest.displayName = 'proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest'; } /** * Generated by JsPbCodeGenerator. @@ -529,16 +589,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.cc.arduino.cli.commands.v1.LoadSketchResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, proto.cc.arduino.cli.commands.v1.LoadSketchResponse.repeatedFields_, null); +proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.cc.arduino.cli.commands.v1.LoadSketchResponse, jspb.Message); +goog.inherits(proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.cc.arduino.cli.commands.v1.LoadSketchResponse.displayName = 'proto.cc.arduino.cli.commands.v1.LoadSketchResponse'; + proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse.displayName = 'proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse'; } /** * Generated by JsPbCodeGenerator. @@ -550,16 +610,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest = function(opt_data) { +proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesRequest = function(opt_data) { jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest, jspb.Message); +goog.inherits(proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesRequest, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.displayName = 'proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest'; + proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesRequest.displayName = 'proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesRequest'; } /** * Generated by JsPbCodeGenerator. @@ -571,16 +631,58 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse = function(opt_data) { +proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesResponse = function(opt_data) { jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse, jspb.Message); +goog.inherits(proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse.displayName = 'proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse'; + proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesResponse.displayName = 'proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesResponse'; +} +/** + * 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.CleanDownloadCacheDirectoryRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryRequest.displayName = 'proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryRequest'; +} +/** + * 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.CleanDownloadCacheDirectoryResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryResponse, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryResponse.displayName = 'proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryResponse'; } @@ -1106,7 +1208,7 @@ proto.cc.arduino.cli.commands.v1.InitResponse.toObject = function(includeInstanc var f, obj = { initProgress: (f = msg.getInitProgress()) && proto.cc.arduino.cli.commands.v1.InitResponse.Progress.toObject(includeInstance, f), error: (f = msg.getError()) && google_rpc_status_pb.Status.toObject(includeInstance, f), - profile: (f = msg.getProfile()) && cc_arduino_cli_commands_v1_common_pb.Profile.toObject(includeInstance, f) + profile: (f = msg.getProfile()) && cc_arduino_cli_commands_v1_common_pb.SketchProfile.toObject(includeInstance, f) }; if (includeInstance) { @@ -1154,8 +1256,8 @@ proto.cc.arduino.cli.commands.v1.InitResponse.deserializeBinaryFromReader = func msg.setError(value); break; case 3: - var value = new cc_arduino_cli_commands_v1_common_pb.Profile; - reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.Profile.deserializeBinaryFromReader); + var value = new cc_arduino_cli_commands_v1_common_pb.SketchProfile; + reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.SketchProfile.deserializeBinaryFromReader); msg.setProfile(value); break; default: @@ -1208,7 +1310,7 @@ proto.cc.arduino.cli.commands.v1.InitResponse.serializeBinaryToWriter = function writer.writeMessage( 3, f, - cc_arduino_cli_commands_v1_common_pb.Profile.serializeBinaryToWriter + cc_arduino_cli_commands_v1_common_pb.SketchProfile.serializeBinaryToWriter ); } }; @@ -1491,17 +1593,17 @@ proto.cc.arduino.cli.commands.v1.InitResponse.prototype.hasError = function() { /** - * optional Profile profile = 3; - * @return {?proto.cc.arduino.cli.commands.v1.Profile} + * optional SketchProfile profile = 3; + * @return {?proto.cc.arduino.cli.commands.v1.SketchProfile} */ proto.cc.arduino.cli.commands.v1.InitResponse.prototype.getProfile = function() { - return /** @type{?proto.cc.arduino.cli.commands.v1.Profile} */ ( - jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.Profile, 3)); + return /** @type{?proto.cc.arduino.cli.commands.v1.SketchProfile} */ ( + jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.SketchProfile, 3)); }; /** - * @param {?proto.cc.arduino.cli.commands.v1.Profile|undefined} value + * @param {?proto.cc.arduino.cli.commands.v1.SketchProfile|undefined} value * @return {!proto.cc.arduino.cli.commands.v1.InitResponse} returns this */ proto.cc.arduino.cli.commands.v1.InitResponse.prototype.setProfile = function(value) { @@ -1543,8 +1645,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.DestroyRequest.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.DestroyRequest.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.FailedInstanceInitError.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.FailedInstanceInitError.toObject(opt_includeInstance, this); }; @@ -1553,13 +1655,14 @@ proto.cc.arduino.cli.commands.v1.DestroyRequest.prototype.toObject = function(op * @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.DestroyRequest} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.FailedInstanceInitError} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.DestroyRequest.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.FailedInstanceInitError.toObject = function(includeInstance, msg) { var f, obj = { - instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f) + reason: jspb.Message.getFieldWithDefault(msg, 1, 0), + message: jspb.Message.getFieldWithDefault(msg, 2, "") }; if (includeInstance) { @@ -1573,23 +1676,23 @@ proto.cc.arduino.cli.commands.v1.DestroyRequest.toObject = function(includeInsta /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.DestroyRequest} + * @return {!proto.cc.arduino.cli.commands.v1.FailedInstanceInitError} */ -proto.cc.arduino.cli.commands.v1.DestroyRequest.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.FailedInstanceInitError.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.DestroyRequest; - return proto.cc.arduino.cli.commands.v1.DestroyRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.FailedInstanceInitError; + return proto.cc.arduino.cli.commands.v1.FailedInstanceInitError.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.DestroyRequest} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.FailedInstanceInitError} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.DestroyRequest} + * @return {!proto.cc.arduino.cli.commands.v1.FailedInstanceInitError} */ -proto.cc.arduino.cli.commands.v1.DestroyRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.FailedInstanceInitError.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -1597,9 +1700,12 @@ proto.cc.arduino.cli.commands.v1.DestroyRequest.deserializeBinaryFromReader = fu 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); + var value = /** @type {!proto.cc.arduino.cli.commands.v1.FailedInstanceInitReason} */ (reader.readEnum()); + msg.setReason(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setMessage(value); break; default: reader.skipField(); @@ -1614,9 +1720,9 @@ proto.cc.arduino.cli.commands.v1.DestroyRequest.deserializeBinaryFromReader = fu * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.DestroyRequest.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.FailedInstanceInitError.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.DestroyRequest.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.FailedInstanceInitError.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -1624,57 +1730,62 @@ proto.cc.arduino.cli.commands.v1.DestroyRequest.prototype.serializeBinary = func /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.DestroyRequest} message + * @param {!proto.cc.arduino.cli.commands.v1.FailedInstanceInitError} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.DestroyRequest.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.FailedInstanceInitError.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getInstance(); - if (f != null) { - writer.writeMessage( + f = message.getReason(); + if (f !== 0.0) { + writer.writeEnum( 1, - f, - cc_arduino_cli_commands_v1_common_pb.Instance.serializeBinaryToWriter + f + ); + } + f = message.getMessage(); + if (f.length > 0) { + writer.writeString( + 2, + f ); } }; /** - * optional Instance instance = 1; - * @return {?proto.cc.arduino.cli.commands.v1.Instance} + * optional FailedInstanceInitReason reason = 1; + * @return {!proto.cc.arduino.cli.commands.v1.FailedInstanceInitReason} */ -proto.cc.arduino.cli.commands.v1.DestroyRequest.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)); +proto.cc.arduino.cli.commands.v1.FailedInstanceInitError.prototype.getReason = function() { + return /** @type {!proto.cc.arduino.cli.commands.v1.FailedInstanceInitReason} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); }; /** - * @param {?proto.cc.arduino.cli.commands.v1.Instance|undefined} value - * @return {!proto.cc.arduino.cli.commands.v1.DestroyRequest} returns this -*/ -proto.cc.arduino.cli.commands.v1.DestroyRequest.prototype.setInstance = function(value) { - return jspb.Message.setWrapperField(this, 1, value); + * @param {!proto.cc.arduino.cli.commands.v1.FailedInstanceInitReason} value + * @return {!proto.cc.arduino.cli.commands.v1.FailedInstanceInitError} returns this + */ +proto.cc.arduino.cli.commands.v1.FailedInstanceInitError.prototype.setReason = function(value) { + return jspb.Message.setProto3EnumField(this, 1, value); }; /** - * Clears the message field making it undefined. - * @return {!proto.cc.arduino.cli.commands.v1.DestroyRequest} returns this + * optional string message = 2; + * @return {string} */ -proto.cc.arduino.cli.commands.v1.DestroyRequest.prototype.clearInstance = function() { - return this.setInstance(undefined); +proto.cc.arduino.cli.commands.v1.FailedInstanceInitError.prototype.getMessage = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.FailedInstanceInitError} returns this */ -proto.cc.arduino.cli.commands.v1.DestroyRequest.prototype.hasInstance = function() { - return jspb.Message.getField(this, 1) != null; +proto.cc.arduino.cli.commands.v1.FailedInstanceInitError.prototype.setMessage = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); }; @@ -1694,8 +1805,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.DestroyResponse.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.DestroyResponse.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.DestroyRequest.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.DestroyRequest.toObject(opt_includeInstance, this); }; @@ -1704,13 +1815,13 @@ proto.cc.arduino.cli.commands.v1.DestroyResponse.prototype.toObject = function(o * @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.DestroyResponse} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.DestroyRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.DestroyResponse.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.DestroyRequest.toObject = function(includeInstance, msg) { var f, obj = { - + instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f) }; if (includeInstance) { @@ -1724,29 +1835,34 @@ proto.cc.arduino.cli.commands.v1.DestroyResponse.toObject = function(includeInst /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.DestroyResponse} + * @return {!proto.cc.arduino.cli.commands.v1.DestroyRequest} */ -proto.cc.arduino.cli.commands.v1.DestroyResponse.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.DestroyRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.DestroyResponse; - return proto.cc.arduino.cli.commands.v1.DestroyResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.DestroyRequest; + return proto.cc.arduino.cli.commands.v1.DestroyRequest.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.DestroyResponse} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.DestroyRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.DestroyResponse} + * @return {!proto.cc.arduino.cli.commands.v1.DestroyRequest} */ -proto.cc.arduino.cli.commands.v1.DestroyResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.DestroyRequest.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; default: reader.skipField(); break; @@ -1760,9 +1876,9 @@ proto.cc.arduino.cli.commands.v1.DestroyResponse.deserializeBinaryFromReader = f * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.DestroyResponse.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.DestroyRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.DestroyResponse.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.DestroyRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -1770,22 +1886,168 @@ proto.cc.arduino.cli.commands.v1.DestroyResponse.prototype.serializeBinary = fun /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.DestroyResponse} message + * @param {!proto.cc.arduino.cli.commands.v1.DestroyRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.DestroyResponse.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.DestroyRequest.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 + ); + } }; +/** + * optional Instance instance = 1; + * @return {?proto.cc.arduino.cli.commands.v1.Instance} + */ +proto.cc.arduino.cli.commands.v1.DestroyRequest.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.DestroyRequest} returns this +*/ +proto.cc.arduino.cli.commands.v1.DestroyRequest.prototype.setInstance = function(value) { + return jspb.Message.setWrapperField(this, 1, value); +}; -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. + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.DestroyRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.DestroyRequest.prototype.clearInstance = function() { + return this.setInstance(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.DestroyRequest.prototype.hasInstance = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + + + +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.DestroyResponse.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.DestroyResponse.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.DestroyResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.DestroyResponse.toObject = function(includeInstance, msg) { + var f, obj = { + + }; + + 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.DestroyResponse} + */ +proto.cc.arduino.cli.commands.v1.DestroyResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.DestroyResponse; + return proto.cc.arduino.cli.commands.v1.DestroyResponse.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.DestroyResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.DestroyResponse} + */ +proto.cc.arduino.cli.commands.v1.DestroyResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.DestroyResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.DestroyResponse.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.DestroyResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.DestroyResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; +}; + + + + + +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: @@ -1811,7 +2073,9 @@ proto.cc.arduino.cli.commands.v1.UpdateIndexRequest.prototype.toObject = functio */ proto.cc.arduino.cli.commands.v1.UpdateIndexRequest.toObject = function(includeInstance, msg) { 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), + ignoreCustomPackageIndexes: jspb.Message.getBooleanFieldWithDefault(msg, 2, false), + updateIfOlderThanSecs: jspb.Message.getFieldWithDefault(msg, 3, 0) }; if (includeInstance) { @@ -1853,6 +2117,14 @@ proto.cc.arduino.cli.commands.v1.UpdateIndexRequest.deserializeBinaryFromReader reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.Instance.deserializeBinaryFromReader); msg.setInstance(value); break; + case 2: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setIgnoreCustomPackageIndexes(value); + break; + case 3: + var value = /** @type {number} */ (reader.readInt64()); + msg.setUpdateIfOlderThanSecs(value); + break; default: reader.skipField(); break; @@ -1890,6 +2162,20 @@ proto.cc.arduino.cli.commands.v1.UpdateIndexRequest.serializeBinaryToWriter = fu cc_arduino_cli_commands_v1_common_pb.Instance.serializeBinaryToWriter ); } + f = message.getIgnoreCustomPackageIndexes(); + if (f) { + writer.writeBool( + 2, + f + ); + } + f = message.getUpdateIfOlderThanSecs(); + if (f !== 0) { + writer.writeInt64( + 3, + f + ); + } }; @@ -1930,6 +2216,68 @@ proto.cc.arduino.cli.commands.v1.UpdateIndexRequest.prototype.hasInstance = func }; +/** + * optional bool ignore_custom_package_indexes = 2; + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.UpdateIndexRequest.prototype.getIgnoreCustomPackageIndexes = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.UpdateIndexRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.UpdateIndexRequest.prototype.setIgnoreCustomPackageIndexes = function(value) { + return jspb.Message.setProto3BooleanField(this, 2, value); +}; + + +/** + * optional int64 update_if_older_than_secs = 3; + * @return {number} + */ +proto.cc.arduino.cli.commands.v1.UpdateIndexRequest.prototype.getUpdateIfOlderThanSecs = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.cc.arduino.cli.commands.v1.UpdateIndexRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.UpdateIndexRequest.prototype.setUpdateIfOlderThanSecs = function(value) { + return jspb.Message.setProto3IntField(this, 3, value); +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.MessageCase = { + MESSAGE_NOT_SET: 0, + DOWNLOAD_PROGRESS: 1, + RESULT: 2 +}; + +/** + * @return {proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.MessageCase} + */ +proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.prototype.getMessageCase = function() { + return /** @type {proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.MessageCase} */(jspb.Message.computeOneofCase(this, proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.oneofGroups_[0])); +}; @@ -1962,7 +2310,8 @@ proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.prototype.toObject = functi */ proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.toObject = function(includeInstance, msg) { var f, obj = { - downloadProgress: (f = msg.getDownloadProgress()) && cc_arduino_cli_commands_v1_common_pb.DownloadProgress.toObject(includeInstance, f) + downloadProgress: (f = msg.getDownloadProgress()) && cc_arduino_cli_commands_v1_common_pb.DownloadProgress.toObject(includeInstance, f), + result: (f = msg.getResult()) && proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result.toObject(includeInstance, f) }; if (includeInstance) { @@ -2004,6 +2353,11 @@ proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.deserializeBinaryFromReader reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.DownloadProgress.deserializeBinaryFromReader); msg.setDownloadProgress(value); break; + case 2: + var value = new proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result.deserializeBinaryFromReader); + msg.setResult(value); + break; default: reader.skipField(); break; @@ -2041,46 +2395,24 @@ proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.serializeBinaryToWriter = f cc_arduino_cli_commands_v1_common_pb.DownloadProgress.serializeBinaryToWriter ); } + f = message.getResult(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result.serializeBinaryToWriter + ); + } }; -/** - * optional DownloadProgress download_progress = 1; - * @return {?proto.cc.arduino.cli.commands.v1.DownloadProgress} - */ -proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.prototype.getDownloadProgress = function() { - return /** @type{?proto.cc.arduino.cli.commands.v1.DownloadProgress} */ ( - jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.DownloadProgress, 1)); -}; - - -/** - * @param {?proto.cc.arduino.cli.commands.v1.DownloadProgress|undefined} value - * @return {!proto.cc.arduino.cli.commands.v1.UpdateIndexResponse} returns this -*/ -proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.prototype.setDownloadProgress = function(value) { - return jspb.Message.setWrapperField(this, 1, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.cc.arduino.cli.commands.v1.UpdateIndexResponse} returns this - */ -proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.prototype.clearDownloadProgress = function() { - return this.setDownloadProgress(undefined); -}; - /** - * Returns whether this field is set. - * @return {boolean} + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const */ -proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.prototype.hasDownloadProgress = function() { - return jspb.Message.getField(this, 1) != null; -}; - - +proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result.repeatedFields_ = [1]; @@ -2097,8 +2429,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result.toObject(opt_includeInstance, this); }; @@ -2107,13 +2439,14 @@ proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.prototype.toObject * @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.UpdateLibrariesIndexRequest} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result.toObject = function(includeInstance, msg) { var f, obj = { - instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f) + updatedIndexesList: jspb.Message.toObjectList(msg.getUpdatedIndexesList(), + proto.cc.arduino.cli.commands.v1.IndexUpdateReport.toObject, includeInstance) }; if (includeInstance) { @@ -2127,23 +2460,23 @@ proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.toObject = function /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest} + * @return {!proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result} */ -proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest; - return proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result; + return proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result.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.UpdateLibrariesIndexRequest} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest} + * @return {!proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result} */ -proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -2151,9 +2484,9 @@ proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.deserializeBinaryFr 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); + var value = new proto.cc.arduino.cli.commands.v1.IndexUpdateReport; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.IndexUpdateReport.deserializeBinaryFromReader); + msg.addUpdatedIndexes(value); break; default: reader.skipField(); @@ -2168,9 +2501,9 @@ proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.deserializeBinaryFr * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -2178,48 +2511,86 @@ proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.prototype.serialize /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest} message + * @param {!proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getInstance(); - if (f != null) { - writer.writeMessage( - 1, + f = message.getUpdatedIndexesList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 1, f, - cc_arduino_cli_commands_v1_common_pb.Instance.serializeBinaryToWriter + proto.cc.arduino.cli.commands.v1.IndexUpdateReport.serializeBinaryToWriter ); } }; /** - * optional Instance instance = 1; - * @return {?proto.cc.arduino.cli.commands.v1.Instance} + * repeated IndexUpdateReport updated_indexes = 1; + * @return {!Array<!proto.cc.arduino.cli.commands.v1.IndexUpdateReport>} */ -proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.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)); +proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result.prototype.getUpdatedIndexesList = function() { + return /** @type{!Array<!proto.cc.arduino.cli.commands.v1.IndexUpdateReport>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.cc.arduino.cli.commands.v1.IndexUpdateReport, 1)); }; /** - * @param {?proto.cc.arduino.cli.commands.v1.Instance|undefined} value - * @return {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest} returns this + * @param {!Array<!proto.cc.arduino.cli.commands.v1.IndexUpdateReport>} value + * @return {!proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result} returns this */ -proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.prototype.setInstance = function(value) { - return jspb.Message.setWrapperField(this, 1, value); +proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result.prototype.setUpdatedIndexesList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 1, value); +}; + + +/** + * @param {!proto.cc.arduino.cli.commands.v1.IndexUpdateReport=} opt_value + * @param {number=} opt_index + * @return {!proto.cc.arduino.cli.commands.v1.IndexUpdateReport} + */ +proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result.prototype.addUpdatedIndexes = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.cc.arduino.cli.commands.v1.IndexUpdateReport, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result} returns this + */ +proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result.prototype.clearUpdatedIndexesList = function() { + return this.setUpdatedIndexesList([]); +}; + + +/** + * optional DownloadProgress download_progress = 1; + * @return {?proto.cc.arduino.cli.commands.v1.DownloadProgress} + */ +proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.prototype.getDownloadProgress = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.DownloadProgress} */ ( + jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.DownloadProgress, 1)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.DownloadProgress|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.UpdateIndexResponse} returns this +*/ +proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.prototype.setDownloadProgress = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest} returns this + * @return {!proto.cc.arduino.cli.commands.v1.UpdateIndexResponse} returns this */ -proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.prototype.clearInstance = function() { - return this.setInstance(undefined); +proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.prototype.clearDownloadProgress = function() { + return this.setDownloadProgress(undefined); }; @@ -2227,11 +2598,48 @@ proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.prototype.clearInst * Returns whether this field is set. * @return {boolean} */ -proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.prototype.hasInstance = function() { +proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.prototype.hasDownloadProgress = function() { return jspb.Message.getField(this, 1) != null; }; +/** + * optional Result result = 2; + * @return {?proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result} + */ +proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.prototype.getResult = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result, 2)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.UpdateIndexResponse} returns this +*/ +proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.prototype.setResult = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.UpdateIndexResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.prototype.clearResult = function() { + return this.setResult(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.prototype.hasResult = function() { + return jspb.Message.getField(this, 2) != null; +}; + + @@ -2248,8 +2656,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.toObject(opt_includeInstance, this); }; @@ -2258,13 +2666,14 @@ proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.prototype.toObject * @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.UpdateLibrariesIndexResponse} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.toObject = function(includeInstance, msg) { var f, obj = { - downloadProgress: (f = msg.getDownloadProgress()) && cc_arduino_cli_commands_v1_common_pb.DownloadProgress.toObject(includeInstance, f) + instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f), + updateIfOlderThanSecs: jspb.Message.getFieldWithDefault(msg, 2, 0) }; if (includeInstance) { @@ -2278,23 +2687,23 @@ proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.toObject = functio /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse} + * @return {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest} */ -proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse; - return proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest; + return proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.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.UpdateLibrariesIndexResponse} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse} + * @return {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest} */ -proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -2302,9 +2711,13 @@ proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.deserializeBinaryF var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new cc_arduino_cli_commands_v1_common_pb.DownloadProgress; - reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.DownloadProgress.deserializeBinaryFromReader); - msg.setDownloadProgress(value); + 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 = /** @type {number} */ (reader.readInt64()); + msg.setUpdateIfOlderThanSecs(value); break; default: reader.skipField(); @@ -2319,9 +2732,9 @@ proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.deserializeBinaryF * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -2329,48 +2742,55 @@ proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.prototype.serializ /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse} message + * @param {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getDownloadProgress(); + f = message.getInstance(); if (f != null) { writer.writeMessage( 1, f, - cc_arduino_cli_commands_v1_common_pb.DownloadProgress.serializeBinaryToWriter + cc_arduino_cli_commands_v1_common_pb.Instance.serializeBinaryToWriter + ); + } + f = message.getUpdateIfOlderThanSecs(); + if (f !== 0) { + writer.writeInt64( + 2, + f ); } }; /** - * optional DownloadProgress download_progress = 1; - * @return {?proto.cc.arduino.cli.commands.v1.DownloadProgress} + * optional Instance instance = 1; + * @return {?proto.cc.arduino.cli.commands.v1.Instance} */ -proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.prototype.getDownloadProgress = function() { - return /** @type{?proto.cc.arduino.cli.commands.v1.DownloadProgress} */ ( - jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.DownloadProgress, 1)); +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.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.DownloadProgress|undefined} value - * @return {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse} returns this + * @param {?proto.cc.arduino.cli.commands.v1.Instance|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest} returns this */ -proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.prototype.setDownloadProgress = function(value) { +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.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.UpdateLibrariesIndexResponse} returns this + * @return {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest} returns this */ -proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.prototype.clearDownloadProgress = function() { - return this.setDownloadProgress(undefined); +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.prototype.clearInstance = function() { + return this.setInstance(undefined); }; @@ -2378,11 +2798,55 @@ proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.prototype.clearDow * Returns whether this field is set. * @return {boolean} */ -proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.prototype.hasDownloadProgress = function() { +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.prototype.hasInstance = function() { return jspb.Message.getField(this, 1) != null; }; +/** + * optional int64 update_if_older_than_secs = 2; + * @return {number} + */ +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.prototype.getUpdateIfOlderThanSecs = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.prototype.setUpdateIfOlderThanSecs = function(value) { + return jspb.Message.setProto3IntField(this, 2, value); +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.MessageCase = { + MESSAGE_NOT_SET: 0, + DOWNLOAD_PROGRESS: 1, + RESULT: 2 +}; + +/** + * @return {proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.MessageCase} + */ +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.prototype.getMessageCase = function() { + return /** @type {proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.MessageCase} */(jspb.Message.computeOneofCase(this, proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.oneofGroups_[0])); +}; @@ -2399,8 +2863,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexRequest.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexRequest.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.toObject(opt_includeInstance, this); }; @@ -2409,13 +2873,14 @@ proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexRequest.prototype.toObj * @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.UpdateCoreLibrariesIndexRequest} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexRequest.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.toObject = function(includeInstance, msg) { var f, obj = { - instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f) + downloadProgress: (f = msg.getDownloadProgress()) && cc_arduino_cli_commands_v1_common_pb.DownloadProgress.toObject(includeInstance, f), + result: (f = msg.getResult()) && proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result.toObject(includeInstance, f) }; if (includeInstance) { @@ -2429,23 +2894,23 @@ proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexRequest.toObject = func /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexRequest} + * @return {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse} */ -proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexRequest.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexRequest; - return proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse; + return proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.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.UpdateCoreLibrariesIndexRequest} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexRequest} + * @return {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse} */ -proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -2453,9 +2918,14 @@ proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexRequest.deserializeBina 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); + var value = new cc_arduino_cli_commands_v1_common_pb.DownloadProgress; + reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.DownloadProgress.deserializeBinaryFromReader); + msg.setDownloadProgress(value); + break; + case 2: + var value = new proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result.deserializeBinaryFromReader); + msg.setResult(value); break; default: reader.skipField(); @@ -2470,9 +2940,9 @@ proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexRequest.deserializeBina * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexRequest.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexRequest.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -2480,57 +2950,28 @@ proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexRequest.prototype.seria /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexRequest} message + * @param {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexRequest.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getInstance(); + f = message.getDownloadProgress(); if (f != null) { writer.writeMessage( 1, f, - cc_arduino_cli_commands_v1_common_pb.Instance.serializeBinaryToWriter + cc_arduino_cli_commands_v1_common_pb.DownloadProgress.serializeBinaryToWriter + ); + } + f = message.getResult(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result.serializeBinaryToWriter ); } -}; - - -/** - * optional Instance instance = 1; - * @return {?proto.cc.arduino.cli.commands.v1.Instance} - */ -proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexRequest.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.UpdateCoreLibrariesIndexRequest} returns this -*/ -proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexRequest.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.UpdateCoreLibrariesIndexRequest} returns this - */ -proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexRequest.prototype.clearInstance = function() { - return this.setInstance(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexRequest.prototype.hasInstance = function() { - return jspb.Message.getField(this, 1) != null; }; @@ -2550,8 +2991,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexResponse.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexResponse.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result.toObject(opt_includeInstance, this); }; @@ -2560,13 +3001,13 @@ proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexResponse.prototype.toOb * @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.UpdateCoreLibrariesIndexResponse} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexResponse.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result.toObject = function(includeInstance, msg) { var f, obj = { - downloadProgress: (f = msg.getDownloadProgress()) && cc_arduino_cli_commands_v1_common_pb.DownloadProgress.toObject(includeInstance, f) + librariesIndex: (f = msg.getLibrariesIndex()) && proto.cc.arduino.cli.commands.v1.IndexUpdateReport.toObject(includeInstance, f) }; if (includeInstance) { @@ -2580,23 +3021,23 @@ proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexResponse.toObject = fun /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexResponse} + * @return {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result} */ -proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexResponse.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexResponse; - return proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result; + return proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result.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.UpdateCoreLibrariesIndexResponse} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexResponse} + * @return {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result} */ -proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -2604,9 +3045,9 @@ proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexResponse.deserializeBin var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new cc_arduino_cli_commands_v1_common_pb.DownloadProgress; - reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.DownloadProgress.deserializeBinaryFromReader); - msg.setDownloadProgress(value); + var value = new proto.cc.arduino.cli.commands.v1.IndexUpdateReport; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.IndexUpdateReport.deserializeBinaryFromReader); + msg.setLibrariesIndex(value); break; default: reader.skipField(); @@ -2621,9 +3062,9 @@ proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexResponse.deserializeBin * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexResponse.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexResponse.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -2631,48 +3072,48 @@ proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexResponse.prototype.seri /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexResponse} message + * @param {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexResponse.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getDownloadProgress(); + f = message.getLibrariesIndex(); if (f != null) { writer.writeMessage( 1, f, - cc_arduino_cli_commands_v1_common_pb.DownloadProgress.serializeBinaryToWriter + proto.cc.arduino.cli.commands.v1.IndexUpdateReport.serializeBinaryToWriter ); } }; /** - * optional DownloadProgress download_progress = 1; - * @return {?proto.cc.arduino.cli.commands.v1.DownloadProgress} + * optional IndexUpdateReport libraries_index = 1; + * @return {?proto.cc.arduino.cli.commands.v1.IndexUpdateReport} */ -proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexResponse.prototype.getDownloadProgress = function() { - return /** @type{?proto.cc.arduino.cli.commands.v1.DownloadProgress} */ ( - jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.DownloadProgress, 1)); +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result.prototype.getLibrariesIndex = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.IndexUpdateReport} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.IndexUpdateReport, 1)); }; /** - * @param {?proto.cc.arduino.cli.commands.v1.DownloadProgress|undefined} value - * @return {!proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexResponse} returns this + * @param {?proto.cc.arduino.cli.commands.v1.IndexUpdateReport|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result} returns this */ -proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexResponse.prototype.setDownloadProgress = function(value) { +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result.prototype.setLibrariesIndex = function(value) { return jspb.Message.setWrapperField(this, 1, value); }; /** * Clears the message field making it undefined. - * @return {!proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexResponse} returns this + * @return {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result} returns this */ -proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexResponse.prototype.clearDownloadProgress = function() { - return this.setDownloadProgress(undefined); +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result.prototype.clearLibrariesIndex = function() { + return this.setLibrariesIndex(undefined); }; @@ -2680,150 +3121,73 @@ proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexResponse.prototype.clea * Returns whether this field is set. * @return {boolean} */ -proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexResponse.prototype.hasDownloadProgress = function() { +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result.prototype.hasLibrariesIndex = function() { return jspb.Message.getField(this, 1) != null; }; - - - -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.OutdatedRequest.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.OutdatedRequest.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.OutdatedRequest} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.commands.v1.OutdatedRequest.toObject = function(includeInstance, msg) { - var f, obj = { - instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f) - }; - - 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.OutdatedRequest} + * optional DownloadProgress download_progress = 1; + * @return {?proto.cc.arduino.cli.commands.v1.DownloadProgress} */ -proto.cc.arduino.cli.commands.v1.OutdatedRequest.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.OutdatedRequest; - return proto.cc.arduino.cli.commands.v1.OutdatedRequest.deserializeBinaryFromReader(msg, reader); +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.prototype.getDownloadProgress = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.DownloadProgress} */ ( + jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.DownloadProgress, 1)); }; /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.cc.arduino.cli.commands.v1.OutdatedRequest} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.OutdatedRequest} - */ -proto.cc.arduino.cli.commands.v1.OutdatedRequest.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; - default: - reader.skipField(); - break; - } - } - return msg; + * @param {?proto.cc.arduino.cli.commands.v1.DownloadProgress|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse} returns this +*/ +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.prototype.setDownloadProgress = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.oneofGroups_[0], value); }; /** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse} returns this */ -proto.cc.arduino.cli.commands.v1.OutdatedRequest.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.OutdatedRequest.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.prototype.clearDownloadProgress = function() { + return this.setDownloadProgress(undefined); }; /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.OutdatedRequest} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * Returns whether this field is set. + * @return {boolean} */ -proto.cc.arduino.cli.commands.v1.OutdatedRequest.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 - ); - } +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.prototype.hasDownloadProgress = function() { + return jspb.Message.getField(this, 1) != null; }; /** - * optional Instance instance = 1; - * @return {?proto.cc.arduino.cli.commands.v1.Instance} + * optional Result result = 2; + * @return {?proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result} */ -proto.cc.arduino.cli.commands.v1.OutdatedRequest.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)); +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.prototype.getResult = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result, 2)); }; /** - * @param {?proto.cc.arduino.cli.commands.v1.Instance|undefined} value - * @return {!proto.cc.arduino.cli.commands.v1.OutdatedRequest} returns this + * @param {?proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse} returns this */ -proto.cc.arduino.cli.commands.v1.OutdatedRequest.prototype.setInstance = function(value) { - return jspb.Message.setWrapperField(this, 1, value); +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.prototype.setResult = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.cc.arduino.cli.commands.v1.OutdatedRequest} returns this + * @return {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse} returns this */ -proto.cc.arduino.cli.commands.v1.OutdatedRequest.prototype.clearInstance = function() { - return this.setInstance(undefined); +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.prototype.clearResult = function() { + return this.setResult(undefined); }; @@ -2831,19 +3195,12 @@ proto.cc.arduino.cli.commands.v1.OutdatedRequest.prototype.clearInstance = funct * Returns whether this field is set. * @return {boolean} */ -proto.cc.arduino.cli.commands.v1.OutdatedRequest.prototype.hasInstance = function() { - return jspb.Message.getField(this, 1) != null; +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.prototype.hasResult = function() { + return jspb.Message.getField(this, 2) != null; }; -/** - * List of repeated fields within this message type. - * @private {!Array<number>} - * @const - */ -proto.cc.arduino.cli.commands.v1.OutdatedResponse.repeatedFields_ = [1,2]; - if (jspb.Message.GENERATE_TO_OBJECT) { @@ -2859,8 +3216,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.OutdatedResponse.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.OutdatedResponse.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.IndexUpdateReport.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.IndexUpdateReport.toObject(opt_includeInstance, this); }; @@ -2869,16 +3226,14 @@ proto.cc.arduino.cli.commands.v1.OutdatedResponse.prototype.toObject = function( * @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.OutdatedResponse} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.IndexUpdateReport} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.OutdatedResponse.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.IndexUpdateReport.toObject = function(includeInstance, msg) { var f, obj = { - outdatedLibrariesList: jspb.Message.toObjectList(msg.getOutdatedLibrariesList(), - cc_arduino_cli_commands_v1_lib_pb.InstalledLibrary.toObject, includeInstance), - outdatedPlatformsList: jspb.Message.toObjectList(msg.getOutdatedPlatformsList(), - cc_arduino_cli_commands_v1_common_pb.Platform.toObject, includeInstance) + indexUrl: jspb.Message.getFieldWithDefault(msg, 1, ""), + status: jspb.Message.getFieldWithDefault(msg, 2, 0) }; if (includeInstance) { @@ -2892,23 +3247,23 @@ proto.cc.arduino.cli.commands.v1.OutdatedResponse.toObject = function(includeIns /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.OutdatedResponse} + * @return {!proto.cc.arduino.cli.commands.v1.IndexUpdateReport} */ -proto.cc.arduino.cli.commands.v1.OutdatedResponse.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.IndexUpdateReport.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.OutdatedResponse; - return proto.cc.arduino.cli.commands.v1.OutdatedResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.IndexUpdateReport; + return proto.cc.arduino.cli.commands.v1.IndexUpdateReport.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.OutdatedResponse} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.IndexUpdateReport} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.OutdatedResponse} + * @return {!proto.cc.arduino.cli.commands.v1.IndexUpdateReport} */ -proto.cc.arduino.cli.commands.v1.OutdatedResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.IndexUpdateReport.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -2916,14 +3271,12 @@ proto.cc.arduino.cli.commands.v1.OutdatedResponse.deserializeBinaryFromReader = var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new cc_arduino_cli_commands_v1_lib_pb.InstalledLibrary; - reader.readMessage(value,cc_arduino_cli_commands_v1_lib_pb.InstalledLibrary.deserializeBinaryFromReader); - msg.addOutdatedLibraries(value); + var value = /** @type {string} */ (reader.readString()); + msg.setIndexUrl(value); break; case 2: - var value = new cc_arduino_cli_commands_v1_common_pb.Platform; - reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.Platform.deserializeBinaryFromReader); - msg.addOutdatedPlatforms(value); + var value = /** @type {!proto.cc.arduino.cli.commands.v1.IndexUpdateReport.Status} */ (reader.readEnum()); + msg.setStatus(value); break; default: reader.skipField(); @@ -2938,9 +3291,9 @@ proto.cc.arduino.cli.commands.v1.OutdatedResponse.deserializeBinaryFromReader = * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.OutdatedResponse.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.IndexUpdateReport.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.OutdatedResponse.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.IndexUpdateReport.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -2948,104 +3301,73 @@ proto.cc.arduino.cli.commands.v1.OutdatedResponse.prototype.serializeBinary = fu /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.OutdatedResponse} message + * @param {!proto.cc.arduino.cli.commands.v1.IndexUpdateReport} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.OutdatedResponse.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.IndexUpdateReport.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getOutdatedLibrariesList(); + f = message.getIndexUrl(); if (f.length > 0) { - writer.writeRepeatedMessage( + writer.writeString( 1, - f, - cc_arduino_cli_commands_v1_lib_pb.InstalledLibrary.serializeBinaryToWriter + f ); } - f = message.getOutdatedPlatformsList(); - if (f.length > 0) { - writer.writeRepeatedMessage( + f = message.getStatus(); + if (f !== 0.0) { + writer.writeEnum( 2, - f, - cc_arduino_cli_commands_v1_common_pb.Platform.serializeBinaryToWriter + f ); } }; /** - * repeated InstalledLibrary outdated_libraries = 1; - * @return {!Array<!proto.cc.arduino.cli.commands.v1.InstalledLibrary>} - */ -proto.cc.arduino.cli.commands.v1.OutdatedResponse.prototype.getOutdatedLibrariesList = function() { - return /** @type{!Array<!proto.cc.arduino.cli.commands.v1.InstalledLibrary>} */ ( - jspb.Message.getRepeatedWrapperField(this, cc_arduino_cli_commands_v1_lib_pb.InstalledLibrary, 1)); -}; - - -/** - * @param {!Array<!proto.cc.arduino.cli.commands.v1.InstalledLibrary>} value - * @return {!proto.cc.arduino.cli.commands.v1.OutdatedResponse} returns this -*/ -proto.cc.arduino.cli.commands.v1.OutdatedResponse.prototype.setOutdatedLibrariesList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 1, value); -}; - - -/** - * @param {!proto.cc.arduino.cli.commands.v1.InstalledLibrary=} opt_value - * @param {number=} opt_index - * @return {!proto.cc.arduino.cli.commands.v1.InstalledLibrary} + * @enum {number} */ -proto.cc.arduino.cli.commands.v1.OutdatedResponse.prototype.addOutdatedLibraries = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.cc.arduino.cli.commands.v1.InstalledLibrary, opt_index); +proto.cc.arduino.cli.commands.v1.IndexUpdateReport.Status = { + STATUS_UNSPECIFIED: 0, + STATUS_UPDATED: 1, + STATUS_ALREADY_UP_TO_DATE: 2, + STATUS_FAILED: 3, + STATUS_SKIPPED: 4 }; - /** - * Clears the list making it empty but non-null. - * @return {!proto.cc.arduino.cli.commands.v1.OutdatedResponse} returns this + * optional string index_url = 1; + * @return {string} */ -proto.cc.arduino.cli.commands.v1.OutdatedResponse.prototype.clearOutdatedLibrariesList = function() { - return this.setOutdatedLibrariesList([]); +proto.cc.arduino.cli.commands.v1.IndexUpdateReport.prototype.getIndexUrl = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * repeated Platform outdated_platforms = 2; - * @return {!Array<!proto.cc.arduino.cli.commands.v1.Platform>} + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.IndexUpdateReport} returns this */ -proto.cc.arduino.cli.commands.v1.OutdatedResponse.prototype.getOutdatedPlatformsList = function() { - return /** @type{!Array<!proto.cc.arduino.cli.commands.v1.Platform>} */ ( - jspb.Message.getRepeatedWrapperField(this, cc_arduino_cli_commands_v1_common_pb.Platform, 2)); -}; - - -/** - * @param {!Array<!proto.cc.arduino.cli.commands.v1.Platform>} value - * @return {!proto.cc.arduino.cli.commands.v1.OutdatedResponse} returns this -*/ -proto.cc.arduino.cli.commands.v1.OutdatedResponse.prototype.setOutdatedPlatformsList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 2, value); +proto.cc.arduino.cli.commands.v1.IndexUpdateReport.prototype.setIndexUrl = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); }; /** - * @param {!proto.cc.arduino.cli.commands.v1.Platform=} opt_value - * @param {number=} opt_index - * @return {!proto.cc.arduino.cli.commands.v1.Platform} + * optional Status status = 2; + * @return {!proto.cc.arduino.cli.commands.v1.IndexUpdateReport.Status} */ -proto.cc.arduino.cli.commands.v1.OutdatedResponse.prototype.addOutdatedPlatforms = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 2, opt_value, proto.cc.arduino.cli.commands.v1.Platform, opt_index); +proto.cc.arduino.cli.commands.v1.IndexUpdateReport.prototype.getStatus = function() { + return /** @type {!proto.cc.arduino.cli.commands.v1.IndexUpdateReport.Status} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); }; /** - * Clears the list making it empty but non-null. - * @return {!proto.cc.arduino.cli.commands.v1.OutdatedResponse} returns this + * @param {!proto.cc.arduino.cli.commands.v1.IndexUpdateReport.Status} value + * @return {!proto.cc.arduino.cli.commands.v1.IndexUpdateReport} returns this */ -proto.cc.arduino.cli.commands.v1.OutdatedResponse.prototype.clearOutdatedPlatformsList = function() { - return this.setOutdatedPlatformsList([]); +proto.cc.arduino.cli.commands.v1.IndexUpdateReport.prototype.setStatus = function(value) { + return jspb.Message.setProto3EnumField(this, 2, value); }; @@ -3065,8 +3387,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.UpgradeRequest.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.UpgradeRequest.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.VersionRequest.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.VersionRequest.toObject(opt_includeInstance, this); }; @@ -3075,14 +3397,13 @@ proto.cc.arduino.cli.commands.v1.UpgradeRequest.prototype.toObject = function(op * @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.UpgradeRequest} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.VersionRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.UpgradeRequest.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.VersionRequest.toObject = function(includeInstance, msg) { var f, obj = { - instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f), - skipPostInstall: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + }; if (includeInstance) { @@ -3096,38 +3417,29 @@ proto.cc.arduino.cli.commands.v1.UpgradeRequest.toObject = function(includeInsta /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.UpgradeRequest} + * @return {!proto.cc.arduino.cli.commands.v1.VersionRequest} */ -proto.cc.arduino.cli.commands.v1.UpgradeRequest.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.VersionRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.UpgradeRequest; - return proto.cc.arduino.cli.commands.v1.UpgradeRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.VersionRequest; + return proto.cc.arduino.cli.commands.v1.VersionRequest.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.UpgradeRequest} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.VersionRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.UpgradeRequest} + * @return {!proto.cc.arduino.cli.commands.v1.VersionRequest} */ -proto.cc.arduino.cli.commands.v1.UpgradeRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.VersionRequest.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 = /** @type {boolean} */ (reader.readBool()); - msg.setSkipPostInstall(value); - break; default: reader.skipField(); break; @@ -3141,9 +3453,9 @@ proto.cc.arduino.cli.commands.v1.UpgradeRequest.deserializeBinaryFromReader = fu * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.UpgradeRequest.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.VersionRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.UpgradeRequest.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.VersionRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -3151,82 +3463,12 @@ proto.cc.arduino.cli.commands.v1.UpgradeRequest.prototype.serializeBinary = func /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.UpgradeRequest} message + * @param {!proto.cc.arduino.cli.commands.v1.VersionRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.UpgradeRequest.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.VersionRequest.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.getSkipPostInstall(); - if (f) { - writer.writeBool( - 2, - f - ); - } -}; - - -/** - * optional Instance instance = 1; - * @return {?proto.cc.arduino.cli.commands.v1.Instance} - */ -proto.cc.arduino.cli.commands.v1.UpgradeRequest.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.UpgradeRequest} returns this -*/ -proto.cc.arduino.cli.commands.v1.UpgradeRequest.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.UpgradeRequest} returns this - */ -proto.cc.arduino.cli.commands.v1.UpgradeRequest.prototype.clearInstance = function() { - return this.setInstance(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.cc.arduino.cli.commands.v1.UpgradeRequest.prototype.hasInstance = function() { - return jspb.Message.getField(this, 1) != null; -}; - - -/** - * optional bool skip_post_install = 2; - * @return {boolean} - */ -proto.cc.arduino.cli.commands.v1.UpgradeRequest.prototype.getSkipPostInstall = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); -}; - - -/** - * @param {boolean} value - * @return {!proto.cc.arduino.cli.commands.v1.UpgradeRequest} returns this - */ -proto.cc.arduino.cli.commands.v1.UpgradeRequest.prototype.setSkipPostInstall = function(value) { - return jspb.Message.setProto3BooleanField(this, 2, value); }; @@ -3246,8 +3488,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.UpgradeResponse.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.UpgradeResponse.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.VersionResponse.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.VersionResponse.toObject(opt_includeInstance, this); }; @@ -3256,14 +3498,13 @@ proto.cc.arduino.cli.commands.v1.UpgradeResponse.prototype.toObject = function(o * @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.UpgradeResponse} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.VersionResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.UpgradeResponse.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.VersionResponse.toObject = function(includeInstance, msg) { var f, obj = { - progress: (f = msg.getProgress()) && cc_arduino_cli_commands_v1_common_pb.DownloadProgress.toObject(includeInstance, f), - taskProgress: (f = msg.getTaskProgress()) && cc_arduino_cli_commands_v1_common_pb.TaskProgress.toObject(includeInstance, f) + version: jspb.Message.getFieldWithDefault(msg, 1, "") }; if (includeInstance) { @@ -3277,23 +3518,23 @@ proto.cc.arduino.cli.commands.v1.UpgradeResponse.toObject = function(includeInst /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.UpgradeResponse} + * @return {!proto.cc.arduino.cli.commands.v1.VersionResponse} */ -proto.cc.arduino.cli.commands.v1.UpgradeResponse.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.VersionResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.UpgradeResponse; - return proto.cc.arduino.cli.commands.v1.UpgradeResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.VersionResponse; + return proto.cc.arduino.cli.commands.v1.VersionResponse.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.UpgradeResponse} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.VersionResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.UpgradeResponse} + * @return {!proto.cc.arduino.cli.commands.v1.VersionResponse} */ -proto.cc.arduino.cli.commands.v1.UpgradeResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.VersionResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -3301,14 +3542,8 @@ proto.cc.arduino.cli.commands.v1.UpgradeResponse.deserializeBinaryFromReader = f var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new cc_arduino_cli_commands_v1_common_pb.DownloadProgress; - reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.DownloadProgress.deserializeBinaryFromReader); - msg.setProgress(value); - break; - case 2: - var value = new cc_arduino_cli_commands_v1_common_pb.TaskProgress; - reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.TaskProgress.deserializeBinaryFromReader); - msg.setTaskProgress(value); + var value = /** @type {string} */ (reader.readString()); + msg.setVersion(value); break; default: reader.skipField(); @@ -3323,9 +3558,9 @@ proto.cc.arduino.cli.commands.v1.UpgradeResponse.deserializeBinaryFromReader = f * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.UpgradeResponse.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.VersionResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.UpgradeResponse.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.VersionResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -3333,102 +3568,37 @@ proto.cc.arduino.cli.commands.v1.UpgradeResponse.prototype.serializeBinary = fun /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.UpgradeResponse} message + * @param {!proto.cc.arduino.cli.commands.v1.VersionResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.UpgradeResponse.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.VersionResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getProgress(); - if (f != null) { - writer.writeMessage( + f = message.getVersion(); + if (f.length > 0) { + writer.writeString( 1, - f, - cc_arduino_cli_commands_v1_common_pb.DownloadProgress.serializeBinaryToWriter - ); - } - f = message.getTaskProgress(); - if (f != null) { - writer.writeMessage( - 2, - f, - cc_arduino_cli_commands_v1_common_pb.TaskProgress.serializeBinaryToWriter + f ); } }; /** - * optional DownloadProgress progress = 1; - * @return {?proto.cc.arduino.cli.commands.v1.DownloadProgress} - */ -proto.cc.arduino.cli.commands.v1.UpgradeResponse.prototype.getProgress = function() { - return /** @type{?proto.cc.arduino.cli.commands.v1.DownloadProgress} */ ( - jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.DownloadProgress, 1)); -}; - - -/** - * @param {?proto.cc.arduino.cli.commands.v1.DownloadProgress|undefined} value - * @return {!proto.cc.arduino.cli.commands.v1.UpgradeResponse} returns this -*/ -proto.cc.arduino.cli.commands.v1.UpgradeResponse.prototype.setProgress = function(value) { - return jspb.Message.setWrapperField(this, 1, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.cc.arduino.cli.commands.v1.UpgradeResponse} returns this - */ -proto.cc.arduino.cli.commands.v1.UpgradeResponse.prototype.clearProgress = function() { - return this.setProgress(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.cc.arduino.cli.commands.v1.UpgradeResponse.prototype.hasProgress = function() { - return jspb.Message.getField(this, 1) != null; -}; - - -/** - * optional TaskProgress task_progress = 2; - * @return {?proto.cc.arduino.cli.commands.v1.TaskProgress} - */ -proto.cc.arduino.cli.commands.v1.UpgradeResponse.prototype.getTaskProgress = function() { - return /** @type{?proto.cc.arduino.cli.commands.v1.TaskProgress} */ ( - jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.TaskProgress, 2)); -}; - - -/** - * @param {?proto.cc.arduino.cli.commands.v1.TaskProgress|undefined} value - * @return {!proto.cc.arduino.cli.commands.v1.UpgradeResponse} returns this -*/ -proto.cc.arduino.cli.commands.v1.UpgradeResponse.prototype.setTaskProgress = function(value) { - return jspb.Message.setWrapperField(this, 2, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.cc.arduino.cli.commands.v1.UpgradeResponse} returns this + * optional string version = 1; + * @return {string} */ -proto.cc.arduino.cli.commands.v1.UpgradeResponse.prototype.clearTaskProgress = function() { - return this.setTaskProgress(undefined); +proto.cc.arduino.cli.commands.v1.VersionResponse.prototype.getVersion = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.VersionResponse} returns this */ -proto.cc.arduino.cli.commands.v1.UpgradeResponse.prototype.hasTaskProgress = function() { - return jspb.Message.getField(this, 2) != null; +proto.cc.arduino.cli.commands.v1.VersionResponse.prototype.setVersion = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); }; @@ -3448,8 +3618,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.VersionRequest.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.VersionRequest.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.NewSketchRequest.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.NewSketchRequest.toObject(opt_includeInstance, this); }; @@ -3458,13 +3628,15 @@ proto.cc.arduino.cli.commands.v1.VersionRequest.prototype.toObject = function(op * @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.VersionRequest} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.NewSketchRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.VersionRequest.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.NewSketchRequest.toObject = function(includeInstance, msg) { var f, obj = { - + sketchName: jspb.Message.getFieldWithDefault(msg, 2, ""), + sketchDir: jspb.Message.getFieldWithDefault(msg, 3, ""), + overwrite: jspb.Message.getBooleanFieldWithDefault(msg, 4, false) }; if (includeInstance) { @@ -3478,29 +3650,41 @@ proto.cc.arduino.cli.commands.v1.VersionRequest.toObject = function(includeInsta /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.VersionRequest} + * @return {!proto.cc.arduino.cli.commands.v1.NewSketchRequest} */ -proto.cc.arduino.cli.commands.v1.VersionRequest.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.NewSketchRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.VersionRequest; - return proto.cc.arduino.cli.commands.v1.VersionRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.NewSketchRequest; + return proto.cc.arduino.cli.commands.v1.NewSketchRequest.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.VersionRequest} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.NewSketchRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.VersionRequest} + * @return {!proto.cc.arduino.cli.commands.v1.NewSketchRequest} */ -proto.cc.arduino.cli.commands.v1.VersionRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.NewSketchRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; } var field = reader.getFieldNumber(); switch (field) { + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setSketchName(value); + break; + case 3: + var value = /** @type {string} */ (reader.readString()); + msg.setSketchDir(value); + break; + case 4: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setOverwrite(value); + break; default: reader.skipField(); break; @@ -3514,9 +3698,9 @@ proto.cc.arduino.cli.commands.v1.VersionRequest.deserializeBinaryFromReader = fu * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.VersionRequest.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.NewSketchRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.VersionRequest.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.NewSketchRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -3524,12 +3708,87 @@ proto.cc.arduino.cli.commands.v1.VersionRequest.prototype.serializeBinary = func /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.VersionRequest} message + * @param {!proto.cc.arduino.cli.commands.v1.NewSketchRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.VersionRequest.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.NewSketchRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; + f = message.getSketchName(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } + f = message.getSketchDir(); + if (f.length > 0) { + writer.writeString( + 3, + f + ); + } + f = message.getOverwrite(); + if (f) { + writer.writeBool( + 4, + f + ); + } +}; + + +/** + * optional string sketch_name = 2; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.NewSketchRequest.prototype.getSketchName = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.NewSketchRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.NewSketchRequest.prototype.setSketchName = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + +/** + * optional string sketch_dir = 3; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.NewSketchRequest.prototype.getSketchDir = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.NewSketchRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.NewSketchRequest.prototype.setSketchDir = function(value) { + return jspb.Message.setProto3StringField(this, 3, value); +}; + + +/** + * optional bool overwrite = 4; + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.NewSketchRequest.prototype.getOverwrite = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 4, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.NewSketchRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.NewSketchRequest.prototype.setOverwrite = function(value) { + return jspb.Message.setProto3BooleanField(this, 4, value); }; @@ -3549,8 +3808,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.VersionResponse.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.VersionResponse.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.NewSketchResponse.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.NewSketchResponse.toObject(opt_includeInstance, this); }; @@ -3559,13 +3818,13 @@ proto.cc.arduino.cli.commands.v1.VersionResponse.prototype.toObject = function(o * @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.VersionResponse} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.NewSketchResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.VersionResponse.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.NewSketchResponse.toObject = function(includeInstance, msg) { var f, obj = { - version: jspb.Message.getFieldWithDefault(msg, 1, "") + mainFile: jspb.Message.getFieldWithDefault(msg, 1, "") }; if (includeInstance) { @@ -3579,23 +3838,23 @@ proto.cc.arduino.cli.commands.v1.VersionResponse.toObject = function(includeInst /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.VersionResponse} + * @return {!proto.cc.arduino.cli.commands.v1.NewSketchResponse} */ -proto.cc.arduino.cli.commands.v1.VersionResponse.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.NewSketchResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.VersionResponse; - return proto.cc.arduino.cli.commands.v1.VersionResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.NewSketchResponse; + return proto.cc.arduino.cli.commands.v1.NewSketchResponse.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.VersionResponse} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.NewSketchResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.VersionResponse} + * @return {!proto.cc.arduino.cli.commands.v1.NewSketchResponse} */ -proto.cc.arduino.cli.commands.v1.VersionResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.NewSketchResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -3604,7 +3863,7 @@ proto.cc.arduino.cli.commands.v1.VersionResponse.deserializeBinaryFromReader = f switch (field) { case 1: var value = /** @type {string} */ (reader.readString()); - msg.setVersion(value); + msg.setMainFile(value); break; default: reader.skipField(); @@ -3619,9 +3878,9 @@ proto.cc.arduino.cli.commands.v1.VersionResponse.deserializeBinaryFromReader = f * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.VersionResponse.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.NewSketchResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.VersionResponse.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.NewSketchResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -3629,13 +3888,13 @@ proto.cc.arduino.cli.commands.v1.VersionResponse.prototype.serializeBinary = fun /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.VersionResponse} message + * @param {!proto.cc.arduino.cli.commands.v1.NewSketchResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.VersionResponse.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.NewSketchResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getVersion(); + f = message.getMainFile(); if (f.length > 0) { writer.writeString( 1, @@ -3646,19 +3905,19 @@ proto.cc.arduino.cli.commands.v1.VersionResponse.serializeBinaryToWriter = funct /** - * optional string version = 1; + * optional string main_file = 1; * @return {string} */ -proto.cc.arduino.cli.commands.v1.VersionResponse.prototype.getVersion = function() { +proto.cc.arduino.cli.commands.v1.NewSketchResponse.prototype.getMainFile = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.VersionResponse} returns this + * @return {!proto.cc.arduino.cli.commands.v1.NewSketchResponse} returns this */ -proto.cc.arduino.cli.commands.v1.VersionResponse.prototype.setVersion = function(value) { +proto.cc.arduino.cli.commands.v1.NewSketchResponse.prototype.setMainFile = function(value) { return jspb.Message.setProto3StringField(this, 1, value); }; @@ -3679,8 +3938,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.NewSketchRequest.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.NewSketchRequest.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.LoadSketchRequest.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.LoadSketchRequest.toObject(opt_includeInstance, this); }; @@ -3689,15 +3948,13 @@ proto.cc.arduino.cli.commands.v1.NewSketchRequest.prototype.toObject = function( * @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.NewSketchRequest} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.LoadSketchRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.NewSketchRequest.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.LoadSketchRequest.toObject = function(includeInstance, msg) { var f, obj = { - instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f), - sketchName: jspb.Message.getFieldWithDefault(msg, 2, ""), - sketchDir: jspb.Message.getFieldWithDefault(msg, 3, "") + sketchPath: jspb.Message.getFieldWithDefault(msg, 2, "") }; if (includeInstance) { @@ -3711,41 +3968,32 @@ proto.cc.arduino.cli.commands.v1.NewSketchRequest.toObject = function(includeIns /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.NewSketchRequest} + * @return {!proto.cc.arduino.cli.commands.v1.LoadSketchRequest} */ -proto.cc.arduino.cli.commands.v1.NewSketchRequest.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.LoadSketchRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.NewSketchRequest; - return proto.cc.arduino.cli.commands.v1.NewSketchRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.LoadSketchRequest; + return proto.cc.arduino.cli.commands.v1.LoadSketchRequest.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.NewSketchRequest} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.LoadSketchRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.NewSketchRequest} + * @return {!proto.cc.arduino.cli.commands.v1.LoadSketchRequest} */ -proto.cc.arduino.cli.commands.v1.NewSketchRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.LoadSketchRequest.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 = /** @type {string} */ (reader.readString()); - msg.setSketchName(value); - break; - case 3: - var value = /** @type {string} */ (reader.readString()); - msg.setSketchDir(value); + msg.setSketchPath(value); break; default: reader.skipField(); @@ -3760,9 +4008,9 @@ proto.cc.arduino.cli.commands.v1.NewSketchRequest.deserializeBinaryFromReader = * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.NewSketchRequest.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.LoadSketchRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.NewSketchRequest.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.LoadSketchRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -3770,107 +4018,188 @@ proto.cc.arduino.cli.commands.v1.NewSketchRequest.prototype.serializeBinary = fu /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.NewSketchRequest} message + * @param {!proto.cc.arduino.cli.commands.v1.LoadSketchRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.NewSketchRequest.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.LoadSketchRequest.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.getSketchName(); + f = message.getSketchPath(); if (f.length > 0) { writer.writeString( 2, f ); } - f = message.getSketchDir(); - if (f.length > 0) { - writer.writeString( - 3, - f - ); - } }; /** - * optional Instance instance = 1; - * @return {?proto.cc.arduino.cli.commands.v1.Instance} + * optional string sketch_path = 2; + * @return {string} */ -proto.cc.arduino.cli.commands.v1.NewSketchRequest.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)); +proto.cc.arduino.cli.commands.v1.LoadSketchRequest.prototype.getSketchPath = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); }; /** - * @param {?proto.cc.arduino.cli.commands.v1.Instance|undefined} value - * @return {!proto.cc.arduino.cli.commands.v1.NewSketchRequest} returns this -*/ -proto.cc.arduino.cli.commands.v1.NewSketchRequest.prototype.setInstance = function(value) { - return jspb.Message.setWrapperField(this, 1, value); + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.LoadSketchRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.LoadSketchRequest.prototype.setSketchPath = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); }; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Clears the message field making it undefined. - * @return {!proto.cc.arduino.cli.commands.v1.NewSketchRequest} returns this + * 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.NewSketchRequest.prototype.clearInstance = function() { - return this.setInstance(undefined); +proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.LoadSketchResponse.toObject(opt_includeInstance, this); }; /** - * Returns whether this field is set. - * @return {boolean} + * 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.LoadSketchResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.NewSketchRequest.prototype.hasInstance = function() { - return jspb.Message.getField(this, 1) != null; +proto.cc.arduino.cli.commands.v1.LoadSketchResponse.toObject = function(includeInstance, msg) { + var f, obj = { + sketch: (f = msg.getSketch()) && cc_arduino_cli_commands_v1_common_pb.Sketch.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * optional string sketch_name = 2; - * @return {string} + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.LoadSketchResponse} */ -proto.cc.arduino.cli.commands.v1.NewSketchRequest.prototype.getSketchName = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +proto.cc.arduino.cli.commands.v1.LoadSketchResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.LoadSketchResponse; + return proto.cc.arduino.cli.commands.v1.LoadSketchResponse.deserializeBinaryFromReader(msg, reader); }; /** - * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.NewSketchRequest} returns this + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.LoadSketchResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.LoadSketchResponse} */ -proto.cc.arduino.cli.commands.v1.NewSketchRequest.prototype.setSketchName = function(value) { - return jspb.Message.setProto3StringField(this, 2, value); +proto.cc.arduino.cli.commands.v1.LoadSketchResponse.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.Sketch; + reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.Sketch.deserializeBinaryFromReader); + msg.setSketch(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * optional string sketch_dir = 3; - * @return {string} + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.NewSketchRequest.prototype.getSketchDir = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.LoadSketchResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.NewSketchRequest} returns this + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.cc.arduino.cli.commands.v1.LoadSketchResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.NewSketchRequest.prototype.setSketchDir = function(value) { - return jspb.Message.setProto3StringField(this, 3, value); +proto.cc.arduino.cli.commands.v1.LoadSketchResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getSketch(); + if (f != null) { + writer.writeMessage( + 1, + f, + cc_arduino_cli_commands_v1_common_pb.Sketch.serializeBinaryToWriter + ); + } +}; + + +/** + * optional Sketch sketch = 1; + * @return {?proto.cc.arduino.cli.commands.v1.Sketch} + */ +proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.getSketch = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.Sketch} */ ( + jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.Sketch, 1)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.Sketch|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.LoadSketchResponse} returns this +*/ +proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.setSketch = function(value) { + return jspb.Message.setWrapperField(this, 1, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.LoadSketchResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.clearSketch = function() { + return this.setSketch(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.hasSketch = function() { + return jspb.Message.getField(this, 1) != null; }; @@ -3890,8 +4219,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.NewSketchResponse.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.NewSketchResponse.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.toObject(opt_includeInstance, this); }; @@ -3900,13 +4229,16 @@ proto.cc.arduino.cli.commands.v1.NewSketchResponse.prototype.toObject = function * @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.NewSketchResponse} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.NewSketchResponse.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.toObject = function(includeInstance, msg) { var f, obj = { - mainFile: jspb.Message.getFieldWithDefault(msg, 1, "") + sketchPath: jspb.Message.getFieldWithDefault(msg, 1, ""), + archivePath: jspb.Message.getFieldWithDefault(msg, 2, ""), + includeBuildDir: jspb.Message.getBooleanFieldWithDefault(msg, 3, false), + overwrite: jspb.Message.getBooleanFieldWithDefault(msg, 4, false) }; if (includeInstance) { @@ -3920,23 +4252,23 @@ proto.cc.arduino.cli.commands.v1.NewSketchResponse.toObject = function(includeIn /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.NewSketchResponse} + * @return {!proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest} */ -proto.cc.arduino.cli.commands.v1.NewSketchResponse.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.NewSketchResponse; - return proto.cc.arduino.cli.commands.v1.NewSketchResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest; + return proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.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.NewSketchResponse} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.NewSketchResponse} + * @return {!proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest} */ -proto.cc.arduino.cli.commands.v1.NewSketchResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -3945,7 +4277,19 @@ proto.cc.arduino.cli.commands.v1.NewSketchResponse.deserializeBinaryFromReader = switch (field) { case 1: var value = /** @type {string} */ (reader.readString()); - msg.setMainFile(value); + msg.setSketchPath(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setArchivePath(value); + break; + case 3: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setIncludeBuildDir(value); + break; + case 4: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setOverwrite(value); break; default: reader.skipField(); @@ -3960,9 +4304,9 @@ proto.cc.arduino.cli.commands.v1.NewSketchResponse.deserializeBinaryFromReader = * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.NewSketchResponse.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.NewSketchResponse.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -3970,37 +4314,213 @@ proto.cc.arduino.cli.commands.v1.NewSketchResponse.prototype.serializeBinary = f /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.NewSketchResponse} message + * @param {!proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.NewSketchResponse.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getMainFile(); + f = message.getSketchPath(); if (f.length > 0) { writer.writeString( 1, f ); } + f = message.getArchivePath(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } + f = message.getIncludeBuildDir(); + if (f) { + writer.writeBool( + 3, + f + ); + } + f = message.getOverwrite(); + if (f) { + writer.writeBool( + 4, + f + ); + } +}; + + +/** + * optional string sketch_path = 1; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.prototype.getSketchPath = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.prototype.setSketchPath = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + +/** + * optional string archive_path = 2; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.prototype.getArchivePath = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.prototype.setArchivePath = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + +/** + * optional bool include_build_dir = 3; + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.prototype.getIncludeBuildDir = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.prototype.setIncludeBuildDir = function(value) { + return jspb.Message.setProto3BooleanField(this, 3, value); +}; + + +/** + * optional bool overwrite = 4; + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.prototype.getOverwrite = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 4, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.prototype.setOverwrite = function(value) { + return jspb.Message.setProto3BooleanField(this, 4, value); +}; + + + + + +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.ArchiveSketchResponse.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse.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.ArchiveSketchResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse.toObject = function(includeInstance, msg) { + var f, obj = { + + }; + + 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.ArchiveSketchResponse} + */ +proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse; + return proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse.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.ArchiveSketchResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse} + */ +proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * optional string main_file = 1; - * @return {string} + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.NewSketchResponse.prototype.getMainFile = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.NewSketchResponse} returns this + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.NewSketchResponse.prototype.setMainFile = function(value) { - return jspb.Message.setProto3StringField(this, 1, value); +proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; }; @@ -4020,8 +4540,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.LoadSketchRequest.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.LoadSketchRequest.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest.toObject(opt_includeInstance, this); }; @@ -4030,14 +4550,17 @@ proto.cc.arduino.cli.commands.v1.LoadSketchRequest.prototype.toObject = function * @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.LoadSketchRequest} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.LoadSketchRequest.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest.toObject = function(includeInstance, msg) { var f, obj = { - instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f), - sketchPath: jspb.Message.getFieldWithDefault(msg, 2, "") + sketchPath: jspb.Message.getFieldWithDefault(msg, 1, ""), + defaultFqbn: jspb.Message.getFieldWithDefault(msg, 2, ""), + defaultPortAddress: jspb.Message.getFieldWithDefault(msg, 3, ""), + defaultPortProtocol: jspb.Message.getFieldWithDefault(msg, 4, ""), + defaultProgrammer: jspb.Message.getFieldWithDefault(msg, 5, "") }; if (includeInstance) { @@ -4051,23 +4574,23 @@ proto.cc.arduino.cli.commands.v1.LoadSketchRequest.toObject = function(includeIn /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.LoadSketchRequest} + * @return {!proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest} */ -proto.cc.arduino.cli.commands.v1.LoadSketchRequest.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.LoadSketchRequest; - return proto.cc.arduino.cli.commands.v1.LoadSketchRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest; + return proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest.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.LoadSketchRequest} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.LoadSketchRequest} + * @return {!proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest} */ -proto.cc.arduino.cli.commands.v1.LoadSketchRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -4075,13 +4598,24 @@ proto.cc.arduino.cli.commands.v1.LoadSketchRequest.deserializeBinaryFromReader = 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); + var value = /** @type {string} */ (reader.readString()); + msg.setSketchPath(value); break; case 2: var value = /** @type {string} */ (reader.readString()); - msg.setSketchPath(value); + msg.setDefaultFqbn(value); + break; + case 3: + var value = /** @type {string} */ (reader.readString()); + msg.setDefaultPortAddress(value); + break; + case 4: + var value = /** @type {string} */ (reader.readString()); + msg.setDefaultPortProtocol(value); + break; + case 5: + var value = /** @type {string} */ (reader.readString()); + msg.setDefaultProgrammer(value); break; default: reader.skipField(); @@ -4096,9 +4630,9 @@ proto.cc.arduino.cli.commands.v1.LoadSketchRequest.deserializeBinaryFromReader = * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.LoadSketchRequest.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.LoadSketchRequest.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -4106,92 +4640,140 @@ proto.cc.arduino.cli.commands.v1.LoadSketchRequest.prototype.serializeBinary = f /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.LoadSketchRequest} message + * @param {!proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.LoadSketchRequest.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getInstance(); - if (f != null) { - writer.writeMessage( + f = message.getSketchPath(); + if (f.length > 0) { + writer.writeString( 1, - f, - cc_arduino_cli_commands_v1_common_pb.Instance.serializeBinaryToWriter + f ); } - f = message.getSketchPath(); + f = message.getDefaultFqbn(); if (f.length > 0) { writer.writeString( 2, f ); } + f = message.getDefaultPortAddress(); + if (f.length > 0) { + writer.writeString( + 3, + f + ); + } + f = message.getDefaultPortProtocol(); + if (f.length > 0) { + writer.writeString( + 4, + f + ); + } + f = message.getDefaultProgrammer(); + if (f.length > 0) { + writer.writeString( + 5, + f + ); + } }; /** - * optional Instance instance = 1; - * @return {?proto.cc.arduino.cli.commands.v1.Instance} + * optional string sketch_path = 1; + * @return {string} */ -proto.cc.arduino.cli.commands.v1.LoadSketchRequest.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)); +proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest.prototype.getSketchPath = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * @param {?proto.cc.arduino.cli.commands.v1.Instance|undefined} value - * @return {!proto.cc.arduino.cli.commands.v1.LoadSketchRequest} returns this -*/ -proto.cc.arduino.cli.commands.v1.LoadSketchRequest.prototype.setInstance = function(value) { - return jspb.Message.setWrapperField(this, 1, value); + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest.prototype.setSketchPath = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); }; /** - * Clears the message field making it undefined. - * @return {!proto.cc.arduino.cli.commands.v1.LoadSketchRequest} returns this + * optional string default_fqbn = 2; + * @return {string} */ -proto.cc.arduino.cli.commands.v1.LoadSketchRequest.prototype.clearInstance = function() { - return this.setInstance(undefined); +proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest.prototype.getDefaultFqbn = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest} returns this */ -proto.cc.arduino.cli.commands.v1.LoadSketchRequest.prototype.hasInstance = function() { - return jspb.Message.getField(this, 1) != null; +proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest.prototype.setDefaultFqbn = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); }; /** - * optional string sketch_path = 2; + * optional string default_port_address = 3; * @return {string} */ -proto.cc.arduino.cli.commands.v1.LoadSketchRequest.prototype.getSketchPath = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest.prototype.getDefaultPortAddress = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); }; /** * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.LoadSketchRequest} returns this + * @return {!proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest} returns this */ -proto.cc.arduino.cli.commands.v1.LoadSketchRequest.prototype.setSketchPath = function(value) { - return jspb.Message.setProto3StringField(this, 2, value); +proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest.prototype.setDefaultPortAddress = function(value) { + return jspb.Message.setProto3StringField(this, 3, value); +}; + + +/** + * optional string default_port_protocol = 4; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest.prototype.getDefaultPortProtocol = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); }; +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest.prototype.setDefaultPortProtocol = function(value) { + return jspb.Message.setProto3StringField(this, 4, value); +}; + /** - * List of repeated fields within this message type. - * @private {!Array<number>} - * @const + * optional string default_programmer = 5; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest.prototype.getDefaultProgrammer = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 5, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest} returns this */ -proto.cc.arduino.cli.commands.v1.LoadSketchResponse.repeatedFields_ = [3,4,5]; +proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest.prototype.setDefaultProgrammer = function(value) { + return jspb.Message.setProto3StringField(this, 5, value); +}; + + @@ -4208,8 +4790,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.LoadSketchResponse.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse.toObject(opt_includeInstance, this); }; @@ -4218,17 +4800,16 @@ proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.toObject = functio * @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.LoadSketchResponse} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.LoadSketchResponse.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse.toObject = function(includeInstance, msg) { var f, obj = { - mainFile: jspb.Message.getFieldWithDefault(msg, 1, ""), - locationPath: jspb.Message.getFieldWithDefault(msg, 2, ""), - otherSketchFilesList: (f = jspb.Message.getRepeatedField(msg, 3)) == null ? undefined : f, - additionalFilesList: (f = jspb.Message.getRepeatedField(msg, 4)) == null ? undefined : f, - rootFolderFilesList: (f = jspb.Message.getRepeatedField(msg, 5)) == null ? undefined : f + defaultFqbn: jspb.Message.getFieldWithDefault(msg, 1, ""), + defaultPortAddress: jspb.Message.getFieldWithDefault(msg, 2, ""), + defaultPortProtocol: jspb.Message.getFieldWithDefault(msg, 3, ""), + defaultProgrammer: jspb.Message.getFieldWithDefault(msg, 4, "") }; if (includeInstance) { @@ -4242,23 +4823,23 @@ proto.cc.arduino.cli.commands.v1.LoadSketchResponse.toObject = function(includeI /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.LoadSketchResponse} + * @return {!proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse} */ -proto.cc.arduino.cli.commands.v1.LoadSketchResponse.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.LoadSketchResponse; - return proto.cc.arduino.cli.commands.v1.LoadSketchResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse; + return proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse.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.LoadSketchResponse} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.LoadSketchResponse} + * @return {!proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse} */ -proto.cc.arduino.cli.commands.v1.LoadSketchResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -4267,23 +4848,19 @@ proto.cc.arduino.cli.commands.v1.LoadSketchResponse.deserializeBinaryFromReader switch (field) { case 1: var value = /** @type {string} */ (reader.readString()); - msg.setMainFile(value); + msg.setDefaultFqbn(value); break; case 2: var value = /** @type {string} */ (reader.readString()); - msg.setLocationPath(value); + msg.setDefaultPortAddress(value); break; case 3: var value = /** @type {string} */ (reader.readString()); - msg.addOtherSketchFiles(value); + msg.setDefaultPortProtocol(value); break; case 4: var value = /** @type {string} */ (reader.readString()); - msg.addAdditionalFiles(value); - break; - case 5: - var value = /** @type {string} */ (reader.readString()); - msg.addRootFolderFiles(value); + msg.setDefaultProgrammer(value); break; default: reader.skipField(); @@ -4298,9 +4875,9 @@ proto.cc.arduino.cli.commands.v1.LoadSketchResponse.deserializeBinaryFromReader * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.LoadSketchResponse.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -4308,194 +4885,372 @@ proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.serializeBinary = /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.LoadSketchResponse} message + * @param {!proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.LoadSketchResponse.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getMainFile(); + f = message.getDefaultFqbn(); if (f.length > 0) { writer.writeString( 1, f ); } - f = message.getLocationPath(); + f = message.getDefaultPortAddress(); if (f.length > 0) { writer.writeString( 2, f ); } - f = message.getOtherSketchFilesList(); + f = message.getDefaultPortProtocol(); if (f.length > 0) { - writer.writeRepeatedString( + writer.writeString( 3, f ); } - f = message.getAdditionalFilesList(); + f = message.getDefaultProgrammer(); if (f.length > 0) { - writer.writeRepeatedString( + writer.writeString( 4, f ); } - f = message.getRootFolderFilesList(); - if (f.length > 0) { - writer.writeRepeatedString( - 5, - f - ); - } }; /** - * optional string main_file = 1; + * optional string default_fqbn = 1; * @return {string} */ -proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.getMainFile = function() { +proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse.prototype.getDefaultFqbn = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.LoadSketchResponse} returns this + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse.prototype.setDefaultFqbn = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + +/** + * optional string default_port_address = 2; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse.prototype.getDefaultPortAddress = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse.prototype.setDefaultPortAddress = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + +/** + * optional string default_port_protocol = 3; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse.prototype.getDefaultPortProtocol = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse.prototype.setDefaultPortProtocol = function(value) { + return jspb.Message.setProto3StringField(this, 3, value); +}; + + +/** + * optional string default_programmer = 4; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse.prototype.getDefaultProgrammer = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse.prototype.setDefaultProgrammer = function(value) { + return jspb.Message.setProto3StringField(this, 4, value); +}; + + + + + +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.CheckForArduinoCLIUpdatesRequest.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesRequest.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.CheckForArduinoCLIUpdatesRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesRequest.toObject = function(includeInstance, msg) { + var f, obj = { + forceCheck: jspb.Message.getBooleanFieldWithDefault(msg, 1, 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.CheckForArduinoCLIUpdatesRequest} */ -proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.setMainFile = function(value) { - return jspb.Message.setProto3StringField(this, 1, value); +proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesRequest; + return proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesRequest.deserializeBinaryFromReader(msg, reader); }; /** - * optional string location_path = 2; - * @return {string} + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesRequest} */ -proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.getLocationPath = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setForceCheck(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.LoadSketchResponse} returns this + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.setLocationPath = function(value) { - return jspb.Message.setProto3StringField(this, 2, value); +proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * repeated string other_sketch_files = 3; - * @return {!Array<string>} + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.getOtherSketchFilesList = function() { - return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 3)); +proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getForceCheck(); + if (f) { + writer.writeBool( + 1, + f + ); + } }; /** - * @param {!Array<string>} value - * @return {!proto.cc.arduino.cli.commands.v1.LoadSketchResponse} returns this + * optional bool force_check = 1; + * @return {boolean} */ -proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.setOtherSketchFilesList = function(value) { - return jspb.Message.setField(this, 3, value || []); +proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesRequest.prototype.getForceCheck = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 1, false)); }; /** - * @param {string} value - * @param {number=} opt_index - * @return {!proto.cc.arduino.cli.commands.v1.LoadSketchResponse} returns this + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesRequest} returns this */ -proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.addOtherSketchFiles = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 3, value, opt_index); +proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesRequest.prototype.setForceCheck = function(value) { + return jspb.Message.setProto3BooleanField(this, 1, value); }; -/** - * Clears the list making it empty but non-null. - * @return {!proto.cc.arduino.cli.commands.v1.LoadSketchResponse} returns this - */ -proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.clearOtherSketchFilesList = function() { - return this.setOtherSketchFilesList([]); -}; + +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * repeated string additional_files = 4; - * @return {!Array<string>} + * 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.LoadSketchResponse.prototype.getAdditionalFilesList = function() { - return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 4)); +proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesResponse.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesResponse.toObject(opt_includeInstance, this); }; /** - * @param {!Array<string>} value - * @return {!proto.cc.arduino.cli.commands.v1.LoadSketchResponse} returns 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.CheckForArduinoCLIUpdatesResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.setAdditionalFilesList = function(value) { - return jspb.Message.setField(this, 4, value || []); +proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesResponse.toObject = function(includeInstance, msg) { + var f, obj = { + newestVersion: jspb.Message.getFieldWithDefault(msg, 1, "") + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * @param {string} value - * @param {number=} opt_index - * @return {!proto.cc.arduino.cli.commands.v1.LoadSketchResponse} returns this + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesResponse} */ -proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.addAdditionalFiles = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 4, value, opt_index); +proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesResponse; + return proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesResponse.deserializeBinaryFromReader(msg, reader); }; /** - * Clears the list making it empty but non-null. - * @return {!proto.cc.arduino.cli.commands.v1.LoadSketchResponse} returns this + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesResponse} */ -proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.clearAdditionalFilesList = function() { - return this.setAdditionalFilesList([]); +proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setNewestVersion(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * repeated string root_folder_files = 5; - * @return {!Array<string>} + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.getRootFolderFilesList = function() { - return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 5)); +proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * @param {!Array<string>} value - * @return {!proto.cc.arduino.cli.commands.v1.LoadSketchResponse} returns this + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.setRootFolderFilesList = function(value) { - return jspb.Message.setField(this, 5, value || []); +proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getNewestVersion(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } }; /** - * @param {string} value - * @param {number=} opt_index - * @return {!proto.cc.arduino.cli.commands.v1.LoadSketchResponse} returns this + * optional string newest_version = 1; + * @return {string} */ -proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.addRootFolderFiles = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 5, value, opt_index); +proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesResponse.prototype.getNewestVersion = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * Clears the list making it empty but non-null. - * @return {!proto.cc.arduino.cli.commands.v1.LoadSketchResponse} returns this + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesResponse} returns this */ -proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.clearRootFolderFilesList = function() { - return this.setRootFolderFilesList([]); +proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesResponse.prototype.setNewestVersion = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); }; @@ -4515,8 +5270,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryRequest.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryRequest.toObject(opt_includeInstance, this); }; @@ -4525,15 +5280,13 @@ proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.prototype.toObject = funct * @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.ArchiveSketchRequest} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryRequest.toObject = function(includeInstance, msg) { var f, obj = { - sketchPath: jspb.Message.getFieldWithDefault(msg, 1, ""), - archivePath: jspb.Message.getFieldWithDefault(msg, 2, ""), - includeBuildDir: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) + instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f) }; if (includeInstance) { @@ -4547,23 +5300,23 @@ proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.toObject = function(includ /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest} + * @return {!proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryRequest} */ -proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest; - return proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryRequest; + return proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryRequest.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.ArchiveSketchRequest} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest} + * @return {!proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryRequest} */ -proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -4571,16 +5324,9 @@ proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.deserializeBinaryFromReade var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {string} */ (reader.readString()); - msg.setSketchPath(value); - break; - case 2: - var value = /** @type {string} */ (reader.readString()); - msg.setArchivePath(value); - break; - case 3: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setIncludeBuildDir(value); + 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; default: reader.skipField(); @@ -4595,9 +5341,9 @@ proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.deserializeBinaryFromReade * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -4605,87 +5351,57 @@ proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.prototype.serializeBinary /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest} message + * @param {!proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getSketchPath(); - if (f.length > 0) { - writer.writeString( + f = message.getInstance(); + if (f != null) { + writer.writeMessage( 1, - f - ); - } - f = message.getArchivePath(); - if (f.length > 0) { - writer.writeString( - 2, - f - ); - } - f = message.getIncludeBuildDir(); - if (f) { - writer.writeBool( - 3, - f + f, + cc_arduino_cli_commands_v1_common_pb.Instance.serializeBinaryToWriter ); } }; /** - * optional string sketch_path = 1; - * @return {string} - */ -proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.prototype.getSketchPath = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest} returns this + * optional Instance instance = 1; + * @return {?proto.cc.arduino.cli.commands.v1.Instance} */ -proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.prototype.setSketchPath = function(value) { - return jspb.Message.setProto3StringField(this, 1, value); +proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryRequest.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)); }; /** - * optional string archive_path = 2; - * @return {string} - */ -proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.prototype.getArchivePath = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); + * @param {?proto.cc.arduino.cli.commands.v1.Instance|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryRequest} returns this +*/ +proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryRequest.prototype.setInstance = function(value) { + return jspb.Message.setWrapperField(this, 1, value); }; /** - * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest} returns this + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryRequest} returns this */ -proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.prototype.setArchivePath = function(value) { - return jspb.Message.setProto3StringField(this, 2, value); +proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryRequest.prototype.clearInstance = function() { + return this.setInstance(undefined); }; /** - * optional bool include_build_dir = 3; + * Returns whether this field is set. * @return {boolean} */ -proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.prototype.getIncludeBuildDir = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); -}; - - -/** - * @param {boolean} value - * @return {!proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest} returns this - */ -proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.prototype.setIncludeBuildDir = function(value) { - return jspb.Message.setProto3BooleanField(this, 3, value); +proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryRequest.prototype.hasInstance = function() { + return jspb.Message.getField(this, 1) != null; }; @@ -4705,8 +5421,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryResponse.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryResponse.toObject(opt_includeInstance, this); }; @@ -4715,11 +5431,11 @@ proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse.prototype.toObject = func * @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.ArchiveSketchResponse} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryResponse.toObject = function(includeInstance, msg) { var f, obj = { }; @@ -4735,23 +5451,23 @@ proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse.toObject = function(inclu /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse} + * @return {!proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryResponse} */ -proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse; - return proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryResponse; + return proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryResponse.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.ArchiveSketchResponse} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse} + * @return {!proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryResponse} */ -proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -4771,9 +5487,9 @@ proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse.deserializeBinaryFromRead * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -4781,13 +5497,24 @@ proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse.prototype.serializeBinary /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse} message + * @param {!proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; }; +/** + * @enum {number} + */ +proto.cc.arduino.cli.commands.v1.FailedInstanceInitReason = { + FAILED_INSTANCE_INIT_REASON_UNSPECIFIED: 0, + FAILED_INSTANCE_INIT_REASON_INVALID_INDEX_URL: 1, + FAILED_INSTANCE_INIT_REASON_INDEX_LOAD_ERROR: 2, + FAILED_INSTANCE_INIT_REASON_TOOL_LOAD_ERROR: 3, + FAILED_INSTANCE_INIT_REASON_INDEX_DOWNLOAD_ERROR: 4 +}; + goog.object.extend(exports, proto.cc.arduino.cli.commands.v1); diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/common_pb.d.ts b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/common_pb.d.ts index f79eb14c0..114e96560 100644 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/common_pb.d.ts +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/common_pb.d.ts @@ -10,7 +10,6 @@ export class Instance extends jspb.Message { getId(): number; setId(value: number): Instance; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): Instance.AsObject; static toObject(includeInstance: boolean, msg: Instance): Instance.AsObject; @@ -28,21 +27,23 @@ export namespace Instance { } export class DownloadProgress extends jspb.Message { - getUrl(): string; - setUrl(value: string): DownloadProgress; - - getFile(): string; - setFile(value: string): DownloadProgress; - getTotalSize(): number; - setTotalSize(value: number): DownloadProgress; + hasStart(): boolean; + clearStart(): void; + getStart(): DownloadProgressStart | undefined; + setStart(value?: DownloadProgressStart): DownloadProgress; - getDownloaded(): number; - setDownloaded(value: number): DownloadProgress; + hasUpdate(): boolean; + clearUpdate(): void; + getUpdate(): DownloadProgressUpdate | undefined; + setUpdate(value?: DownloadProgressUpdate): DownloadProgress; - getCompleted(): boolean; - setCompleted(value: boolean): DownloadProgress; + hasEnd(): boolean; + clearEnd(): void; + getEnd(): DownloadProgressEnd | undefined; + setEnd(value?: DownloadProgressEnd): DownloadProgress; + getMessageCase(): DownloadProgress.MessageCase; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): DownloadProgress.AsObject; @@ -55,29 +56,100 @@ export class DownloadProgress extends jspb.Message { } export namespace DownloadProgress { + export type AsObject = { + start?: DownloadProgressStart.AsObject, + update?: DownloadProgressUpdate.AsObject, + end?: DownloadProgressEnd.AsObject, + } + + export enum MessageCase { + MESSAGE_NOT_SET = 0, + START = 1, + UPDATE = 2, + END = 3, + } + +} + +export class DownloadProgressStart extends jspb.Message { + getUrl(): string; + setUrl(value: string): DownloadProgressStart; + getLabel(): string; + setLabel(value: string): DownloadProgressStart; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): DownloadProgressStart.AsObject; + static toObject(includeInstance: boolean, msg: DownloadProgressStart): DownloadProgressStart.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: DownloadProgressStart, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): DownloadProgressStart; + static deserializeBinaryFromReader(message: DownloadProgressStart, reader: jspb.BinaryReader): DownloadProgressStart; +} + +export namespace DownloadProgressStart { export type AsObject = { url: string, - file: string, - totalSize: number, + label: string, + } +} + +export class DownloadProgressUpdate extends jspb.Message { + getDownloaded(): number; + setDownloaded(value: number): DownloadProgressUpdate; + getTotalSize(): number; + setTotalSize(value: number): DownloadProgressUpdate; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): DownloadProgressUpdate.AsObject; + static toObject(includeInstance: boolean, msg: DownloadProgressUpdate): DownloadProgressUpdate.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: DownloadProgressUpdate, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): DownloadProgressUpdate; + static deserializeBinaryFromReader(message: DownloadProgressUpdate, reader: jspb.BinaryReader): DownloadProgressUpdate; +} + +export namespace DownloadProgressUpdate { + export type AsObject = { downloaded: number, - completed: boolean, + totalSize: number, + } +} + +export class DownloadProgressEnd extends jspb.Message { + getSuccess(): boolean; + setSuccess(value: boolean): DownloadProgressEnd; + getMessage(): string; + setMessage(value: string): DownloadProgressEnd; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): DownloadProgressEnd.AsObject; + static toObject(includeInstance: boolean, msg: DownloadProgressEnd): DownloadProgressEnd.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: DownloadProgressEnd, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): DownloadProgressEnd; + static deserializeBinaryFromReader(message: DownloadProgressEnd, reader: jspb.BinaryReader): DownloadProgressEnd; +} + +export namespace DownloadProgressEnd { + export type AsObject = { + success: boolean, + message: string, } } export class TaskProgress extends jspb.Message { getName(): string; setName(value: string): TaskProgress; - getMessage(): string; setMessage(value: string): TaskProgress; - getCompleted(): boolean; setCompleted(value: boolean): TaskProgress; - getPercent(): number; setPercent(value: number): TaskProgress; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): TaskProgress.AsObject; static toObject(includeInstance: boolean, msg: TaskProgress): TaskProgress.AsObject; @@ -100,14 +172,11 @@ export namespace TaskProgress { export class Programmer extends jspb.Message { getPlatform(): string; setPlatform(value: string): Programmer; - getId(): string; setId(value: string): Programmer; - getName(): string; setName(value: string): Programmer; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): Programmer.AsObject; static toObject(includeInstance: boolean, msg: Programmer): Programmer.AsObject; @@ -126,85 +195,185 @@ export namespace Programmer { } } +export class MissingProgrammerError extends jspb.Message { + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): MissingProgrammerError.AsObject; + static toObject(includeInstance: boolean, msg: MissingProgrammerError): MissingProgrammerError.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: MissingProgrammerError, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): MissingProgrammerError; + static deserializeBinaryFromReader(message: MissingProgrammerError, reader: jspb.BinaryReader): MissingProgrammerError; +} + +export namespace MissingProgrammerError { + export type AsObject = { + } +} + export class Platform extends jspb.Message { - getId(): string; - setId(value: string): Platform; - getInstalled(): string; - setInstalled(value: string): Platform; + hasMetadata(): boolean; + clearMetadata(): void; + getMetadata(): PlatformMetadata | undefined; + setMetadata(value?: PlatformMetadata): Platform; - getLatest(): string; - setLatest(value: string): Platform; + hasRelease(): boolean; + clearRelease(): void; + getRelease(): PlatformRelease | undefined; + setRelease(value?: PlatformRelease): Platform; - getName(): string; - setName(value: string): Platform; + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Platform.AsObject; + static toObject(includeInstance: boolean, msg: Platform): Platform.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: Platform, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Platform; + static deserializeBinaryFromReader(message: Platform, reader: jspb.BinaryReader): Platform; +} - getMaintainer(): string; - setMaintainer(value: string): Platform; +export namespace Platform { + export type AsObject = { + metadata?: PlatformMetadata.AsObject, + release?: PlatformRelease.AsObject, + } +} - getWebsite(): string; - setWebsite(value: string): Platform; +export class PlatformSummary extends jspb.Message { - getEmail(): string; - setEmail(value: string): Platform; + hasMetadata(): boolean; + clearMetadata(): void; + getMetadata(): PlatformMetadata | undefined; + setMetadata(value?: PlatformMetadata): PlatformSummary; - clearBoardsList(): void; - getBoardsList(): Array<Board>; - setBoardsList(value: Array<Board>): Platform; - addBoards(value?: Board, index?: number): Board; + getReleasesMap(): jspb.Map<string, PlatformRelease>; + clearReleasesMap(): void; + getInstalledVersion(): string; + setInstalledVersion(value: string): PlatformSummary; + getLatestVersion(): string; + setLatestVersion(value: string): PlatformSummary; - getManuallyInstalled(): boolean; - setManuallyInstalled(value: boolean): Platform; + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): PlatformSummary.AsObject; + static toObject(includeInstance: boolean, msg: PlatformSummary): PlatformSummary.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: PlatformSummary, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): PlatformSummary; + static deserializeBinaryFromReader(message: PlatformSummary, reader: jspb.BinaryReader): PlatformSummary; +} - getDeprecated(): boolean; - setDeprecated(value: boolean): Platform; +export namespace PlatformSummary { + export type AsObject = { + metadata?: PlatformMetadata.AsObject, - clearTypeList(): void; - getTypeList(): Array<string>; - setTypeList(value: Array<string>): Platform; - addType(value: string, index?: number): string; + releasesMap: Array<[string, PlatformRelease.AsObject]>, + installedVersion: string, + latestVersion: string, + } +} +export class PlatformMetadata extends jspb.Message { + getId(): string; + setId(value: string): PlatformMetadata; + getMaintainer(): string; + setMaintainer(value: string): PlatformMetadata; + getWebsite(): string; + setWebsite(value: string): PlatformMetadata; + getEmail(): string; + setEmail(value: string): PlatformMetadata; + getManuallyInstalled(): boolean; + setManuallyInstalled(value: boolean): PlatformMetadata; + getDeprecated(): boolean; + setDeprecated(value: boolean): PlatformMetadata; + getIndexed(): boolean; + setIndexed(value: boolean): PlatformMetadata; serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): Platform.AsObject; - static toObject(includeInstance: boolean, msg: Platform): Platform.AsObject; + toObject(includeInstance?: boolean): PlatformMetadata.AsObject; + static toObject(includeInstance: boolean, msg: PlatformMetadata): PlatformMetadata.AsObject; static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: Platform, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): Platform; - static deserializeBinaryFromReader(message: Platform, reader: jspb.BinaryReader): Platform; + static serializeBinaryToWriter(message: PlatformMetadata, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): PlatformMetadata; + static deserializeBinaryFromReader(message: PlatformMetadata, reader: jspb.BinaryReader): PlatformMetadata; } -export namespace Platform { +export namespace PlatformMetadata { export type AsObject = { id: string, - installed: string, - latest: string, - name: string, maintainer: string, website: string, email: string, - boardsList: Array<Board.AsObject>, manuallyInstalled: boolean, deprecated: boolean, - typeList: Array<string>, + indexed: boolean, + } +} + +export class PlatformRelease extends jspb.Message { + getName(): string; + setName(value: string): PlatformRelease; + getVersion(): string; + setVersion(value: string): PlatformRelease; + clearTypesList(): void; + getTypesList(): Array<string>; + setTypesList(value: Array<string>): PlatformRelease; + addTypes(value: string, index?: number): string; + getInstalled(): boolean; + setInstalled(value: boolean): PlatformRelease; + clearBoardsList(): void; + getBoardsList(): Array<Board>; + setBoardsList(value: Array<Board>): PlatformRelease; + addBoards(value?: Board, index?: number): Board; + + hasHelp(): boolean; + clearHelp(): void; + getHelp(): HelpResources | undefined; + setHelp(value?: HelpResources): PlatformRelease; + getMissingMetadata(): boolean; + setMissingMetadata(value: boolean): PlatformRelease; + getDeprecated(): boolean; + setDeprecated(value: boolean): PlatformRelease; + getCompatible(): boolean; + setCompatible(value: boolean): PlatformRelease; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): PlatformRelease.AsObject; + static toObject(includeInstance: boolean, msg: PlatformRelease): PlatformRelease.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: PlatformRelease, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): PlatformRelease; + static deserializeBinaryFromReader(message: PlatformRelease, reader: jspb.BinaryReader): PlatformRelease; +} + +export namespace PlatformRelease { + export type AsObject = { + name: string, + version: string, + typesList: Array<string>, + installed: boolean, + boardsList: Array<Board.AsObject>, + help?: HelpResources.AsObject, + missingMetadata: boolean, + deprecated: boolean, + compatible: boolean, } } export class InstalledPlatformReference extends jspb.Message { getId(): string; setId(value: string): InstalledPlatformReference; - getVersion(): string; setVersion(value: string): InstalledPlatformReference; - getInstallDir(): string; setInstallDir(value: string): InstalledPlatformReference; - getPackageUrl(): string; setPackageUrl(value: string): InstalledPlatformReference; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): InstalledPlatformReference.AsObject; static toObject(includeInstance: boolean, msg: InstalledPlatformReference): InstalledPlatformReference.AsObject; @@ -227,11 +396,9 @@ export namespace InstalledPlatformReference { export class Board extends jspb.Message { getName(): string; setName(value: string): Board; - getFqbn(): string; setFqbn(value: string): Board; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): Board.AsObject; static toObject(includeInstance: boolean, msg: Board): Board.AsObject; @@ -249,27 +416,172 @@ export namespace Board { } } -export class Profile extends jspb.Message { - getName(): string; - setName(value: string): Profile; +export class HelpResources extends jspb.Message { + getOnline(): string; + setOnline(value: string): HelpResources; - getFqbn(): string; - setFqbn(value: string): Profile; + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): HelpResources.AsObject; + static toObject(includeInstance: boolean, msg: HelpResources): HelpResources.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: HelpResources, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): HelpResources; + static deserializeBinaryFromReader(message: HelpResources, reader: jspb.BinaryReader): HelpResources; +} + +export namespace HelpResources { + export type AsObject = { + online: string, + } +} + +export class Sketch extends jspb.Message { + getMainFile(): string; + setMainFile(value: string): Sketch; + getLocationPath(): string; + setLocationPath(value: string): Sketch; + clearOtherSketchFilesList(): void; + getOtherSketchFilesList(): Array<string>; + setOtherSketchFilesList(value: Array<string>): Sketch; + addOtherSketchFiles(value: string, index?: number): string; + clearAdditionalFilesList(): void; + getAdditionalFilesList(): Array<string>; + setAdditionalFilesList(value: Array<string>): Sketch; + addAdditionalFiles(value: string, index?: number): string; + clearRootFolderFilesList(): void; + getRootFolderFilesList(): Array<string>; + setRootFolderFilesList(value: Array<string>): Sketch; + addRootFolderFiles(value: string, index?: number): string; + getDefaultFqbn(): string; + setDefaultFqbn(value: string): Sketch; + getDefaultPort(): string; + setDefaultPort(value: string): Sketch; + getDefaultProtocol(): string; + setDefaultProtocol(value: string): Sketch; + clearProfilesList(): void; + getProfilesList(): Array<SketchProfile>; + setProfilesList(value: Array<SketchProfile>): Sketch; + addProfiles(value?: SketchProfile, index?: number): SketchProfile; + + hasDefaultProfile(): boolean; + clearDefaultProfile(): void; + getDefaultProfile(): SketchProfile | undefined; + setDefaultProfile(value?: SketchProfile): Sketch; + getDefaultProgrammer(): string; + setDefaultProgrammer(value: string): Sketch; + + hasDefaultPortConfig(): boolean; + clearDefaultPortConfig(): void; + getDefaultPortConfig(): MonitorPortConfiguration | undefined; + setDefaultPortConfig(value?: MonitorPortConfiguration): Sketch; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Sketch.AsObject; + static toObject(includeInstance: boolean, msg: Sketch): Sketch.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: Sketch, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Sketch; + static deserializeBinaryFromReader(message: Sketch, reader: jspb.BinaryReader): Sketch; +} + +export namespace Sketch { + export type AsObject = { + mainFile: string, + locationPath: string, + otherSketchFilesList: Array<string>, + additionalFilesList: Array<string>, + rootFolderFilesList: Array<string>, + defaultFqbn: string, + defaultPort: string, + defaultProtocol: string, + profilesList: Array<SketchProfile.AsObject>, + defaultProfile?: SketchProfile.AsObject, + defaultProgrammer: string, + defaultPortConfig?: MonitorPortConfiguration.AsObject, + } +} +export class MonitorPortConfiguration extends jspb.Message { + clearSettingsList(): void; + getSettingsList(): Array<MonitorPortSetting>; + setSettingsList(value: Array<MonitorPortSetting>): MonitorPortConfiguration; + addSettings(value?: MonitorPortSetting, index?: number): MonitorPortSetting; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): MonitorPortConfiguration.AsObject; + static toObject(includeInstance: boolean, msg: MonitorPortConfiguration): MonitorPortConfiguration.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: MonitorPortConfiguration, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): MonitorPortConfiguration; + static deserializeBinaryFromReader(message: MonitorPortConfiguration, reader: jspb.BinaryReader): MonitorPortConfiguration; +} + +export namespace MonitorPortConfiguration { + export type AsObject = { + settingsList: Array<MonitorPortSetting.AsObject>, + } +} + +export class MonitorPortSetting extends jspb.Message { + getSettingId(): string; + setSettingId(value: string): MonitorPortSetting; + getValue(): string; + setValue(value: string): MonitorPortSetting; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): MonitorPortSetting.AsObject; + static toObject(includeInstance: boolean, msg: MonitorPortSetting): MonitorPortSetting.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: MonitorPortSetting, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): MonitorPortSetting; + static deserializeBinaryFromReader(message: MonitorPortSetting, reader: jspb.BinaryReader): MonitorPortSetting; +} + +export namespace MonitorPortSetting { + export type AsObject = { + settingId: string, + value: string, + } +} + +export class SketchProfile extends jspb.Message { + getName(): string; + setName(value: string): SketchProfile; + getFqbn(): string; + setFqbn(value: string): SketchProfile; + getProgrammer(): string; + setProgrammer(value: string): SketchProfile; + getPort(): string; + setPort(value: string): SketchProfile; + + hasPortConfig(): boolean; + clearPortConfig(): void; + getPortConfig(): MonitorPortConfiguration | undefined; + setPortConfig(value?: MonitorPortConfiguration): SketchProfile; + getProtocol(): string; + setProtocol(value: string): SketchProfile; serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): Profile.AsObject; - static toObject(includeInstance: boolean, msg: Profile): Profile.AsObject; + toObject(includeInstance?: boolean): SketchProfile.AsObject; + static toObject(includeInstance: boolean, msg: SketchProfile): SketchProfile.AsObject; static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: Profile, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): Profile; - static deserializeBinaryFromReader(message: Profile, reader: jspb.BinaryReader): Profile; + static serializeBinaryToWriter(message: SketchProfile, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): SketchProfile; + static deserializeBinaryFromReader(message: SketchProfile, reader: jspb.BinaryReader): SketchProfile; } -export namespace Profile { +export namespace SketchProfile { export type AsObject = { name: string, fqbn: string, + programmer: string, + port: string, + portConfig?: MonitorPortConfiguration.AsObject, + protocol: string, } } diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/common_pb.js b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/common_pb.js index 4ffbe5d22..0b959a33e 100644 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/common_pb.js +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/common_pb.js @@ -13,15 +13,33 @@ var jspb = require('google-protobuf'); var goog = jspb; -var global = Function('return this')(); +var global = (function() { + if (this) { return this; } + if (typeof window !== 'undefined') { return window; } + if (typeof global !== 'undefined') { return global; } + if (typeof self !== 'undefined') { return self; } + return Function('return this')(); +}.call(null)); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.Board', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.DownloadProgress', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.DownloadProgress.MessageCase', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.DownloadProgressEnd', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.DownloadProgressStart', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.HelpResources', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.InstalledPlatformReference', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.Instance', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.MissingProgrammerError', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.MonitorPortSetting', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.Platform', null, global); -goog.exportSymbol('proto.cc.arduino.cli.commands.v1.Profile', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformMetadata', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformRelease', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformSummary', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.Programmer', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.Sketch', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.SketchProfile', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.TaskProgress', null, global); /** * Generated by JsPbCodeGenerator. @@ -55,7 +73,7 @@ if (goog.DEBUG && !COMPILED) { * @constructor */ proto.cc.arduino.cli.commands.v1.DownloadProgress = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.cc.arduino.cli.commands.v1.DownloadProgress.oneofGroups_); }; goog.inherits(proto.cc.arduino.cli.commands.v1.DownloadProgress, jspb.Message); if (goog.DEBUG && !COMPILED) { @@ -65,6 +83,69 @@ if (goog.DEBUG && !COMPILED) { */ proto.cc.arduino.cli.commands.v1.DownloadProgress.displayName = 'proto.cc.arduino.cli.commands.v1.DownloadProgress'; } +/** + * 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.DownloadProgressStart = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.DownloadProgressStart, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.DownloadProgressStart.displayName = 'proto.cc.arduino.cli.commands.v1.DownloadProgressStart'; +} +/** + * 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.DownloadProgressUpdate = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate.displayName = 'proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate'; +} +/** + * 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.DownloadProgressEnd = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.DownloadProgressEnd, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.DownloadProgressEnd.displayName = 'proto.cc.arduino.cli.commands.v1.DownloadProgressEnd'; +} /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -107,6 +188,27 @@ if (goog.DEBUG && !COMPILED) { */ proto.cc.arduino.cli.commands.v1.Programmer.displayName = 'proto.cc.arduino.cli.commands.v1.Programmer'; } +/** + * 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.MissingProgrammerError = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.MissingProgrammerError, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.MissingProgrammerError.displayName = 'proto.cc.arduino.cli.commands.v1.MissingProgrammerError'; +} /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -118,7 +220,7 @@ if (goog.DEBUG && !COMPILED) { * @constructor */ proto.cc.arduino.cli.commands.v1.Platform = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, proto.cc.arduino.cli.commands.v1.Platform.repeatedFields_, null); + jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; goog.inherits(proto.cc.arduino.cli.commands.v1.Platform, jspb.Message); if (goog.DEBUG && !COMPILED) { @@ -128,6 +230,69 @@ if (goog.DEBUG && !COMPILED) { */ proto.cc.arduino.cli.commands.v1.Platform.displayName = 'proto.cc.arduino.cli.commands.v1.Platform'; } +/** + * 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.PlatformSummary = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.PlatformSummary, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.PlatformSummary.displayName = 'proto.cc.arduino.cli.commands.v1.PlatformSummary'; +} +/** + * 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.PlatformMetadata = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.PlatformMetadata, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.PlatformMetadata.displayName = 'proto.cc.arduino.cli.commands.v1.PlatformMetadata'; +} +/** + * 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.PlatformRelease = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.cc.arduino.cli.commands.v1.PlatformRelease.repeatedFields_, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.PlatformRelease, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.PlatformRelease.displayName = 'proto.cc.arduino.cli.commands.v1.PlatformRelease'; +} /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -180,16 +345,100 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.cc.arduino.cli.commands.v1.Profile = function(opt_data) { +proto.cc.arduino.cli.commands.v1.HelpResources = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.HelpResources, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.HelpResources.displayName = 'proto.cc.arduino.cli.commands.v1.HelpResources'; +} +/** + * 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.Sketch = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.cc.arduino.cli.commands.v1.Sketch.repeatedFields_, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.Sketch, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.Sketch.displayName = 'proto.cc.arduino.cli.commands.v1.Sketch'; +} +/** + * 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.MonitorPortConfiguration = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.repeatedFields_, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.displayName = 'proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration'; +} +/** + * 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.MonitorPortSetting = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.MonitorPortSetting, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.MonitorPortSetting.displayName = 'proto.cc.arduino.cli.commands.v1.MonitorPortSetting'; +} +/** + * 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.SketchProfile = function(opt_data) { jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.cc.arduino.cli.commands.v1.Profile, jspb.Message); +goog.inherits(proto.cc.arduino.cli.commands.v1.SketchProfile, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.cc.arduino.cli.commands.v1.Profile.displayName = 'proto.cc.arduino.cli.commands.v1.Profile'; + proto.cc.arduino.cli.commands.v1.SketchProfile.displayName = 'proto.cc.arduino.cli.commands.v1.SketchProfile'; } @@ -322,6 +571,33 @@ proto.cc.arduino.cli.commands.v1.Instance.prototype.setId = function(value) { +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.cc.arduino.cli.commands.v1.DownloadProgress.oneofGroups_ = [[1,2,3]]; + +/** + * @enum {number} + */ +proto.cc.arduino.cli.commands.v1.DownloadProgress.MessageCase = { + MESSAGE_NOT_SET: 0, + START: 1, + UPDATE: 2, + END: 3 +}; + +/** + * @return {proto.cc.arduino.cli.commands.v1.DownloadProgress.MessageCase} + */ +proto.cc.arduino.cli.commands.v1.DownloadProgress.prototype.getMessageCase = function() { + return /** @type {proto.cc.arduino.cli.commands.v1.DownloadProgress.MessageCase} */(jspb.Message.computeOneofCase(this, proto.cc.arduino.cli.commands.v1.DownloadProgress.oneofGroups_[0])); +}; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -353,11 +629,9 @@ proto.cc.arduino.cli.commands.v1.DownloadProgress.prototype.toObject = function( */ proto.cc.arduino.cli.commands.v1.DownloadProgress.toObject = function(includeInstance, msg) { var f, obj = { - url: jspb.Message.getFieldWithDefault(msg, 1, ""), - file: jspb.Message.getFieldWithDefault(msg, 2, ""), - totalSize: jspb.Message.getFieldWithDefault(msg, 3, 0), - downloaded: jspb.Message.getFieldWithDefault(msg, 4, 0), - completed: jspb.Message.getBooleanFieldWithDefault(msg, 5, false) + start: (f = msg.getStart()) && proto.cc.arduino.cli.commands.v1.DownloadProgressStart.toObject(includeInstance, f), + update: (f = msg.getUpdate()) && proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate.toObject(includeInstance, f), + end: (f = msg.getEnd()) && proto.cc.arduino.cli.commands.v1.DownloadProgressEnd.toObject(includeInstance, f) }; if (includeInstance) { @@ -395,24 +669,19 @@ proto.cc.arduino.cli.commands.v1.DownloadProgress.deserializeBinaryFromReader = var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {string} */ (reader.readString()); - msg.setUrl(value); + var value = new proto.cc.arduino.cli.commands.v1.DownloadProgressStart; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.DownloadProgressStart.deserializeBinaryFromReader); + msg.setStart(value); break; case 2: - var value = /** @type {string} */ (reader.readString()); - msg.setFile(value); + var value = new proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate.deserializeBinaryFromReader); + msg.setUpdate(value); break; case 3: - var value = /** @type {number} */ (reader.readInt64()); - msg.setTotalSize(value); - break; - case 4: - var value = /** @type {number} */ (reader.readInt64()); - msg.setDownloaded(value); - break; - case 5: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setCompleted(value); + var value = new proto.cc.arduino.cli.commands.v1.DownloadProgressEnd; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.DownloadProgressEnd.deserializeBinaryFromReader); + msg.setEnd(value); break; default: reader.skipField(); @@ -443,131 +712,141 @@ proto.cc.arduino.cli.commands.v1.DownloadProgress.prototype.serializeBinary = fu */ proto.cc.arduino.cli.commands.v1.DownloadProgress.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getUrl(); - if (f.length > 0) { - writer.writeString( + f = message.getStart(); + if (f != null) { + writer.writeMessage( 1, - f + f, + proto.cc.arduino.cli.commands.v1.DownloadProgressStart.serializeBinaryToWriter ); } - f = message.getFile(); - if (f.length > 0) { - writer.writeString( + f = message.getUpdate(); + if (f != null) { + writer.writeMessage( 2, - f + f, + proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate.serializeBinaryToWriter ); } - f = message.getTotalSize(); - if (f !== 0) { - writer.writeInt64( + f = message.getEnd(); + if (f != null) { + writer.writeMessage( 3, - f - ); - } - f = message.getDownloaded(); - if (f !== 0) { - writer.writeInt64( - 4, - f - ); - } - f = message.getCompleted(); - if (f) { - writer.writeBool( - 5, - f + f, + proto.cc.arduino.cli.commands.v1.DownloadProgressEnd.serializeBinaryToWriter ); } }; /** - * optional string url = 1; - * @return {string} + * optional DownloadProgressStart start = 1; + * @return {?proto.cc.arduino.cli.commands.v1.DownloadProgressStart} */ -proto.cc.arduino.cli.commands.v1.DownloadProgress.prototype.getUrl = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +proto.cc.arduino.cli.commands.v1.DownloadProgress.prototype.getStart = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.DownloadProgressStart} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.DownloadProgressStart, 1)); }; /** - * @param {string} value + * @param {?proto.cc.arduino.cli.commands.v1.DownloadProgressStart|undefined} value * @return {!proto.cc.arduino.cli.commands.v1.DownloadProgress} returns this - */ -proto.cc.arduino.cli.commands.v1.DownloadProgress.prototype.setUrl = function(value) { - return jspb.Message.setProto3StringField(this, 1, value); +*/ +proto.cc.arduino.cli.commands.v1.DownloadProgress.prototype.setStart = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.cc.arduino.cli.commands.v1.DownloadProgress.oneofGroups_[0], value); }; /** - * optional string file = 2; - * @return {string} + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.DownloadProgress} returns this */ -proto.cc.arduino.cli.commands.v1.DownloadProgress.prototype.getFile = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +proto.cc.arduino.cli.commands.v1.DownloadProgress.prototype.clearStart = function() { + return this.setStart(undefined); }; /** - * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.DownloadProgress} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.cc.arduino.cli.commands.v1.DownloadProgress.prototype.setFile = function(value) { - return jspb.Message.setProto3StringField(this, 2, value); +proto.cc.arduino.cli.commands.v1.DownloadProgress.prototype.hasStart = function() { + return jspb.Message.getField(this, 1) != null; }; /** - * optional int64 total_size = 3; - * @return {number} + * optional DownloadProgressUpdate update = 2; + * @return {?proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate} */ -proto.cc.arduino.cli.commands.v1.DownloadProgress.prototype.getTotalSize = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); +proto.cc.arduino.cli.commands.v1.DownloadProgress.prototype.getUpdate = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate, 2)); }; /** - * @param {number} value + * @param {?proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate|undefined} value * @return {!proto.cc.arduino.cli.commands.v1.DownloadProgress} returns this - */ -proto.cc.arduino.cli.commands.v1.DownloadProgress.prototype.setTotalSize = function(value) { - return jspb.Message.setProto3IntField(this, 3, value); +*/ +proto.cc.arduino.cli.commands.v1.DownloadProgress.prototype.setUpdate = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.cc.arduino.cli.commands.v1.DownloadProgress.oneofGroups_[0], value); }; /** - * optional int64 downloaded = 4; - * @return {number} + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.DownloadProgress} returns this */ -proto.cc.arduino.cli.commands.v1.DownloadProgress.prototype.getDownloaded = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0)); +proto.cc.arduino.cli.commands.v1.DownloadProgress.prototype.clearUpdate = function() { + return this.setUpdate(undefined); }; /** - * @param {number} value - * @return {!proto.cc.arduino.cli.commands.v1.DownloadProgress} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.cc.arduino.cli.commands.v1.DownloadProgress.prototype.setDownloaded = function(value) { - return jspb.Message.setProto3IntField(this, 4, value); +proto.cc.arduino.cli.commands.v1.DownloadProgress.prototype.hasUpdate = function() { + return jspb.Message.getField(this, 2) != null; }; /** - * optional bool completed = 5; - * @return {boolean} + * optional DownloadProgressEnd end = 3; + * @return {?proto.cc.arduino.cli.commands.v1.DownloadProgressEnd} */ -proto.cc.arduino.cli.commands.v1.DownloadProgress.prototype.getCompleted = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 5, false)); +proto.cc.arduino.cli.commands.v1.DownloadProgress.prototype.getEnd = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.DownloadProgressEnd} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.DownloadProgressEnd, 3)); }; /** - * @param {boolean} value + * @param {?proto.cc.arduino.cli.commands.v1.DownloadProgressEnd|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.DownloadProgress} returns this +*/ +proto.cc.arduino.cli.commands.v1.DownloadProgress.prototype.setEnd = function(value) { + return jspb.Message.setOneofWrapperField(this, 3, proto.cc.arduino.cli.commands.v1.DownloadProgress.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. * @return {!proto.cc.arduino.cli.commands.v1.DownloadProgress} returns this */ -proto.cc.arduino.cli.commands.v1.DownloadProgress.prototype.setCompleted = function(value) { - return jspb.Message.setProto3BooleanField(this, 5, value); +proto.cc.arduino.cli.commands.v1.DownloadProgress.prototype.clearEnd = function() { + return this.setEnd(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.DownloadProgress.prototype.hasEnd = function() { + return jspb.Message.getField(this, 3) != null; }; @@ -587,8 +866,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.TaskProgress.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.TaskProgress.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.DownloadProgressStart.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.DownloadProgressStart.toObject(opt_includeInstance, this); }; @@ -597,16 +876,14 @@ proto.cc.arduino.cli.commands.v1.TaskProgress.prototype.toObject = function(opt_ * @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.TaskProgress} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.DownloadProgressStart} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.TaskProgress.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.DownloadProgressStart.toObject = function(includeInstance, msg) { var f, obj = { - name: jspb.Message.getFieldWithDefault(msg, 1, ""), - message: jspb.Message.getFieldWithDefault(msg, 2, ""), - completed: jspb.Message.getBooleanFieldWithDefault(msg, 3, false), - percent: jspb.Message.getFloatingPointFieldWithDefault(msg, 4, 0.0) + url: jspb.Message.getFieldWithDefault(msg, 1, ""), + label: jspb.Message.getFieldWithDefault(msg, 2, "") }; if (includeInstance) { @@ -620,23 +897,23 @@ proto.cc.arduino.cli.commands.v1.TaskProgress.toObject = function(includeInstanc /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.TaskProgress} + * @return {!proto.cc.arduino.cli.commands.v1.DownloadProgressStart} */ -proto.cc.arduino.cli.commands.v1.TaskProgress.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.DownloadProgressStart.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.TaskProgress; - return proto.cc.arduino.cli.commands.v1.TaskProgress.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.DownloadProgressStart; + return proto.cc.arduino.cli.commands.v1.DownloadProgressStart.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.TaskProgress} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.DownloadProgressStart} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.TaskProgress} + * @return {!proto.cc.arduino.cli.commands.v1.DownloadProgressStart} */ -proto.cc.arduino.cli.commands.v1.TaskProgress.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.DownloadProgressStart.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -645,19 +922,11 @@ proto.cc.arduino.cli.commands.v1.TaskProgress.deserializeBinaryFromReader = func switch (field) { case 1: var value = /** @type {string} */ (reader.readString()); - msg.setName(value); + msg.setUrl(value); break; case 2: var value = /** @type {string} */ (reader.readString()); - msg.setMessage(value); - break; - case 3: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setCompleted(value); - break; - case 4: - var value = /** @type {number} */ (reader.readFloat()); - msg.setPercent(value); + msg.setLabel(value); break; default: reader.skipField(); @@ -672,9 +941,9 @@ proto.cc.arduino.cli.commands.v1.TaskProgress.deserializeBinaryFromReader = func * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.TaskProgress.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.DownloadProgressStart.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.TaskProgress.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.DownloadProgressStart.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -682,112 +951,2469 @@ proto.cc.arduino.cli.commands.v1.TaskProgress.prototype.serializeBinary = functi /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.TaskProgress} message + * @param {!proto.cc.arduino.cli.commands.v1.DownloadProgressStart} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.TaskProgress.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.DownloadProgressStart.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getName(); + f = message.getUrl(); if (f.length > 0) { writer.writeString( 1, f ); } - f = message.getMessage(); + f = message.getLabel(); if (f.length > 0) { writer.writeString( 2, f ); } - f = message.getCompleted(); - if (f) { - writer.writeBool( - 3, - f - ); - } - f = message.getPercent(); - if (f !== 0.0) { - writer.writeFloat( - 4, - f - ); - } }; /** - * optional string name = 1; + * optional string url = 1; * @return {string} */ -proto.cc.arduino.cli.commands.v1.TaskProgress.prototype.getName = function() { +proto.cc.arduino.cli.commands.v1.DownloadProgressStart.prototype.getUrl = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.TaskProgress} returns this + * @return {!proto.cc.arduino.cli.commands.v1.DownloadProgressStart} returns this */ -proto.cc.arduino.cli.commands.v1.TaskProgress.prototype.setName = function(value) { +proto.cc.arduino.cli.commands.v1.DownloadProgressStart.prototype.setUrl = function(value) { return jspb.Message.setProto3StringField(this, 1, value); }; /** - * optional string message = 2; + * optional string label = 2; * @return {string} */ -proto.cc.arduino.cli.commands.v1.TaskProgress.prototype.getMessage = function() { +proto.cc.arduino.cli.commands.v1.DownloadProgressStart.prototype.getLabel = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); }; /** * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.TaskProgress} returns this + * @return {!proto.cc.arduino.cli.commands.v1.DownloadProgressStart} returns this */ -proto.cc.arduino.cli.commands.v1.TaskProgress.prototype.setMessage = function(value) { +proto.cc.arduino.cli.commands.v1.DownloadProgressStart.prototype.setLabel = function(value) { return jspb.Message.setProto3StringField(this, 2, value); }; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * optional bool completed = 3; - * @return {boolean} + * 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.TaskProgress.prototype.getCompleted = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); +proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate.toObject(opt_includeInstance, this); }; /** - * @param {boolean} value - * @return {!proto.cc.arduino.cli.commands.v1.TaskProgress} returns 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.DownloadProgressUpdate} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.TaskProgress.prototype.setCompleted = function(value) { - return jspb.Message.setProto3BooleanField(this, 3, value); +proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate.toObject = function(includeInstance, msg) { + var f, obj = { + downloaded: jspb.Message.getFieldWithDefault(msg, 1, 0), + totalSize: jspb.Message.getFieldWithDefault(msg, 2, 0) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * optional float percent = 4; + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate} + */ +proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate; + return proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate.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.DownloadProgressUpdate} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate} + */ +proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {number} */ (reader.readInt64()); + msg.setDownloaded(value); + break; + case 2: + var value = /** @type {number} */ (reader.readInt64()); + msg.setTotalSize(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.DownloadProgressUpdate.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate.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.DownloadProgressUpdate} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getDownloaded(); + if (f !== 0) { + writer.writeInt64( + 1, + f + ); + } + f = message.getTotalSize(); + if (f !== 0) { + writer.writeInt64( + 2, + f + ); + } +}; + + +/** + * optional int64 downloaded = 1; * @return {number} */ -proto.cc.arduino.cli.commands.v1.TaskProgress.prototype.getPercent = function() { - return /** @type {number} */ (jspb.Message.getFloatingPointFieldWithDefault(this, 4, 0.0)); +proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate.prototype.getDownloaded = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); }; /** * @param {number} value - * @return {!proto.cc.arduino.cli.commands.v1.TaskProgress} returns this + * @return {!proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate} returns this + */ +proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate.prototype.setDownloaded = function(value) { + return jspb.Message.setProto3IntField(this, 1, value); +}; + + +/** + * optional int64 total_size = 2; + * @return {number} + */ +proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate.prototype.getTotalSize = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate} returns this + */ +proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate.prototype.setTotalSize = function(value) { + return jspb.Message.setProto3IntField(this, 2, value); +}; + + + + + +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.DownloadProgressEnd.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.DownloadProgressEnd.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.DownloadProgressEnd} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.DownloadProgressEnd.toObject = function(includeInstance, msg) { + var f, obj = { + success: jspb.Message.getBooleanFieldWithDefault(msg, 1, false), + message: jspb.Message.getFieldWithDefault(msg, 2, "") + }; + + 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.DownloadProgressEnd} + */ +proto.cc.arduino.cli.commands.v1.DownloadProgressEnd.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.DownloadProgressEnd; + return proto.cc.arduino.cli.commands.v1.DownloadProgressEnd.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.DownloadProgressEnd} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.DownloadProgressEnd} + */ +proto.cc.arduino.cli.commands.v1.DownloadProgressEnd.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setSuccess(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setMessage(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.DownloadProgressEnd.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.DownloadProgressEnd.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.DownloadProgressEnd} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.DownloadProgressEnd.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getSuccess(); + if (f) { + writer.writeBool( + 1, + f + ); + } + f = message.getMessage(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } +}; + + +/** + * optional bool success = 1; + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.DownloadProgressEnd.prototype.getSuccess = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 1, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.DownloadProgressEnd} returns this + */ +proto.cc.arduino.cli.commands.v1.DownloadProgressEnd.prototype.setSuccess = function(value) { + return jspb.Message.setProto3BooleanField(this, 1, value); +}; + + +/** + * optional string message = 2; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.DownloadProgressEnd.prototype.getMessage = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.DownloadProgressEnd} returns this + */ +proto.cc.arduino.cli.commands.v1.DownloadProgressEnd.prototype.setMessage = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + + + + +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.TaskProgress.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.TaskProgress.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.TaskProgress} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.TaskProgress.toObject = function(includeInstance, msg) { + var f, obj = { + name: jspb.Message.getFieldWithDefault(msg, 1, ""), + message: jspb.Message.getFieldWithDefault(msg, 2, ""), + completed: jspb.Message.getBooleanFieldWithDefault(msg, 3, false), + percent: jspb.Message.getFloatingPointFieldWithDefault(msg, 4, 0.0) + }; + + 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.TaskProgress} + */ +proto.cc.arduino.cli.commands.v1.TaskProgress.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.TaskProgress; + return proto.cc.arduino.cli.commands.v1.TaskProgress.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.TaskProgress} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.TaskProgress} + */ +proto.cc.arduino.cli.commands.v1.TaskProgress.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setName(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setMessage(value); + break; + case 3: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setCompleted(value); + break; + case 4: + var value = /** @type {number} */ (reader.readFloat()); + msg.setPercent(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.TaskProgress.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.TaskProgress.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.TaskProgress} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.TaskProgress.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getName(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } + f = message.getMessage(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } + f = message.getCompleted(); + if (f) { + writer.writeBool( + 3, + f + ); + } + f = message.getPercent(); + if (f !== 0.0) { + writer.writeFloat( + 4, + f + ); + } +}; + + +/** + * optional string name = 1; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.TaskProgress.prototype.getName = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.TaskProgress} returns this + */ +proto.cc.arduino.cli.commands.v1.TaskProgress.prototype.setName = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + +/** + * optional string message = 2; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.TaskProgress.prototype.getMessage = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.TaskProgress} returns this + */ +proto.cc.arduino.cli.commands.v1.TaskProgress.prototype.setMessage = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + +/** + * optional bool completed = 3; + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.TaskProgress.prototype.getCompleted = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.TaskProgress} returns this + */ +proto.cc.arduino.cli.commands.v1.TaskProgress.prototype.setCompleted = function(value) { + return jspb.Message.setProto3BooleanField(this, 3, value); +}; + + +/** + * optional float percent = 4; + * @return {number} + */ +proto.cc.arduino.cli.commands.v1.TaskProgress.prototype.getPercent = function() { + return /** @type {number} */ (jspb.Message.getFloatingPointFieldWithDefault(this, 4, 0.0)); +}; + + +/** + * @param {number} value + * @return {!proto.cc.arduino.cli.commands.v1.TaskProgress} returns this + */ +proto.cc.arduino.cli.commands.v1.TaskProgress.prototype.setPercent = function(value) { + return jspb.Message.setProto3FloatField(this, 4, value); +}; + + + + + +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.Programmer.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.Programmer.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.Programmer} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.Programmer.toObject = function(includeInstance, msg) { + var f, obj = { + platform: jspb.Message.getFieldWithDefault(msg, 1, ""), + id: jspb.Message.getFieldWithDefault(msg, 2, ""), + name: jspb.Message.getFieldWithDefault(msg, 3, "") + }; + + 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.Programmer} + */ +proto.cc.arduino.cli.commands.v1.Programmer.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.Programmer; + return proto.cc.arduino.cli.commands.v1.Programmer.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.Programmer} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.Programmer} + */ +proto.cc.arduino.cli.commands.v1.Programmer.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setPlatform(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setId(value); + break; + case 3: + var value = /** @type {string} */ (reader.readString()); + msg.setName(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.Programmer.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.Programmer.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.Programmer} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.Programmer.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getPlatform(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } + f = message.getId(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } + f = message.getName(); + if (f.length > 0) { + writer.writeString( + 3, + f + ); + } +}; + + +/** + * optional string platform = 1; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.Programmer.prototype.getPlatform = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.Programmer} returns this + */ +proto.cc.arduino.cli.commands.v1.Programmer.prototype.setPlatform = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + +/** + * optional string id = 2; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.Programmer.prototype.getId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.Programmer} returns this + */ +proto.cc.arduino.cli.commands.v1.Programmer.prototype.setId = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + +/** + * optional string name = 3; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.Programmer.prototype.getName = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.Programmer} returns this + */ +proto.cc.arduino.cli.commands.v1.Programmer.prototype.setName = function(value) { + return jspb.Message.setProto3StringField(this, 3, value); +}; + + + + + +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.MissingProgrammerError.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.MissingProgrammerError.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.MissingProgrammerError} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.MissingProgrammerError.toObject = function(includeInstance, msg) { + var f, obj = { + + }; + + 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.MissingProgrammerError} + */ +proto.cc.arduino.cli.commands.v1.MissingProgrammerError.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.MissingProgrammerError; + return proto.cc.arduino.cli.commands.v1.MissingProgrammerError.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.MissingProgrammerError} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.MissingProgrammerError} + */ +proto.cc.arduino.cli.commands.v1.MissingProgrammerError.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.MissingProgrammerError.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.MissingProgrammerError.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.MissingProgrammerError} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.MissingProgrammerError.serializeBinaryToWriter = function(message, writer) { + var f = undefined; +}; + + + + + +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.Platform.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.Platform.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.Platform} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.Platform.toObject = function(includeInstance, msg) { + var f, obj = { + metadata: (f = msg.getMetadata()) && proto.cc.arduino.cli.commands.v1.PlatformMetadata.toObject(includeInstance, f), + release: (f = msg.getRelease()) && proto.cc.arduino.cli.commands.v1.PlatformRelease.toObject(includeInstance, f) + }; + + 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.Platform} + */ +proto.cc.arduino.cli.commands.v1.Platform.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.Platform; + return proto.cc.arduino.cli.commands.v1.Platform.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.Platform} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.Platform} + */ +proto.cc.arduino.cli.commands.v1.Platform.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.PlatformMetadata; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.PlatformMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); + break; + case 2: + var value = new proto.cc.arduino.cli.commands.v1.PlatformRelease; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.PlatformRelease.deserializeBinaryFromReader); + msg.setRelease(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.Platform.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.Platform.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.Platform} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.Platform.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.cc.arduino.cli.commands.v1.PlatformMetadata.serializeBinaryToWriter + ); + } + f = message.getRelease(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.cc.arduino.cli.commands.v1.PlatformRelease.serializeBinaryToWriter + ); + } +}; + + +/** + * optional PlatformMetadata metadata = 1; + * @return {?proto.cc.arduino.cli.commands.v1.PlatformMetadata} + */ +proto.cc.arduino.cli.commands.v1.Platform.prototype.getMetadata = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.PlatformMetadata} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.PlatformMetadata, 1)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.PlatformMetadata|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.Platform} returns this +*/ +proto.cc.arduino.cli.commands.v1.Platform.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 1, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.Platform} returns this + */ +proto.cc.arduino.cli.commands.v1.Platform.prototype.clearMetadata = function() { + return this.setMetadata(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.Platform.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional PlatformRelease release = 2; + * @return {?proto.cc.arduino.cli.commands.v1.PlatformRelease} + */ +proto.cc.arduino.cli.commands.v1.Platform.prototype.getRelease = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.PlatformRelease} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.PlatformRelease, 2)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.PlatformRelease|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.Platform} returns this +*/ +proto.cc.arduino.cli.commands.v1.Platform.prototype.setRelease = function(value) { + return jspb.Message.setWrapperField(this, 2, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.Platform} returns this + */ +proto.cc.arduino.cli.commands.v1.Platform.prototype.clearRelease = function() { + return this.setRelease(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.Platform.prototype.hasRelease = function() { + return jspb.Message.getField(this, 2) != null; +}; + + + + + +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.PlatformSummary.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.PlatformSummary.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.PlatformSummary} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.PlatformSummary.toObject = function(includeInstance, msg) { + var f, obj = { + metadata: (f = msg.getMetadata()) && proto.cc.arduino.cli.commands.v1.PlatformMetadata.toObject(includeInstance, f), + releasesMap: (f = msg.getReleasesMap()) ? f.toObject(includeInstance, proto.cc.arduino.cli.commands.v1.PlatformRelease.toObject) : [], + installedVersion: jspb.Message.getFieldWithDefault(msg, 3, ""), + latestVersion: jspb.Message.getFieldWithDefault(msg, 4, "") + }; + + 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.PlatformSummary} + */ +proto.cc.arduino.cli.commands.v1.PlatformSummary.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.PlatformSummary; + return proto.cc.arduino.cli.commands.v1.PlatformSummary.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.PlatformSummary} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.PlatformSummary} + */ +proto.cc.arduino.cli.commands.v1.PlatformSummary.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.PlatformMetadata; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.PlatformMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); + break; + case 2: + var value = msg.getReleasesMap(); + reader.readMessage(value, function(message, reader) { + jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readString, jspb.BinaryReader.prototype.readMessage, proto.cc.arduino.cli.commands.v1.PlatformRelease.deserializeBinaryFromReader, "", new proto.cc.arduino.cli.commands.v1.PlatformRelease()); + }); + break; + case 3: + var value = /** @type {string} */ (reader.readString()); + msg.setInstalledVersion(value); + break; + case 4: + var value = /** @type {string} */ (reader.readString()); + msg.setLatestVersion(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.PlatformSummary.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.PlatformSummary.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.PlatformSummary} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.PlatformSummary.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.cc.arduino.cli.commands.v1.PlatformMetadata.serializeBinaryToWriter + ); + } + f = message.getReleasesMap(true); + if (f && f.getLength() > 0) { + f.serializeBinary(2, writer, jspb.BinaryWriter.prototype.writeString, jspb.BinaryWriter.prototype.writeMessage, proto.cc.arduino.cli.commands.v1.PlatformRelease.serializeBinaryToWriter); + } + f = message.getInstalledVersion(); + if (f.length > 0) { + writer.writeString( + 3, + f + ); + } + f = message.getLatestVersion(); + if (f.length > 0) { + writer.writeString( + 4, + f + ); + } +}; + + +/** + * optional PlatformMetadata metadata = 1; + * @return {?proto.cc.arduino.cli.commands.v1.PlatformMetadata} + */ +proto.cc.arduino.cli.commands.v1.PlatformSummary.prototype.getMetadata = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.PlatformMetadata} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.PlatformMetadata, 1)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.PlatformMetadata|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.PlatformSummary} returns this +*/ +proto.cc.arduino.cli.commands.v1.PlatformSummary.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 1, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.PlatformSummary} returns this + */ +proto.cc.arduino.cli.commands.v1.PlatformSummary.prototype.clearMetadata = function() { + return this.setMetadata(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.PlatformSummary.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * map<string, PlatformRelease> releases = 2; + * @param {boolean=} opt_noLazyCreate Do not create the map if + * empty, instead returning `undefined` + * @return {!jspb.Map<string,!proto.cc.arduino.cli.commands.v1.PlatformRelease>} + */ +proto.cc.arduino.cli.commands.v1.PlatformSummary.prototype.getReleasesMap = function(opt_noLazyCreate) { + return /** @type {!jspb.Map<string,!proto.cc.arduino.cli.commands.v1.PlatformRelease>} */ ( + jspb.Message.getMapField(this, 2, opt_noLazyCreate, + proto.cc.arduino.cli.commands.v1.PlatformRelease)); +}; + + +/** + * Clears values from the map. The map will be non-null. + * @return {!proto.cc.arduino.cli.commands.v1.PlatformSummary} returns this + */ +proto.cc.arduino.cli.commands.v1.PlatformSummary.prototype.clearReleasesMap = function() { + this.getReleasesMap().clear(); + return this;}; + + +/** + * optional string installed_version = 3; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.PlatformSummary.prototype.getInstalledVersion = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.PlatformSummary} returns this + */ +proto.cc.arduino.cli.commands.v1.PlatformSummary.prototype.setInstalledVersion = function(value) { + return jspb.Message.setProto3StringField(this, 3, value); +}; + + +/** + * optional string latest_version = 4; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.PlatformSummary.prototype.getLatestVersion = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.PlatformSummary} returns this + */ +proto.cc.arduino.cli.commands.v1.PlatformSummary.prototype.setLatestVersion = function(value) { + return jspb.Message.setProto3StringField(this, 4, value); +}; + + + + + +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.PlatformMetadata.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.PlatformMetadata.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.PlatformMetadata} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.PlatformMetadata.toObject = function(includeInstance, msg) { + var f, obj = { + id: jspb.Message.getFieldWithDefault(msg, 1, ""), + maintainer: jspb.Message.getFieldWithDefault(msg, 2, ""), + website: jspb.Message.getFieldWithDefault(msg, 3, ""), + email: jspb.Message.getFieldWithDefault(msg, 4, ""), + manuallyInstalled: jspb.Message.getBooleanFieldWithDefault(msg, 5, false), + deprecated: jspb.Message.getBooleanFieldWithDefault(msg, 6, false), + indexed: jspb.Message.getBooleanFieldWithDefault(msg, 7, 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.PlatformMetadata} + */ +proto.cc.arduino.cli.commands.v1.PlatformMetadata.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.PlatformMetadata; + return proto.cc.arduino.cli.commands.v1.PlatformMetadata.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.PlatformMetadata} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.PlatformMetadata} + */ +proto.cc.arduino.cli.commands.v1.PlatformMetadata.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setId(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setMaintainer(value); + break; + case 3: + var value = /** @type {string} */ (reader.readString()); + msg.setWebsite(value); + break; + case 4: + var value = /** @type {string} */ (reader.readString()); + msg.setEmail(value); + break; + case 5: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setManuallyInstalled(value); + break; + case 6: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setDeprecated(value); + break; + case 7: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setIndexed(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.PlatformMetadata.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.PlatformMetadata.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.PlatformMetadata} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.PlatformMetadata.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getId(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } + f = message.getMaintainer(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } + f = message.getWebsite(); + if (f.length > 0) { + writer.writeString( + 3, + f + ); + } + f = message.getEmail(); + if (f.length > 0) { + writer.writeString( + 4, + f + ); + } + f = message.getManuallyInstalled(); + if (f) { + writer.writeBool( + 5, + f + ); + } + f = message.getDeprecated(); + if (f) { + writer.writeBool( + 6, + f + ); + } + f = message.getIndexed(); + if (f) { + writer.writeBool( + 7, + f + ); + } +}; + + +/** + * optional string id = 1; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.PlatformMetadata.prototype.getId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.PlatformMetadata} returns this + */ +proto.cc.arduino.cli.commands.v1.PlatformMetadata.prototype.setId = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + +/** + * optional string maintainer = 2; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.PlatformMetadata.prototype.getMaintainer = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.PlatformMetadata} returns this + */ +proto.cc.arduino.cli.commands.v1.PlatformMetadata.prototype.setMaintainer = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + +/** + * optional string website = 3; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.PlatformMetadata.prototype.getWebsite = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.PlatformMetadata} returns this + */ +proto.cc.arduino.cli.commands.v1.PlatformMetadata.prototype.setWebsite = function(value) { + return jspb.Message.setProto3StringField(this, 3, value); +}; + + +/** + * optional string email = 4; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.PlatformMetadata.prototype.getEmail = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.PlatformMetadata} returns this + */ +proto.cc.arduino.cli.commands.v1.PlatformMetadata.prototype.setEmail = function(value) { + return jspb.Message.setProto3StringField(this, 4, value); +}; + + +/** + * optional bool manually_installed = 5; + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.PlatformMetadata.prototype.getManuallyInstalled = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 5, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.PlatformMetadata} returns this + */ +proto.cc.arduino.cli.commands.v1.PlatformMetadata.prototype.setManuallyInstalled = function(value) { + return jspb.Message.setProto3BooleanField(this, 5, value); +}; + + +/** + * optional bool deprecated = 6; + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.PlatformMetadata.prototype.getDeprecated = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 6, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.PlatformMetadata} returns this + */ +proto.cc.arduino.cli.commands.v1.PlatformMetadata.prototype.setDeprecated = function(value) { + return jspb.Message.setProto3BooleanField(this, 6, value); +}; + + +/** + * optional bool indexed = 7; + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.PlatformMetadata.prototype.getIndexed = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 7, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.PlatformMetadata} returns this + */ +proto.cc.arduino.cli.commands.v1.PlatformMetadata.prototype.setIndexed = function(value) { + return jspb.Message.setProto3BooleanField(this, 7, value); +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.cc.arduino.cli.commands.v1.PlatformRelease.repeatedFields_ = [3,5]; + + + +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.PlatformRelease.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.PlatformRelease.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.PlatformRelease} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.PlatformRelease.toObject = function(includeInstance, msg) { + var f, obj = { + name: jspb.Message.getFieldWithDefault(msg, 1, ""), + version: jspb.Message.getFieldWithDefault(msg, 2, ""), + typesList: (f = jspb.Message.getRepeatedField(msg, 3)) == null ? undefined : f, + installed: jspb.Message.getBooleanFieldWithDefault(msg, 4, false), + boardsList: jspb.Message.toObjectList(msg.getBoardsList(), + proto.cc.arduino.cli.commands.v1.Board.toObject, includeInstance), + help: (f = msg.getHelp()) && proto.cc.arduino.cli.commands.v1.HelpResources.toObject(includeInstance, f), + missingMetadata: jspb.Message.getBooleanFieldWithDefault(msg, 7, false), + deprecated: jspb.Message.getBooleanFieldWithDefault(msg, 8, false), + compatible: jspb.Message.getBooleanFieldWithDefault(msg, 9, 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.PlatformRelease} + */ +proto.cc.arduino.cli.commands.v1.PlatformRelease.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.PlatformRelease; + return proto.cc.arduino.cli.commands.v1.PlatformRelease.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.PlatformRelease} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.PlatformRelease} + */ +proto.cc.arduino.cli.commands.v1.PlatformRelease.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setName(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setVersion(value); + break; + case 3: + var value = /** @type {string} */ (reader.readString()); + msg.addTypes(value); + break; + case 4: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setInstalled(value); + break; + case 5: + var value = new proto.cc.arduino.cli.commands.v1.Board; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.Board.deserializeBinaryFromReader); + msg.addBoards(value); + break; + case 6: + var value = new proto.cc.arduino.cli.commands.v1.HelpResources; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.HelpResources.deserializeBinaryFromReader); + msg.setHelp(value); + break; + case 7: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setMissingMetadata(value); + break; + case 8: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setDeprecated(value); + break; + case 9: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setCompatible(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.PlatformRelease.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.PlatformRelease.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.PlatformRelease} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.PlatformRelease.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getName(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } + f = message.getVersion(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } + f = message.getTypesList(); + if (f.length > 0) { + writer.writeRepeatedString( + 3, + f + ); + } + f = message.getInstalled(); + if (f) { + writer.writeBool( + 4, + f + ); + } + f = message.getBoardsList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 5, + f, + proto.cc.arduino.cli.commands.v1.Board.serializeBinaryToWriter + ); + } + f = message.getHelp(); + if (f != null) { + writer.writeMessage( + 6, + f, + proto.cc.arduino.cli.commands.v1.HelpResources.serializeBinaryToWriter + ); + } + f = message.getMissingMetadata(); + if (f) { + writer.writeBool( + 7, + f + ); + } + f = message.getDeprecated(); + if (f) { + writer.writeBool( + 8, + f + ); + } + f = message.getCompatible(); + if (f) { + writer.writeBool( + 9, + f + ); + } +}; + + +/** + * optional string name = 1; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.PlatformRelease.prototype.getName = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.PlatformRelease} returns this + */ +proto.cc.arduino.cli.commands.v1.PlatformRelease.prototype.setName = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + +/** + * optional string version = 2; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.PlatformRelease.prototype.getVersion = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.PlatformRelease} returns this + */ +proto.cc.arduino.cli.commands.v1.PlatformRelease.prototype.setVersion = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + +/** + * repeated string types = 3; + * @return {!Array<string>} + */ +proto.cc.arduino.cli.commands.v1.PlatformRelease.prototype.getTypesList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 3)); +}; + + +/** + * @param {!Array<string>} value + * @return {!proto.cc.arduino.cli.commands.v1.PlatformRelease} returns this + */ +proto.cc.arduino.cli.commands.v1.PlatformRelease.prototype.setTypesList = function(value) { + return jspb.Message.setField(this, 3, value || []); +}; + + +/** + * @param {string} value + * @param {number=} opt_index + * @return {!proto.cc.arduino.cli.commands.v1.PlatformRelease} returns this + */ +proto.cc.arduino.cli.commands.v1.PlatformRelease.prototype.addTypes = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 3, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.cc.arduino.cli.commands.v1.PlatformRelease} returns this + */ +proto.cc.arduino.cli.commands.v1.PlatformRelease.prototype.clearTypesList = function() { + return this.setTypesList([]); +}; + + +/** + * optional bool installed = 4; + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.PlatformRelease.prototype.getInstalled = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 4, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.PlatformRelease} returns this + */ +proto.cc.arduino.cli.commands.v1.PlatformRelease.prototype.setInstalled = function(value) { + return jspb.Message.setProto3BooleanField(this, 4, value); +}; + + +/** + * repeated Board boards = 5; + * @return {!Array<!proto.cc.arduino.cli.commands.v1.Board>} + */ +proto.cc.arduino.cli.commands.v1.PlatformRelease.prototype.getBoardsList = function() { + return /** @type{!Array<!proto.cc.arduino.cli.commands.v1.Board>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.cc.arduino.cli.commands.v1.Board, 5)); +}; + + +/** + * @param {!Array<!proto.cc.arduino.cli.commands.v1.Board>} value + * @return {!proto.cc.arduino.cli.commands.v1.PlatformRelease} returns this +*/ +proto.cc.arduino.cli.commands.v1.PlatformRelease.prototype.setBoardsList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 5, value); +}; + + +/** + * @param {!proto.cc.arduino.cli.commands.v1.Board=} opt_value + * @param {number=} opt_index + * @return {!proto.cc.arduino.cli.commands.v1.Board} + */ +proto.cc.arduino.cli.commands.v1.PlatformRelease.prototype.addBoards = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 5, opt_value, proto.cc.arduino.cli.commands.v1.Board, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.cc.arduino.cli.commands.v1.PlatformRelease} returns this + */ +proto.cc.arduino.cli.commands.v1.PlatformRelease.prototype.clearBoardsList = function() { + return this.setBoardsList([]); +}; + + +/** + * optional HelpResources help = 6; + * @return {?proto.cc.arduino.cli.commands.v1.HelpResources} + */ +proto.cc.arduino.cli.commands.v1.PlatformRelease.prototype.getHelp = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.HelpResources} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.HelpResources, 6)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.HelpResources|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.PlatformRelease} returns this +*/ +proto.cc.arduino.cli.commands.v1.PlatformRelease.prototype.setHelp = function(value) { + return jspb.Message.setWrapperField(this, 6, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.PlatformRelease} returns this + */ +proto.cc.arduino.cli.commands.v1.PlatformRelease.prototype.clearHelp = function() { + return this.setHelp(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.PlatformRelease.prototype.hasHelp = function() { + return jspb.Message.getField(this, 6) != null; +}; + + +/** + * optional bool missing_metadata = 7; + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.PlatformRelease.prototype.getMissingMetadata = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 7, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.PlatformRelease} returns this + */ +proto.cc.arduino.cli.commands.v1.PlatformRelease.prototype.setMissingMetadata = function(value) { + return jspb.Message.setProto3BooleanField(this, 7, value); +}; + + +/** + * optional bool deprecated = 8; + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.PlatformRelease.prototype.getDeprecated = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 8, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.PlatformRelease} returns this + */ +proto.cc.arduino.cli.commands.v1.PlatformRelease.prototype.setDeprecated = function(value) { + return jspb.Message.setProto3BooleanField(this, 8, value); +}; + + +/** + * optional bool compatible = 9; + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.PlatformRelease.prototype.getCompatible = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 9, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.PlatformRelease} returns this + */ +proto.cc.arduino.cli.commands.v1.PlatformRelease.prototype.setCompatible = function(value) { + return jspb.Message.setProto3BooleanField(this, 9, value); +}; + + + + + +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.InstalledPlatformReference.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.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.InstalledPlatformReference} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.toObject = function(includeInstance, msg) { + var f, obj = { + id: jspb.Message.getFieldWithDefault(msg, 1, ""), + version: jspb.Message.getFieldWithDefault(msg, 2, ""), + installDir: jspb.Message.getFieldWithDefault(msg, 3, ""), + packageUrl: jspb.Message.getFieldWithDefault(msg, 4, "") + }; + + 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.InstalledPlatformReference} + */ +proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.InstalledPlatformReference; + return proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.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.InstalledPlatformReference} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.InstalledPlatformReference} + */ +proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setId(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setVersion(value); + break; + case 3: + var value = /** @type {string} */ (reader.readString()); + msg.setInstallDir(value); + break; + case 4: + var value = /** @type {string} */ (reader.readString()); + msg.setPackageUrl(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.InstalledPlatformReference.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.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.InstalledPlatformReference} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getId(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } + f = message.getVersion(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } + f = message.getInstallDir(); + if (f.length > 0) { + writer.writeString( + 3, + f + ); + } + f = message.getPackageUrl(); + if (f.length > 0) { + writer.writeString( + 4, + f + ); + } +}; + + +/** + * optional string id = 1; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.prototype.getId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.InstalledPlatformReference} returns this + */ +proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.prototype.setId = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + +/** + * optional string version = 2; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.prototype.getVersion = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.InstalledPlatformReference} returns this + */ +proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.prototype.setVersion = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + +/** + * optional string install_dir = 3; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.prototype.getInstallDir = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.InstalledPlatformReference} returns this + */ +proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.prototype.setInstallDir = function(value) { + return jspb.Message.setProto3StringField(this, 3, value); +}; + + +/** + * optional string package_url = 4; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.prototype.getPackageUrl = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.InstalledPlatformReference} returns this + */ +proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.prototype.setPackageUrl = function(value) { + return jspb.Message.setProto3StringField(this, 4, value); +}; + + + + + +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.Board.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.Board.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.Board} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.Board.toObject = function(includeInstance, msg) { + var f, obj = { + name: jspb.Message.getFieldWithDefault(msg, 1, ""), + fqbn: jspb.Message.getFieldWithDefault(msg, 2, "") + }; + + 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.Board} + */ +proto.cc.arduino.cli.commands.v1.Board.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.Board; + return proto.cc.arduino.cli.commands.v1.Board.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.Board} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.Board} + */ +proto.cc.arduino.cli.commands.v1.Board.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setName(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setFqbn(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.Board.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.Board.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.Board} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.Board.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getName(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } + f = message.getFqbn(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } +}; + + +/** + * optional string name = 1; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.Board.prototype.getName = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.Board} returns this + */ +proto.cc.arduino.cli.commands.v1.Board.prototype.setName = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + +/** + * optional string fqbn = 2; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.Board.prototype.getFqbn = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.Board} returns this */ -proto.cc.arduino.cli.commands.v1.TaskProgress.prototype.setPercent = function(value) { - return jspb.Message.setProto3FloatField(this, 4, value); +proto.cc.arduino.cli.commands.v1.Board.prototype.setFqbn = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); }; @@ -807,8 +3433,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.Programmer.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.Programmer.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.HelpResources.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.HelpResources.toObject(opt_includeInstance, this); }; @@ -817,15 +3443,13 @@ proto.cc.arduino.cli.commands.v1.Programmer.prototype.toObject = function(opt_in * @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.Programmer} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.HelpResources} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.Programmer.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.HelpResources.toObject = function(includeInstance, msg) { var f, obj = { - platform: jspb.Message.getFieldWithDefault(msg, 1, ""), - id: jspb.Message.getFieldWithDefault(msg, 2, ""), - name: jspb.Message.getFieldWithDefault(msg, 3, "") + online: jspb.Message.getFieldWithDefault(msg, 1, "") }; if (includeInstance) { @@ -839,23 +3463,23 @@ proto.cc.arduino.cli.commands.v1.Programmer.toObject = function(includeInstance, /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.Programmer} + * @return {!proto.cc.arduino.cli.commands.v1.HelpResources} */ -proto.cc.arduino.cli.commands.v1.Programmer.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.HelpResources.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.Programmer; - return proto.cc.arduino.cli.commands.v1.Programmer.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.HelpResources; + return proto.cc.arduino.cli.commands.v1.HelpResources.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.Programmer} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.HelpResources} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.Programmer} + * @return {!proto.cc.arduino.cli.commands.v1.HelpResources} */ -proto.cc.arduino.cli.commands.v1.Programmer.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.HelpResources.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -864,15 +3488,7 @@ proto.cc.arduino.cli.commands.v1.Programmer.deserializeBinaryFromReader = functi switch (field) { case 1: var value = /** @type {string} */ (reader.readString()); - msg.setPlatform(value); - break; - case 2: - var value = /** @type {string} */ (reader.readString()); - msg.setId(value); - break; - case 3: - var value = /** @type {string} */ (reader.readString()); - msg.setName(value); + msg.setOnline(value); break; default: reader.skipField(); @@ -887,9 +3503,9 @@ proto.cc.arduino.cli.commands.v1.Programmer.deserializeBinaryFromReader = functi * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.Programmer.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.HelpResources.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.Programmer.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.HelpResources.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -897,97 +3513,47 @@ proto.cc.arduino.cli.commands.v1.Programmer.prototype.serializeBinary = function /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.Programmer} message + * @param {!proto.cc.arduino.cli.commands.v1.HelpResources} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.Programmer.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.HelpResources.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getPlatform(); + f = message.getOnline(); if (f.length > 0) { writer.writeString( 1, f ); } - f = message.getId(); - if (f.length > 0) { - writer.writeString( - 2, - f - ); - } - f = message.getName(); - if (f.length > 0) { - writer.writeString( - 3, - f - ); - } }; /** - * optional string platform = 1; + * optional string online = 1; * @return {string} */ -proto.cc.arduino.cli.commands.v1.Programmer.prototype.getPlatform = function() { +proto.cc.arduino.cli.commands.v1.HelpResources.prototype.getOnline = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.Programmer} returns this + * @return {!proto.cc.arduino.cli.commands.v1.HelpResources} returns this */ -proto.cc.arduino.cli.commands.v1.Programmer.prototype.setPlatform = function(value) { +proto.cc.arduino.cli.commands.v1.HelpResources.prototype.setOnline = function(value) { return jspb.Message.setProto3StringField(this, 1, value); }; -/** - * optional string id = 2; - * @return {string} - */ -proto.cc.arduino.cli.commands.v1.Programmer.prototype.getId = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); -}; - - -/** - * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.Programmer} returns this - */ -proto.cc.arduino.cli.commands.v1.Programmer.prototype.setId = function(value) { - return jspb.Message.setProto3StringField(this, 2, value); -}; - - -/** - * optional string name = 3; - * @return {string} - */ -proto.cc.arduino.cli.commands.v1.Programmer.prototype.getName = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); -}; - - -/** - * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.Programmer} returns this - */ -proto.cc.arduino.cli.commands.v1.Programmer.prototype.setName = function(value) { - return jspb.Message.setProto3StringField(this, 3, value); -}; - - /** * List of repeated fields within this message type. * @private {!Array<number>} * @const */ -proto.cc.arduino.cli.commands.v1.Platform.repeatedFields_ = [8,11]; +proto.cc.arduino.cli.commands.v1.Sketch.repeatedFields_ = [3,4,5,9]; @@ -1004,8 +3570,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.Platform.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.Platform.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.Sketch.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.Sketch.toObject(opt_includeInstance, this); }; @@ -1014,24 +3580,25 @@ proto.cc.arduino.cli.commands.v1.Platform.prototype.toObject = function(opt_incl * @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.Platform} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.Sketch} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.Platform.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.Sketch.toObject = function(includeInstance, msg) { var f, obj = { - id: jspb.Message.getFieldWithDefault(msg, 1, ""), - installed: jspb.Message.getFieldWithDefault(msg, 2, ""), - latest: jspb.Message.getFieldWithDefault(msg, 3, ""), - name: jspb.Message.getFieldWithDefault(msg, 4, ""), - maintainer: jspb.Message.getFieldWithDefault(msg, 5, ""), - website: jspb.Message.getFieldWithDefault(msg, 6, ""), - email: jspb.Message.getFieldWithDefault(msg, 7, ""), - boardsList: jspb.Message.toObjectList(msg.getBoardsList(), - proto.cc.arduino.cli.commands.v1.Board.toObject, includeInstance), - manuallyInstalled: jspb.Message.getBooleanFieldWithDefault(msg, 9, false), - deprecated: jspb.Message.getBooleanFieldWithDefault(msg, 10, false), - typeList: (f = jspb.Message.getRepeatedField(msg, 11)) == null ? undefined : f + mainFile: jspb.Message.getFieldWithDefault(msg, 1, ""), + locationPath: jspb.Message.getFieldWithDefault(msg, 2, ""), + otherSketchFilesList: (f = jspb.Message.getRepeatedField(msg, 3)) == null ? undefined : f, + additionalFilesList: (f = jspb.Message.getRepeatedField(msg, 4)) == null ? undefined : f, + rootFolderFilesList: (f = jspb.Message.getRepeatedField(msg, 5)) == null ? undefined : f, + defaultFqbn: jspb.Message.getFieldWithDefault(msg, 6, ""), + defaultPort: jspb.Message.getFieldWithDefault(msg, 7, ""), + defaultProtocol: jspb.Message.getFieldWithDefault(msg, 8, ""), + profilesList: jspb.Message.toObjectList(msg.getProfilesList(), + proto.cc.arduino.cli.commands.v1.SketchProfile.toObject, includeInstance), + defaultProfile: (f = msg.getDefaultProfile()) && proto.cc.arduino.cli.commands.v1.SketchProfile.toObject(includeInstance, f), + defaultProgrammer: jspb.Message.getFieldWithDefault(msg, 11, ""), + defaultPortConfig: (f = msg.getDefaultPortConfig()) && proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.toObject(includeInstance, f) }; if (includeInstance) { @@ -1045,23 +3612,23 @@ proto.cc.arduino.cli.commands.v1.Platform.toObject = function(includeInstance, m /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.Platform} + * @return {!proto.cc.arduino.cli.commands.v1.Sketch} */ -proto.cc.arduino.cli.commands.v1.Platform.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.Sketch.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.Platform; - return proto.cc.arduino.cli.commands.v1.Platform.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.Sketch; + return proto.cc.arduino.cli.commands.v1.Sketch.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.Platform} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.Sketch} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.Platform} + * @return {!proto.cc.arduino.cli.commands.v1.Sketch} */ -proto.cc.arduino.cli.commands.v1.Platform.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.Sketch.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -1070,48 +3637,54 @@ proto.cc.arduino.cli.commands.v1.Platform.deserializeBinaryFromReader = function switch (field) { case 1: var value = /** @type {string} */ (reader.readString()); - msg.setId(value); + msg.setMainFile(value); break; case 2: var value = /** @type {string} */ (reader.readString()); - msg.setInstalled(value); + msg.setLocationPath(value); break; case 3: var value = /** @type {string} */ (reader.readString()); - msg.setLatest(value); + msg.addOtherSketchFiles(value); break; case 4: var value = /** @type {string} */ (reader.readString()); - msg.setName(value); + msg.addAdditionalFiles(value); break; case 5: var value = /** @type {string} */ (reader.readString()); - msg.setMaintainer(value); + msg.addRootFolderFiles(value); break; case 6: var value = /** @type {string} */ (reader.readString()); - msg.setWebsite(value); + msg.setDefaultFqbn(value); break; case 7: var value = /** @type {string} */ (reader.readString()); - msg.setEmail(value); + msg.setDefaultPort(value); break; case 8: - var value = new proto.cc.arduino.cli.commands.v1.Board; - reader.readMessage(value,proto.cc.arduino.cli.commands.v1.Board.deserializeBinaryFromReader); - msg.addBoards(value); + var value = /** @type {string} */ (reader.readString()); + msg.setDefaultProtocol(value); break; case 9: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setManuallyInstalled(value); + var value = new proto.cc.arduino.cli.commands.v1.SketchProfile; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.SketchProfile.deserializeBinaryFromReader); + msg.addProfiles(value); break; case 10: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setDeprecated(value); + var value = new proto.cc.arduino.cli.commands.v1.SketchProfile; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.SketchProfile.deserializeBinaryFromReader); + msg.setDefaultProfile(value); break; case 11: var value = /** @type {string} */ (reader.readString()); - msg.addType(value); + msg.setDefaultProgrammer(value); + break; + case 12: + var value = new proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.deserializeBinaryFromReader); + msg.setDefaultPortConfig(value); break; default: reader.skipField(); @@ -1126,9 +3699,9 @@ proto.cc.arduino.cli.commands.v1.Platform.deserializeBinaryFromReader = function * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.Platform.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.Sketch.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.Platform.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.Sketch.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -1136,330 +3709,440 @@ proto.cc.arduino.cli.commands.v1.Platform.prototype.serializeBinary = function() /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.Platform} message + * @param {!proto.cc.arduino.cli.commands.v1.Sketch} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.Platform.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.Sketch.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getId(); + f = message.getMainFile(); if (f.length > 0) { writer.writeString( 1, f ); } - f = message.getInstalled(); + f = message.getLocationPath(); if (f.length > 0) { writer.writeString( 2, f ); } - f = message.getLatest(); + f = message.getOtherSketchFilesList(); if (f.length > 0) { - writer.writeString( + writer.writeRepeatedString( 3, f ); } - f = message.getName(); + f = message.getAdditionalFilesList(); if (f.length > 0) { - writer.writeString( + writer.writeRepeatedString( 4, f ); } - f = message.getMaintainer(); + f = message.getRootFolderFilesList(); if (f.length > 0) { - writer.writeString( + writer.writeRepeatedString( 5, f ); } - f = message.getWebsite(); + f = message.getDefaultFqbn(); if (f.length > 0) { writer.writeString( 6, f ); } - f = message.getEmail(); + f = message.getDefaultPort(); if (f.length > 0) { writer.writeString( 7, f ); } - f = message.getBoardsList(); + f = message.getDefaultProtocol(); if (f.length > 0) { - writer.writeRepeatedMessage( + writer.writeString( 8, - f, - proto.cc.arduino.cli.commands.v1.Board.serializeBinaryToWriter + f ); } - f = message.getManuallyInstalled(); - if (f) { - writer.writeBool( + f = message.getProfilesList(); + if (f.length > 0) { + writer.writeRepeatedMessage( 9, - f + f, + proto.cc.arduino.cli.commands.v1.SketchProfile.serializeBinaryToWriter ); } - f = message.getDeprecated(); - if (f) { - writer.writeBool( + f = message.getDefaultProfile(); + if (f != null) { + writer.writeMessage( 10, - f + f, + proto.cc.arduino.cli.commands.v1.SketchProfile.serializeBinaryToWriter ); } - f = message.getTypeList(); + f = message.getDefaultProgrammer(); if (f.length > 0) { - writer.writeRepeatedString( + writer.writeString( 11, f ); } + f = message.getDefaultPortConfig(); + if (f != null) { + writer.writeMessage( + 12, + f, + proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.serializeBinaryToWriter + ); + } }; /** - * optional string id = 1; + * optional string main_file = 1; * @return {string} */ -proto.cc.arduino.cli.commands.v1.Platform.prototype.getId = function() { +proto.cc.arduino.cli.commands.v1.Sketch.prototype.getMainFile = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.Platform} returns this + * @return {!proto.cc.arduino.cli.commands.v1.Sketch} returns this */ -proto.cc.arduino.cli.commands.v1.Platform.prototype.setId = function(value) { +proto.cc.arduino.cli.commands.v1.Sketch.prototype.setMainFile = function(value) { return jspb.Message.setProto3StringField(this, 1, value); }; /** - * optional string installed = 2; + * optional string location_path = 2; * @return {string} */ -proto.cc.arduino.cli.commands.v1.Platform.prototype.getInstalled = function() { +proto.cc.arduino.cli.commands.v1.Sketch.prototype.getLocationPath = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); }; /** * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.Platform} returns this + * @return {!proto.cc.arduino.cli.commands.v1.Sketch} returns this */ -proto.cc.arduino.cli.commands.v1.Platform.prototype.setInstalled = function(value) { +proto.cc.arduino.cli.commands.v1.Sketch.prototype.setLocationPath = function(value) { return jspb.Message.setProto3StringField(this, 2, value); }; /** - * optional string latest = 3; - * @return {string} + * repeated string other_sketch_files = 3; + * @return {!Array<string>} */ -proto.cc.arduino.cli.commands.v1.Platform.prototype.getLatest = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +proto.cc.arduino.cli.commands.v1.Sketch.prototype.getOtherSketchFilesList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 3)); +}; + + +/** + * @param {!Array<string>} value + * @return {!proto.cc.arduino.cli.commands.v1.Sketch} returns this + */ +proto.cc.arduino.cli.commands.v1.Sketch.prototype.setOtherSketchFilesList = function(value) { + return jspb.Message.setField(this, 3, value || []); }; /** * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.Platform} returns this + * @param {number=} opt_index + * @return {!proto.cc.arduino.cli.commands.v1.Sketch} returns this */ -proto.cc.arduino.cli.commands.v1.Platform.prototype.setLatest = function(value) { - return jspb.Message.setProto3StringField(this, 3, value); +proto.cc.arduino.cli.commands.v1.Sketch.prototype.addOtherSketchFiles = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 3, value, opt_index); }; /** - * optional string name = 4; - * @return {string} + * Clears the list making it empty but non-null. + * @return {!proto.cc.arduino.cli.commands.v1.Sketch} returns this */ -proto.cc.arduino.cli.commands.v1.Platform.prototype.getName = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); +proto.cc.arduino.cli.commands.v1.Sketch.prototype.clearOtherSketchFilesList = function() { + return this.setOtherSketchFilesList([]); +}; + + +/** + * repeated string additional_files = 4; + * @return {!Array<string>} + */ +proto.cc.arduino.cli.commands.v1.Sketch.prototype.getAdditionalFilesList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 4)); +}; + + +/** + * @param {!Array<string>} value + * @return {!proto.cc.arduino.cli.commands.v1.Sketch} returns this + */ +proto.cc.arduino.cli.commands.v1.Sketch.prototype.setAdditionalFilesList = function(value) { + return jspb.Message.setField(this, 4, value || []); }; /** * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.Platform} returns this + * @param {number=} opt_index + * @return {!proto.cc.arduino.cli.commands.v1.Sketch} returns this */ -proto.cc.arduino.cli.commands.v1.Platform.prototype.setName = function(value) { - return jspb.Message.setProto3StringField(this, 4, value); +proto.cc.arduino.cli.commands.v1.Sketch.prototype.addAdditionalFiles = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 4, value, opt_index); }; /** - * optional string maintainer = 5; - * @return {string} + * Clears the list making it empty but non-null. + * @return {!proto.cc.arduino.cli.commands.v1.Sketch} returns this + */ +proto.cc.arduino.cli.commands.v1.Sketch.prototype.clearAdditionalFilesList = function() { + return this.setAdditionalFilesList([]); +}; + + +/** + * repeated string root_folder_files = 5; + * @return {!Array<string>} + */ +proto.cc.arduino.cli.commands.v1.Sketch.prototype.getRootFolderFilesList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 5)); +}; + + +/** + * @param {!Array<string>} value + * @return {!proto.cc.arduino.cli.commands.v1.Sketch} returns this */ -proto.cc.arduino.cli.commands.v1.Platform.prototype.getMaintainer = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 5, "")); +proto.cc.arduino.cli.commands.v1.Sketch.prototype.setRootFolderFilesList = function(value) { + return jspb.Message.setField(this, 5, value || []); }; /** * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.Platform} returns this + * @param {number=} opt_index + * @return {!proto.cc.arduino.cli.commands.v1.Sketch} returns this + */ +proto.cc.arduino.cli.commands.v1.Sketch.prototype.addRootFolderFiles = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 5, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.cc.arduino.cli.commands.v1.Sketch} returns this */ -proto.cc.arduino.cli.commands.v1.Platform.prototype.setMaintainer = function(value) { - return jspb.Message.setProto3StringField(this, 5, value); +proto.cc.arduino.cli.commands.v1.Sketch.prototype.clearRootFolderFilesList = function() { + return this.setRootFolderFilesList([]); }; /** - * optional string website = 6; + * optional string default_fqbn = 6; * @return {string} */ -proto.cc.arduino.cli.commands.v1.Platform.prototype.getWebsite = function() { +proto.cc.arduino.cli.commands.v1.Sketch.prototype.getDefaultFqbn = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 6, "")); }; /** * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.Platform} returns this + * @return {!proto.cc.arduino.cli.commands.v1.Sketch} returns this */ -proto.cc.arduino.cli.commands.v1.Platform.prototype.setWebsite = function(value) { +proto.cc.arduino.cli.commands.v1.Sketch.prototype.setDefaultFqbn = function(value) { return jspb.Message.setProto3StringField(this, 6, value); }; /** - * optional string email = 7; + * optional string default_port = 7; * @return {string} */ -proto.cc.arduino.cli.commands.v1.Platform.prototype.getEmail = function() { +proto.cc.arduino.cli.commands.v1.Sketch.prototype.getDefaultPort = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 7, "")); }; /** * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.Platform} returns this + * @return {!proto.cc.arduino.cli.commands.v1.Sketch} returns this */ -proto.cc.arduino.cli.commands.v1.Platform.prototype.setEmail = function(value) { +proto.cc.arduino.cli.commands.v1.Sketch.prototype.setDefaultPort = function(value) { return jspb.Message.setProto3StringField(this, 7, value); }; /** - * repeated Board boards = 8; - * @return {!Array<!proto.cc.arduino.cli.commands.v1.Board>} + * optional string default_protocol = 8; + * @return {string} */ -proto.cc.arduino.cli.commands.v1.Platform.prototype.getBoardsList = function() { - return /** @type{!Array<!proto.cc.arduino.cli.commands.v1.Board>} */ ( - jspb.Message.getRepeatedWrapperField(this, proto.cc.arduino.cli.commands.v1.Board, 8)); +proto.cc.arduino.cli.commands.v1.Sketch.prototype.getDefaultProtocol = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 8, "")); }; /** - * @param {!Array<!proto.cc.arduino.cli.commands.v1.Board>} value - * @return {!proto.cc.arduino.cli.commands.v1.Platform} returns this + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.Sketch} returns this + */ +proto.cc.arduino.cli.commands.v1.Sketch.prototype.setDefaultProtocol = function(value) { + return jspb.Message.setProto3StringField(this, 8, value); +}; + + +/** + * repeated SketchProfile profiles = 9; + * @return {!Array<!proto.cc.arduino.cli.commands.v1.SketchProfile>} + */ +proto.cc.arduino.cli.commands.v1.Sketch.prototype.getProfilesList = function() { + return /** @type{!Array<!proto.cc.arduino.cli.commands.v1.SketchProfile>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.cc.arduino.cli.commands.v1.SketchProfile, 9)); +}; + + +/** + * @param {!Array<!proto.cc.arduino.cli.commands.v1.SketchProfile>} value + * @return {!proto.cc.arduino.cli.commands.v1.Sketch} returns this */ -proto.cc.arduino.cli.commands.v1.Platform.prototype.setBoardsList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 8, value); +proto.cc.arduino.cli.commands.v1.Sketch.prototype.setProfilesList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 9, value); }; /** - * @param {!proto.cc.arduino.cli.commands.v1.Board=} opt_value + * @param {!proto.cc.arduino.cli.commands.v1.SketchProfile=} opt_value * @param {number=} opt_index - * @return {!proto.cc.arduino.cli.commands.v1.Board} + * @return {!proto.cc.arduino.cli.commands.v1.SketchProfile} */ -proto.cc.arduino.cli.commands.v1.Platform.prototype.addBoards = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 8, opt_value, proto.cc.arduino.cli.commands.v1.Board, opt_index); +proto.cc.arduino.cli.commands.v1.Sketch.prototype.addProfiles = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 9, opt_value, proto.cc.arduino.cli.commands.v1.SketchProfile, opt_index); }; /** * Clears the list making it empty but non-null. - * @return {!proto.cc.arduino.cli.commands.v1.Platform} returns this + * @return {!proto.cc.arduino.cli.commands.v1.Sketch} returns this */ -proto.cc.arduino.cli.commands.v1.Platform.prototype.clearBoardsList = function() { - return this.setBoardsList([]); +proto.cc.arduino.cli.commands.v1.Sketch.prototype.clearProfilesList = function() { + return this.setProfilesList([]); }; /** - * optional bool manually_installed = 9; - * @return {boolean} + * optional SketchProfile default_profile = 10; + * @return {?proto.cc.arduino.cli.commands.v1.SketchProfile} */ -proto.cc.arduino.cli.commands.v1.Platform.prototype.getManuallyInstalled = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 9, false)); +proto.cc.arduino.cli.commands.v1.Sketch.prototype.getDefaultProfile = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.SketchProfile} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.SketchProfile, 10)); }; /** - * @param {boolean} value - * @return {!proto.cc.arduino.cli.commands.v1.Platform} returns this + * @param {?proto.cc.arduino.cli.commands.v1.SketchProfile|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.Sketch} returns this +*/ +proto.cc.arduino.cli.commands.v1.Sketch.prototype.setDefaultProfile = function(value) { + return jspb.Message.setWrapperField(this, 10, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.Sketch} returns this */ -proto.cc.arduino.cli.commands.v1.Platform.prototype.setManuallyInstalled = function(value) { - return jspb.Message.setProto3BooleanField(this, 9, value); +proto.cc.arduino.cli.commands.v1.Sketch.prototype.clearDefaultProfile = function() { + return this.setDefaultProfile(undefined); }; /** - * optional bool deprecated = 10; + * Returns whether this field is set. * @return {boolean} */ -proto.cc.arduino.cli.commands.v1.Platform.prototype.getDeprecated = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 10, false)); +proto.cc.arduino.cli.commands.v1.Sketch.prototype.hasDefaultProfile = function() { + return jspb.Message.getField(this, 10) != null; }; /** - * @param {boolean} value - * @return {!proto.cc.arduino.cli.commands.v1.Platform} returns this + * optional string default_programmer = 11; + * @return {string} */ -proto.cc.arduino.cli.commands.v1.Platform.prototype.setDeprecated = function(value) { - return jspb.Message.setProto3BooleanField(this, 10, value); +proto.cc.arduino.cli.commands.v1.Sketch.prototype.getDefaultProgrammer = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 11, "")); }; /** - * repeated string type = 11; - * @return {!Array<string>} + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.Sketch} returns this + */ +proto.cc.arduino.cli.commands.v1.Sketch.prototype.setDefaultProgrammer = function(value) { + return jspb.Message.setProto3StringField(this, 11, value); +}; + + +/** + * optional MonitorPortConfiguration default_port_config = 12; + * @return {?proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration} */ -proto.cc.arduino.cli.commands.v1.Platform.prototype.getTypeList = function() { - return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 11)); +proto.cc.arduino.cli.commands.v1.Sketch.prototype.getDefaultPortConfig = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration, 12)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.Sketch} returns this +*/ +proto.cc.arduino.cli.commands.v1.Sketch.prototype.setDefaultPortConfig = function(value) { + return jspb.Message.setWrapperField(this, 12, value); }; /** - * @param {!Array<string>} value - * @return {!proto.cc.arduino.cli.commands.v1.Platform} returns this + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.Sketch} returns this */ -proto.cc.arduino.cli.commands.v1.Platform.prototype.setTypeList = function(value) { - return jspb.Message.setField(this, 11, value || []); +proto.cc.arduino.cli.commands.v1.Sketch.prototype.clearDefaultPortConfig = function() { + return this.setDefaultPortConfig(undefined); }; /** - * @param {string} value - * @param {number=} opt_index - * @return {!proto.cc.arduino.cli.commands.v1.Platform} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.cc.arduino.cli.commands.v1.Platform.prototype.addType = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 11, value, opt_index); +proto.cc.arduino.cli.commands.v1.Sketch.prototype.hasDefaultPortConfig = function() { + return jspb.Message.getField(this, 12) != null; }; + /** - * Clears the list making it empty but non-null. - * @return {!proto.cc.arduino.cli.commands.v1.Platform} returns this + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const */ -proto.cc.arduino.cli.commands.v1.Platform.prototype.clearTypeList = function() { - return this.setTypeList([]); -}; - - +proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.repeatedFields_ = [1]; @@ -1476,8 +4159,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.toObject(opt_includeInstance, this); }; @@ -1486,16 +4169,14 @@ proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.prototype.toObject = * @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.InstalledPlatformReference} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.toObject = function(includeInstance, msg) { var f, obj = { - id: jspb.Message.getFieldWithDefault(msg, 1, ""), - version: jspb.Message.getFieldWithDefault(msg, 2, ""), - installDir: jspb.Message.getFieldWithDefault(msg, 3, ""), - packageUrl: jspb.Message.getFieldWithDefault(msg, 4, "") + settingsList: jspb.Message.toObjectList(msg.getSettingsList(), + proto.cc.arduino.cli.commands.v1.MonitorPortSetting.toObject, includeInstance) }; if (includeInstance) { @@ -1509,23 +4190,23 @@ proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.toObject = function( /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.InstalledPlatformReference} + * @return {!proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration} */ -proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.InstalledPlatformReference; - return proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration; + return proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.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.InstalledPlatformReference} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.InstalledPlatformReference} + * @return {!proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration} */ -proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -1533,20 +4214,9 @@ proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.deserializeBinaryFro var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {string} */ (reader.readString()); - msg.setId(value); - break; - case 2: - var value = /** @type {string} */ (reader.readString()); - msg.setVersion(value); - break; - case 3: - var value = /** @type {string} */ (reader.readString()); - msg.setInstallDir(value); - break; - case 4: - var value = /** @type {string} */ (reader.readString()); - msg.setPackageUrl(value); + var value = new proto.cc.arduino.cli.commands.v1.MonitorPortSetting; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.MonitorPortSetting.deserializeBinaryFromReader); + msg.addSettings(value); break; default: reader.skipField(); @@ -1561,9 +4231,9 @@ proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.deserializeBinaryFro * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -1571,112 +4241,58 @@ proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.prototype.serializeB /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.InstalledPlatformReference} message + * @param {!proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getId(); + f = message.getSettingsList(); if (f.length > 0) { - writer.writeString( + writer.writeRepeatedMessage( 1, - f - ); - } - f = message.getVersion(); - if (f.length > 0) { - writer.writeString( - 2, - f - ); - } - f = message.getInstallDir(); - if (f.length > 0) { - writer.writeString( - 3, - f - ); - } - f = message.getPackageUrl(); - if (f.length > 0) { - writer.writeString( - 4, - f + f, + proto.cc.arduino.cli.commands.v1.MonitorPortSetting.serializeBinaryToWriter ); } }; /** - * optional string id = 1; - * @return {string} - */ -proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.prototype.getId = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.InstalledPlatformReference} returns this - */ -proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.prototype.setId = function(value) { - return jspb.Message.setProto3StringField(this, 1, value); -}; - - -/** - * optional string version = 2; - * @return {string} - */ -proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.prototype.getVersion = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); -}; - - -/** - * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.InstalledPlatformReference} returns this - */ -proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.prototype.setVersion = function(value) { - return jspb.Message.setProto3StringField(this, 2, value); -}; - - -/** - * optional string install_dir = 3; - * @return {string} + * repeated MonitorPortSetting settings = 1; + * @return {!Array<!proto.cc.arduino.cli.commands.v1.MonitorPortSetting>} */ -proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.prototype.getInstallDir = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.prototype.getSettingsList = function() { + return /** @type{!Array<!proto.cc.arduino.cli.commands.v1.MonitorPortSetting>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.cc.arduino.cli.commands.v1.MonitorPortSetting, 1)); }; /** - * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.InstalledPlatformReference} returns this - */ -proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.prototype.setInstallDir = function(value) { - return jspb.Message.setProto3StringField(this, 3, value); + * @param {!Array<!proto.cc.arduino.cli.commands.v1.MonitorPortSetting>} value + * @return {!proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration} returns this +*/ +proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.prototype.setSettingsList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 1, value); }; /** - * optional string package_url = 4; - * @return {string} + * @param {!proto.cc.arduino.cli.commands.v1.MonitorPortSetting=} opt_value + * @param {number=} opt_index + * @return {!proto.cc.arduino.cli.commands.v1.MonitorPortSetting} */ -proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.prototype.getPackageUrl = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); +proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.prototype.addSettings = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.cc.arduino.cli.commands.v1.MonitorPortSetting, opt_index); }; /** - * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.InstalledPlatformReference} returns this + * Clears the list making it empty but non-null. + * @return {!proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration} returns this */ -proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.prototype.setPackageUrl = function(value) { - return jspb.Message.setProto3StringField(this, 4, value); +proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.prototype.clearSettingsList = function() { + return this.setSettingsList([]); }; @@ -1696,8 +4312,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.Board.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.Board.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.MonitorPortSetting.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.MonitorPortSetting.toObject(opt_includeInstance, this); }; @@ -1706,14 +4322,14 @@ proto.cc.arduino.cli.commands.v1.Board.prototype.toObject = function(opt_include * @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.Board} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.MonitorPortSetting} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.Board.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.MonitorPortSetting.toObject = function(includeInstance, msg) { var f, obj = { - name: jspb.Message.getFieldWithDefault(msg, 1, ""), - fqbn: jspb.Message.getFieldWithDefault(msg, 2, "") + settingId: jspb.Message.getFieldWithDefault(msg, 1, ""), + value: jspb.Message.getFieldWithDefault(msg, 2, "") }; if (includeInstance) { @@ -1727,23 +4343,23 @@ proto.cc.arduino.cli.commands.v1.Board.toObject = function(includeInstance, msg) /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.Board} + * @return {!proto.cc.arduino.cli.commands.v1.MonitorPortSetting} */ -proto.cc.arduino.cli.commands.v1.Board.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.MonitorPortSetting.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.Board; - return proto.cc.arduino.cli.commands.v1.Board.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.MonitorPortSetting; + return proto.cc.arduino.cli.commands.v1.MonitorPortSetting.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.Board} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.MonitorPortSetting} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.Board} + * @return {!proto.cc.arduino.cli.commands.v1.MonitorPortSetting} */ -proto.cc.arduino.cli.commands.v1.Board.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.MonitorPortSetting.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -1752,11 +4368,11 @@ proto.cc.arduino.cli.commands.v1.Board.deserializeBinaryFromReader = function(ms switch (field) { case 1: var value = /** @type {string} */ (reader.readString()); - msg.setName(value); + msg.setSettingId(value); break; case 2: var value = /** @type {string} */ (reader.readString()); - msg.setFqbn(value); + msg.setValue(value); break; default: reader.skipField(); @@ -1771,9 +4387,9 @@ proto.cc.arduino.cli.commands.v1.Board.deserializeBinaryFromReader = function(ms * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.Board.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.MonitorPortSetting.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.Board.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.MonitorPortSetting.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -1781,20 +4397,20 @@ proto.cc.arduino.cli.commands.v1.Board.prototype.serializeBinary = function() { /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.Board} message + * @param {!proto.cc.arduino.cli.commands.v1.MonitorPortSetting} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.Board.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.MonitorPortSetting.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getName(); + f = message.getSettingId(); if (f.length > 0) { writer.writeString( 1, f ); } - f = message.getFqbn(); + f = message.getValue(); if (f.length > 0) { writer.writeString( 2, @@ -1805,37 +4421,37 @@ proto.cc.arduino.cli.commands.v1.Board.serializeBinaryToWriter = function(messag /** - * optional string name = 1; + * optional string setting_id = 1; * @return {string} */ -proto.cc.arduino.cli.commands.v1.Board.prototype.getName = function() { +proto.cc.arduino.cli.commands.v1.MonitorPortSetting.prototype.getSettingId = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.Board} returns this + * @return {!proto.cc.arduino.cli.commands.v1.MonitorPortSetting} returns this */ -proto.cc.arduino.cli.commands.v1.Board.prototype.setName = function(value) { +proto.cc.arduino.cli.commands.v1.MonitorPortSetting.prototype.setSettingId = function(value) { return jspb.Message.setProto3StringField(this, 1, value); }; /** - * optional string fqbn = 2; + * optional string value = 2; * @return {string} */ -proto.cc.arduino.cli.commands.v1.Board.prototype.getFqbn = function() { +proto.cc.arduino.cli.commands.v1.MonitorPortSetting.prototype.getValue = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); }; /** * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.Board} returns this + * @return {!proto.cc.arduino.cli.commands.v1.MonitorPortSetting} returns this */ -proto.cc.arduino.cli.commands.v1.Board.prototype.setFqbn = function(value) { +proto.cc.arduino.cli.commands.v1.MonitorPortSetting.prototype.setValue = function(value) { return jspb.Message.setProto3StringField(this, 2, value); }; @@ -1856,8 +4472,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.Profile.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.Profile.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.SketchProfile.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.SketchProfile.toObject(opt_includeInstance, this); }; @@ -1866,14 +4482,18 @@ proto.cc.arduino.cli.commands.v1.Profile.prototype.toObject = function(opt_inclu * @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.Profile} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.SketchProfile} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.Profile.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.SketchProfile.toObject = function(includeInstance, msg) { var f, obj = { name: jspb.Message.getFieldWithDefault(msg, 1, ""), - fqbn: jspb.Message.getFieldWithDefault(msg, 2, "") + fqbn: jspb.Message.getFieldWithDefault(msg, 2, ""), + programmer: jspb.Message.getFieldWithDefault(msg, 3, ""), + port: jspb.Message.getFieldWithDefault(msg, 4, ""), + portConfig: (f = msg.getPortConfig()) && proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.toObject(includeInstance, f), + protocol: jspb.Message.getFieldWithDefault(msg, 6, "") }; if (includeInstance) { @@ -1887,23 +4507,23 @@ proto.cc.arduino.cli.commands.v1.Profile.toObject = function(includeInstance, ms /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.Profile} + * @return {!proto.cc.arduino.cli.commands.v1.SketchProfile} */ -proto.cc.arduino.cli.commands.v1.Profile.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.SketchProfile.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.Profile; - return proto.cc.arduino.cli.commands.v1.Profile.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.SketchProfile; + return proto.cc.arduino.cli.commands.v1.SketchProfile.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.Profile} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.SketchProfile} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.Profile} + * @return {!proto.cc.arduino.cli.commands.v1.SketchProfile} */ -proto.cc.arduino.cli.commands.v1.Profile.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.SketchProfile.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -1918,6 +4538,23 @@ proto.cc.arduino.cli.commands.v1.Profile.deserializeBinaryFromReader = function( var value = /** @type {string} */ (reader.readString()); msg.setFqbn(value); break; + case 3: + var value = /** @type {string} */ (reader.readString()); + msg.setProgrammer(value); + break; + case 4: + var value = /** @type {string} */ (reader.readString()); + msg.setPort(value); + break; + case 5: + var value = new proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.deserializeBinaryFromReader); + msg.setPortConfig(value); + break; + case 6: + var value = /** @type {string} */ (reader.readString()); + msg.setProtocol(value); + break; default: reader.skipField(); break; @@ -1931,9 +4568,9 @@ proto.cc.arduino.cli.commands.v1.Profile.deserializeBinaryFromReader = function( * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.Profile.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.SketchProfile.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.Profile.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.SketchProfile.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -1941,11 +4578,11 @@ proto.cc.arduino.cli.commands.v1.Profile.prototype.serializeBinary = function() /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.Profile} message + * @param {!proto.cc.arduino.cli.commands.v1.SketchProfile} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.Profile.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.SketchProfile.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getName(); if (f.length > 0) { @@ -1961,6 +4598,35 @@ proto.cc.arduino.cli.commands.v1.Profile.serializeBinaryToWriter = function(mess f ); } + f = message.getProgrammer(); + if (f.length > 0) { + writer.writeString( + 3, + f + ); + } + f = message.getPort(); + if (f.length > 0) { + writer.writeString( + 4, + f + ); + } + f = message.getPortConfig(); + if (f != null) { + writer.writeMessage( + 5, + f, + proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.serializeBinaryToWriter + ); + } + f = message.getProtocol(); + if (f.length > 0) { + writer.writeString( + 6, + f + ); + } }; @@ -1968,16 +4634,16 @@ proto.cc.arduino.cli.commands.v1.Profile.serializeBinaryToWriter = function(mess * optional string name = 1; * @return {string} */ -proto.cc.arduino.cli.commands.v1.Profile.prototype.getName = function() { +proto.cc.arduino.cli.commands.v1.SketchProfile.prototype.getName = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.Profile} returns this + * @return {!proto.cc.arduino.cli.commands.v1.SketchProfile} returns this */ -proto.cc.arduino.cli.commands.v1.Profile.prototype.setName = function(value) { +proto.cc.arduino.cli.commands.v1.SketchProfile.prototype.setName = function(value) { return jspb.Message.setProto3StringField(this, 1, value); }; @@ -1986,18 +4652,109 @@ proto.cc.arduino.cli.commands.v1.Profile.prototype.setName = function(value) { * optional string fqbn = 2; * @return {string} */ -proto.cc.arduino.cli.commands.v1.Profile.prototype.getFqbn = function() { +proto.cc.arduino.cli.commands.v1.SketchProfile.prototype.getFqbn = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); }; /** * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.Profile} returns this + * @return {!proto.cc.arduino.cli.commands.v1.SketchProfile} returns this */ -proto.cc.arduino.cli.commands.v1.Profile.prototype.setFqbn = function(value) { +proto.cc.arduino.cli.commands.v1.SketchProfile.prototype.setFqbn = function(value) { return jspb.Message.setProto3StringField(this, 2, value); }; +/** + * optional string programmer = 3; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.SketchProfile.prototype.getProgrammer = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.SketchProfile} returns this + */ +proto.cc.arduino.cli.commands.v1.SketchProfile.prototype.setProgrammer = function(value) { + return jspb.Message.setProto3StringField(this, 3, value); +}; + + +/** + * optional string port = 4; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.SketchProfile.prototype.getPort = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.SketchProfile} returns this + */ +proto.cc.arduino.cli.commands.v1.SketchProfile.prototype.setPort = function(value) { + return jspb.Message.setProto3StringField(this, 4, value); +}; + + +/** + * optional MonitorPortConfiguration port_config = 5; + * @return {?proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration} + */ +proto.cc.arduino.cli.commands.v1.SketchProfile.prototype.getPortConfig = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration, 5)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.SketchProfile} returns this +*/ +proto.cc.arduino.cli.commands.v1.SketchProfile.prototype.setPortConfig = function(value) { + return jspb.Message.setWrapperField(this, 5, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.SketchProfile} returns this + */ +proto.cc.arduino.cli.commands.v1.SketchProfile.prototype.clearPortConfig = function() { + return this.setPortConfig(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.SketchProfile.prototype.hasPortConfig = function() { + return jspb.Message.getField(this, 5) != null; +}; + + +/** + * optional string protocol = 6; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.SketchProfile.prototype.getProtocol = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 6, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.SketchProfile} returns this + */ +proto.cc.arduino.cli.commands.v1.SketchProfile.prototype.setProtocol = function(value) { + return jspb.Message.setProto3StringField(this, 6, value); +}; + + goog.object.extend(exports, proto.cc.arduino.cli.commands.v1); diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/compile_pb.d.ts b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/compile_pb.d.ts index 34c8ec082..f9c202c98 100644 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/compile_pb.d.ts +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/compile_pb.d.ts @@ -5,7 +5,6 @@ /* eslint-disable */ import * as jspb from "google-protobuf"; -import * as google_protobuf_wrappers_pb from "google-protobuf/google/protobuf/wrappers_pb"; import * as cc_arduino_cli_commands_v1_common_pb from "../../../../../cc/arduino/cli/commands/v1/common_pb"; import * as cc_arduino_cli_commands_v1_lib_pb from "../../../../../cc/arduino/cli/commands/v1/lib_pb"; @@ -15,89 +14,68 @@ export class CompileRequest extends jspb.Message { clearInstance(): void; getInstance(): cc_arduino_cli_commands_v1_common_pb.Instance | undefined; setInstance(value?: cc_arduino_cli_commands_v1_common_pb.Instance): CompileRequest; - getFqbn(): string; setFqbn(value: string): CompileRequest; - getSketchPath(): string; setSketchPath(value: string): CompileRequest; - getShowProperties(): boolean; setShowProperties(value: boolean): CompileRequest; - getPreprocess(): boolean; setPreprocess(value: boolean): CompileRequest; - getBuildCachePath(): string; setBuildCachePath(value: string): CompileRequest; - getBuildPath(): string; setBuildPath(value: string): CompileRequest; - clearBuildPropertiesList(): void; getBuildPropertiesList(): Array<string>; setBuildPropertiesList(value: Array<string>): CompileRequest; addBuildProperties(value: string, index?: number): string; - getWarnings(): string; setWarnings(value: string): CompileRequest; - getVerbose(): boolean; setVerbose(value: boolean): CompileRequest; - getQuiet(): boolean; setQuiet(value: boolean): CompileRequest; - - getVidPid(): string; - setVidPid(value: string): CompileRequest; - getJobs(): number; setJobs(value: number): CompileRequest; - clearLibrariesList(): void; getLibrariesList(): Array<string>; setLibrariesList(value: Array<string>): CompileRequest; addLibraries(value: string, index?: number): string; - getOptimizeForDebug(): boolean; setOptimizeForDebug(value: boolean): CompileRequest; - getExportDir(): string; setExportDir(value: string): CompileRequest; - getClean(): boolean; setClean(value: boolean): CompileRequest; - getCreateCompilationDatabaseOnly(): boolean; setCreateCompilationDatabaseOnly(value: boolean): CompileRequest; - getSourceOverrideMap(): jspb.Map<string, string>; clearSourceOverrideMap(): void; - hasExportBinaries(): boolean; clearExportBinaries(): void; - getExportBinaries(): google_protobuf_wrappers_pb.BoolValue | undefined; - setExportBinaries(value?: google_protobuf_wrappers_pb.BoolValue): CompileRequest; - + getExportBinaries(): boolean | undefined; + setExportBinaries(value: boolean): CompileRequest; clearLibraryList(): void; getLibraryList(): Array<string>; setLibraryList(value: Array<string>): CompileRequest; addLibrary(value: string, index?: number): string; - getKeysKeychain(): string; setKeysKeychain(value: string): CompileRequest; - getSignKey(): string; setSignKey(value: string): CompileRequest; - getEncryptKey(): string; setEncryptKey(value: string): CompileRequest; - getSkipLibrariesDiscovery(): boolean; setSkipLibrariesDiscovery(value: boolean): CompileRequest; - + getDoNotExpandBuildProperties(): boolean; + setDoNotExpandBuildProperties(value: boolean): CompileRequest; + clearBuildCacheExtraPathsList(): void; + getBuildCacheExtraPathsList(): Array<string>; + setBuildCacheExtraPathsList(value: Array<string>): CompileRequest; + addBuildCacheExtraPaths(value: string, index?: number): string; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): CompileRequest.AsObject; @@ -122,7 +100,6 @@ export namespace CompileRequest { warnings: string, verbose: boolean, quiet: boolean, - vidPid: string, jobs: number, librariesList: Array<string>, optimizeForDebug: boolean, @@ -131,92 +108,150 @@ export namespace CompileRequest { createCompilationDatabaseOnly: boolean, sourceOverrideMap: Array<[string, string]>, - exportBinaries?: google_protobuf_wrappers_pb.BoolValue.AsObject, + exportBinaries?: boolean, libraryList: Array<string>, keysKeychain: string, signKey: string, encryptKey: string, skipLibrariesDiscovery: boolean, + doNotExpandBuildProperties: boolean, + buildCacheExtraPathsList: Array<string>, } } export class CompileResponse extends jspb.Message { + + hasOutStream(): boolean; + clearOutStream(): void; getOutStream(): Uint8Array | string; getOutStream_asU8(): Uint8Array; getOutStream_asB64(): string; setOutStream(value: Uint8Array | string): CompileResponse; + hasErrStream(): boolean; + clearErrStream(): void; getErrStream(): Uint8Array | string; getErrStream_asU8(): Uint8Array; getErrStream_asB64(): string; setErrStream(value: Uint8Array | string): CompileResponse; - getBuildPath(): string; - setBuildPath(value: string): CompileResponse; + hasProgress(): boolean; + clearProgress(): void; + getProgress(): cc_arduino_cli_commands_v1_common_pb.TaskProgress | undefined; + setProgress(value?: cc_arduino_cli_commands_v1_common_pb.TaskProgress): CompileResponse; + hasResult(): boolean; + clearResult(): void; + getResult(): BuilderResult | undefined; + setResult(value?: BuilderResult): CompileResponse; + + getMessageCase(): CompileResponse.MessageCase; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): CompileResponse.AsObject; + static toObject(includeInstance: boolean, msg: CompileResponse): CompileResponse.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: CompileResponse, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): CompileResponse; + static deserializeBinaryFromReader(message: CompileResponse, reader: jspb.BinaryReader): CompileResponse; +} + +export namespace CompileResponse { + export type AsObject = { + outStream: Uint8Array | string, + errStream: Uint8Array | string, + progress?: cc_arduino_cli_commands_v1_common_pb.TaskProgress.AsObject, + result?: BuilderResult.AsObject, + } + + export enum MessageCase { + MESSAGE_NOT_SET = 0, + OUT_STREAM = 1, + ERR_STREAM = 2, + PROGRESS = 3, + RESULT = 4, + } + +} + +export class InstanceNeedsReinitializationError extends jspb.Message { + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): InstanceNeedsReinitializationError.AsObject; + static toObject(includeInstance: boolean, msg: InstanceNeedsReinitializationError): InstanceNeedsReinitializationError.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: InstanceNeedsReinitializationError, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): InstanceNeedsReinitializationError; + static deserializeBinaryFromReader(message: InstanceNeedsReinitializationError, reader: jspb.BinaryReader): InstanceNeedsReinitializationError; +} + +export namespace InstanceNeedsReinitializationError { + export type AsObject = { + } +} + +export class BuilderResult extends jspb.Message { + getBuildPath(): string; + setBuildPath(value: string): BuilderResult; clearUsedLibrariesList(): void; getUsedLibrariesList(): Array<cc_arduino_cli_commands_v1_lib_pb.Library>; - setUsedLibrariesList(value: Array<cc_arduino_cli_commands_v1_lib_pb.Library>): CompileResponse; + setUsedLibrariesList(value: Array<cc_arduino_cli_commands_v1_lib_pb.Library>): BuilderResult; addUsedLibraries(value?: cc_arduino_cli_commands_v1_lib_pb.Library, index?: number): cc_arduino_cli_commands_v1_lib_pb.Library; - clearExecutableSectionsSizeList(): void; getExecutableSectionsSizeList(): Array<ExecutableSectionSize>; - setExecutableSectionsSizeList(value: Array<ExecutableSectionSize>): CompileResponse; + setExecutableSectionsSizeList(value: Array<ExecutableSectionSize>): BuilderResult; addExecutableSectionsSize(value?: ExecutableSectionSize, index?: number): ExecutableSectionSize; - hasBoardPlatform(): boolean; clearBoardPlatform(): void; getBoardPlatform(): cc_arduino_cli_commands_v1_common_pb.InstalledPlatformReference | undefined; - setBoardPlatform(value?: cc_arduino_cli_commands_v1_common_pb.InstalledPlatformReference): CompileResponse; - + setBoardPlatform(value?: cc_arduino_cli_commands_v1_common_pb.InstalledPlatformReference): BuilderResult; hasBuildPlatform(): boolean; clearBuildPlatform(): void; getBuildPlatform(): cc_arduino_cli_commands_v1_common_pb.InstalledPlatformReference | undefined; - setBuildPlatform(value?: cc_arduino_cli_commands_v1_common_pb.InstalledPlatformReference): CompileResponse; - - - hasProgress(): boolean; - clearProgress(): void; - getProgress(): cc_arduino_cli_commands_v1_common_pb.TaskProgress | undefined; - setProgress(value?: cc_arduino_cli_commands_v1_common_pb.TaskProgress): CompileResponse; - + setBuildPlatform(value?: cc_arduino_cli_commands_v1_common_pb.InstalledPlatformReference): BuilderResult; + clearBuildPropertiesList(): void; + getBuildPropertiesList(): Array<string>; + setBuildPropertiesList(value: Array<string>): BuilderResult; + addBuildProperties(value: string, index?: number): string; + clearDiagnosticsList(): void; + getDiagnosticsList(): Array<CompileDiagnostic>; + setDiagnosticsList(value: Array<CompileDiagnostic>): BuilderResult; + addDiagnostics(value?: CompileDiagnostic, index?: number): CompileDiagnostic; serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): CompileResponse.AsObject; - static toObject(includeInstance: boolean, msg: CompileResponse): CompileResponse.AsObject; + toObject(includeInstance?: boolean): BuilderResult.AsObject; + static toObject(includeInstance: boolean, msg: BuilderResult): BuilderResult.AsObject; static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: CompileResponse, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): CompileResponse; - static deserializeBinaryFromReader(message: CompileResponse, reader: jspb.BinaryReader): CompileResponse; + static serializeBinaryToWriter(message: BuilderResult, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): BuilderResult; + static deserializeBinaryFromReader(message: BuilderResult, reader: jspb.BinaryReader): BuilderResult; } -export namespace CompileResponse { +export namespace BuilderResult { export type AsObject = { - outStream: Uint8Array | string, - errStream: Uint8Array | string, buildPath: string, usedLibrariesList: Array<cc_arduino_cli_commands_v1_lib_pb.Library.AsObject>, executableSectionsSizeList: Array<ExecutableSectionSize.AsObject>, boardPlatform?: cc_arduino_cli_commands_v1_common_pb.InstalledPlatformReference.AsObject, buildPlatform?: cc_arduino_cli_commands_v1_common_pb.InstalledPlatformReference.AsObject, - progress?: cc_arduino_cli_commands_v1_common_pb.TaskProgress.AsObject, + buildPropertiesList: Array<string>, + diagnosticsList: Array<CompileDiagnostic.AsObject>, } } export class ExecutableSectionSize extends jspb.Message { getName(): string; setName(value: string): ExecutableSectionSize; - getSize(): number; setSize(value: number): ExecutableSectionSize; - getMaxSize(): number; setMaxSize(value: number): ExecutableSectionSize; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): ExecutableSectionSize.AsObject; static toObject(includeInstance: boolean, msg: ExecutableSectionSize): ExecutableSectionSize.AsObject; @@ -234,3 +269,103 @@ export namespace ExecutableSectionSize { maxSize: number, } } + +export class CompileDiagnostic extends jspb.Message { + getSeverity(): string; + setSeverity(value: string): CompileDiagnostic; + getMessage(): string; + setMessage(value: string): CompileDiagnostic; + getFile(): string; + setFile(value: string): CompileDiagnostic; + getLine(): number; + setLine(value: number): CompileDiagnostic; + getColumn(): number; + setColumn(value: number): CompileDiagnostic; + clearContextList(): void; + getContextList(): Array<CompileDiagnosticContext>; + setContextList(value: Array<CompileDiagnosticContext>): CompileDiagnostic; + addContext(value?: CompileDiagnosticContext, index?: number): CompileDiagnosticContext; + clearNotesList(): void; + getNotesList(): Array<CompileDiagnosticNote>; + setNotesList(value: Array<CompileDiagnosticNote>): CompileDiagnostic; + addNotes(value?: CompileDiagnosticNote, index?: number): CompileDiagnosticNote; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): CompileDiagnostic.AsObject; + static toObject(includeInstance: boolean, msg: CompileDiagnostic): CompileDiagnostic.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: CompileDiagnostic, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): CompileDiagnostic; + static deserializeBinaryFromReader(message: CompileDiagnostic, reader: jspb.BinaryReader): CompileDiagnostic; +} + +export namespace CompileDiagnostic { + export type AsObject = { + severity: string, + message: string, + file: string, + line: number, + column: number, + contextList: Array<CompileDiagnosticContext.AsObject>, + notesList: Array<CompileDiagnosticNote.AsObject>, + } +} + +export class CompileDiagnosticContext extends jspb.Message { + getMessage(): string; + setMessage(value: string): CompileDiagnosticContext; + getFile(): string; + setFile(value: string): CompileDiagnosticContext; + getLine(): number; + setLine(value: number): CompileDiagnosticContext; + getColumn(): number; + setColumn(value: number): CompileDiagnosticContext; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): CompileDiagnosticContext.AsObject; + static toObject(includeInstance: boolean, msg: CompileDiagnosticContext): CompileDiagnosticContext.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: CompileDiagnosticContext, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): CompileDiagnosticContext; + static deserializeBinaryFromReader(message: CompileDiagnosticContext, reader: jspb.BinaryReader): CompileDiagnosticContext; +} + +export namespace CompileDiagnosticContext { + export type AsObject = { + message: string, + file: string, + line: number, + column: number, + } +} + +export class CompileDiagnosticNote extends jspb.Message { + getMessage(): string; + setMessage(value: string): CompileDiagnosticNote; + getFile(): string; + setFile(value: string): CompileDiagnosticNote; + getLine(): number; + setLine(value: number): CompileDiagnosticNote; + getColumn(): number; + setColumn(value: number): CompileDiagnosticNote; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): CompileDiagnosticNote.AsObject; + static toObject(includeInstance: boolean, msg: CompileDiagnosticNote): CompileDiagnosticNote.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: CompileDiagnosticNote, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): CompileDiagnosticNote; + static deserializeBinaryFromReader(message: CompileDiagnosticNote, reader: jspb.BinaryReader): CompileDiagnosticNote; +} + +export namespace CompileDiagnosticNote { + export type AsObject = { + message: string, + file: string, + line: number, + column: number, + } +} diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/compile_pb.js b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/compile_pb.js index c2bae211d..0e1782705 100644 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/compile_pb.js +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/compile_pb.js @@ -13,17 +13,27 @@ var jspb = require('google-protobuf'); var goog = jspb; -var global = Function('return this')(); +var global = (function() { + if (this) { return this; } + if (typeof window !== 'undefined') { return window; } + if (typeof global !== 'undefined') { return global; } + if (typeof self !== 'undefined') { return self; } + return Function('return this')(); +}.call(null)); -var google_protobuf_wrappers_pb = require('google-protobuf/google/protobuf/wrappers_pb.js'); -goog.object.extend(proto, google_protobuf_wrappers_pb); var cc_arduino_cli_commands_v1_common_pb = require('../../../../../cc/arduino/cli/commands/v1/common_pb.js'); goog.object.extend(proto, cc_arduino_cli_commands_v1_common_pb); var cc_arduino_cli_commands_v1_lib_pb = require('../../../../../cc/arduino/cli/commands/v1/lib_pb.js'); goog.object.extend(proto, cc_arduino_cli_commands_v1_lib_pb); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.BuilderResult', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.CompileDiagnostic', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.CompileRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.CompileResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.CompileResponse.MessageCase', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.ExecutableSectionSize', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.InstanceNeedsReinitializationError', null, global); /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -56,7 +66,7 @@ if (goog.DEBUG && !COMPILED) { * @constructor */ proto.cc.arduino.cli.commands.v1.CompileResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, proto.cc.arduino.cli.commands.v1.CompileResponse.repeatedFields_, null); + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.cc.arduino.cli.commands.v1.CompileResponse.oneofGroups_); }; goog.inherits(proto.cc.arduino.cli.commands.v1.CompileResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { @@ -66,6 +76,48 @@ if (goog.DEBUG && !COMPILED) { */ proto.cc.arduino.cli.commands.v1.CompileResponse.displayName = 'proto.cc.arduino.cli.commands.v1.CompileResponse'; } +/** + * 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.InstanceNeedsReinitializationError = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.InstanceNeedsReinitializationError, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.InstanceNeedsReinitializationError.displayName = 'proto.cc.arduino.cli.commands.v1.InstanceNeedsReinitializationError'; +} +/** + * 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.BuilderResult = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.cc.arduino.cli.commands.v1.BuilderResult.repeatedFields_, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.BuilderResult, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.BuilderResult.displayName = 'proto.cc.arduino.cli.commands.v1.BuilderResult'; +} /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -87,13 +139,76 @@ if (goog.DEBUG && !COMPILED) { */ proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.displayName = 'proto.cc.arduino.cli.commands.v1.ExecutableSectionSize'; } +/** + * 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.CompileDiagnostic = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.cc.arduino.cli.commands.v1.CompileDiagnostic.repeatedFields_, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.CompileDiagnostic, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.CompileDiagnostic.displayName = 'proto.cc.arduino.cli.commands.v1.CompileDiagnostic'; +} +/** + * 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.CompileDiagnosticContext = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext.displayName = 'proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext'; +} +/** + * 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.CompileDiagnosticNote = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote.displayName = 'proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote'; +} /** * List of repeated fields within this message type. * @private {!Array<number>} * @const */ -proto.cc.arduino.cli.commands.v1.CompileRequest.repeatedFields_ = [8,15,24]; +proto.cc.arduino.cli.commands.v1.CompileRequest.repeatedFields_ = [8,15,24,30]; @@ -137,7 +252,6 @@ proto.cc.arduino.cli.commands.v1.CompileRequest.toObject = function(includeInsta warnings: jspb.Message.getFieldWithDefault(msg, 9, ""), verbose: jspb.Message.getBooleanFieldWithDefault(msg, 10, false), quiet: jspb.Message.getBooleanFieldWithDefault(msg, 11, false), - vidPid: jspb.Message.getFieldWithDefault(msg, 12, ""), jobs: jspb.Message.getFieldWithDefault(msg, 14, 0), librariesList: (f = jspb.Message.getRepeatedField(msg, 15)) == null ? undefined : f, optimizeForDebug: jspb.Message.getBooleanFieldWithDefault(msg, 16, false), @@ -145,12 +259,14 @@ proto.cc.arduino.cli.commands.v1.CompileRequest.toObject = function(includeInsta clean: jspb.Message.getBooleanFieldWithDefault(msg, 19, false), createCompilationDatabaseOnly: jspb.Message.getBooleanFieldWithDefault(msg, 21, false), sourceOverrideMap: (f = msg.getSourceOverrideMap()) ? f.toObject(includeInstance, undefined) : [], - exportBinaries: (f = msg.getExportBinaries()) && google_protobuf_wrappers_pb.BoolValue.toObject(includeInstance, f), + exportBinaries: jspb.Message.getBooleanFieldWithDefault(msg, 23, false), libraryList: (f = jspb.Message.getRepeatedField(msg, 24)) == null ? undefined : f, keysKeychain: jspb.Message.getFieldWithDefault(msg, 25, ""), signKey: jspb.Message.getFieldWithDefault(msg, 26, ""), encryptKey: jspb.Message.getFieldWithDefault(msg, 27, ""), - skipLibrariesDiscovery: jspb.Message.getBooleanFieldWithDefault(msg, 28, false) + skipLibrariesDiscovery: jspb.Message.getBooleanFieldWithDefault(msg, 28, false), + doNotExpandBuildProperties: jspb.Message.getBooleanFieldWithDefault(msg, 29, false), + buildCacheExtraPathsList: (f = jspb.Message.getRepeatedField(msg, 30)) == null ? undefined : f }; if (includeInstance) { @@ -232,10 +348,6 @@ proto.cc.arduino.cli.commands.v1.CompileRequest.deserializeBinaryFromReader = fu var value = /** @type {boolean} */ (reader.readBool()); msg.setQuiet(value); break; - case 12: - var value = /** @type {string} */ (reader.readString()); - msg.setVidPid(value); - break; case 14: var value = /** @type {number} */ (reader.readInt32()); msg.setJobs(value); @@ -267,8 +379,7 @@ proto.cc.arduino.cli.commands.v1.CompileRequest.deserializeBinaryFromReader = fu }); break; case 23: - var value = new google_protobuf_wrappers_pb.BoolValue; - reader.readMessage(value,google_protobuf_wrappers_pb.BoolValue.deserializeBinaryFromReader); + var value = /** @type {boolean} */ (reader.readBool()); msg.setExportBinaries(value); break; case 24: @@ -291,6 +402,14 @@ proto.cc.arduino.cli.commands.v1.CompileRequest.deserializeBinaryFromReader = fu var value = /** @type {boolean} */ (reader.readBool()); msg.setSkipLibrariesDiscovery(value); break; + case 29: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setDoNotExpandBuildProperties(value); + break; + case 30: + var value = /** @type {string} */ (reader.readString()); + msg.addBuildCacheExtraPaths(value); + break; default: reader.skipField(); break; @@ -398,13 +517,6 @@ proto.cc.arduino.cli.commands.v1.CompileRequest.serializeBinaryToWriter = functi f ); } - f = message.getVidPid(); - if (f.length > 0) { - writer.writeString( - 12, - f - ); - } f = message.getJobs(); if (f !== 0) { writer.writeInt32( @@ -451,12 +563,11 @@ proto.cc.arduino.cli.commands.v1.CompileRequest.serializeBinaryToWriter = functi if (f && f.getLength() > 0) { f.serializeBinary(22, writer, jspb.BinaryWriter.prototype.writeString, jspb.BinaryWriter.prototype.writeString); } - f = message.getExportBinaries(); + f = /** @type {boolean} */ (jspb.Message.getField(message, 23)); if (f != null) { - writer.writeMessage( + writer.writeBool( 23, - f, - google_protobuf_wrappers_pb.BoolValue.serializeBinaryToWriter + f ); } f = message.getLibraryList(); @@ -494,6 +605,20 @@ proto.cc.arduino.cli.commands.v1.CompileRequest.serializeBinaryToWriter = functi f ); } + f = message.getDoNotExpandBuildProperties(); + if (f) { + writer.writeBool( + 29, + f + ); + } + f = message.getBuildCacheExtraPathsList(); + if (f.length > 0) { + writer.writeRepeatedString( + 30, + f + ); + } }; @@ -733,24 +858,6 @@ proto.cc.arduino.cli.commands.v1.CompileRequest.prototype.setQuiet = function(va }; -/** - * optional string vid_pid = 12; - * @return {string} - */ -proto.cc.arduino.cli.commands.v1.CompileRequest.prototype.getVidPid = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 12, "")); -}; - - -/** - * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.CompileRequest} returns this - */ -proto.cc.arduino.cli.commands.v1.CompileRequest.prototype.setVidPid = function(value) { - return jspb.Message.setProto3StringField(this, 12, value); -}; - - /** * optional int32 jobs = 14; * @return {number} @@ -901,30 +1008,29 @@ proto.cc.arduino.cli.commands.v1.CompileRequest.prototype.clearSourceOverrideMap /** - * optional google.protobuf.BoolValue export_binaries = 23; - * @return {?proto.google.protobuf.BoolValue} + * optional bool export_binaries = 23; + * @return {boolean} */ proto.cc.arduino.cli.commands.v1.CompileRequest.prototype.getExportBinaries = function() { - return /** @type{?proto.google.protobuf.BoolValue} */ ( - jspb.Message.getWrapperField(this, google_protobuf_wrappers_pb.BoolValue, 23)); + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 23, false)); }; /** - * @param {?proto.google.protobuf.BoolValue|undefined} value + * @param {boolean} value * @return {!proto.cc.arduino.cli.commands.v1.CompileRequest} returns this -*/ + */ proto.cc.arduino.cli.commands.v1.CompileRequest.prototype.setExportBinaries = function(value) { - return jspb.Message.setWrapperField(this, 23, value); + return jspb.Message.setField(this, 23, value); }; /** - * Clears the message field making it undefined. + * Clears the field making it undefined. * @return {!proto.cc.arduino.cli.commands.v1.CompileRequest} returns this */ proto.cc.arduino.cli.commands.v1.CompileRequest.prototype.clearExportBinaries = function() { - return this.setExportBinaries(undefined); + return jspb.Message.setField(this, 23, undefined); }; @@ -1046,13 +1152,89 @@ proto.cc.arduino.cli.commands.v1.CompileRequest.prototype.setSkipLibrariesDiscov }; +/** + * optional bool do_not_expand_build_properties = 29; + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.CompileRequest.prototype.getDoNotExpandBuildProperties = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 29, false)); +}; + /** - * List of repeated fields within this message type. - * @private {!Array<number>} + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.CompileRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.CompileRequest.prototype.setDoNotExpandBuildProperties = function(value) { + return jspb.Message.setProto3BooleanField(this, 29, value); +}; + + +/** + * repeated string build_cache_extra_paths = 30; + * @return {!Array<string>} + */ +proto.cc.arduino.cli.commands.v1.CompileRequest.prototype.getBuildCacheExtraPathsList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 30)); +}; + + +/** + * @param {!Array<string>} value + * @return {!proto.cc.arduino.cli.commands.v1.CompileRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.CompileRequest.prototype.setBuildCacheExtraPathsList = function(value) { + return jspb.Message.setField(this, 30, value || []); +}; + + +/** + * @param {string} value + * @param {number=} opt_index + * @return {!proto.cc.arduino.cli.commands.v1.CompileRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.CompileRequest.prototype.addBuildCacheExtraPaths = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 30, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.cc.arduino.cli.commands.v1.CompileRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.CompileRequest.prototype.clearBuildCacheExtraPathsList = function() { + return this.setBuildCacheExtraPathsList([]); +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} * @const */ -proto.cc.arduino.cli.commands.v1.CompileResponse.repeatedFields_ = [4,5]; +proto.cc.arduino.cli.commands.v1.CompileResponse.oneofGroups_ = [[1,2,3,4]]; + +/** + * @enum {number} + */ +proto.cc.arduino.cli.commands.v1.CompileResponse.MessageCase = { + MESSAGE_NOT_SET: 0, + OUT_STREAM: 1, + ERR_STREAM: 2, + PROGRESS: 3, + RESULT: 4 +}; + +/** + * @return {proto.cc.arduino.cli.commands.v1.CompileResponse.MessageCase} + */ +proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.getMessageCase = function() { + return /** @type {proto.cc.arduino.cli.commands.v1.CompileResponse.MessageCase} */(jspb.Message.computeOneofCase(this, proto.cc.arduino.cli.commands.v1.CompileResponse.oneofGroups_[0])); +}; @@ -1087,14 +1269,8 @@ proto.cc.arduino.cli.commands.v1.CompileResponse.toObject = function(includeInst var f, obj = { outStream: msg.getOutStream_asB64(), errStream: msg.getErrStream_asB64(), - buildPath: jspb.Message.getFieldWithDefault(msg, 3, ""), - usedLibrariesList: jspb.Message.toObjectList(msg.getUsedLibrariesList(), - cc_arduino_cli_commands_v1_lib_pb.Library.toObject, includeInstance), - executableSectionsSizeList: jspb.Message.toObjectList(msg.getExecutableSectionsSizeList(), - proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.toObject, includeInstance), - boardPlatform: (f = msg.getBoardPlatform()) && cc_arduino_cli_commands_v1_common_pb.InstalledPlatformReference.toObject(includeInstance, f), - buildPlatform: (f = msg.getBuildPlatform()) && cc_arduino_cli_commands_v1_common_pb.InstalledPlatformReference.toObject(includeInstance, f), - progress: (f = msg.getProgress()) && cc_arduino_cli_commands_v1_common_pb.TaskProgress.toObject(includeInstance, f) + progress: (f = msg.getProgress()) && cc_arduino_cli_commands_v1_common_pb.TaskProgress.toObject(includeInstance, f), + result: (f = msg.getResult()) && proto.cc.arduino.cli.commands.v1.BuilderResult.toObject(includeInstance, f) }; if (includeInstance) { @@ -1140,34 +1316,15 @@ proto.cc.arduino.cli.commands.v1.CompileResponse.deserializeBinaryFromReader = f msg.setErrStream(value); break; case 3: - var value = /** @type {string} */ (reader.readString()); - msg.setBuildPath(value); - break; - case 4: - var value = new cc_arduino_cli_commands_v1_lib_pb.Library; - reader.readMessage(value,cc_arduino_cli_commands_v1_lib_pb.Library.deserializeBinaryFromReader); - msg.addUsedLibraries(value); - break; - case 5: - var value = new proto.cc.arduino.cli.commands.v1.ExecutableSectionSize; - reader.readMessage(value,proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.deserializeBinaryFromReader); - msg.addExecutableSectionsSize(value); - break; - case 6: - var value = new cc_arduino_cli_commands_v1_common_pb.InstalledPlatformReference; - reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.InstalledPlatformReference.deserializeBinaryFromReader); - msg.setBoardPlatform(value); - break; - case 7: - var value = new cc_arduino_cli_commands_v1_common_pb.InstalledPlatformReference; - reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.InstalledPlatformReference.deserializeBinaryFromReader); - msg.setBuildPlatform(value); - break; - case 8: var value = new cc_arduino_cli_commands_v1_common_pb.TaskProgress; reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.TaskProgress.deserializeBinaryFromReader); msg.setProgress(value); break; + case 4: + var value = new proto.cc.arduino.cli.commands.v1.BuilderResult; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.BuilderResult.deserializeBinaryFromReader); + msg.setResult(value); + break; default: reader.skipField(); break; @@ -1197,65 +1354,34 @@ proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.serializeBinary = fun */ proto.cc.arduino.cli.commands.v1.CompileResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getOutStream_asU8(); - if (f.length > 0) { + f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 1)); + if (f != null) { writer.writeBytes( 1, f ); } - f = message.getErrStream_asU8(); - if (f.length > 0) { + f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 2)); + if (f != null) { writer.writeBytes( 2, f ); } - f = message.getBuildPath(); - if (f.length > 0) { - writer.writeString( - 3, - f - ); - } - f = message.getUsedLibrariesList(); - if (f.length > 0) { - writer.writeRepeatedMessage( - 4, - f, - cc_arduino_cli_commands_v1_lib_pb.Library.serializeBinaryToWriter - ); - } - f = message.getExecutableSectionsSizeList(); - if (f.length > 0) { - writer.writeRepeatedMessage( - 5, - f, - proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.serializeBinaryToWriter - ); - } - f = message.getBoardPlatform(); + f = message.getProgress(); if (f != null) { writer.writeMessage( - 6, + 3, f, - cc_arduino_cli_commands_v1_common_pb.InstalledPlatformReference.serializeBinaryToWriter + cc_arduino_cli_commands_v1_common_pb.TaskProgress.serializeBinaryToWriter ); } - f = message.getBuildPlatform(); + f = message.getResult(); if (f != null) { writer.writeMessage( - 7, + 4, f, - cc_arduino_cli_commands_v1_common_pb.InstalledPlatformReference.serializeBinaryToWriter - ); - } - f = message.getProgress(); - if (f != null) { - writer.writeMessage( - 8, - f, - cc_arduino_cli_commands_v1_common_pb.TaskProgress.serializeBinaryToWriter + proto.cc.arduino.cli.commands.v1.BuilderResult.serializeBinaryToWriter ); } }; @@ -1299,7 +1425,25 @@ proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.getOutStream_asU8 = f * @return {!proto.cc.arduino.cli.commands.v1.CompileResponse} returns this */ proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.setOutStream = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); + return jspb.Message.setOneofField(this, 1, proto.cc.arduino.cli.commands.v1.CompileResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.CompileResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.clearOutStream = function() { + return jspb.Message.setOneofField(this, 1, proto.cc.arduino.cli.commands.v1.CompileResponse.oneofGroups_[0], undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.hasOutStream = function() { + return jspb.Message.getField(this, 1) != null; }; @@ -1341,215 +1485,210 @@ proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.getErrStream_asU8 = f * @return {!proto.cc.arduino.cli.commands.v1.CompileResponse} returns this */ proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.setErrStream = function(value) { - return jspb.Message.setProto3BytesField(this, 2, value); + return jspb.Message.setOneofField(this, 2, proto.cc.arduino.cli.commands.v1.CompileResponse.oneofGroups_[0], value); }; /** - * optional string build_path = 3; - * @return {string} + * Clears the field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.CompileResponse} returns this */ -proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.getBuildPath = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.clearErrStream = function() { + return jspb.Message.setOneofField(this, 2, proto.cc.arduino.cli.commands.v1.CompileResponse.oneofGroups_[0], undefined); }; /** - * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.CompileResponse} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.setBuildPath = function(value) { - return jspb.Message.setProto3StringField(this, 3, value); +proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.hasErrStream = function() { + return jspb.Message.getField(this, 2) != null; }; /** - * repeated Library used_libraries = 4; - * @return {!Array<!proto.cc.arduino.cli.commands.v1.Library>} + * optional TaskProgress progress = 3; + * @return {?proto.cc.arduino.cli.commands.v1.TaskProgress} */ -proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.getUsedLibrariesList = function() { - return /** @type{!Array<!proto.cc.arduino.cli.commands.v1.Library>} */ ( - jspb.Message.getRepeatedWrapperField(this, cc_arduino_cli_commands_v1_lib_pb.Library, 4)); +proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.getProgress = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.TaskProgress} */ ( + jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.TaskProgress, 3)); }; /** - * @param {!Array<!proto.cc.arduino.cli.commands.v1.Library>} value + * @param {?proto.cc.arduino.cli.commands.v1.TaskProgress|undefined} value * @return {!proto.cc.arduino.cli.commands.v1.CompileResponse} returns this */ -proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.setUsedLibrariesList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 4, value); +proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.setProgress = function(value) { + return jspb.Message.setOneofWrapperField(this, 3, proto.cc.arduino.cli.commands.v1.CompileResponse.oneofGroups_[0], value); }; /** - * @param {!proto.cc.arduino.cli.commands.v1.Library=} opt_value - * @param {number=} opt_index - * @return {!proto.cc.arduino.cli.commands.v1.Library} + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.CompileResponse} returns this */ -proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.addUsedLibraries = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 4, opt_value, proto.cc.arduino.cli.commands.v1.Library, opt_index); +proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.clearProgress = function() { + return this.setProgress(undefined); }; /** - * Clears the list making it empty but non-null. - * @return {!proto.cc.arduino.cli.commands.v1.CompileResponse} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.clearUsedLibrariesList = function() { - return this.setUsedLibrariesList([]); +proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.hasProgress = function() { + return jspb.Message.getField(this, 3) != null; }; /** - * repeated ExecutableSectionSize executable_sections_size = 5; - * @return {!Array<!proto.cc.arduino.cli.commands.v1.ExecutableSectionSize>} + * optional BuilderResult result = 4; + * @return {?proto.cc.arduino.cli.commands.v1.BuilderResult} */ -proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.getExecutableSectionsSizeList = function() { - return /** @type{!Array<!proto.cc.arduino.cli.commands.v1.ExecutableSectionSize>} */ ( - jspb.Message.getRepeatedWrapperField(this, proto.cc.arduino.cli.commands.v1.ExecutableSectionSize, 5)); +proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.getResult = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.BuilderResult} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.BuilderResult, 4)); }; /** - * @param {!Array<!proto.cc.arduino.cli.commands.v1.ExecutableSectionSize>} value + * @param {?proto.cc.arduino.cli.commands.v1.BuilderResult|undefined} value * @return {!proto.cc.arduino.cli.commands.v1.CompileResponse} returns this */ -proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.setExecutableSectionsSizeList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 5, value); -}; - - -/** - * @param {!proto.cc.arduino.cli.commands.v1.ExecutableSectionSize=} opt_value - * @param {number=} opt_index - * @return {!proto.cc.arduino.cli.commands.v1.ExecutableSectionSize} - */ -proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.addExecutableSectionsSize = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 5, opt_value, proto.cc.arduino.cli.commands.v1.ExecutableSectionSize, opt_index); +proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.setResult = function(value) { + return jspb.Message.setOneofWrapperField(this, 4, proto.cc.arduino.cli.commands.v1.CompileResponse.oneofGroups_[0], value); }; /** - * Clears the list making it empty but non-null. + * Clears the message field making it undefined. * @return {!proto.cc.arduino.cli.commands.v1.CompileResponse} returns this */ -proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.clearExecutableSectionsSizeList = function() { - return this.setExecutableSectionsSizeList([]); +proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.clearResult = function() { + return this.setResult(undefined); }; /** - * optional InstalledPlatformReference board_platform = 6; - * @return {?proto.cc.arduino.cli.commands.v1.InstalledPlatformReference} + * Returns whether this field is set. + * @return {boolean} */ -proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.getBoardPlatform = function() { - return /** @type{?proto.cc.arduino.cli.commands.v1.InstalledPlatformReference} */ ( - jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.InstalledPlatformReference, 6)); +proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.hasResult = function() { + return jspb.Message.getField(this, 4) != null; }; -/** - * @param {?proto.cc.arduino.cli.commands.v1.InstalledPlatformReference|undefined} value - * @return {!proto.cc.arduino.cli.commands.v1.CompileResponse} returns this -*/ -proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.setBoardPlatform = function(value) { - return jspb.Message.setWrapperField(this, 6, value); -}; - -/** - * Clears the message field making it undefined. - * @return {!proto.cc.arduino.cli.commands.v1.CompileResponse} returns this - */ -proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.clearBoardPlatform = function() { - return this.setBoardPlatform(undefined); -}; +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Returns whether this field is set. - * @return {boolean} + * 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.CompileResponse.prototype.hasBoardPlatform = function() { - return jspb.Message.getField(this, 6) != null; +proto.cc.arduino.cli.commands.v1.InstanceNeedsReinitializationError.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.InstanceNeedsReinitializationError.toObject(opt_includeInstance, this); }; /** - * optional InstalledPlatformReference build_platform = 7; - * @return {?proto.cc.arduino.cli.commands.v1.InstalledPlatformReference} + * 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.InstanceNeedsReinitializationError} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.getBuildPlatform = function() { - return /** @type{?proto.cc.arduino.cli.commands.v1.InstalledPlatformReference} */ ( - jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.InstalledPlatformReference, 7)); -}; +proto.cc.arduino.cli.commands.v1.InstanceNeedsReinitializationError.toObject = function(includeInstance, msg) { + var f, obj = { + }; -/** - * @param {?proto.cc.arduino.cli.commands.v1.InstalledPlatformReference|undefined} value - * @return {!proto.cc.arduino.cli.commands.v1.CompileResponse} returns this -*/ -proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.setBuildPlatform = function(value) { - return jspb.Message.setWrapperField(this, 7, value); + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * Clears the message field making it undefined. - * @return {!proto.cc.arduino.cli.commands.v1.CompileResponse} returns this + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.InstanceNeedsReinitializationError} */ -proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.clearBuildPlatform = function() { - return this.setBuildPlatform(undefined); +proto.cc.arduino.cli.commands.v1.InstanceNeedsReinitializationError.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.InstanceNeedsReinitializationError; + return proto.cc.arduino.cli.commands.v1.InstanceNeedsReinitializationError.deserializeBinaryFromReader(msg, reader); }; /** - * Returns whether this field is set. - * @return {boolean} + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.InstanceNeedsReinitializationError} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.InstanceNeedsReinitializationError} */ -proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.hasBuildPlatform = function() { - return jspb.Message.getField(this, 7) != null; +proto.cc.arduino.cli.commands.v1.InstanceNeedsReinitializationError.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * optional TaskProgress progress = 8; - * @return {?proto.cc.arduino.cli.commands.v1.TaskProgress} + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.getProgress = function() { - return /** @type{?proto.cc.arduino.cli.commands.v1.TaskProgress} */ ( - jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.TaskProgress, 8)); -}; - - -/** - * @param {?proto.cc.arduino.cli.commands.v1.TaskProgress|undefined} value - * @return {!proto.cc.arduino.cli.commands.v1.CompileResponse} returns this -*/ -proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.setProgress = function(value) { - return jspb.Message.setWrapperField(this, 8, value); +proto.cc.arduino.cli.commands.v1.InstanceNeedsReinitializationError.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.InstanceNeedsReinitializationError.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * Clears the message field making it undefined. - * @return {!proto.cc.arduino.cli.commands.v1.CompileResponse} returns this + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.cc.arduino.cli.commands.v1.InstanceNeedsReinitializationError} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.clearProgress = function() { - return this.setProgress(undefined); +proto.cc.arduino.cli.commands.v1.InstanceNeedsReinitializationError.serializeBinaryToWriter = function(message, writer) { + var f = undefined; }; + /** - * Returns whether this field is set. - * @return {boolean} + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const */ -proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.hasProgress = function() { - return jspb.Message.getField(this, 8) != null; -}; - - +proto.cc.arduino.cli.commands.v1.BuilderResult.repeatedFields_ = [2,3,7,8]; @@ -1566,8 +1705,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.BuilderResult.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.BuilderResult.toObject(opt_includeInstance, this); }; @@ -1576,15 +1715,22 @@ proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.prototype.toObject = func * @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.ExecutableSectionSize} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.BuilderResult} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.BuilderResult.toObject = function(includeInstance, msg) { var f, obj = { - name: jspb.Message.getFieldWithDefault(msg, 1, ""), - size: jspb.Message.getFieldWithDefault(msg, 2, 0), - maxSize: jspb.Message.getFieldWithDefault(msg, 3, 0) + buildPath: jspb.Message.getFieldWithDefault(msg, 1, ""), + usedLibrariesList: jspb.Message.toObjectList(msg.getUsedLibrariesList(), + cc_arduino_cli_commands_v1_lib_pb.Library.toObject, includeInstance), + executableSectionsSizeList: jspb.Message.toObjectList(msg.getExecutableSectionsSizeList(), + proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.toObject, includeInstance), + boardPlatform: (f = msg.getBoardPlatform()) && cc_arduino_cli_commands_v1_common_pb.InstalledPlatformReference.toObject(includeInstance, f), + buildPlatform: (f = msg.getBuildPlatform()) && cc_arduino_cli_commands_v1_common_pb.InstalledPlatformReference.toObject(includeInstance, f), + buildPropertiesList: (f = jspb.Message.getRepeatedField(msg, 7)) == null ? undefined : f, + diagnosticsList: jspb.Message.toObjectList(msg.getDiagnosticsList(), + proto.cc.arduino.cli.commands.v1.CompileDiagnostic.toObject, includeInstance) }; if (includeInstance) { @@ -1598,23 +1744,23 @@ proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.toObject = function(inclu /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.ExecutableSectionSize} + * @return {!proto.cc.arduino.cli.commands.v1.BuilderResult} */ -proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.BuilderResult.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.ExecutableSectionSize; - return proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.BuilderResult; + return proto.cc.arduino.cli.commands.v1.BuilderResult.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.ExecutableSectionSize} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.BuilderResult} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.ExecutableSectionSize} + * @return {!proto.cc.arduino.cli.commands.v1.BuilderResult} */ -proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.BuilderResult.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -1623,15 +1769,36 @@ proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.deserializeBinaryFromRead switch (field) { case 1: var value = /** @type {string} */ (reader.readString()); - msg.setName(value); + msg.setBuildPath(value); break; case 2: - var value = /** @type {number} */ (reader.readInt64()); - msg.setSize(value); + var value = new cc_arduino_cli_commands_v1_lib_pb.Library; + reader.readMessage(value,cc_arduino_cli_commands_v1_lib_pb.Library.deserializeBinaryFromReader); + msg.addUsedLibraries(value); break; case 3: - var value = /** @type {number} */ (reader.readInt64()); - msg.setMaxSize(value); + var value = new proto.cc.arduino.cli.commands.v1.ExecutableSectionSize; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.deserializeBinaryFromReader); + msg.addExecutableSectionsSize(value); + break; + case 4: + var value = new cc_arduino_cli_commands_v1_common_pb.InstalledPlatformReference; + reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.InstalledPlatformReference.deserializeBinaryFromReader); + msg.setBoardPlatform(value); + break; + case 5: + var value = new cc_arduino_cli_commands_v1_common_pb.InstalledPlatformReference; + reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.InstalledPlatformReference.deserializeBinaryFromReader); + msg.setBuildPlatform(value); + break; + case 7: + var value = /** @type {string} */ (reader.readString()); + msg.addBuildProperties(value); + break; + case 8: + var value = new proto.cc.arduino.cli.commands.v1.CompileDiagnostic; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.CompileDiagnostic.deserializeBinaryFromReader); + msg.addDiagnostics(value); break; default: reader.skipField(); @@ -1646,9 +1813,9 @@ proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.deserializeBinaryFromRead * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.BuilderResult.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.BuilderResult.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -1656,88 +1823,1303 @@ proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.prototype.serializeBinary /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.ExecutableSectionSize} message + * @param {!proto.cc.arduino.cli.commands.v1.BuilderResult} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.BuilderResult.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getName(); + f = message.getBuildPath(); if (f.length > 0) { writer.writeString( 1, f ); } - f = message.getSize(); - if (f !== 0) { - writer.writeInt64( + f = message.getUsedLibrariesList(); + if (f.length > 0) { + writer.writeRepeatedMessage( 2, - f + f, + cc_arduino_cli_commands_v1_lib_pb.Library.serializeBinaryToWriter ); } - f = message.getMaxSize(); - if (f !== 0) { - writer.writeInt64( + f = message.getExecutableSectionsSizeList(); + if (f.length > 0) { + writer.writeRepeatedMessage( 3, - f + f, + proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.serializeBinaryToWriter ); } -}; - - -/** - * optional string name = 1; - * @return {string} - */ -proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.prototype.getName = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.ExecutableSectionSize} returns this - */ -proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.prototype.setName = function(value) { + f = message.getBoardPlatform(); + if (f != null) { + writer.writeMessage( + 4, + f, + cc_arduino_cli_commands_v1_common_pb.InstalledPlatformReference.serializeBinaryToWriter + ); + } + f = message.getBuildPlatform(); + if (f != null) { + writer.writeMessage( + 5, + f, + cc_arduino_cli_commands_v1_common_pb.InstalledPlatformReference.serializeBinaryToWriter + ); + } + f = message.getBuildPropertiesList(); + if (f.length > 0) { + writer.writeRepeatedString( + 7, + f + ); + } + f = message.getDiagnosticsList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 8, + f, + proto.cc.arduino.cli.commands.v1.CompileDiagnostic.serializeBinaryToWriter + ); + } +}; + + +/** + * optional string build_path = 1; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.BuilderResult.prototype.getBuildPath = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.BuilderResult} returns this + */ +proto.cc.arduino.cli.commands.v1.BuilderResult.prototype.setBuildPath = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + +/** + * repeated Library used_libraries = 2; + * @return {!Array<!proto.cc.arduino.cli.commands.v1.Library>} + */ +proto.cc.arduino.cli.commands.v1.BuilderResult.prototype.getUsedLibrariesList = function() { + return /** @type{!Array<!proto.cc.arduino.cli.commands.v1.Library>} */ ( + jspb.Message.getRepeatedWrapperField(this, cc_arduino_cli_commands_v1_lib_pb.Library, 2)); +}; + + +/** + * @param {!Array<!proto.cc.arduino.cli.commands.v1.Library>} value + * @return {!proto.cc.arduino.cli.commands.v1.BuilderResult} returns this +*/ +proto.cc.arduino.cli.commands.v1.BuilderResult.prototype.setUsedLibrariesList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 2, value); +}; + + +/** + * @param {!proto.cc.arduino.cli.commands.v1.Library=} opt_value + * @param {number=} opt_index + * @return {!proto.cc.arduino.cli.commands.v1.Library} + */ +proto.cc.arduino.cli.commands.v1.BuilderResult.prototype.addUsedLibraries = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 2, opt_value, proto.cc.arduino.cli.commands.v1.Library, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.cc.arduino.cli.commands.v1.BuilderResult} returns this + */ +proto.cc.arduino.cli.commands.v1.BuilderResult.prototype.clearUsedLibrariesList = function() { + return this.setUsedLibrariesList([]); +}; + + +/** + * repeated ExecutableSectionSize executable_sections_size = 3; + * @return {!Array<!proto.cc.arduino.cli.commands.v1.ExecutableSectionSize>} + */ +proto.cc.arduino.cli.commands.v1.BuilderResult.prototype.getExecutableSectionsSizeList = function() { + return /** @type{!Array<!proto.cc.arduino.cli.commands.v1.ExecutableSectionSize>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.cc.arduino.cli.commands.v1.ExecutableSectionSize, 3)); +}; + + +/** + * @param {!Array<!proto.cc.arduino.cli.commands.v1.ExecutableSectionSize>} value + * @return {!proto.cc.arduino.cli.commands.v1.BuilderResult} returns this +*/ +proto.cc.arduino.cli.commands.v1.BuilderResult.prototype.setExecutableSectionsSizeList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 3, value); +}; + + +/** + * @param {!proto.cc.arduino.cli.commands.v1.ExecutableSectionSize=} opt_value + * @param {number=} opt_index + * @return {!proto.cc.arduino.cli.commands.v1.ExecutableSectionSize} + */ +proto.cc.arduino.cli.commands.v1.BuilderResult.prototype.addExecutableSectionsSize = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 3, opt_value, proto.cc.arduino.cli.commands.v1.ExecutableSectionSize, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.cc.arduino.cli.commands.v1.BuilderResult} returns this + */ +proto.cc.arduino.cli.commands.v1.BuilderResult.prototype.clearExecutableSectionsSizeList = function() { + return this.setExecutableSectionsSizeList([]); +}; + + +/** + * optional InstalledPlatformReference board_platform = 4; + * @return {?proto.cc.arduino.cli.commands.v1.InstalledPlatformReference} + */ +proto.cc.arduino.cli.commands.v1.BuilderResult.prototype.getBoardPlatform = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.InstalledPlatformReference} */ ( + jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.InstalledPlatformReference, 4)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.InstalledPlatformReference|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.BuilderResult} returns this +*/ +proto.cc.arduino.cli.commands.v1.BuilderResult.prototype.setBoardPlatform = function(value) { + return jspb.Message.setWrapperField(this, 4, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.BuilderResult} returns this + */ +proto.cc.arduino.cli.commands.v1.BuilderResult.prototype.clearBoardPlatform = function() { + return this.setBoardPlatform(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.BuilderResult.prototype.hasBoardPlatform = function() { + return jspb.Message.getField(this, 4) != null; +}; + + +/** + * optional InstalledPlatformReference build_platform = 5; + * @return {?proto.cc.arduino.cli.commands.v1.InstalledPlatformReference} + */ +proto.cc.arduino.cli.commands.v1.BuilderResult.prototype.getBuildPlatform = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.InstalledPlatformReference} */ ( + jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.InstalledPlatformReference, 5)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.InstalledPlatformReference|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.BuilderResult} returns this +*/ +proto.cc.arduino.cli.commands.v1.BuilderResult.prototype.setBuildPlatform = function(value) { + return jspb.Message.setWrapperField(this, 5, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.BuilderResult} returns this + */ +proto.cc.arduino.cli.commands.v1.BuilderResult.prototype.clearBuildPlatform = function() { + return this.setBuildPlatform(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.BuilderResult.prototype.hasBuildPlatform = function() { + return jspb.Message.getField(this, 5) != null; +}; + + +/** + * repeated string build_properties = 7; + * @return {!Array<string>} + */ +proto.cc.arduino.cli.commands.v1.BuilderResult.prototype.getBuildPropertiesList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 7)); +}; + + +/** + * @param {!Array<string>} value + * @return {!proto.cc.arduino.cli.commands.v1.BuilderResult} returns this + */ +proto.cc.arduino.cli.commands.v1.BuilderResult.prototype.setBuildPropertiesList = function(value) { + return jspb.Message.setField(this, 7, value || []); +}; + + +/** + * @param {string} value + * @param {number=} opt_index + * @return {!proto.cc.arduino.cli.commands.v1.BuilderResult} returns this + */ +proto.cc.arduino.cli.commands.v1.BuilderResult.prototype.addBuildProperties = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 7, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.cc.arduino.cli.commands.v1.BuilderResult} returns this + */ +proto.cc.arduino.cli.commands.v1.BuilderResult.prototype.clearBuildPropertiesList = function() { + return this.setBuildPropertiesList([]); +}; + + +/** + * repeated CompileDiagnostic diagnostics = 8; + * @return {!Array<!proto.cc.arduino.cli.commands.v1.CompileDiagnostic>} + */ +proto.cc.arduino.cli.commands.v1.BuilderResult.prototype.getDiagnosticsList = function() { + return /** @type{!Array<!proto.cc.arduino.cli.commands.v1.CompileDiagnostic>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.cc.arduino.cli.commands.v1.CompileDiagnostic, 8)); +}; + + +/** + * @param {!Array<!proto.cc.arduino.cli.commands.v1.CompileDiagnostic>} value + * @return {!proto.cc.arduino.cli.commands.v1.BuilderResult} returns this +*/ +proto.cc.arduino.cli.commands.v1.BuilderResult.prototype.setDiagnosticsList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 8, value); +}; + + +/** + * @param {!proto.cc.arduino.cli.commands.v1.CompileDiagnostic=} opt_value + * @param {number=} opt_index + * @return {!proto.cc.arduino.cli.commands.v1.CompileDiagnostic} + */ +proto.cc.arduino.cli.commands.v1.BuilderResult.prototype.addDiagnostics = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 8, opt_value, proto.cc.arduino.cli.commands.v1.CompileDiagnostic, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.cc.arduino.cli.commands.v1.BuilderResult} returns this + */ +proto.cc.arduino.cli.commands.v1.BuilderResult.prototype.clearDiagnosticsList = function() { + return this.setDiagnosticsList([]); +}; + + + + + +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.ExecutableSectionSize.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.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.ExecutableSectionSize} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.toObject = function(includeInstance, msg) { + var f, obj = { + name: jspb.Message.getFieldWithDefault(msg, 1, ""), + size: jspb.Message.getFieldWithDefault(msg, 2, 0), + maxSize: jspb.Message.getFieldWithDefault(msg, 3, 0) + }; + + 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.ExecutableSectionSize} + */ +proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.ExecutableSectionSize; + return proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.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.ExecutableSectionSize} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.ExecutableSectionSize} + */ +proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setName(value); + break; + case 2: + var value = /** @type {number} */ (reader.readInt64()); + msg.setSize(value); + break; + case 3: + var value = /** @type {number} */ (reader.readInt64()); + msg.setMaxSize(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.ExecutableSectionSize.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.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.ExecutableSectionSize} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getName(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } + f = message.getSize(); + if (f !== 0) { + writer.writeInt64( + 2, + f + ); + } + f = message.getMaxSize(); + if (f !== 0) { + writer.writeInt64( + 3, + f + ); + } +}; + + +/** + * optional string name = 1; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.prototype.getName = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.ExecutableSectionSize} returns this + */ +proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.prototype.setName = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + +/** + * optional int64 size = 2; + * @return {number} + */ +proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.prototype.getSize = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.cc.arduino.cli.commands.v1.ExecutableSectionSize} returns this + */ +proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.prototype.setSize = function(value) { + return jspb.Message.setProto3IntField(this, 2, value); +}; + + +/** + * optional int64 max_size = 3; + * @return {number} + */ +proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.prototype.getMaxSize = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.cc.arduino.cli.commands.v1.ExecutableSectionSize} returns this + */ +proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.prototype.setMaxSize = function(value) { + return jspb.Message.setProto3IntField(this, 3, value); +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnostic.repeatedFields_ = [6,7]; + + + +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.CompileDiagnostic.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.CompileDiagnostic.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.CompileDiagnostic} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnostic.toObject = function(includeInstance, msg) { + var f, obj = { + severity: jspb.Message.getFieldWithDefault(msg, 1, ""), + message: jspb.Message.getFieldWithDefault(msg, 2, ""), + file: jspb.Message.getFieldWithDefault(msg, 3, ""), + line: jspb.Message.getFieldWithDefault(msg, 4, 0), + column: jspb.Message.getFieldWithDefault(msg, 5, 0), + contextList: jspb.Message.toObjectList(msg.getContextList(), + proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext.toObject, includeInstance), + notesList: jspb.Message.toObjectList(msg.getNotesList(), + proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote.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.CompileDiagnostic} + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnostic.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.CompileDiagnostic; + return proto.cc.arduino.cli.commands.v1.CompileDiagnostic.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.CompileDiagnostic} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.CompileDiagnostic} + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnostic.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setSeverity(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setMessage(value); + break; + case 3: + var value = /** @type {string} */ (reader.readString()); + msg.setFile(value); + break; + case 4: + var value = /** @type {number} */ (reader.readInt64()); + msg.setLine(value); + break; + case 5: + var value = /** @type {number} */ (reader.readInt64()); + msg.setColumn(value); + break; + case 6: + var value = new proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext.deserializeBinaryFromReader); + msg.addContext(value); + break; + case 7: + var value = new proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote.deserializeBinaryFromReader); + msg.addNotes(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.CompileDiagnostic.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.CompileDiagnostic.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.CompileDiagnostic} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnostic.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getSeverity(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } + f = message.getMessage(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } + f = message.getFile(); + if (f.length > 0) { + writer.writeString( + 3, + f + ); + } + f = message.getLine(); + if (f !== 0) { + writer.writeInt64( + 4, + f + ); + } + f = message.getColumn(); + if (f !== 0) { + writer.writeInt64( + 5, + f + ); + } + f = message.getContextList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 6, + f, + proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext.serializeBinaryToWriter + ); + } + f = message.getNotesList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 7, + f, + proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote.serializeBinaryToWriter + ); + } +}; + + +/** + * optional string severity = 1; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnostic.prototype.getSeverity = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.CompileDiagnostic} returns this + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnostic.prototype.setSeverity = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + +/** + * optional string message = 2; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnostic.prototype.getMessage = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.CompileDiagnostic} returns this + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnostic.prototype.setMessage = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + +/** + * optional string file = 3; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnostic.prototype.getFile = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.CompileDiagnostic} returns this + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnostic.prototype.setFile = function(value) { + return jspb.Message.setProto3StringField(this, 3, value); +}; + + +/** + * optional int64 line = 4; + * @return {number} + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnostic.prototype.getLine = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.cc.arduino.cli.commands.v1.CompileDiagnostic} returns this + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnostic.prototype.setLine = function(value) { + return jspb.Message.setProto3IntField(this, 4, value); +}; + + +/** + * optional int64 column = 5; + * @return {number} + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnostic.prototype.getColumn = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 5, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.cc.arduino.cli.commands.v1.CompileDiagnostic} returns this + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnostic.prototype.setColumn = function(value) { + return jspb.Message.setProto3IntField(this, 5, value); +}; + + +/** + * repeated CompileDiagnosticContext context = 6; + * @return {!Array<!proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext>} + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnostic.prototype.getContextList = function() { + return /** @type{!Array<!proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext, 6)); +}; + + +/** + * @param {!Array<!proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext>} value + * @return {!proto.cc.arduino.cli.commands.v1.CompileDiagnostic} returns this +*/ +proto.cc.arduino.cli.commands.v1.CompileDiagnostic.prototype.setContextList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 6, value); +}; + + +/** + * @param {!proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext=} opt_value + * @param {number=} opt_index + * @return {!proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext} + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnostic.prototype.addContext = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 6, opt_value, proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.cc.arduino.cli.commands.v1.CompileDiagnostic} returns this + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnostic.prototype.clearContextList = function() { + return this.setContextList([]); +}; + + +/** + * repeated CompileDiagnosticNote notes = 7; + * @return {!Array<!proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote>} + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnostic.prototype.getNotesList = function() { + return /** @type{!Array<!proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote, 7)); +}; + + +/** + * @param {!Array<!proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote>} value + * @return {!proto.cc.arduino.cli.commands.v1.CompileDiagnostic} returns this +*/ +proto.cc.arduino.cli.commands.v1.CompileDiagnostic.prototype.setNotesList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 7, value); +}; + + +/** + * @param {!proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote=} opt_value + * @param {number=} opt_index + * @return {!proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote} + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnostic.prototype.addNotes = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 7, opt_value, proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.cc.arduino.cli.commands.v1.CompileDiagnostic} returns this + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnostic.prototype.clearNotesList = function() { + return this.setNotesList([]); +}; + + + + + +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.CompileDiagnosticContext.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext.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.CompileDiagnosticContext} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext.toObject = function(includeInstance, msg) { + var f, obj = { + message: jspb.Message.getFieldWithDefault(msg, 1, ""), + file: jspb.Message.getFieldWithDefault(msg, 2, ""), + line: jspb.Message.getFieldWithDefault(msg, 3, 0), + column: jspb.Message.getFieldWithDefault(msg, 4, 0) + }; + + 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.CompileDiagnosticContext} + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext; + return proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext.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.CompileDiagnosticContext} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext} + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setMessage(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setFile(value); + break; + case 3: + var value = /** @type {number} */ (reader.readInt64()); + msg.setLine(value); + break; + case 4: + var value = /** @type {number} */ (reader.readInt64()); + msg.setColumn(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.CompileDiagnosticContext.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext.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.CompileDiagnosticContext} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getMessage(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } + f = message.getFile(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } + f = message.getLine(); + if (f !== 0) { + writer.writeInt64( + 3, + f + ); + } + f = message.getColumn(); + if (f !== 0) { + writer.writeInt64( + 4, + f + ); + } +}; + + +/** + * optional string message = 1; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext.prototype.getMessage = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext} returns this + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext.prototype.setMessage = function(value) { return jspb.Message.setProto3StringField(this, 1, value); }; /** - * optional int64 size = 2; + * optional string file = 2; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext.prototype.getFile = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext} returns this + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext.prototype.setFile = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + +/** + * optional int64 line = 3; * @return {number} */ -proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.prototype.getSize = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext.prototype.getLine = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); }; /** * @param {number} value - * @return {!proto.cc.arduino.cli.commands.v1.ExecutableSectionSize} returns this + * @return {!proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext} returns this */ -proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.prototype.setSize = function(value) { - return jspb.Message.setProto3IntField(this, 2, value); +proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext.prototype.setLine = function(value) { + return jspb.Message.setProto3IntField(this, 3, value); }; /** - * optional int64 max_size = 3; + * optional int64 column = 4; * @return {number} */ -proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.prototype.getMaxSize = function() { +proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext.prototype.getColumn = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext} returns this + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext.prototype.setColumn = function(value) { + return jspb.Message.setProto3IntField(this, 4, value); +}; + + + + + +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.CompileDiagnosticNote.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote.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.CompileDiagnosticNote} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote.toObject = function(includeInstance, msg) { + var f, obj = { + message: jspb.Message.getFieldWithDefault(msg, 1, ""), + file: jspb.Message.getFieldWithDefault(msg, 2, ""), + line: jspb.Message.getFieldWithDefault(msg, 3, 0), + column: jspb.Message.getFieldWithDefault(msg, 4, 0) + }; + + 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.CompileDiagnosticNote} + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote; + return proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote.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.CompileDiagnosticNote} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote} + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setMessage(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setFile(value); + break; + case 3: + var value = /** @type {number} */ (reader.readInt64()); + msg.setLine(value); + break; + case 4: + var value = /** @type {number} */ (reader.readInt64()); + msg.setColumn(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.CompileDiagnosticNote.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote.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.CompileDiagnosticNote} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getMessage(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } + f = message.getFile(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } + f = message.getLine(); + if (f !== 0) { + writer.writeInt64( + 3, + f + ); + } + f = message.getColumn(); + if (f !== 0) { + writer.writeInt64( + 4, + f + ); + } +}; + + +/** + * optional string message = 1; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote.prototype.getMessage = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote} returns this + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote.prototype.setMessage = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + +/** + * optional string file = 2; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote.prototype.getFile = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote} returns this + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote.prototype.setFile = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + +/** + * optional int64 line = 3; + * @return {number} + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote.prototype.getLine = function() { return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); }; /** * @param {number} value - * @return {!proto.cc.arduino.cli.commands.v1.ExecutableSectionSize} returns this + * @return {!proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote} returns this */ -proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.prototype.setMaxSize = function(value) { +proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote.prototype.setLine = function(value) { return jspb.Message.setProto3IntField(this, 3, value); }; +/** + * optional int64 column = 4; + * @return {number} + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote.prototype.getColumn = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote} returns this + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote.prototype.setColumn = function(value) { + return jspb.Message.setProto3IntField(this, 4, value); +}; + + goog.object.extend(exports, proto.cc.arduino.cli.commands.v1); diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/core_pb.d.ts b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/core_pb.d.ts index 30792fd12..cd50946ed 100644 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/core_pb.d.ts +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/core_pb.d.ts @@ -13,22 +13,18 @@ export class PlatformInstallRequest extends jspb.Message { clearInstance(): void; getInstance(): cc_arduino_cli_commands_v1_common_pb.Instance | undefined; setInstance(value?: cc_arduino_cli_commands_v1_common_pb.Instance): PlatformInstallRequest; - getPlatformPackage(): string; setPlatformPackage(value: string): PlatformInstallRequest; - getArchitecture(): string; setArchitecture(value: string): PlatformInstallRequest; - getVersion(): string; setVersion(value: string): PlatformInstallRequest; - getSkipPostInstall(): boolean; setSkipPostInstall(value: boolean): PlatformInstallRequest; - getNoOverwrite(): boolean; setNoOverwrite(value: boolean): PlatformInstallRequest; - + getSkipPreUninstall(): boolean; + setSkipPreUninstall(value: boolean): PlatformInstallRequest; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): PlatformInstallRequest.AsObject; @@ -48,6 +44,7 @@ export namespace PlatformInstallRequest { version: string, skipPostInstall: boolean, noOverwrite: boolean, + skipPreUninstall: boolean, } } @@ -58,12 +55,17 @@ export class PlatformInstallResponse extends jspb.Message { getProgress(): cc_arduino_cli_commands_v1_common_pb.DownloadProgress | undefined; setProgress(value?: cc_arduino_cli_commands_v1_common_pb.DownloadProgress): PlatformInstallResponse; - hasTaskProgress(): boolean; clearTaskProgress(): void; getTaskProgress(): cc_arduino_cli_commands_v1_common_pb.TaskProgress | undefined; setTaskProgress(value?: cc_arduino_cli_commands_v1_common_pb.TaskProgress): PlatformInstallResponse; + hasResult(): boolean; + clearResult(): void; + getResult(): PlatformInstallResponse.Result | undefined; + setResult(value?: PlatformInstallResponse.Result): PlatformInstallResponse; + + getMessageCase(): PlatformInstallResponse.MessageCase; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): PlatformInstallResponse.AsObject; @@ -79,6 +81,51 @@ export namespace PlatformInstallResponse { export type AsObject = { progress?: cc_arduino_cli_commands_v1_common_pb.DownloadProgress.AsObject, taskProgress?: cc_arduino_cli_commands_v1_common_pb.TaskProgress.AsObject, + result?: PlatformInstallResponse.Result.AsObject, + } + + + export class Result extends jspb.Message { + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Result.AsObject; + static toObject(includeInstance: boolean, msg: Result): Result.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: Result, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Result; + static deserializeBinaryFromReader(message: Result, reader: jspb.BinaryReader): Result; + } + + export namespace Result { + export type AsObject = { + } + } + + + export enum MessageCase { + MESSAGE_NOT_SET = 0, + PROGRESS = 1, + TASK_PROGRESS = 2, + RESULT = 3, + } + +} + +export class PlatformLoadingError extends jspb.Message { + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): PlatformLoadingError.AsObject; + static toObject(includeInstance: boolean, msg: PlatformLoadingError): PlatformLoadingError.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: PlatformLoadingError, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): PlatformLoadingError; + static deserializeBinaryFromReader(message: PlatformLoadingError, reader: jspb.BinaryReader): PlatformLoadingError; +} + +export namespace PlatformLoadingError { + export type AsObject = { } } @@ -88,17 +135,13 @@ export class PlatformDownloadRequest extends jspb.Message { clearInstance(): void; getInstance(): cc_arduino_cli_commands_v1_common_pb.Instance | undefined; setInstance(value?: cc_arduino_cli_commands_v1_common_pb.Instance): PlatformDownloadRequest; - getPlatformPackage(): string; setPlatformPackage(value: string): PlatformDownloadRequest; - getArchitecture(): string; setArchitecture(value: string): PlatformDownloadRequest; - getVersion(): string; setVersion(value: string): PlatformDownloadRequest; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): PlatformDownloadRequest.AsObject; static toObject(includeInstance: boolean, msg: PlatformDownloadRequest): PlatformDownloadRequest.AsObject; @@ -125,6 +168,12 @@ export class PlatformDownloadResponse extends jspb.Message { getProgress(): cc_arduino_cli_commands_v1_common_pb.DownloadProgress | undefined; setProgress(value?: cc_arduino_cli_commands_v1_common_pb.DownloadProgress): PlatformDownloadResponse; + hasResult(): boolean; + clearResult(): void; + getResult(): PlatformDownloadResponse.Result | undefined; + setResult(value?: PlatformDownloadResponse.Result): PlatformDownloadResponse; + + getMessageCase(): PlatformDownloadResponse.MessageCase; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): PlatformDownloadResponse.AsObject; @@ -139,7 +188,34 @@ export class PlatformDownloadResponse extends jspb.Message { export namespace PlatformDownloadResponse { export type AsObject = { progress?: cc_arduino_cli_commands_v1_common_pb.DownloadProgress.AsObject, + result?: PlatformDownloadResponse.Result.AsObject, + } + + + export class Result extends jspb.Message { + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Result.AsObject; + static toObject(includeInstance: boolean, msg: Result): Result.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: Result, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Result; + static deserializeBinaryFromReader(message: Result, reader: jspb.BinaryReader): Result; } + + export namespace Result { + export type AsObject = { + } + } + + + export enum MessageCase { + MESSAGE_NOT_SET = 0, + PROGRESS = 1, + RESULT = 2, + } + } export class PlatformUninstallRequest extends jspb.Message { @@ -148,13 +224,12 @@ export class PlatformUninstallRequest extends jspb.Message { clearInstance(): void; getInstance(): cc_arduino_cli_commands_v1_common_pb.Instance | undefined; setInstance(value?: cc_arduino_cli_commands_v1_common_pb.Instance): PlatformUninstallRequest; - getPlatformPackage(): string; setPlatformPackage(value: string): PlatformUninstallRequest; - getArchitecture(): string; setArchitecture(value: string): PlatformUninstallRequest; - + getSkipPreUninstall(): boolean; + setSkipPreUninstall(value: boolean): PlatformUninstallRequest; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): PlatformUninstallRequest.AsObject; @@ -171,6 +246,7 @@ export namespace PlatformUninstallRequest { instance?: cc_arduino_cli_commands_v1_common_pb.Instance.AsObject, platformPackage: string, architecture: string, + skipPreUninstall: boolean, } } @@ -181,6 +257,12 @@ export class PlatformUninstallResponse extends jspb.Message { getTaskProgress(): cc_arduino_cli_commands_v1_common_pb.TaskProgress | undefined; setTaskProgress(value?: cc_arduino_cli_commands_v1_common_pb.TaskProgress): PlatformUninstallResponse; + hasResult(): boolean; + clearResult(): void; + getResult(): PlatformUninstallResponse.Result | undefined; + setResult(value?: PlatformUninstallResponse.Result): PlatformUninstallResponse; + + getMessageCase(): PlatformUninstallResponse.MessageCase; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): PlatformUninstallResponse.AsObject; @@ -195,7 +277,34 @@ export class PlatformUninstallResponse extends jspb.Message { export namespace PlatformUninstallResponse { export type AsObject = { taskProgress?: cc_arduino_cli_commands_v1_common_pb.TaskProgress.AsObject, + result?: PlatformUninstallResponse.Result.AsObject, } + + + export class Result extends jspb.Message { + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Result.AsObject; + static toObject(includeInstance: boolean, msg: Result): Result.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: Result, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Result; + static deserializeBinaryFromReader(message: Result, reader: jspb.BinaryReader): Result; + } + + export namespace Result { + export type AsObject = { + } + } + + + export enum MessageCase { + MESSAGE_NOT_SET = 0, + TASK_PROGRESS = 1, + RESULT = 2, + } + } export class AlreadyAtLatestVersionError extends jspb.Message { @@ -221,16 +330,14 @@ export class PlatformUpgradeRequest extends jspb.Message { clearInstance(): void; getInstance(): cc_arduino_cli_commands_v1_common_pb.Instance | undefined; setInstance(value?: cc_arduino_cli_commands_v1_common_pb.Instance): PlatformUpgradeRequest; - getPlatformPackage(): string; setPlatformPackage(value: string): PlatformUpgradeRequest; - getArchitecture(): string; setArchitecture(value: string): PlatformUpgradeRequest; - getSkipPostInstall(): boolean; setSkipPostInstall(value: boolean): PlatformUpgradeRequest; - + getSkipPreUninstall(): boolean; + setSkipPreUninstall(value: boolean): PlatformUpgradeRequest; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): PlatformUpgradeRequest.AsObject; @@ -248,6 +355,7 @@ export namespace PlatformUpgradeRequest { platformPackage: string, architecture: string, skipPostInstall: boolean, + skipPreUninstall: boolean, } } @@ -258,12 +366,17 @@ export class PlatformUpgradeResponse extends jspb.Message { getProgress(): cc_arduino_cli_commands_v1_common_pb.DownloadProgress | undefined; setProgress(value?: cc_arduino_cli_commands_v1_common_pb.DownloadProgress): PlatformUpgradeResponse; - hasTaskProgress(): boolean; clearTaskProgress(): void; getTaskProgress(): cc_arduino_cli_commands_v1_common_pb.TaskProgress | undefined; setTaskProgress(value?: cc_arduino_cli_commands_v1_common_pb.TaskProgress): PlatformUpgradeResponse; + hasResult(): boolean; + clearResult(): void; + getResult(): PlatformUpgradeResponse.Result | undefined; + setResult(value?: PlatformUpgradeResponse.Result): PlatformUpgradeResponse; + + getMessageCase(): PlatformUpgradeResponse.MessageCase; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): PlatformUpgradeResponse.AsObject; @@ -279,7 +392,41 @@ export namespace PlatformUpgradeResponse { export type AsObject = { progress?: cc_arduino_cli_commands_v1_common_pb.DownloadProgress.AsObject, taskProgress?: cc_arduino_cli_commands_v1_common_pb.TaskProgress.AsObject, + result?: PlatformUpgradeResponse.Result.AsObject, + } + + + export class Result extends jspb.Message { + + hasPlatform(): boolean; + clearPlatform(): void; + getPlatform(): cc_arduino_cli_commands_v1_common_pb.Platform | undefined; + setPlatform(value?: cc_arduino_cli_commands_v1_common_pb.Platform): Result; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Result.AsObject; + static toObject(includeInstance: boolean, msg: Result): Result.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: Result, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Result; + static deserializeBinaryFromReader(message: Result, reader: jspb.BinaryReader): Result; } + + export namespace Result { + export type AsObject = { + platform?: cc_arduino_cli_commands_v1_common_pb.Platform.AsObject, + } + } + + + export enum MessageCase { + MESSAGE_NOT_SET = 0, + PROGRESS = 1, + TASK_PROGRESS = 2, + RESULT = 3, + } + } export class PlatformSearchRequest extends jspb.Message { @@ -288,13 +435,10 @@ export class PlatformSearchRequest extends jspb.Message { clearInstance(): void; getInstance(): cc_arduino_cli_commands_v1_common_pb.Instance | undefined; setInstance(value?: cc_arduino_cli_commands_v1_common_pb.Instance): PlatformSearchRequest; - getSearchArgs(): string; setSearchArgs(value: string): PlatformSearchRequest; - - getAllVersions(): boolean; - setAllVersions(value: boolean): PlatformSearchRequest; - + getManuallyInstalled(): boolean; + setManuallyInstalled(value: boolean): PlatformSearchRequest; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): PlatformSearchRequest.AsObject; @@ -310,16 +454,15 @@ export namespace PlatformSearchRequest { export type AsObject = { instance?: cc_arduino_cli_commands_v1_common_pb.Instance.AsObject, searchArgs: string, - allVersions: boolean, + manuallyInstalled: boolean, } } export class PlatformSearchResponse extends jspb.Message { clearSearchOutputList(): void; - getSearchOutputList(): Array<cc_arduino_cli_commands_v1_common_pb.Platform>; - setSearchOutputList(value: Array<cc_arduino_cli_commands_v1_common_pb.Platform>): PlatformSearchResponse; - addSearchOutput(value?: cc_arduino_cli_commands_v1_common_pb.Platform, index?: number): cc_arduino_cli_commands_v1_common_pb.Platform; - + getSearchOutputList(): Array<cc_arduino_cli_commands_v1_common_pb.PlatformSummary>; + setSearchOutputList(value: Array<cc_arduino_cli_commands_v1_common_pb.PlatformSummary>): PlatformSearchResponse; + addSearchOutput(value?: cc_arduino_cli_commands_v1_common_pb.PlatformSummary, index?: number): cc_arduino_cli_commands_v1_common_pb.PlatformSummary; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): PlatformSearchResponse.AsObject; @@ -333,61 +476,6 @@ export class PlatformSearchResponse extends jspb.Message { export namespace PlatformSearchResponse { export type AsObject = { - searchOutputList: Array<cc_arduino_cli_commands_v1_common_pb.Platform.AsObject>, - } -} - -export class PlatformListRequest 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): PlatformListRequest; - - getUpdatableOnly(): boolean; - setUpdatableOnly(value: boolean): PlatformListRequest; - - getAll(): boolean; - setAll(value: boolean): PlatformListRequest; - - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): PlatformListRequest.AsObject; - static toObject(includeInstance: boolean, msg: PlatformListRequest): PlatformListRequest.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: PlatformListRequest, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): PlatformListRequest; - static deserializeBinaryFromReader(message: PlatformListRequest, reader: jspb.BinaryReader): PlatformListRequest; -} - -export namespace PlatformListRequest { - export type AsObject = { - instance?: cc_arduino_cli_commands_v1_common_pb.Instance.AsObject, - updatableOnly: boolean, - all: boolean, - } -} - -export class PlatformListResponse extends jspb.Message { - clearInstalledPlatformsList(): void; - getInstalledPlatformsList(): Array<cc_arduino_cli_commands_v1_common_pb.Platform>; - setInstalledPlatformsList(value: Array<cc_arduino_cli_commands_v1_common_pb.Platform>): PlatformListResponse; - addInstalledPlatforms(value?: cc_arduino_cli_commands_v1_common_pb.Platform, index?: number): cc_arduino_cli_commands_v1_common_pb.Platform; - - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): PlatformListResponse.AsObject; - static toObject(includeInstance: boolean, msg: PlatformListResponse): PlatformListResponse.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: PlatformListResponse, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): PlatformListResponse; - static deserializeBinaryFromReader(message: PlatformListResponse, reader: jspb.BinaryReader): PlatformListResponse; -} - -export namespace PlatformListResponse { - export type AsObject = { - installedPlatformsList: Array<cc_arduino_cli_commands_v1_common_pb.Platform.AsObject>, + searchOutputList: Array<cc_arduino_cli_commands_v1_common_pb.PlatformSummary.AsObject>, } } diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/core_pb.js b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/core_pb.js index 093656172..86d02942a 100644 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/core_pb.js +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/core_pb.js @@ -13,23 +13,36 @@ var jspb = require('google-protobuf'); var goog = jspb; -var global = Function('return this')(); +var global = (function() { + if (this) { return this; } + if (typeof window !== 'undefined') { return window; } + if (typeof global !== 'undefined') { return global; } + if (typeof self !== 'undefined') { return self; } + return Function('return this')(); +}.call(null)); var cc_arduino_cli_commands_v1_common_pb = require('../../../../../cc/arduino/cli/commands/v1/common_pb.js'); goog.object.extend(proto, cc_arduino_cli_commands_v1_common_pb); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.AlreadyAtLatestVersionError', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformDownloadRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.MessageCase', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.Result', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformInstallRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformInstallResponse', null, global); -goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformListRequest', null, global); -goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformListResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.MessageCase', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.Result', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformLoadingError', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformSearchRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformSearchResponse', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformUninstallRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.MessageCase', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.Result', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformUpgradeRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.MessageCase', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result', null, global); /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -62,7 +75,7 @@ if (goog.DEBUG && !COMPILED) { * @constructor */ proto.cc.arduino.cli.commands.v1.PlatformInstallResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.oneofGroups_); }; goog.inherits(proto.cc.arduino.cli.commands.v1.PlatformInstallResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { @@ -72,6 +85,48 @@ if (goog.DEBUG && !COMPILED) { */ proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.displayName = 'proto.cc.arduino.cli.commands.v1.PlatformInstallResponse'; } +/** + * 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.PlatformInstallResponse.Result = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.Result, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.Result.displayName = 'proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.Result'; +} +/** + * 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.PlatformLoadingError = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.PlatformLoadingError, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.PlatformLoadingError.displayName = 'proto.cc.arduino.cli.commands.v1.PlatformLoadingError'; +} /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -104,7 +159,7 @@ if (goog.DEBUG && !COMPILED) { * @constructor */ proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.oneofGroups_); }; goog.inherits(proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { @@ -114,6 +169,27 @@ if (goog.DEBUG && !COMPILED) { */ proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.displayName = 'proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse'; } +/** + * 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.PlatformDownloadResponse.Result = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.Result, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.Result.displayName = 'proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.Result'; +} /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -146,7 +222,7 @@ if (goog.DEBUG && !COMPILED) { * @constructor */ proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.oneofGroups_); }; goog.inherits(proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { @@ -166,16 +242,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.cc.arduino.cli.commands.v1.AlreadyAtLatestVersionError = function(opt_data) { +proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.Result = function(opt_data) { jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.cc.arduino.cli.commands.v1.AlreadyAtLatestVersionError, jspb.Message); +goog.inherits(proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.Result, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.cc.arduino.cli.commands.v1.AlreadyAtLatestVersionError.displayName = 'proto.cc.arduino.cli.commands.v1.AlreadyAtLatestVersionError'; + proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.Result.displayName = 'proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.Result'; } /** * Generated by JsPbCodeGenerator. @@ -187,16 +263,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.cc.arduino.cli.commands.v1.PlatformUpgradeRequest = function(opt_data) { +proto.cc.arduino.cli.commands.v1.AlreadyAtLatestVersionError = function(opt_data) { jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.cc.arduino.cli.commands.v1.PlatformUpgradeRequest, jspb.Message); +goog.inherits(proto.cc.arduino.cli.commands.v1.AlreadyAtLatestVersionError, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.cc.arduino.cli.commands.v1.PlatformUpgradeRequest.displayName = 'proto.cc.arduino.cli.commands.v1.PlatformUpgradeRequest'; + proto.cc.arduino.cli.commands.v1.AlreadyAtLatestVersionError.displayName = 'proto.cc.arduino.cli.commands.v1.AlreadyAtLatestVersionError'; } /** * Generated by JsPbCodeGenerator. @@ -208,16 +284,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse = function(opt_data) { +proto.cc.arduino.cli.commands.v1.PlatformUpgradeRequest = function(opt_data) { jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse, jspb.Message); +goog.inherits(proto.cc.arduino.cli.commands.v1.PlatformUpgradeRequest, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.displayName = 'proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse'; + proto.cc.arduino.cli.commands.v1.PlatformUpgradeRequest.displayName = 'proto.cc.arduino.cli.commands.v1.PlatformUpgradeRequest'; } /** * Generated by JsPbCodeGenerator. @@ -229,16 +305,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.cc.arduino.cli.commands.v1.PlatformSearchRequest = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); +proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.oneofGroups_); }; -goog.inherits(proto.cc.arduino.cli.commands.v1.PlatformSearchRequest, jspb.Message); +goog.inherits(proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.cc.arduino.cli.commands.v1.PlatformSearchRequest.displayName = 'proto.cc.arduino.cli.commands.v1.PlatformSearchRequest'; + proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.displayName = 'proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse'; } /** * Generated by JsPbCodeGenerator. @@ -250,16 +326,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.cc.arduino.cli.commands.v1.PlatformSearchResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, proto.cc.arduino.cli.commands.v1.PlatformSearchResponse.repeatedFields_, null); +proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.cc.arduino.cli.commands.v1.PlatformSearchResponse, jspb.Message); +goog.inherits(proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.cc.arduino.cli.commands.v1.PlatformSearchResponse.displayName = 'proto.cc.arduino.cli.commands.v1.PlatformSearchResponse'; + proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result.displayName = 'proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result'; } /** * Generated by JsPbCodeGenerator. @@ -271,16 +347,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.cc.arduino.cli.commands.v1.PlatformListRequest = function(opt_data) { +proto.cc.arduino.cli.commands.v1.PlatformSearchRequest = function(opt_data) { jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.cc.arduino.cli.commands.v1.PlatformListRequest, jspb.Message); +goog.inherits(proto.cc.arduino.cli.commands.v1.PlatformSearchRequest, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.cc.arduino.cli.commands.v1.PlatformListRequest.displayName = 'proto.cc.arduino.cli.commands.v1.PlatformListRequest'; + proto.cc.arduino.cli.commands.v1.PlatformSearchRequest.displayName = 'proto.cc.arduino.cli.commands.v1.PlatformSearchRequest'; } /** * Generated by JsPbCodeGenerator. @@ -292,16 +368,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.cc.arduino.cli.commands.v1.PlatformListResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, proto.cc.arduino.cli.commands.v1.PlatformListResponse.repeatedFields_, null); +proto.cc.arduino.cli.commands.v1.PlatformSearchResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.cc.arduino.cli.commands.v1.PlatformSearchResponse.repeatedFields_, null); }; -goog.inherits(proto.cc.arduino.cli.commands.v1.PlatformListResponse, jspb.Message); +goog.inherits(proto.cc.arduino.cli.commands.v1.PlatformSearchResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.cc.arduino.cli.commands.v1.PlatformListResponse.displayName = 'proto.cc.arduino.cli.commands.v1.PlatformListResponse'; + proto.cc.arduino.cli.commands.v1.PlatformSearchResponse.displayName = 'proto.cc.arduino.cli.commands.v1.PlatformSearchResponse'; } @@ -340,7 +416,8 @@ proto.cc.arduino.cli.commands.v1.PlatformInstallRequest.toObject = function(incl architecture: jspb.Message.getFieldWithDefault(msg, 3, ""), version: jspb.Message.getFieldWithDefault(msg, 4, ""), skipPostInstall: jspb.Message.getBooleanFieldWithDefault(msg, 5, false), - noOverwrite: jspb.Message.getBooleanFieldWithDefault(msg, 6, false) + noOverwrite: jspb.Message.getBooleanFieldWithDefault(msg, 6, false), + skipPreUninstall: jspb.Message.getBooleanFieldWithDefault(msg, 7, false) }; if (includeInstance) { @@ -402,6 +479,10 @@ proto.cc.arduino.cli.commands.v1.PlatformInstallRequest.deserializeBinaryFromRea var value = /** @type {boolean} */ (reader.readBool()); msg.setNoOverwrite(value); break; + case 7: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setSkipPreUninstall(value); + break; default: reader.skipField(); break; @@ -474,6 +555,13 @@ proto.cc.arduino.cli.commands.v1.PlatformInstallRequest.serializeBinaryToWriter f ); } + f = message.getSkipPreUninstall(); + if (f) { + writer.writeBool( + 7, + f + ); + } }; @@ -604,6 +692,51 @@ proto.cc.arduino.cli.commands.v1.PlatformInstallRequest.prototype.setNoOverwrite }; +/** + * optional bool skip_pre_uninstall = 7; + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.PlatformInstallRequest.prototype.getSkipPreUninstall = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 7, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.PlatformInstallRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.PlatformInstallRequest.prototype.setSkipPreUninstall = function(value) { + return jspb.Message.setProto3BooleanField(this, 7, value); +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.oneofGroups_ = [[1,2,3]]; + +/** + * @enum {number} + */ +proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.MessageCase = { + MESSAGE_NOT_SET: 0, + PROGRESS: 1, + TASK_PROGRESS: 2, + RESULT: 3 +}; + +/** + * @return {proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.MessageCase} + */ +proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.prototype.getMessageCase = function() { + return /** @type {proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.MessageCase} */(jspb.Message.computeOneofCase(this, proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.oneofGroups_[0])); +}; @@ -637,7 +770,8 @@ proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.prototype.toObject = fu proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.toObject = function(includeInstance, msg) { var f, obj = { progress: (f = msg.getProgress()) && cc_arduino_cli_commands_v1_common_pb.DownloadProgress.toObject(includeInstance, f), - taskProgress: (f = msg.getTaskProgress()) && cc_arduino_cli_commands_v1_common_pb.TaskProgress.toObject(includeInstance, f) + taskProgress: (f = msg.getTaskProgress()) && cc_arduino_cli_commands_v1_common_pb.TaskProgress.toObject(includeInstance, f), + result: (f = msg.getResult()) && proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.Result.toObject(includeInstance, f) }; if (includeInstance) { @@ -684,6 +818,11 @@ proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.deserializeBinaryFromRe reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.TaskProgress.deserializeBinaryFromReader); msg.setTaskProgress(value); break; + case 3: + var value = new proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.Result; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.Result.deserializeBinaryFromReader); + msg.setResult(value); + break; default: reader.skipField(); break; @@ -729,6 +868,115 @@ proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.serializeBinaryToWriter cc_arduino_cli_commands_v1_common_pb.TaskProgress.serializeBinaryToWriter ); } + f = message.getResult(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.Result.serializeBinaryToWriter + ); + } +}; + + + + + +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.PlatformInstallResponse.Result.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.Result.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.PlatformInstallResponse.Result} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.Result.toObject = function(includeInstance, msg) { + var f, obj = { + + }; + + 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.PlatformInstallResponse.Result} + */ +proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.Result.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.Result; + return proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.Result.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.PlatformInstallResponse.Result} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.Result} + */ +proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.Result.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.Result.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.Result.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.PlatformInstallResponse.Result} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.Result.serializeBinaryToWriter = function(message, writer) { + var f = undefined; }; @@ -747,7 +995,7 @@ proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.prototype.getProgress = * @return {!proto.cc.arduino.cli.commands.v1.PlatformInstallResponse} returns this */ proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.prototype.setProgress = function(value) { - return jspb.Message.setWrapperField(this, 1, value); + return jspb.Message.setOneofWrapperField(this, 1, proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.oneofGroups_[0], value); }; @@ -784,7 +1032,7 @@ proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.prototype.getTaskProgre * @return {!proto.cc.arduino.cli.commands.v1.PlatformInstallResponse} returns this */ proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.prototype.setTaskProgress = function(value) { - return jspb.Message.setWrapperField(this, 2, value); + return jspb.Message.setOneofWrapperField(this, 2, proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.oneofGroups_[0], value); }; @@ -806,6 +1054,43 @@ proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.prototype.hasTaskProgre }; +/** + * optional Result result = 3; + * @return {?proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.Result} + */ +proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.prototype.getResult = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.Result} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.Result, 3)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.Result|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.PlatformInstallResponse} returns this +*/ +proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.prototype.setResult = function(value) { + return jspb.Message.setOneofWrapperField(this, 3, proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.PlatformInstallResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.prototype.clearResult = function() { + return this.setResult(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.prototype.hasResult = function() { + return jspb.Message.getField(this, 3) != null; +}; + + @@ -822,8 +1107,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.PlatformDownloadRequest.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.PlatformDownloadRequest.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.PlatformLoadingError.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.PlatformLoadingError.toObject(opt_includeInstance, this); }; @@ -832,16 +1117,13 @@ proto.cc.arduino.cli.commands.v1.PlatformDownloadRequest.prototype.toObject = fu * @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.PlatformDownloadRequest} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.PlatformLoadingError} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.PlatformDownloadRequest.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.PlatformLoadingError.toObject = function(includeInstance, msg) { var f, obj = { - instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f), - platformPackage: jspb.Message.getFieldWithDefault(msg, 2, ""), - architecture: jspb.Message.getFieldWithDefault(msg, 3, ""), - version: jspb.Message.getFieldWithDefault(msg, 4, "") + }; if (includeInstance) { @@ -855,12 +1137,116 @@ proto.cc.arduino.cli.commands.v1.PlatformDownloadRequest.toObject = function(inc /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.PlatformDownloadRequest} + * @return {!proto.cc.arduino.cli.commands.v1.PlatformLoadingError} */ -proto.cc.arduino.cli.commands.v1.PlatformDownloadRequest.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.PlatformLoadingError.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.PlatformDownloadRequest; - return proto.cc.arduino.cli.commands.v1.PlatformDownloadRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.PlatformLoadingError; + return proto.cc.arduino.cli.commands.v1.PlatformLoadingError.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.PlatformLoadingError} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.PlatformLoadingError} + */ +proto.cc.arduino.cli.commands.v1.PlatformLoadingError.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.PlatformLoadingError.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.PlatformLoadingError.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.PlatformLoadingError} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.PlatformLoadingError.serializeBinaryToWriter = function(message, writer) { + var f = undefined; +}; + + + + + +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.PlatformDownloadRequest.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.PlatformDownloadRequest.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.PlatformDownloadRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.PlatformDownloadRequest.toObject = function(includeInstance, msg) { + var f, obj = { + instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f), + platformPackage: jspb.Message.getFieldWithDefault(msg, 2, ""), + architecture: jspb.Message.getFieldWithDefault(msg, 3, ""), + version: jspb.Message.getFieldWithDefault(msg, 4, "") + }; + + 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.PlatformDownloadRequest} + */ +proto.cc.arduino.cli.commands.v1.PlatformDownloadRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.PlatformDownloadRequest; + return proto.cc.arduino.cli.commands.v1.PlatformDownloadRequest.deserializeBinaryFromReader(msg, reader); }; @@ -1048,6 +1434,32 @@ proto.cc.arduino.cli.commands.v1.PlatformDownloadRequest.prototype.setVersion = +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.MessageCase = { + MESSAGE_NOT_SET: 0, + PROGRESS: 1, + RESULT: 2 +}; + +/** + * @return {proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.MessageCase} + */ +proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.prototype.getMessageCase = function() { + return /** @type {proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.MessageCase} */(jspb.Message.computeOneofCase(this, proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.oneofGroups_[0])); +}; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -1079,7 +1491,8 @@ proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.prototype.toObject = f */ proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.toObject = function(includeInstance, msg) { var f, obj = { - progress: (f = msg.getProgress()) && cc_arduino_cli_commands_v1_common_pb.DownloadProgress.toObject(includeInstance, f) + progress: (f = msg.getProgress()) && cc_arduino_cli_commands_v1_common_pb.DownloadProgress.toObject(includeInstance, f), + result: (f = msg.getResult()) && proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.Result.toObject(includeInstance, f) }; if (includeInstance) { @@ -1121,6 +1534,11 @@ proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.deserializeBinaryFromR reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.DownloadProgress.deserializeBinaryFromReader); msg.setProgress(value); break; + case 2: + var value = new proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.Result; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.Result.deserializeBinaryFromReader); + msg.setResult(value); + break; default: reader.skipField(); break; @@ -1158,6 +1576,115 @@ proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.serializeBinaryToWrite cc_arduino_cli_commands_v1_common_pb.DownloadProgress.serializeBinaryToWriter ); } + f = message.getResult(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.Result.serializeBinaryToWriter + ); + } +}; + + + + + +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.PlatformDownloadResponse.Result.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.Result.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.PlatformDownloadResponse.Result} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.Result.toObject = function(includeInstance, msg) { + var f, obj = { + + }; + + 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.PlatformDownloadResponse.Result} + */ +proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.Result.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.Result; + return proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.Result.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.PlatformDownloadResponse.Result} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.Result} + */ +proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.Result.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.Result.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.Result.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.PlatformDownloadResponse.Result} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.Result.serializeBinaryToWriter = function(message, writer) { + var f = undefined; }; @@ -1176,7 +1703,7 @@ proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.prototype.getProgress * @return {!proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse} returns this */ proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.prototype.setProgress = function(value) { - return jspb.Message.setWrapperField(this, 1, value); + return jspb.Message.setOneofWrapperField(this, 1, proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.oneofGroups_[0], value); }; @@ -1198,6 +1725,43 @@ proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.prototype.hasProgress }; +/** + * optional Result result = 2; + * @return {?proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.Result} + */ +proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.prototype.getResult = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.Result} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.Result, 2)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.Result|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse} returns this +*/ +proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.prototype.setResult = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.prototype.clearResult = function() { + return this.setResult(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.prototype.hasResult = function() { + return jspb.Message.getField(this, 2) != null; +}; + + @@ -1232,7 +1796,8 @@ proto.cc.arduino.cli.commands.v1.PlatformUninstallRequest.toObject = function(in var f, obj = { instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f), platformPackage: jspb.Message.getFieldWithDefault(msg, 2, ""), - architecture: jspb.Message.getFieldWithDefault(msg, 3, "") + architecture: jspb.Message.getFieldWithDefault(msg, 3, ""), + skipPreUninstall: jspb.Message.getBooleanFieldWithDefault(msg, 4, false) }; if (includeInstance) { @@ -1282,6 +1847,10 @@ proto.cc.arduino.cli.commands.v1.PlatformUninstallRequest.deserializeBinaryFromR var value = /** @type {string} */ (reader.readString()); msg.setArchitecture(value); break; + case 4: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setSkipPreUninstall(value); + break; default: reader.skipField(); break; @@ -1333,6 +1902,13 @@ proto.cc.arduino.cli.commands.v1.PlatformUninstallRequest.serializeBinaryToWrite f ); } + f = message.getSkipPreUninstall(); + if (f) { + writer.writeBool( + 4, + f + ); + } }; @@ -1409,12 +1985,56 @@ proto.cc.arduino.cli.commands.v1.PlatformUninstallRequest.prototype.setArchitect }; +/** + * optional bool skip_pre_uninstall = 4; + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.PlatformUninstallRequest.prototype.getSkipPreUninstall = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 4, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.PlatformUninstallRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.PlatformUninstallRequest.prototype.setSkipPreUninstall = function(value) { + return jspb.Message.setProto3BooleanField(this, 4, value); +}; -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.MessageCase = { + MESSAGE_NOT_SET: 0, + TASK_PROGRESS: 1, + RESULT: 2 +}; + +/** + * @return {proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.MessageCase} + */ +proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.prototype.getMessageCase = function() { + return /** @type {proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.MessageCase} */(jspb.Message.computeOneofCase(this, proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.oneofGroups_[0])); +}; + + + +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. @@ -1441,7 +2061,8 @@ proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.prototype.toObject = */ proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.toObject = function(includeInstance, msg) { var f, obj = { - taskProgress: (f = msg.getTaskProgress()) && cc_arduino_cli_commands_v1_common_pb.TaskProgress.toObject(includeInstance, f) + taskProgress: (f = msg.getTaskProgress()) && cc_arduino_cli_commands_v1_common_pb.TaskProgress.toObject(includeInstance, f), + result: (f = msg.getResult()) && proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.Result.toObject(includeInstance, f) }; if (includeInstance) { @@ -1483,6 +2104,11 @@ proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.deserializeBinaryFrom reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.TaskProgress.deserializeBinaryFromReader); msg.setTaskProgress(value); break; + case 2: + var value = new proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.Result; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.Result.deserializeBinaryFromReader); + msg.setResult(value); + break; default: reader.skipField(); break; @@ -1520,6 +2146,115 @@ proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.serializeBinaryToWrit cc_arduino_cli_commands_v1_common_pb.TaskProgress.serializeBinaryToWriter ); } + f = message.getResult(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.Result.serializeBinaryToWriter + ); + } +}; + + + + + +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.PlatformUninstallResponse.Result.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.Result.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.PlatformUninstallResponse.Result} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.Result.toObject = function(includeInstance, msg) { + var f, obj = { + + }; + + 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.PlatformUninstallResponse.Result} + */ +proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.Result.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.Result; + return proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.Result.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.PlatformUninstallResponse.Result} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.Result} + */ +proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.Result.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.Result.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.Result.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.PlatformUninstallResponse.Result} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.Result.serializeBinaryToWriter = function(message, writer) { + var f = undefined; }; @@ -1538,7 +2273,7 @@ proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.prototype.getTaskProg * @return {!proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse} returns this */ proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.prototype.setTaskProgress = function(value) { - return jspb.Message.setWrapperField(this, 1, value); + return jspb.Message.setOneofWrapperField(this, 1, proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.oneofGroups_[0], value); }; @@ -1560,6 +2295,43 @@ proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.prototype.hasTaskProg }; +/** + * optional Result result = 2; + * @return {?proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.Result} + */ +proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.prototype.getResult = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.Result} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.Result, 2)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.Result|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse} returns this +*/ +proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.prototype.setResult = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.prototype.clearResult = function() { + return this.setResult(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.prototype.hasResult = function() { + return jspb.Message.getField(this, 2) != null; +}; + + @@ -1696,7 +2468,8 @@ proto.cc.arduino.cli.commands.v1.PlatformUpgradeRequest.toObject = function(incl instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f), platformPackage: jspb.Message.getFieldWithDefault(msg, 2, ""), architecture: jspb.Message.getFieldWithDefault(msg, 3, ""), - skipPostInstall: jspb.Message.getBooleanFieldWithDefault(msg, 4, false) + skipPostInstall: jspb.Message.getBooleanFieldWithDefault(msg, 4, false), + skipPreUninstall: jspb.Message.getBooleanFieldWithDefault(msg, 5, false) }; if (includeInstance) { @@ -1750,6 +2523,10 @@ proto.cc.arduino.cli.commands.v1.PlatformUpgradeRequest.deserializeBinaryFromRea var value = /** @type {boolean} */ (reader.readBool()); msg.setSkipPostInstall(value); break; + case 5: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setSkipPreUninstall(value); + break; default: reader.skipField(); break; @@ -1808,6 +2585,13 @@ proto.cc.arduino.cli.commands.v1.PlatformUpgradeRequest.serializeBinaryToWriter f ); } + f = message.getSkipPreUninstall(); + if (f) { + writer.writeBool( + 5, + f + ); + } }; @@ -1902,6 +2686,51 @@ proto.cc.arduino.cli.commands.v1.PlatformUpgradeRequest.prototype.setSkipPostIns }; +/** + * optional bool skip_pre_uninstall = 5; + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.PlatformUpgradeRequest.prototype.getSkipPreUninstall = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 5, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.PlatformUpgradeRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.PlatformUpgradeRequest.prototype.setSkipPreUninstall = function(value) { + return jspb.Message.setProto3BooleanField(this, 5, value); +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.oneofGroups_ = [[1,2,3]]; + +/** + * @enum {number} + */ +proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.MessageCase = { + MESSAGE_NOT_SET: 0, + PROGRESS: 1, + TASK_PROGRESS: 2, + RESULT: 3 +}; + +/** + * @return {proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.MessageCase} + */ +proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.prototype.getMessageCase = function() { + return /** @type {proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.MessageCase} */(jspb.Message.computeOneofCase(this, proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.oneofGroups_[0])); +}; @@ -1935,7 +2764,8 @@ proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.prototype.toObject = fu proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.toObject = function(includeInstance, msg) { var f, obj = { progress: (f = msg.getProgress()) && cc_arduino_cli_commands_v1_common_pb.DownloadProgress.toObject(includeInstance, f), - taskProgress: (f = msg.getTaskProgress()) && cc_arduino_cli_commands_v1_common_pb.TaskProgress.toObject(includeInstance, f) + taskProgress: (f = msg.getTaskProgress()) && cc_arduino_cli_commands_v1_common_pb.TaskProgress.toObject(includeInstance, f), + result: (f = msg.getResult()) && proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result.toObject(includeInstance, f) }; if (includeInstance) { @@ -1982,6 +2812,11 @@ proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.deserializeBinaryFromRe reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.TaskProgress.deserializeBinaryFromReader); msg.setTaskProgress(value); break; + case 3: + var value = new proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result.deserializeBinaryFromReader); + msg.setResult(value); + break; default: reader.skipField(); break; @@ -2027,80 +2862,14 @@ proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.serializeBinaryToWriter cc_arduino_cli_commands_v1_common_pb.TaskProgress.serializeBinaryToWriter ); } -}; - - -/** - * optional DownloadProgress progress = 1; - * @return {?proto.cc.arduino.cli.commands.v1.DownloadProgress} - */ -proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.prototype.getProgress = function() { - return /** @type{?proto.cc.arduino.cli.commands.v1.DownloadProgress} */ ( - jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.DownloadProgress, 1)); -}; - - -/** - * @param {?proto.cc.arduino.cli.commands.v1.DownloadProgress|undefined} value - * @return {!proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse} returns this -*/ -proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.prototype.setProgress = function(value) { - return jspb.Message.setWrapperField(this, 1, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse} returns this - */ -proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.prototype.clearProgress = function() { - return this.setProgress(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.prototype.hasProgress = function() { - return jspb.Message.getField(this, 1) != null; -}; - - -/** - * optional TaskProgress task_progress = 2; - * @return {?proto.cc.arduino.cli.commands.v1.TaskProgress} - */ -proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.prototype.getTaskProgress = function() { - return /** @type{?proto.cc.arduino.cli.commands.v1.TaskProgress} */ ( - jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.TaskProgress, 2)); -}; - - -/** - * @param {?proto.cc.arduino.cli.commands.v1.TaskProgress|undefined} value - * @return {!proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse} returns this -*/ -proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.prototype.setTaskProgress = function(value) { - return jspb.Message.setWrapperField(this, 2, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse} returns this - */ -proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.prototype.clearTaskProgress = function() { - return this.setTaskProgress(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.prototype.hasTaskProgress = function() { - return jspb.Message.getField(this, 2) != null; + f = message.getResult(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result.serializeBinaryToWriter + ); + } }; @@ -2120,8 +2889,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.PlatformSearchRequest.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.PlatformSearchRequest.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result.toObject(opt_includeInstance, this); }; @@ -2130,15 +2899,13 @@ proto.cc.arduino.cli.commands.v1.PlatformSearchRequest.prototype.toObject = func * @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.PlatformSearchRequest} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.PlatformSearchRequest.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result.toObject = function(includeInstance, msg) { var f, obj = { - instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f), - searchArgs: jspb.Message.getFieldWithDefault(msg, 2, ""), - allVersions: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) + platform: (f = msg.getPlatform()) && cc_arduino_cli_commands_v1_common_pb.Platform.toObject(includeInstance, f) }; if (includeInstance) { @@ -2152,23 +2919,23 @@ proto.cc.arduino.cli.commands.v1.PlatformSearchRequest.toObject = function(inclu /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.PlatformSearchRequest} + * @return {!proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result} */ -proto.cc.arduino.cli.commands.v1.PlatformSearchRequest.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.PlatformSearchRequest; - return proto.cc.arduino.cli.commands.v1.PlatformSearchRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result; + return proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result.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.PlatformSearchRequest} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.PlatformSearchRequest} + * @return {!proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result} */ -proto.cc.arduino.cli.commands.v1.PlatformSearchRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -2176,17 +2943,9 @@ proto.cc.arduino.cli.commands.v1.PlatformSearchRequest.deserializeBinaryFromRead 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 = /** @type {string} */ (reader.readString()); - msg.setSearchArgs(value); - break; - case 3: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setAllVersions(value); + var value = new cc_arduino_cli_commands_v1_common_pb.Platform; + reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.Platform.deserializeBinaryFromReader); + msg.setPlatform(value); break; default: reader.skipField(); @@ -2201,9 +2960,9 @@ proto.cc.arduino.cli.commands.v1.PlatformSearchRequest.deserializeBinaryFromRead * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.PlatformSearchRequest.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.PlatformSearchRequest.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -2211,62 +2970,48 @@ proto.cc.arduino.cli.commands.v1.PlatformSearchRequest.prototype.serializeBinary /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.PlatformSearchRequest} message + * @param {!proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.PlatformSearchRequest.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getInstance(); + f = message.getPlatform(); if (f != null) { writer.writeMessage( 1, f, - cc_arduino_cli_commands_v1_common_pb.Instance.serializeBinaryToWriter - ); - } - f = message.getSearchArgs(); - if (f.length > 0) { - writer.writeString( - 2, - f - ); - } - f = message.getAllVersions(); - if (f) { - writer.writeBool( - 3, - f + cc_arduino_cli_commands_v1_common_pb.Platform.serializeBinaryToWriter ); } }; /** - * optional Instance instance = 1; - * @return {?proto.cc.arduino.cli.commands.v1.Instance} + * optional Platform platform = 1; + * @return {?proto.cc.arduino.cli.commands.v1.Platform} */ -proto.cc.arduino.cli.commands.v1.PlatformSearchRequest.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)); +proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result.prototype.getPlatform = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.Platform} */ ( + jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.Platform, 1)); }; /** - * @param {?proto.cc.arduino.cli.commands.v1.Instance|undefined} value - * @return {!proto.cc.arduino.cli.commands.v1.PlatformSearchRequest} returns this + * @param {?proto.cc.arduino.cli.commands.v1.Platform|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result} returns this */ -proto.cc.arduino.cli.commands.v1.PlatformSearchRequest.prototype.setInstance = function(value) { +proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result.prototype.setPlatform = function(value) { return jspb.Message.setWrapperField(this, 1, value); }; /** * Clears the message field making it undefined. - * @return {!proto.cc.arduino.cli.commands.v1.PlatformSearchRequest} returns this + * @return {!proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result} returns this */ -proto.cc.arduino.cli.commands.v1.PlatformSearchRequest.prototype.clearInstance = function() { - return this.setInstance(undefined); +proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result.prototype.clearPlatform = function() { + return this.setPlatform(undefined); }; @@ -2274,204 +3019,119 @@ proto.cc.arduino.cli.commands.v1.PlatformSearchRequest.prototype.clearInstance = * Returns whether this field is set. * @return {boolean} */ -proto.cc.arduino.cli.commands.v1.PlatformSearchRequest.prototype.hasInstance = function() { +proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result.prototype.hasPlatform = function() { return jspb.Message.getField(this, 1) != null; }; /** - * optional string search_args = 2; - * @return {string} - */ -proto.cc.arduino.cli.commands.v1.PlatformSearchRequest.prototype.getSearchArgs = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); -}; - - -/** - * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.PlatformSearchRequest} returns this - */ -proto.cc.arduino.cli.commands.v1.PlatformSearchRequest.prototype.setSearchArgs = function(value) { - return jspb.Message.setProto3StringField(this, 2, value); -}; - - -/** - * optional bool all_versions = 3; - * @return {boolean} + * optional DownloadProgress progress = 1; + * @return {?proto.cc.arduino.cli.commands.v1.DownloadProgress} */ -proto.cc.arduino.cli.commands.v1.PlatformSearchRequest.prototype.getAllVersions = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); +proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.prototype.getProgress = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.DownloadProgress} */ ( + jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.DownloadProgress, 1)); }; /** - * @param {boolean} value - * @return {!proto.cc.arduino.cli.commands.v1.PlatformSearchRequest} returns this - */ -proto.cc.arduino.cli.commands.v1.PlatformSearchRequest.prototype.setAllVersions = function(value) { - return jspb.Message.setProto3BooleanField(this, 3, value); + * @param {?proto.cc.arduino.cli.commands.v1.DownloadProgress|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse} returns this +*/ +proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.prototype.setProgress = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.oneofGroups_[0], value); }; - -/** - * List of repeated fields within this message type. - * @private {!Array<number>} - * @const - */ -proto.cc.arduino.cli.commands.v1.PlatformSearchResponse.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} + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse} returns this */ -proto.cc.arduino.cli.commands.v1.PlatformSearchResponse.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.PlatformSearchResponse.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.prototype.clearProgress = function() { + return this.setProgress(undefined); }; /** - * 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.PlatformSearchResponse} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages + * Returns whether this field is set. + * @return {boolean} */ -proto.cc.arduino.cli.commands.v1.PlatformSearchResponse.toObject = function(includeInstance, msg) { - var f, obj = { - searchOutputList: jspb.Message.toObjectList(msg.getSearchOutputList(), - cc_arduino_cli_commands_v1_common_pb.Platform.toObject, includeInstance) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; +proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.prototype.hasProgress = function() { + return jspb.Message.getField(this, 1) != null; }; -} /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.PlatformSearchResponse} + * optional TaskProgress task_progress = 2; + * @return {?proto.cc.arduino.cli.commands.v1.TaskProgress} */ -proto.cc.arduino.cli.commands.v1.PlatformSearchResponse.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.PlatformSearchResponse; - return proto.cc.arduino.cli.commands.v1.PlatformSearchResponse.deserializeBinaryFromReader(msg, reader); +proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.prototype.getTaskProgress = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.TaskProgress} */ ( + jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.TaskProgress, 2)); }; /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.cc.arduino.cli.commands.v1.PlatformSearchResponse} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.PlatformSearchResponse} - */ -proto.cc.arduino.cli.commands.v1.PlatformSearchResponse.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.Platform; - reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.Platform.deserializeBinaryFromReader); - msg.addSearchOutput(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; + * @param {?proto.cc.arduino.cli.commands.v1.TaskProgress|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse} returns this +*/ +proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.prototype.setTaskProgress = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.oneofGroups_[0], value); }; /** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse} returns this */ -proto.cc.arduino.cli.commands.v1.PlatformSearchResponse.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.PlatformSearchResponse.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); +proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.prototype.clearTaskProgress = function() { + return this.setTaskProgress(undefined); }; /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.PlatformSearchResponse} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * Returns whether this field is set. + * @return {boolean} */ -proto.cc.arduino.cli.commands.v1.PlatformSearchResponse.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getSearchOutputList(); - if (f.length > 0) { - writer.writeRepeatedMessage( - 1, - f, - cc_arduino_cli_commands_v1_common_pb.Platform.serializeBinaryToWriter - ); - } +proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.prototype.hasTaskProgress = function() { + return jspb.Message.getField(this, 2) != null; }; /** - * repeated Platform search_output = 1; - * @return {!Array<!proto.cc.arduino.cli.commands.v1.Platform>} + * optional Result result = 3; + * @return {?proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result} */ -proto.cc.arduino.cli.commands.v1.PlatformSearchResponse.prototype.getSearchOutputList = function() { - return /** @type{!Array<!proto.cc.arduino.cli.commands.v1.Platform>} */ ( - jspb.Message.getRepeatedWrapperField(this, cc_arduino_cli_commands_v1_common_pb.Platform, 1)); +proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.prototype.getResult = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result, 3)); }; /** - * @param {!Array<!proto.cc.arduino.cli.commands.v1.Platform>} value - * @return {!proto.cc.arduino.cli.commands.v1.PlatformSearchResponse} returns this + * @param {?proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse} returns this */ -proto.cc.arduino.cli.commands.v1.PlatformSearchResponse.prototype.setSearchOutputList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 1, value); +proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.prototype.setResult = function(value) { + return jspb.Message.setOneofWrapperField(this, 3, proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.oneofGroups_[0], value); }; /** - * @param {!proto.cc.arduino.cli.commands.v1.Platform=} opt_value - * @param {number=} opt_index - * @return {!proto.cc.arduino.cli.commands.v1.Platform} + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse} returns this */ -proto.cc.arduino.cli.commands.v1.PlatformSearchResponse.prototype.addSearchOutput = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.cc.arduino.cli.commands.v1.Platform, opt_index); +proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.prototype.clearResult = function() { + return this.setResult(undefined); }; /** - * Clears the list making it empty but non-null. - * @return {!proto.cc.arduino.cli.commands.v1.PlatformSearchResponse} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.cc.arduino.cli.commands.v1.PlatformSearchResponse.prototype.clearSearchOutputList = function() { - return this.setSearchOutputList([]); +proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.prototype.hasResult = function() { + return jspb.Message.getField(this, 3) != null; }; @@ -2491,8 +3151,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.PlatformListRequest.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.PlatformListRequest.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.PlatformSearchRequest.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.PlatformSearchRequest.toObject(opt_includeInstance, this); }; @@ -2501,15 +3161,15 @@ proto.cc.arduino.cli.commands.v1.PlatformListRequest.prototype.toObject = functi * @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.PlatformListRequest} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.PlatformSearchRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.PlatformListRequest.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.PlatformSearchRequest.toObject = function(includeInstance, msg) { var f, obj = { instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f), - updatableOnly: jspb.Message.getBooleanFieldWithDefault(msg, 2, false), - all: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) + searchArgs: jspb.Message.getFieldWithDefault(msg, 2, ""), + manuallyInstalled: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) }; if (includeInstance) { @@ -2523,23 +3183,23 @@ proto.cc.arduino.cli.commands.v1.PlatformListRequest.toObject = function(include /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.PlatformListRequest} + * @return {!proto.cc.arduino.cli.commands.v1.PlatformSearchRequest} */ -proto.cc.arduino.cli.commands.v1.PlatformListRequest.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.PlatformSearchRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.PlatformListRequest; - return proto.cc.arduino.cli.commands.v1.PlatformListRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.PlatformSearchRequest; + return proto.cc.arduino.cli.commands.v1.PlatformSearchRequest.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.PlatformListRequest} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.PlatformSearchRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.PlatformListRequest} + * @return {!proto.cc.arduino.cli.commands.v1.PlatformSearchRequest} */ -proto.cc.arduino.cli.commands.v1.PlatformListRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.PlatformSearchRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -2552,12 +3212,12 @@ proto.cc.arduino.cli.commands.v1.PlatformListRequest.deserializeBinaryFromReader msg.setInstance(value); break; case 2: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setUpdatableOnly(value); + var value = /** @type {string} */ (reader.readString()); + msg.setSearchArgs(value); break; case 3: var value = /** @type {boolean} */ (reader.readBool()); - msg.setAll(value); + msg.setManuallyInstalled(value); break; default: reader.skipField(); @@ -2572,9 +3232,9 @@ proto.cc.arduino.cli.commands.v1.PlatformListRequest.deserializeBinaryFromReader * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.PlatformListRequest.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.PlatformSearchRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.PlatformListRequest.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.PlatformSearchRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -2582,11 +3242,11 @@ proto.cc.arduino.cli.commands.v1.PlatformListRequest.prototype.serializeBinary = /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.PlatformListRequest} message + * @param {!proto.cc.arduino.cli.commands.v1.PlatformSearchRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.PlatformListRequest.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.PlatformSearchRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getInstance(); if (f != null) { @@ -2596,14 +3256,14 @@ proto.cc.arduino.cli.commands.v1.PlatformListRequest.serializeBinaryToWriter = f cc_arduino_cli_commands_v1_common_pb.Instance.serializeBinaryToWriter ); } - f = message.getUpdatableOnly(); - if (f) { - writer.writeBool( + f = message.getSearchArgs(); + if (f.length > 0) { + writer.writeString( 2, f ); } - f = message.getAll(); + f = message.getManuallyInstalled(); if (f) { writer.writeBool( 3, @@ -2617,7 +3277,7 @@ proto.cc.arduino.cli.commands.v1.PlatformListRequest.serializeBinaryToWriter = f * optional Instance instance = 1; * @return {?proto.cc.arduino.cli.commands.v1.Instance} */ -proto.cc.arduino.cli.commands.v1.PlatformListRequest.prototype.getInstance = function() { +proto.cc.arduino.cli.commands.v1.PlatformSearchRequest.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)); }; @@ -2625,18 +3285,18 @@ proto.cc.arduino.cli.commands.v1.PlatformListRequest.prototype.getInstance = fun /** * @param {?proto.cc.arduino.cli.commands.v1.Instance|undefined} value - * @return {!proto.cc.arduino.cli.commands.v1.PlatformListRequest} returns this + * @return {!proto.cc.arduino.cli.commands.v1.PlatformSearchRequest} returns this */ -proto.cc.arduino.cli.commands.v1.PlatformListRequest.prototype.setInstance = function(value) { +proto.cc.arduino.cli.commands.v1.PlatformSearchRequest.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.PlatformListRequest} returns this + * @return {!proto.cc.arduino.cli.commands.v1.PlatformSearchRequest} returns this */ -proto.cc.arduino.cli.commands.v1.PlatformListRequest.prototype.clearInstance = function() { +proto.cc.arduino.cli.commands.v1.PlatformSearchRequest.prototype.clearInstance = function() { return this.setInstance(undefined); }; @@ -2645,43 +3305,43 @@ proto.cc.arduino.cli.commands.v1.PlatformListRequest.prototype.clearInstance = f * Returns whether this field is set. * @return {boolean} */ -proto.cc.arduino.cli.commands.v1.PlatformListRequest.prototype.hasInstance = function() { +proto.cc.arduino.cli.commands.v1.PlatformSearchRequest.prototype.hasInstance = function() { return jspb.Message.getField(this, 1) != null; }; /** - * optional bool updatable_only = 2; - * @return {boolean} + * optional string search_args = 2; + * @return {string} */ -proto.cc.arduino.cli.commands.v1.PlatformListRequest.prototype.getUpdatableOnly = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +proto.cc.arduino.cli.commands.v1.PlatformSearchRequest.prototype.getSearchArgs = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); }; /** - * @param {boolean} value - * @return {!proto.cc.arduino.cli.commands.v1.PlatformListRequest} returns this + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.PlatformSearchRequest} returns this */ -proto.cc.arduino.cli.commands.v1.PlatformListRequest.prototype.setUpdatableOnly = function(value) { - return jspb.Message.setProto3BooleanField(this, 2, value); +proto.cc.arduino.cli.commands.v1.PlatformSearchRequest.prototype.setSearchArgs = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); }; /** - * optional bool all = 3; + * optional bool manually_installed = 3; * @return {boolean} */ -proto.cc.arduino.cli.commands.v1.PlatformListRequest.prototype.getAll = function() { +proto.cc.arduino.cli.commands.v1.PlatformSearchRequest.prototype.getManuallyInstalled = function() { return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); }; /** * @param {boolean} value - * @return {!proto.cc.arduino.cli.commands.v1.PlatformListRequest} returns this + * @return {!proto.cc.arduino.cli.commands.v1.PlatformSearchRequest} returns this */ -proto.cc.arduino.cli.commands.v1.PlatformListRequest.prototype.setAll = function(value) { +proto.cc.arduino.cli.commands.v1.PlatformSearchRequest.prototype.setManuallyInstalled = function(value) { return jspb.Message.setProto3BooleanField(this, 3, value); }; @@ -2692,7 +3352,7 @@ proto.cc.arduino.cli.commands.v1.PlatformListRequest.prototype.setAll = function * @private {!Array<number>} * @const */ -proto.cc.arduino.cli.commands.v1.PlatformListResponse.repeatedFields_ = [1]; +proto.cc.arduino.cli.commands.v1.PlatformSearchResponse.repeatedFields_ = [1]; @@ -2709,8 +3369,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.PlatformListResponse.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.PlatformListResponse.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.PlatformSearchResponse.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.PlatformSearchResponse.toObject(opt_includeInstance, this); }; @@ -2719,14 +3379,14 @@ proto.cc.arduino.cli.commands.v1.PlatformListResponse.prototype.toObject = funct * @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.PlatformListResponse} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.PlatformSearchResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.PlatformListResponse.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.PlatformSearchResponse.toObject = function(includeInstance, msg) { var f, obj = { - installedPlatformsList: jspb.Message.toObjectList(msg.getInstalledPlatformsList(), - cc_arduino_cli_commands_v1_common_pb.Platform.toObject, includeInstance) + searchOutputList: jspb.Message.toObjectList(msg.getSearchOutputList(), + cc_arduino_cli_commands_v1_common_pb.PlatformSummary.toObject, includeInstance) }; if (includeInstance) { @@ -2740,23 +3400,23 @@ proto.cc.arduino.cli.commands.v1.PlatformListResponse.toObject = function(includ /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.PlatformListResponse} + * @return {!proto.cc.arduino.cli.commands.v1.PlatformSearchResponse} */ -proto.cc.arduino.cli.commands.v1.PlatformListResponse.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.PlatformSearchResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.PlatformListResponse; - return proto.cc.arduino.cli.commands.v1.PlatformListResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.PlatformSearchResponse; + return proto.cc.arduino.cli.commands.v1.PlatformSearchResponse.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.PlatformListResponse} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.PlatformSearchResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.PlatformListResponse} + * @return {!proto.cc.arduino.cli.commands.v1.PlatformSearchResponse} */ -proto.cc.arduino.cli.commands.v1.PlatformListResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.PlatformSearchResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -2764,9 +3424,9 @@ proto.cc.arduino.cli.commands.v1.PlatformListResponse.deserializeBinaryFromReade var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new cc_arduino_cli_commands_v1_common_pb.Platform; - reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.Platform.deserializeBinaryFromReader); - msg.addInstalledPlatforms(value); + var value = new cc_arduino_cli_commands_v1_common_pb.PlatformSummary; + reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.PlatformSummary.deserializeBinaryFromReader); + msg.addSearchOutput(value); break; default: reader.skipField(); @@ -2781,9 +3441,9 @@ proto.cc.arduino.cli.commands.v1.PlatformListResponse.deserializeBinaryFromReade * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.PlatformListResponse.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.PlatformSearchResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.PlatformListResponse.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.PlatformSearchResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -2791,58 +3451,58 @@ proto.cc.arduino.cli.commands.v1.PlatformListResponse.prototype.serializeBinary /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.PlatformListResponse} message + * @param {!proto.cc.arduino.cli.commands.v1.PlatformSearchResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.PlatformListResponse.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.PlatformSearchResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getInstalledPlatformsList(); + f = message.getSearchOutputList(); if (f.length > 0) { writer.writeRepeatedMessage( 1, f, - cc_arduino_cli_commands_v1_common_pb.Platform.serializeBinaryToWriter + cc_arduino_cli_commands_v1_common_pb.PlatformSummary.serializeBinaryToWriter ); } }; /** - * repeated Platform installed_platforms = 1; - * @return {!Array<!proto.cc.arduino.cli.commands.v1.Platform>} + * repeated PlatformSummary search_output = 1; + * @return {!Array<!proto.cc.arduino.cli.commands.v1.PlatformSummary>} */ -proto.cc.arduino.cli.commands.v1.PlatformListResponse.prototype.getInstalledPlatformsList = function() { - return /** @type{!Array<!proto.cc.arduino.cli.commands.v1.Platform>} */ ( - jspb.Message.getRepeatedWrapperField(this, cc_arduino_cli_commands_v1_common_pb.Platform, 1)); +proto.cc.arduino.cli.commands.v1.PlatformSearchResponse.prototype.getSearchOutputList = function() { + return /** @type{!Array<!proto.cc.arduino.cli.commands.v1.PlatformSummary>} */ ( + jspb.Message.getRepeatedWrapperField(this, cc_arduino_cli_commands_v1_common_pb.PlatformSummary, 1)); }; /** - * @param {!Array<!proto.cc.arduino.cli.commands.v1.Platform>} value - * @return {!proto.cc.arduino.cli.commands.v1.PlatformListResponse} returns this + * @param {!Array<!proto.cc.arduino.cli.commands.v1.PlatformSummary>} value + * @return {!proto.cc.arduino.cli.commands.v1.PlatformSearchResponse} returns this */ -proto.cc.arduino.cli.commands.v1.PlatformListResponse.prototype.setInstalledPlatformsList = function(value) { +proto.cc.arduino.cli.commands.v1.PlatformSearchResponse.prototype.setSearchOutputList = function(value) { return jspb.Message.setRepeatedWrapperField(this, 1, value); }; /** - * @param {!proto.cc.arduino.cli.commands.v1.Platform=} opt_value + * @param {!proto.cc.arduino.cli.commands.v1.PlatformSummary=} opt_value * @param {number=} opt_index - * @return {!proto.cc.arduino.cli.commands.v1.Platform} + * @return {!proto.cc.arduino.cli.commands.v1.PlatformSummary} */ -proto.cc.arduino.cli.commands.v1.PlatformListResponse.prototype.addInstalledPlatforms = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.cc.arduino.cli.commands.v1.Platform, opt_index); +proto.cc.arduino.cli.commands.v1.PlatformSearchResponse.prototype.addSearchOutput = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.cc.arduino.cli.commands.v1.PlatformSummary, opt_index); }; /** * Clears the list making it empty but non-null. - * @return {!proto.cc.arduino.cli.commands.v1.PlatformListResponse} returns this + * @return {!proto.cc.arduino.cli.commands.v1.PlatformSearchResponse} returns this */ -proto.cc.arduino.cli.commands.v1.PlatformListResponse.prototype.clearInstalledPlatformsList = function() { - return this.setInstalledPlatformsList([]); +proto.cc.arduino.cli.commands.v1.PlatformSearchResponse.prototype.clearSearchOutputList = function() { + return this.setSearchOutputList([]); }; diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/debug_grpc_pb.js b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/debug_grpc_pb.js new file mode 100644 index 000000000..97b3a2461 --- /dev/null +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/debug_grpc_pb.js @@ -0,0 +1 @@ +// GENERATED CODE -- NO SERVICES IN PROTO \ No newline at end of file diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/debug_pb.d.ts b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/debug_pb.d.ts new file mode 100644 index 000000000..5a3c99ac8 --- /dev/null +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/debug_pb.d.ts @@ -0,0 +1,321 @@ +// package: cc.arduino.cli.commands.v1 +// file: cc/arduino/cli/commands/v1/debug.proto + +/* tslint:disable */ +/* eslint-disable */ + +import * as jspb from "google-protobuf"; +import * as cc_arduino_cli_commands_v1_common_pb from "../../../../../cc/arduino/cli/commands/v1/common_pb"; +import * as cc_arduino_cli_commands_v1_port_pb from "../../../../../cc/arduino/cli/commands/v1/port_pb"; +import * as google_protobuf_any_pb from "google-protobuf/google/protobuf/any_pb"; + +export class DebugRequest extends jspb.Message { + + hasDebugRequest(): boolean; + clearDebugRequest(): void; + getDebugRequest(): GetDebugConfigRequest | undefined; + setDebugRequest(value?: GetDebugConfigRequest): DebugRequest; + getData(): Uint8Array | string; + getData_asU8(): Uint8Array; + getData_asB64(): string; + setData(value: Uint8Array | string): DebugRequest; + getSendInterrupt(): boolean; + setSendInterrupt(value: boolean): DebugRequest; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): DebugRequest.AsObject; + static toObject(includeInstance: boolean, msg: DebugRequest): DebugRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: DebugRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): DebugRequest; + static deserializeBinaryFromReader(message: DebugRequest, reader: jspb.BinaryReader): DebugRequest; +} + +export namespace DebugRequest { + export type AsObject = { + debugRequest?: GetDebugConfigRequest.AsObject, + data: Uint8Array | string, + sendInterrupt: boolean, + } +} + +export class DebugResponse extends jspb.Message { + + hasData(): boolean; + clearData(): void; + getData(): Uint8Array | string; + getData_asU8(): Uint8Array; + getData_asB64(): string; + setData(value: Uint8Array | string): DebugResponse; + + hasResult(): boolean; + clearResult(): void; + getResult(): DebugResponse.Result | undefined; + setResult(value?: DebugResponse.Result): DebugResponse; + + getMessageCase(): DebugResponse.MessageCase; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): DebugResponse.AsObject; + static toObject(includeInstance: boolean, msg: DebugResponse): DebugResponse.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: DebugResponse, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): DebugResponse; + static deserializeBinaryFromReader(message: DebugResponse, reader: jspb.BinaryReader): DebugResponse; +} + +export namespace DebugResponse { + export type AsObject = { + data: Uint8Array | string, + result?: DebugResponse.Result.AsObject, + } + + + export class Result extends jspb.Message { + getError(): string; + setError(value: string): Result; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Result.AsObject; + static toObject(includeInstance: boolean, msg: Result): Result.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: Result, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Result; + static deserializeBinaryFromReader(message: Result, reader: jspb.BinaryReader): Result; + } + + export namespace Result { + export type AsObject = { + error: string, + } + } + + + export enum MessageCase { + MESSAGE_NOT_SET = 0, + DATA = 1, + RESULT = 2, + } + +} + +export class IsDebugSupportedRequest 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): IsDebugSupportedRequest; + getFqbn(): string; + setFqbn(value: string): IsDebugSupportedRequest; + + hasPort(): boolean; + clearPort(): void; + getPort(): cc_arduino_cli_commands_v1_port_pb.Port | undefined; + setPort(value?: cc_arduino_cli_commands_v1_port_pb.Port): IsDebugSupportedRequest; + getInterpreter(): string; + setInterpreter(value: string): IsDebugSupportedRequest; + getProgrammer(): string; + setProgrammer(value: string): IsDebugSupportedRequest; + clearDebugPropertiesList(): void; + getDebugPropertiesList(): Array<string>; + setDebugPropertiesList(value: Array<string>): IsDebugSupportedRequest; + addDebugProperties(value: string, index?: number): string; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): IsDebugSupportedRequest.AsObject; + static toObject(includeInstance: boolean, msg: IsDebugSupportedRequest): IsDebugSupportedRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: IsDebugSupportedRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): IsDebugSupportedRequest; + static deserializeBinaryFromReader(message: IsDebugSupportedRequest, reader: jspb.BinaryReader): IsDebugSupportedRequest; +} + +export namespace IsDebugSupportedRequest { + export type AsObject = { + instance?: cc_arduino_cli_commands_v1_common_pb.Instance.AsObject, + fqbn: string, + port?: cc_arduino_cli_commands_v1_port_pb.Port.AsObject, + interpreter: string, + programmer: string, + debugPropertiesList: Array<string>, + } +} + +export class IsDebugSupportedResponse extends jspb.Message { + getDebuggingSupported(): boolean; + setDebuggingSupported(value: boolean): IsDebugSupportedResponse; + getDebugFqbn(): string; + setDebugFqbn(value: string): IsDebugSupportedResponse; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): IsDebugSupportedResponse.AsObject; + static toObject(includeInstance: boolean, msg: IsDebugSupportedResponse): IsDebugSupportedResponse.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: IsDebugSupportedResponse, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): IsDebugSupportedResponse; + static deserializeBinaryFromReader(message: IsDebugSupportedResponse, reader: jspb.BinaryReader): IsDebugSupportedResponse; +} + +export namespace IsDebugSupportedResponse { + export type AsObject = { + debuggingSupported: boolean, + debugFqbn: string, + } +} + +export class GetDebugConfigRequest 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): GetDebugConfigRequest; + getFqbn(): string; + setFqbn(value: string): GetDebugConfigRequest; + getSketchPath(): string; + setSketchPath(value: string): GetDebugConfigRequest; + + hasPort(): boolean; + clearPort(): void; + getPort(): cc_arduino_cli_commands_v1_port_pb.Port | undefined; + setPort(value?: cc_arduino_cli_commands_v1_port_pb.Port): GetDebugConfigRequest; + getInterpreter(): string; + setInterpreter(value: string): GetDebugConfigRequest; + getImportDir(): string; + setImportDir(value: string): GetDebugConfigRequest; + getProgrammer(): string; + setProgrammer(value: string): GetDebugConfigRequest; + clearDebugPropertiesList(): void; + getDebugPropertiesList(): Array<string>; + setDebugPropertiesList(value: Array<string>): GetDebugConfigRequest; + addDebugProperties(value: string, index?: number): string; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetDebugConfigRequest.AsObject; + static toObject(includeInstance: boolean, msg: GetDebugConfigRequest): GetDebugConfigRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: GetDebugConfigRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetDebugConfigRequest; + static deserializeBinaryFromReader(message: GetDebugConfigRequest, reader: jspb.BinaryReader): GetDebugConfigRequest; +} + +export namespace GetDebugConfigRequest { + export type AsObject = { + instance?: cc_arduino_cli_commands_v1_common_pb.Instance.AsObject, + fqbn: string, + sketchPath: string, + port?: cc_arduino_cli_commands_v1_port_pb.Port.AsObject, + interpreter: string, + importDir: string, + programmer: string, + debugPropertiesList: Array<string>, + } +} + +export class GetDebugConfigResponse extends jspb.Message { + getExecutable(): string; + setExecutable(value: string): GetDebugConfigResponse; + getToolchain(): string; + setToolchain(value: string): GetDebugConfigResponse; + getToolchainPath(): string; + setToolchainPath(value: string): GetDebugConfigResponse; + getToolchainPrefix(): string; + setToolchainPrefix(value: string): GetDebugConfigResponse; + getServer(): string; + setServer(value: string): GetDebugConfigResponse; + getServerPath(): string; + setServerPath(value: string): GetDebugConfigResponse; + + hasToolchainConfiguration(): boolean; + clearToolchainConfiguration(): void; + getToolchainConfiguration(): google_protobuf_any_pb.Any | undefined; + setToolchainConfiguration(value?: google_protobuf_any_pb.Any): GetDebugConfigResponse; + + hasServerConfiguration(): boolean; + clearServerConfiguration(): void; + getServerConfiguration(): google_protobuf_any_pb.Any | undefined; + setServerConfiguration(value?: google_protobuf_any_pb.Any): GetDebugConfigResponse; + + getCustomConfigsMap(): jspb.Map<string, string>; + clearCustomConfigsMap(): void; + getSvdFile(): string; + setSvdFile(value: string): GetDebugConfigResponse; + getProgrammer(): string; + setProgrammer(value: string): GetDebugConfigResponse; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetDebugConfigResponse.AsObject; + static toObject(includeInstance: boolean, msg: GetDebugConfigResponse): GetDebugConfigResponse.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: GetDebugConfigResponse, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetDebugConfigResponse; + static deserializeBinaryFromReader(message: GetDebugConfigResponse, reader: jspb.BinaryReader): GetDebugConfigResponse; +} + +export namespace GetDebugConfigResponse { + export type AsObject = { + executable: string, + toolchain: string, + toolchainPath: string, + toolchainPrefix: string, + server: string, + serverPath: string, + toolchainConfiguration?: google_protobuf_any_pb.Any.AsObject, + serverConfiguration?: google_protobuf_any_pb.Any.AsObject, + + customConfigsMap: Array<[string, string]>, + svdFile: string, + programmer: string, + } +} + +export class DebugGCCToolchainConfiguration extends jspb.Message { + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): DebugGCCToolchainConfiguration.AsObject; + static toObject(includeInstance: boolean, msg: DebugGCCToolchainConfiguration): DebugGCCToolchainConfiguration.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: DebugGCCToolchainConfiguration, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): DebugGCCToolchainConfiguration; + static deserializeBinaryFromReader(message: DebugGCCToolchainConfiguration, reader: jspb.BinaryReader): DebugGCCToolchainConfiguration; +} + +export namespace DebugGCCToolchainConfiguration { + export type AsObject = { + } +} + +export class DebugOpenOCDServerConfiguration extends jspb.Message { + getPath(): string; + setPath(value: string): DebugOpenOCDServerConfiguration; + getScriptsDir(): string; + setScriptsDir(value: string): DebugOpenOCDServerConfiguration; + clearScriptsList(): void; + getScriptsList(): Array<string>; + setScriptsList(value: Array<string>): DebugOpenOCDServerConfiguration; + addScripts(value: string, index?: number): string; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): DebugOpenOCDServerConfiguration.AsObject; + static toObject(includeInstance: boolean, msg: DebugOpenOCDServerConfiguration): DebugOpenOCDServerConfiguration.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: DebugOpenOCDServerConfiguration, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): DebugOpenOCDServerConfiguration; + static deserializeBinaryFromReader(message: DebugOpenOCDServerConfiguration, reader: jspb.BinaryReader): DebugOpenOCDServerConfiguration; +} + +export namespace DebugOpenOCDServerConfiguration { + export type AsObject = { + path: string, + scriptsDir: string, + scriptsList: Array<string>, + } +} diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/debug_pb.js b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/debug_pb.js new file mode 100644 index 000000000..f6dfc3a92 --- /dev/null +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/debug_pb.js @@ -0,0 +1,2551 @@ +// source: cc/arduino/cli/commands/v1/debug.proto +/** + * @fileoverview + * @enhanceable + * @suppress {missingRequire} reports error on implicit type usages. + * @suppress {messageConventions} JS Compiler reports an error if a variable or + * field starts with 'MSG_' and isn't a translatable message. + * @public + */ +// GENERATED CODE -- DO NOT EDIT! +/* eslint-disable */ +// @ts-nocheck + +var jspb = require('google-protobuf'); +var goog = jspb; +var global = (function() { + if (this) { return this; } + if (typeof window !== 'undefined') { return window; } + if (typeof global !== 'undefined') { return global; } + if (typeof self !== 'undefined') { return self; } + return Function('return this')(); +}.call(null)); + +var cc_arduino_cli_commands_v1_common_pb = require('../../../../../cc/arduino/cli/commands/v1/common_pb.js'); +goog.object.extend(proto, cc_arduino_cli_commands_v1_common_pb); +var cc_arduino_cli_commands_v1_port_pb = require('../../../../../cc/arduino/cli/commands/v1/port_pb.js'); +goog.object.extend(proto, cc_arduino_cli_commands_v1_port_pb); +var google_protobuf_any_pb = require('google-protobuf/google/protobuf/any_pb.js'); +goog.object.extend(proto, google_protobuf_any_pb); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.DebugGCCToolchainConfiguration', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.DebugRequest', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.DebugResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.DebugResponse.MessageCase', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.DebugResponse.Result', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.IsDebugSupportedResponse', null, global); +/** + * 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.DebugRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.DebugRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.DebugRequest.displayName = 'proto.cc.arduino.cli.commands.v1.DebugRequest'; +} +/** + * 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.DebugResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.cc.arduino.cli.commands.v1.DebugResponse.oneofGroups_); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.DebugResponse, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.DebugResponse.displayName = 'proto.cc.arduino.cli.commands.v1.DebugResponse'; +} +/** + * 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.DebugResponse.Result = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.DebugResponse.Result, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.DebugResponse.Result.displayName = 'proto.cc.arduino.cli.commands.v1.DebugResponse.Result'; +} +/** + * 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.IsDebugSupportedRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest.repeatedFields_, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest.displayName = 'proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest'; +} +/** + * 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.IsDebugSupportedResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.IsDebugSupportedResponse, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.IsDebugSupportedResponse.displayName = 'proto.cc.arduino.cli.commands.v1.IsDebugSupportedResponse'; +} +/** + * 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.GetDebugConfigRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.repeatedFields_, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.displayName = 'proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest'; +} +/** + * 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.GetDebugConfigResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.displayName = 'proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse'; +} +/** + * 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.DebugGCCToolchainConfiguration = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.DebugGCCToolchainConfiguration, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.DebugGCCToolchainConfiguration.displayName = 'proto.cc.arduino.cli.commands.v1.DebugGCCToolchainConfiguration'; +} +/** + * 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.DebugOpenOCDServerConfiguration = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration.repeatedFields_, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration.displayName = 'proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration'; +} + + + +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.DebugRequest.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.DebugRequest.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.DebugRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.DebugRequest.toObject = function(includeInstance, msg) { + var f, obj = { + debugRequest: (f = msg.getDebugRequest()) && proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.toObject(includeInstance, f), + data: msg.getData_asB64(), + sendInterrupt: 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.DebugRequest} + */ +proto.cc.arduino.cli.commands.v1.DebugRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.DebugRequest; + return proto.cc.arduino.cli.commands.v1.DebugRequest.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.DebugRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.DebugRequest} + */ +proto.cc.arduino.cli.commands.v1.DebugRequest.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.GetDebugConfigRequest; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.deserializeBinaryFromReader); + msg.setDebugRequest(value); + break; + case 2: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setData(value); + break; + case 3: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setSendInterrupt(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.DebugRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.DebugRequest.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.DebugRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.DebugRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getDebugRequest(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.serializeBinaryToWriter + ); + } + f = message.getData_asU8(); + if (f.length > 0) { + writer.writeBytes( + 2, + f + ); + } + f = message.getSendInterrupt(); + if (f) { + writer.writeBool( + 3, + f + ); + } +}; + + +/** + * optional GetDebugConfigRequest debug_request = 1; + * @return {?proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest} + */ +proto.cc.arduino.cli.commands.v1.DebugRequest.prototype.getDebugRequest = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest, 1)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.DebugRequest} returns this +*/ +proto.cc.arduino.cli.commands.v1.DebugRequest.prototype.setDebugRequest = function(value) { + return jspb.Message.setWrapperField(this, 1, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.DebugRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.DebugRequest.prototype.clearDebugRequest = function() { + return this.setDebugRequest(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.DebugRequest.prototype.hasDebugRequest = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional bytes data = 2; + * @return {!(string|Uint8Array)} + */ +proto.cc.arduino.cli.commands.v1.DebugRequest.prototype.getData = function() { + return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * optional bytes data = 2; + * This is a type-conversion wrapper around `getData()` + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.DebugRequest.prototype.getData_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getData())); +}; + + +/** + * optional bytes data = 2; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getData()` + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.DebugRequest.prototype.getData_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getData())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.cc.arduino.cli.commands.v1.DebugRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.DebugRequest.prototype.setData = function(value) { + return jspb.Message.setProto3BytesField(this, 2, value); +}; + + +/** + * optional bool send_interrupt = 3; + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.DebugRequest.prototype.getSendInterrupt = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.DebugRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.DebugRequest.prototype.setSendInterrupt = function(value) { + return jspb.Message.setProto3BooleanField(this, 3, value); +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.cc.arduino.cli.commands.v1.DebugResponse.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.cc.arduino.cli.commands.v1.DebugResponse.MessageCase = { + MESSAGE_NOT_SET: 0, + DATA: 1, + RESULT: 2 +}; + +/** + * @return {proto.cc.arduino.cli.commands.v1.DebugResponse.MessageCase} + */ +proto.cc.arduino.cli.commands.v1.DebugResponse.prototype.getMessageCase = function() { + return /** @type {proto.cc.arduino.cli.commands.v1.DebugResponse.MessageCase} */(jspb.Message.computeOneofCase(this, proto.cc.arduino.cli.commands.v1.DebugResponse.oneofGroups_[0])); +}; + + + +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.DebugResponse.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.DebugResponse.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.DebugResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.DebugResponse.toObject = function(includeInstance, msg) { + var f, obj = { + data: msg.getData_asB64(), + result: (f = msg.getResult()) && proto.cc.arduino.cli.commands.v1.DebugResponse.Result.toObject(includeInstance, f) + }; + + 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.DebugResponse} + */ +proto.cc.arduino.cli.commands.v1.DebugResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.DebugResponse; + return proto.cc.arduino.cli.commands.v1.DebugResponse.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.DebugResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.DebugResponse} + */ +proto.cc.arduino.cli.commands.v1.DebugResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setData(value); + break; + case 2: + var value = new proto.cc.arduino.cli.commands.v1.DebugResponse.Result; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.DebugResponse.Result.deserializeBinaryFromReader); + msg.setResult(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.DebugResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.DebugResponse.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.DebugResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.DebugResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 1)); + if (f != null) { + writer.writeBytes( + 1, + f + ); + } + f = message.getResult(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.cc.arduino.cli.commands.v1.DebugResponse.Result.serializeBinaryToWriter + ); + } +}; + + + + + +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.DebugResponse.Result.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.DebugResponse.Result.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.DebugResponse.Result} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.DebugResponse.Result.toObject = function(includeInstance, msg) { + var f, obj = { + error: jspb.Message.getFieldWithDefault(msg, 1, "") + }; + + 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.DebugResponse.Result} + */ +proto.cc.arduino.cli.commands.v1.DebugResponse.Result.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.DebugResponse.Result; + return proto.cc.arduino.cli.commands.v1.DebugResponse.Result.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.DebugResponse.Result} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.DebugResponse.Result} + */ +proto.cc.arduino.cli.commands.v1.DebugResponse.Result.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setError(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.DebugResponse.Result.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.DebugResponse.Result.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.DebugResponse.Result} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.DebugResponse.Result.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getError(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } +}; + + +/** + * optional string error = 1; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.DebugResponse.Result.prototype.getError = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.DebugResponse.Result} returns this + */ +proto.cc.arduino.cli.commands.v1.DebugResponse.Result.prototype.setError = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + +/** + * optional bytes data = 1; + * @return {!(string|Uint8Array)} + */ +proto.cc.arduino.cli.commands.v1.DebugResponse.prototype.getData = function() { + return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes data = 1; + * This is a type-conversion wrapper around `getData()` + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.DebugResponse.prototype.getData_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getData())); +}; + + +/** + * optional bytes data = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getData()` + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.DebugResponse.prototype.getData_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getData())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.cc.arduino.cli.commands.v1.DebugResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.DebugResponse.prototype.setData = function(value) { + return jspb.Message.setOneofField(this, 1, proto.cc.arduino.cli.commands.v1.DebugResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.DebugResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.DebugResponse.prototype.clearData = function() { + return jspb.Message.setOneofField(this, 1, proto.cc.arduino.cli.commands.v1.DebugResponse.oneofGroups_[0], undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.DebugResponse.prototype.hasData = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional Result result = 2; + * @return {?proto.cc.arduino.cli.commands.v1.DebugResponse.Result} + */ +proto.cc.arduino.cli.commands.v1.DebugResponse.prototype.getResult = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.DebugResponse.Result} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.DebugResponse.Result, 2)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.DebugResponse.Result|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.DebugResponse} returns this +*/ +proto.cc.arduino.cli.commands.v1.DebugResponse.prototype.setResult = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.cc.arduino.cli.commands.v1.DebugResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.DebugResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.DebugResponse.prototype.clearResult = function() { + return this.setResult(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.DebugResponse.prototype.hasResult = function() { + return jspb.Message.getField(this, 2) != null; +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest.repeatedFields_ = [6]; + + + +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.IsDebugSupportedRequest.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest.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.IsDebugSupportedRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest.toObject = function(includeInstance, msg) { + var f, obj = { + instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f), + fqbn: jspb.Message.getFieldWithDefault(msg, 2, ""), + port: (f = msg.getPort()) && cc_arduino_cli_commands_v1_port_pb.Port.toObject(includeInstance, f), + interpreter: jspb.Message.getFieldWithDefault(msg, 4, ""), + programmer: jspb.Message.getFieldWithDefault(msg, 5, ""), + debugPropertiesList: (f = jspb.Message.getRepeatedField(msg, 6)) == null ? undefined : f + }; + + 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.IsDebugSupportedRequest} + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest; + return proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest.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.IsDebugSupportedRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest} + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest.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 = /** @type {string} */ (reader.readString()); + msg.setFqbn(value); + break; + case 3: + var value = new cc_arduino_cli_commands_v1_port_pb.Port; + reader.readMessage(value,cc_arduino_cli_commands_v1_port_pb.Port.deserializeBinaryFromReader); + msg.setPort(value); + break; + case 4: + var value = /** @type {string} */ (reader.readString()); + msg.setInterpreter(value); + break; + case 5: + var value = /** @type {string} */ (reader.readString()); + msg.setProgrammer(value); + break; + case 6: + var value = /** @type {string} */ (reader.readString()); + msg.addDebugProperties(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.IsDebugSupportedRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest.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.IsDebugSupportedRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest.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.getFqbn(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } + f = message.getPort(); + if (f != null) { + writer.writeMessage( + 3, + f, + cc_arduino_cli_commands_v1_port_pb.Port.serializeBinaryToWriter + ); + } + f = message.getInterpreter(); + if (f.length > 0) { + writer.writeString( + 4, + f + ); + } + f = message.getProgrammer(); + if (f.length > 0) { + writer.writeString( + 5, + f + ); + } + f = message.getDebugPropertiesList(); + if (f.length > 0) { + writer.writeRepeatedString( + 6, + f + ); + } +}; + + +/** + * optional Instance instance = 1; + * @return {?proto.cc.arduino.cli.commands.v1.Instance} + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest.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.IsDebugSupportedRequest} returns this +*/ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest.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.IsDebugSupportedRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest.prototype.clearInstance = function() { + return this.setInstance(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest.prototype.hasInstance = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional string fqbn = 2; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest.prototype.getFqbn = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest.prototype.setFqbn = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + +/** + * optional Port port = 3; + * @return {?proto.cc.arduino.cli.commands.v1.Port} + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest.prototype.getPort = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.Port} */ ( + jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_port_pb.Port, 3)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.Port|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest} returns this +*/ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest.prototype.setPort = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest.prototype.clearPort = function() { + return this.setPort(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest.prototype.hasPort = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional string interpreter = 4; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest.prototype.getInterpreter = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest.prototype.setInterpreter = function(value) { + return jspb.Message.setProto3StringField(this, 4, value); +}; + + +/** + * optional string programmer = 5; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest.prototype.getProgrammer = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 5, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest.prototype.setProgrammer = function(value) { + return jspb.Message.setProto3StringField(this, 5, value); +}; + + +/** + * repeated string debug_properties = 6; + * @return {!Array<string>} + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest.prototype.getDebugPropertiesList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 6)); +}; + + +/** + * @param {!Array<string>} value + * @return {!proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest.prototype.setDebugPropertiesList = function(value) { + return jspb.Message.setField(this, 6, value || []); +}; + + +/** + * @param {string} value + * @param {number=} opt_index + * @return {!proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest.prototype.addDebugProperties = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 6, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest.prototype.clearDebugPropertiesList = function() { + return this.setDebugPropertiesList([]); +}; + + + + + +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.IsDebugSupportedResponse.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.IsDebugSupportedResponse.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.IsDebugSupportedResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedResponse.toObject = function(includeInstance, msg) { + var f, obj = { + debuggingSupported: jspb.Message.getBooleanFieldWithDefault(msg, 1, false), + debugFqbn: jspb.Message.getFieldWithDefault(msg, 2, "") + }; + + 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.IsDebugSupportedResponse} + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.IsDebugSupportedResponse; + return proto.cc.arduino.cli.commands.v1.IsDebugSupportedResponse.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.IsDebugSupportedResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.IsDebugSupportedResponse} + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setDebuggingSupported(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setDebugFqbn(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.IsDebugSupportedResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.IsDebugSupportedResponse.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.IsDebugSupportedResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getDebuggingSupported(); + if (f) { + writer.writeBool( + 1, + f + ); + } + f = message.getDebugFqbn(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } +}; + + +/** + * optional bool debugging_supported = 1; + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedResponse.prototype.getDebuggingSupported = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 1, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.IsDebugSupportedResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedResponse.prototype.setDebuggingSupported = function(value) { + return jspb.Message.setProto3BooleanField(this, 1, value); +}; + + +/** + * optional string debug_fqbn = 2; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedResponse.prototype.getDebugFqbn = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.IsDebugSupportedResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedResponse.prototype.setDebugFqbn = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.repeatedFields_ = [10]; + + + +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.GetDebugConfigRequest.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.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.GetDebugConfigRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.toObject = function(includeInstance, msg) { + var f, obj = { + instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f), + fqbn: jspb.Message.getFieldWithDefault(msg, 2, ""), + sketchPath: jspb.Message.getFieldWithDefault(msg, 3, ""), + port: (f = msg.getPort()) && cc_arduino_cli_commands_v1_port_pb.Port.toObject(includeInstance, f), + interpreter: jspb.Message.getFieldWithDefault(msg, 5, ""), + importDir: jspb.Message.getFieldWithDefault(msg, 8, ""), + programmer: jspb.Message.getFieldWithDefault(msg, 9, ""), + debugPropertiesList: (f = jspb.Message.getRepeatedField(msg, 10)) == null ? undefined : f + }; + + 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.GetDebugConfigRequest} + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest; + return proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.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.GetDebugConfigRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest} + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.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 = /** @type {string} */ (reader.readString()); + msg.setFqbn(value); + break; + case 3: + var value = /** @type {string} */ (reader.readString()); + msg.setSketchPath(value); + break; + case 4: + var value = new cc_arduino_cli_commands_v1_port_pb.Port; + reader.readMessage(value,cc_arduino_cli_commands_v1_port_pb.Port.deserializeBinaryFromReader); + msg.setPort(value); + break; + case 5: + var value = /** @type {string} */ (reader.readString()); + msg.setInterpreter(value); + break; + case 8: + var value = /** @type {string} */ (reader.readString()); + msg.setImportDir(value); + break; + case 9: + var value = /** @type {string} */ (reader.readString()); + msg.setProgrammer(value); + break; + case 10: + var value = /** @type {string} */ (reader.readString()); + msg.addDebugProperties(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.GetDebugConfigRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.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.GetDebugConfigRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.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.getFqbn(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } + f = message.getSketchPath(); + if (f.length > 0) { + writer.writeString( + 3, + f + ); + } + f = message.getPort(); + if (f != null) { + writer.writeMessage( + 4, + f, + cc_arduino_cli_commands_v1_port_pb.Port.serializeBinaryToWriter + ); + } + f = message.getInterpreter(); + if (f.length > 0) { + writer.writeString( + 5, + f + ); + } + f = message.getImportDir(); + if (f.length > 0) { + writer.writeString( + 8, + f + ); + } + f = message.getProgrammer(); + if (f.length > 0) { + writer.writeString( + 9, + f + ); + } + f = message.getDebugPropertiesList(); + if (f.length > 0) { + writer.writeRepeatedString( + 10, + f + ); + } +}; + + +/** + * optional Instance instance = 1; + * @return {?proto.cc.arduino.cli.commands.v1.Instance} + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.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.GetDebugConfigRequest} returns this +*/ +proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.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.GetDebugConfigRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.prototype.clearInstance = function() { + return this.setInstance(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.prototype.hasInstance = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional string fqbn = 2; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.prototype.getFqbn = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.prototype.setFqbn = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + +/** + * optional string sketch_path = 3; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.prototype.getSketchPath = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.prototype.setSketchPath = function(value) { + return jspb.Message.setProto3StringField(this, 3, value); +}; + + +/** + * optional Port port = 4; + * @return {?proto.cc.arduino.cli.commands.v1.Port} + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.prototype.getPort = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.Port} */ ( + jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_port_pb.Port, 4)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.Port|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest} returns this +*/ +proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.prototype.setPort = function(value) { + return jspb.Message.setWrapperField(this, 4, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.prototype.clearPort = function() { + return this.setPort(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.prototype.hasPort = function() { + return jspb.Message.getField(this, 4) != null; +}; + + +/** + * optional string interpreter = 5; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.prototype.getInterpreter = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 5, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.prototype.setInterpreter = function(value) { + return jspb.Message.setProto3StringField(this, 5, value); +}; + + +/** + * optional string import_dir = 8; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.prototype.getImportDir = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 8, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.prototype.setImportDir = function(value) { + return jspb.Message.setProto3StringField(this, 8, value); +}; + + +/** + * optional string programmer = 9; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.prototype.getProgrammer = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 9, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.prototype.setProgrammer = function(value) { + return jspb.Message.setProto3StringField(this, 9, value); +}; + + +/** + * repeated string debug_properties = 10; + * @return {!Array<string>} + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.prototype.getDebugPropertiesList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 10)); +}; + + +/** + * @param {!Array<string>} value + * @return {!proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.prototype.setDebugPropertiesList = function(value) { + return jspb.Message.setField(this, 10, value || []); +}; + + +/** + * @param {string} value + * @param {number=} opt_index + * @return {!proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.prototype.addDebugProperties = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 10, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.prototype.clearDebugPropertiesList = function() { + return this.setDebugPropertiesList([]); +}; + + + + + +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.GetDebugConfigResponse.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.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.GetDebugConfigResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.toObject = function(includeInstance, msg) { + var f, obj = { + executable: jspb.Message.getFieldWithDefault(msg, 1, ""), + toolchain: jspb.Message.getFieldWithDefault(msg, 2, ""), + toolchainPath: jspb.Message.getFieldWithDefault(msg, 3, ""), + toolchainPrefix: jspb.Message.getFieldWithDefault(msg, 4, ""), + server: jspb.Message.getFieldWithDefault(msg, 5, ""), + serverPath: jspb.Message.getFieldWithDefault(msg, 6, ""), + toolchainConfiguration: (f = msg.getToolchainConfiguration()) && google_protobuf_any_pb.Any.toObject(includeInstance, f), + serverConfiguration: (f = msg.getServerConfiguration()) && google_protobuf_any_pb.Any.toObject(includeInstance, f), + customConfigsMap: (f = msg.getCustomConfigsMap()) ? f.toObject(includeInstance, undefined) : [], + svdFile: jspb.Message.getFieldWithDefault(msg, 10, ""), + programmer: jspb.Message.getFieldWithDefault(msg, 11, "") + }; + + 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.GetDebugConfigResponse} + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse; + return proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.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.GetDebugConfigResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse} + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setExecutable(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setToolchain(value); + break; + case 3: + var value = /** @type {string} */ (reader.readString()); + msg.setToolchainPath(value); + break; + case 4: + var value = /** @type {string} */ (reader.readString()); + msg.setToolchainPrefix(value); + break; + case 5: + var value = /** @type {string} */ (reader.readString()); + msg.setServer(value); + break; + case 6: + var value = /** @type {string} */ (reader.readString()); + msg.setServerPath(value); + break; + case 7: + var value = new google_protobuf_any_pb.Any; + reader.readMessage(value,google_protobuf_any_pb.Any.deserializeBinaryFromReader); + msg.setToolchainConfiguration(value); + break; + case 8: + var value = new google_protobuf_any_pb.Any; + reader.readMessage(value,google_protobuf_any_pb.Any.deserializeBinaryFromReader); + msg.setServerConfiguration(value); + break; + case 9: + var value = msg.getCustomConfigsMap(); + reader.readMessage(value, function(message, reader) { + jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readString, jspb.BinaryReader.prototype.readString, null, "", ""); + }); + break; + case 10: + var value = /** @type {string} */ (reader.readString()); + msg.setSvdFile(value); + break; + case 11: + var value = /** @type {string} */ (reader.readString()); + msg.setProgrammer(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.GetDebugConfigResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.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.GetDebugConfigResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getExecutable(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } + f = message.getToolchain(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } + f = message.getToolchainPath(); + if (f.length > 0) { + writer.writeString( + 3, + f + ); + } + f = message.getToolchainPrefix(); + if (f.length > 0) { + writer.writeString( + 4, + f + ); + } + f = message.getServer(); + if (f.length > 0) { + writer.writeString( + 5, + f + ); + } + f = message.getServerPath(); + if (f.length > 0) { + writer.writeString( + 6, + f + ); + } + f = message.getToolchainConfiguration(); + if (f != null) { + writer.writeMessage( + 7, + f, + google_protobuf_any_pb.Any.serializeBinaryToWriter + ); + } + f = message.getServerConfiguration(); + if (f != null) { + writer.writeMessage( + 8, + f, + google_protobuf_any_pb.Any.serializeBinaryToWriter + ); + } + f = message.getCustomConfigsMap(true); + if (f && f.getLength() > 0) { + f.serializeBinary(9, writer, jspb.BinaryWriter.prototype.writeString, jspb.BinaryWriter.prototype.writeString); + } + f = message.getSvdFile(); + if (f.length > 0) { + writer.writeString( + 10, + f + ); + } + f = message.getProgrammer(); + if (f.length > 0) { + writer.writeString( + 11, + f + ); + } +}; + + +/** + * optional string executable = 1; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.prototype.getExecutable = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.prototype.setExecutable = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + +/** + * optional string toolchain = 2; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.prototype.getToolchain = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.prototype.setToolchain = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + +/** + * optional string toolchain_path = 3; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.prototype.getToolchainPath = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.prototype.setToolchainPath = function(value) { + return jspb.Message.setProto3StringField(this, 3, value); +}; + + +/** + * optional string toolchain_prefix = 4; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.prototype.getToolchainPrefix = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.prototype.setToolchainPrefix = function(value) { + return jspb.Message.setProto3StringField(this, 4, value); +}; + + +/** + * optional string server = 5; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.prototype.getServer = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 5, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.prototype.setServer = function(value) { + return jspb.Message.setProto3StringField(this, 5, value); +}; + + +/** + * optional string server_path = 6; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.prototype.getServerPath = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 6, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.prototype.setServerPath = function(value) { + return jspb.Message.setProto3StringField(this, 6, value); +}; + + +/** + * optional google.protobuf.Any toolchain_configuration = 7; + * @return {?proto.google.protobuf.Any} + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.prototype.getToolchainConfiguration = function() { + return /** @type{?proto.google.protobuf.Any} */ ( + jspb.Message.getWrapperField(this, google_protobuf_any_pb.Any, 7)); +}; + + +/** + * @param {?proto.google.protobuf.Any|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse} returns this +*/ +proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.prototype.setToolchainConfiguration = function(value) { + return jspb.Message.setWrapperField(this, 7, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.prototype.clearToolchainConfiguration = function() { + return this.setToolchainConfiguration(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.prototype.hasToolchainConfiguration = function() { + return jspb.Message.getField(this, 7) != null; +}; + + +/** + * optional google.protobuf.Any server_configuration = 8; + * @return {?proto.google.protobuf.Any} + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.prototype.getServerConfiguration = function() { + return /** @type{?proto.google.protobuf.Any} */ ( + jspb.Message.getWrapperField(this, google_protobuf_any_pb.Any, 8)); +}; + + +/** + * @param {?proto.google.protobuf.Any|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse} returns this +*/ +proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.prototype.setServerConfiguration = function(value) { + return jspb.Message.setWrapperField(this, 8, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.prototype.clearServerConfiguration = function() { + return this.setServerConfiguration(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.prototype.hasServerConfiguration = function() { + return jspb.Message.getField(this, 8) != null; +}; + + +/** + * map<string, string> custom_configs = 9; + * @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.GetDebugConfigResponse.prototype.getCustomConfigsMap = function(opt_noLazyCreate) { + return /** @type {!jspb.Map<string,string>} */ ( + jspb.Message.getMapField(this, 9, opt_noLazyCreate, + null)); +}; + + +/** + * Clears values from the map. The map will be non-null. + * @return {!proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.prototype.clearCustomConfigsMap = function() { + this.getCustomConfigsMap().clear(); + return this;}; + + +/** + * optional string svd_file = 10; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.prototype.getSvdFile = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 10, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.prototype.setSvdFile = function(value) { + return jspb.Message.setProto3StringField(this, 10, value); +}; + + +/** + * optional string programmer = 11; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.prototype.getProgrammer = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 11, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.prototype.setProgrammer = function(value) { + return jspb.Message.setProto3StringField(this, 11, value); +}; + + + + + +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.DebugGCCToolchainConfiguration.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.DebugGCCToolchainConfiguration.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.DebugGCCToolchainConfiguration} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.DebugGCCToolchainConfiguration.toObject = function(includeInstance, msg) { + var f, obj = { + + }; + + 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.DebugGCCToolchainConfiguration} + */ +proto.cc.arduino.cli.commands.v1.DebugGCCToolchainConfiguration.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.DebugGCCToolchainConfiguration; + return proto.cc.arduino.cli.commands.v1.DebugGCCToolchainConfiguration.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.DebugGCCToolchainConfiguration} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.DebugGCCToolchainConfiguration} + */ +proto.cc.arduino.cli.commands.v1.DebugGCCToolchainConfiguration.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.DebugGCCToolchainConfiguration.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.DebugGCCToolchainConfiguration.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.DebugGCCToolchainConfiguration} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.DebugGCCToolchainConfiguration.serializeBinaryToWriter = function(message, writer) { + var f = undefined; +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration.repeatedFields_ = [3]; + + + +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.DebugOpenOCDServerConfiguration.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration.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.DebugOpenOCDServerConfiguration} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration.toObject = function(includeInstance, msg) { + var f, obj = { + path: jspb.Message.getFieldWithDefault(msg, 1, ""), + scriptsDir: jspb.Message.getFieldWithDefault(msg, 2, ""), + scriptsList: (f = jspb.Message.getRepeatedField(msg, 3)) == null ? undefined : f + }; + + 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.DebugOpenOCDServerConfiguration} + */ +proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration; + return proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration.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.DebugOpenOCDServerConfiguration} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration} + */ +proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setPath(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setScriptsDir(value); + break; + case 3: + var value = /** @type {string} */ (reader.readString()); + msg.addScripts(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.DebugOpenOCDServerConfiguration.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration.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.DebugOpenOCDServerConfiguration} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getPath(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } + f = message.getScriptsDir(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } + f = message.getScriptsList(); + if (f.length > 0) { + writer.writeRepeatedString( + 3, + f + ); + } +}; + + +/** + * optional string path = 1; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration.prototype.getPath = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration} returns this + */ +proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration.prototype.setPath = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + +/** + * optional string scripts_dir = 2; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration.prototype.getScriptsDir = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration} returns this + */ +proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration.prototype.setScriptsDir = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + +/** + * repeated string scripts = 3; + * @return {!Array<string>} + */ +proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration.prototype.getScriptsList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 3)); +}; + + +/** + * @param {!Array<string>} value + * @return {!proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration} returns this + */ +proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration.prototype.setScriptsList = function(value) { + return jspb.Message.setField(this, 3, value || []); +}; + + +/** + * @param {string} value + * @param {number=} opt_index + * @return {!proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration} returns this + */ +proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration.prototype.addScripts = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 3, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration} returns this + */ +proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration.prototype.clearScriptsList = function() { + return this.setScriptsList([]); +}; + + +goog.object.extend(exports, proto.cc.arduino.cli.commands.v1); diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/lib_pb.d.ts b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/lib_pb.d.ts index 1437d3e0a..c5401953e 100644 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/lib_pb.d.ts +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/lib_pb.d.ts @@ -13,14 +13,11 @@ export class LibraryDownloadRequest extends jspb.Message { clearInstance(): void; getInstance(): cc_arduino_cli_commands_v1_common_pb.Instance | undefined; setInstance(value?: cc_arduino_cli_commands_v1_common_pb.Instance): LibraryDownloadRequest; - getName(): string; setName(value: string): LibraryDownloadRequest; - getVersion(): string; setVersion(value: string): LibraryDownloadRequest; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): LibraryDownloadRequest.AsObject; static toObject(includeInstance: boolean, msg: LibraryDownloadRequest): LibraryDownloadRequest.AsObject; @@ -46,6 +43,12 @@ export class LibraryDownloadResponse extends jspb.Message { getProgress(): cc_arduino_cli_commands_v1_common_pb.DownloadProgress | undefined; setProgress(value?: cc_arduino_cli_commands_v1_common_pb.DownloadProgress): LibraryDownloadResponse; + hasResult(): boolean; + clearResult(): void; + getResult(): LibraryDownloadResponse.Result | undefined; + setResult(value?: LibraryDownloadResponse.Result): LibraryDownloadResponse; + + getMessageCase(): LibraryDownloadResponse.MessageCase; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): LibraryDownloadResponse.AsObject; @@ -60,7 +63,34 @@ export class LibraryDownloadResponse extends jspb.Message { export namespace LibraryDownloadResponse { export type AsObject = { progress?: cc_arduino_cli_commands_v1_common_pb.DownloadProgress.AsObject, + result?: LibraryDownloadResponse.Result.AsObject, + } + + + export class Result extends jspb.Message { + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Result.AsObject; + static toObject(includeInstance: boolean, msg: Result): Result.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: Result, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Result; + static deserializeBinaryFromReader(message: Result, reader: jspb.BinaryReader): Result; + } + + export namespace Result { + export type AsObject = { + } + } + + + export enum MessageCase { + MESSAGE_NOT_SET = 0, + PROGRESS = 1, + RESULT = 2, } + } export class LibraryInstallRequest extends jspb.Message { @@ -69,23 +99,17 @@ export class LibraryInstallRequest extends jspb.Message { clearInstance(): void; getInstance(): cc_arduino_cli_commands_v1_common_pb.Instance | undefined; setInstance(value?: cc_arduino_cli_commands_v1_common_pb.Instance): LibraryInstallRequest; - getName(): string; setName(value: string): LibraryInstallRequest; - getVersion(): string; setVersion(value: string): LibraryInstallRequest; - getNoDeps(): boolean; setNoDeps(value: boolean): LibraryInstallRequest; - getNoOverwrite(): boolean; setNoOverwrite(value: boolean): LibraryInstallRequest; - getInstallLocation(): LibraryInstallLocation; setInstallLocation(value: LibraryInstallLocation): LibraryInstallRequest; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): LibraryInstallRequest.AsObject; static toObject(includeInstance: boolean, msg: LibraryInstallRequest): LibraryInstallRequest.AsObject; @@ -114,12 +138,17 @@ export class LibraryInstallResponse extends jspb.Message { getProgress(): cc_arduino_cli_commands_v1_common_pb.DownloadProgress | undefined; setProgress(value?: cc_arduino_cli_commands_v1_common_pb.DownloadProgress): LibraryInstallResponse; - hasTaskProgress(): boolean; clearTaskProgress(): void; getTaskProgress(): cc_arduino_cli_commands_v1_common_pb.TaskProgress | undefined; setTaskProgress(value?: cc_arduino_cli_commands_v1_common_pb.TaskProgress): LibraryInstallResponse; + hasResult(): boolean; + clearResult(): void; + getResult(): LibraryInstallResponse.Result | undefined; + setResult(value?: LibraryInstallResponse.Result): LibraryInstallResponse; + + getMessageCase(): LibraryInstallResponse.MessageCase; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): LibraryInstallResponse.AsObject; @@ -135,7 +164,35 @@ export namespace LibraryInstallResponse { export type AsObject = { progress?: cc_arduino_cli_commands_v1_common_pb.DownloadProgress.AsObject, taskProgress?: cc_arduino_cli_commands_v1_common_pb.TaskProgress.AsObject, + result?: LibraryInstallResponse.Result.AsObject, } + + + export class Result extends jspb.Message { + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Result.AsObject; + static toObject(includeInstance: boolean, msg: Result): Result.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: Result, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Result; + static deserializeBinaryFromReader(message: Result, reader: jspb.BinaryReader): Result; + } + + export namespace Result { + export type AsObject = { + } + } + + + export enum MessageCase { + MESSAGE_NOT_SET = 0, + PROGRESS = 1, + TASK_PROGRESS = 2, + RESULT = 3, + } + } export class LibraryUpgradeRequest extends jspb.Message { @@ -144,14 +201,11 @@ export class LibraryUpgradeRequest extends jspb.Message { clearInstance(): void; getInstance(): cc_arduino_cli_commands_v1_common_pb.Instance | undefined; setInstance(value?: cc_arduino_cli_commands_v1_common_pb.Instance): LibraryUpgradeRequest; - getName(): string; setName(value: string): LibraryUpgradeRequest; - getNoDeps(): boolean; setNoDeps(value: boolean): LibraryUpgradeRequest; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): LibraryUpgradeRequest.AsObject; static toObject(includeInstance: boolean, msg: LibraryUpgradeRequest): LibraryUpgradeRequest.AsObject; @@ -177,12 +231,17 @@ export class LibraryUpgradeResponse extends jspb.Message { getProgress(): cc_arduino_cli_commands_v1_common_pb.DownloadProgress | undefined; setProgress(value?: cc_arduino_cli_commands_v1_common_pb.DownloadProgress): LibraryUpgradeResponse; - hasTaskProgress(): boolean; clearTaskProgress(): void; getTaskProgress(): cc_arduino_cli_commands_v1_common_pb.TaskProgress | undefined; setTaskProgress(value?: cc_arduino_cli_commands_v1_common_pb.TaskProgress): LibraryUpgradeResponse; + hasResult(): boolean; + clearResult(): void; + getResult(): LibraryUpgradeResponse.Result | undefined; + setResult(value?: LibraryUpgradeResponse.Result): LibraryUpgradeResponse; + + getMessageCase(): LibraryUpgradeResponse.MessageCase; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): LibraryUpgradeResponse.AsObject; @@ -198,7 +257,35 @@ export namespace LibraryUpgradeResponse { export type AsObject = { progress?: cc_arduino_cli_commands_v1_common_pb.DownloadProgress.AsObject, taskProgress?: cc_arduino_cli_commands_v1_common_pb.TaskProgress.AsObject, + result?: LibraryUpgradeResponse.Result.AsObject, + } + + + export class Result extends jspb.Message { + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Result.AsObject; + static toObject(includeInstance: boolean, msg: Result): Result.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: Result, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Result; + static deserializeBinaryFromReader(message: Result, reader: jspb.BinaryReader): Result; + } + + export namespace Result { + export type AsObject = { + } } + + + export enum MessageCase { + MESSAGE_NOT_SET = 0, + PROGRESS = 1, + TASK_PROGRESS = 2, + RESULT = 3, + } + } export class LibraryUninstallRequest extends jspb.Message { @@ -207,14 +294,11 @@ export class LibraryUninstallRequest extends jspb.Message { clearInstance(): void; getInstance(): cc_arduino_cli_commands_v1_common_pb.Instance | undefined; setInstance(value?: cc_arduino_cli_commands_v1_common_pb.Instance): LibraryUninstallRequest; - getName(): string; setName(value: string): LibraryUninstallRequest; - getVersion(): string; setVersion(value: string): LibraryUninstallRequest; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): LibraryUninstallRequest.AsObject; static toObject(includeInstance: boolean, msg: LibraryUninstallRequest): LibraryUninstallRequest.AsObject; @@ -240,6 +324,12 @@ export class LibraryUninstallResponse extends jspb.Message { getTaskProgress(): cc_arduino_cli_commands_v1_common_pb.TaskProgress | undefined; setTaskProgress(value?: cc_arduino_cli_commands_v1_common_pb.TaskProgress): LibraryUninstallResponse; + hasResult(): boolean; + clearResult(): void; + getResult(): LibraryUninstallResponse.Result | undefined; + setResult(value?: LibraryUninstallResponse.Result): LibraryUninstallResponse; + + getMessageCase(): LibraryUninstallResponse.MessageCase; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): LibraryUninstallResponse.AsObject; @@ -254,7 +344,34 @@ export class LibraryUninstallResponse extends jspb.Message { export namespace LibraryUninstallResponse { export type AsObject = { taskProgress?: cc_arduino_cli_commands_v1_common_pb.TaskProgress.AsObject, + result?: LibraryUninstallResponse.Result.AsObject, } + + + export class Result extends jspb.Message { + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Result.AsObject; + static toObject(includeInstance: boolean, msg: Result): Result.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: Result, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Result; + static deserializeBinaryFromReader(message: Result, reader: jspb.BinaryReader): Result; + } + + export namespace Result { + export type AsObject = { + } + } + + + export enum MessageCase { + MESSAGE_NOT_SET = 0, + TASK_PROGRESS = 1, + RESULT = 2, + } + } export class LibraryUpgradeAllRequest extends jspb.Message { @@ -264,7 +381,6 @@ export class LibraryUpgradeAllRequest extends jspb.Message { getInstance(): cc_arduino_cli_commands_v1_common_pb.Instance | undefined; setInstance(value?: cc_arduino_cli_commands_v1_common_pb.Instance): LibraryUpgradeAllRequest; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): LibraryUpgradeAllRequest.AsObject; static toObject(includeInstance: boolean, msg: LibraryUpgradeAllRequest): LibraryUpgradeAllRequest.AsObject; @@ -288,12 +404,17 @@ export class LibraryUpgradeAllResponse extends jspb.Message { getProgress(): cc_arduino_cli_commands_v1_common_pb.DownloadProgress | undefined; setProgress(value?: cc_arduino_cli_commands_v1_common_pb.DownloadProgress): LibraryUpgradeAllResponse; - hasTaskProgress(): boolean; clearTaskProgress(): void; getTaskProgress(): cc_arduino_cli_commands_v1_common_pb.TaskProgress | undefined; setTaskProgress(value?: cc_arduino_cli_commands_v1_common_pb.TaskProgress): LibraryUpgradeAllResponse; + hasResult(): boolean; + clearResult(): void; + getResult(): LibraryUpgradeAllResponse.Result | undefined; + setResult(value?: LibraryUpgradeAllResponse.Result): LibraryUpgradeAllResponse; + + getMessageCase(): LibraryUpgradeAllResponse.MessageCase; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): LibraryUpgradeAllResponse.AsObject; @@ -309,7 +430,35 @@ export namespace LibraryUpgradeAllResponse { export type AsObject = { progress?: cc_arduino_cli_commands_v1_common_pb.DownloadProgress.AsObject, taskProgress?: cc_arduino_cli_commands_v1_common_pb.TaskProgress.AsObject, + result?: LibraryUpgradeAllResponse.Result.AsObject, } + + + export class Result extends jspb.Message { + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Result.AsObject; + static toObject(includeInstance: boolean, msg: Result): Result.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: Result, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Result; + static deserializeBinaryFromReader(message: Result, reader: jspb.BinaryReader): Result; + } + + export namespace Result { + export type AsObject = { + } + } + + + export enum MessageCase { + MESSAGE_NOT_SET = 0, + PROGRESS = 1, + TASK_PROGRESS = 2, + RESULT = 3, + } + } export class LibraryResolveDependenciesRequest extends jspb.Message { @@ -318,13 +467,12 @@ export class LibraryResolveDependenciesRequest extends jspb.Message { clearInstance(): void; getInstance(): cc_arduino_cli_commands_v1_common_pb.Instance | undefined; setInstance(value?: cc_arduino_cli_commands_v1_common_pb.Instance): LibraryResolveDependenciesRequest; - getName(): string; setName(value: string): LibraryResolveDependenciesRequest; - getVersion(): string; setVersion(value: string): LibraryResolveDependenciesRequest; - + getDoNotUpdateInstalledLibraries(): boolean; + setDoNotUpdateInstalledLibraries(value: boolean): LibraryResolveDependenciesRequest; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): LibraryResolveDependenciesRequest.AsObject; @@ -341,6 +489,7 @@ export namespace LibraryResolveDependenciesRequest { instance?: cc_arduino_cli_commands_v1_common_pb.Instance.AsObject, name: string, version: string, + doNotUpdateInstalledLibraries: boolean, } } @@ -350,7 +499,6 @@ export class LibraryResolveDependenciesResponse extends jspb.Message { setDependenciesList(value: Array<LibraryDependencyStatus>): LibraryResolveDependenciesResponse; addDependencies(value?: LibraryDependencyStatus, index?: number): LibraryDependencyStatus; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): LibraryResolveDependenciesResponse.AsObject; static toObject(includeInstance: boolean, msg: LibraryResolveDependenciesResponse): LibraryResolveDependenciesResponse.AsObject; @@ -370,14 +518,11 @@ export namespace LibraryResolveDependenciesResponse { export class LibraryDependencyStatus extends jspb.Message { getName(): string; setName(value: string): LibraryDependencyStatus; - getVersionRequired(): string; setVersionRequired(value: string): LibraryDependencyStatus; - getVersionInstalled(): string; setVersionInstalled(value: string): LibraryDependencyStatus; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): LibraryDependencyStatus.AsObject; static toObject(includeInstance: boolean, msg: LibraryDependencyStatus): LibraryDependencyStatus.AsObject; @@ -402,10 +547,10 @@ export class LibrarySearchRequest extends jspb.Message { clearInstance(): void; getInstance(): cc_arduino_cli_commands_v1_common_pb.Instance | undefined; setInstance(value?: cc_arduino_cli_commands_v1_common_pb.Instance): LibrarySearchRequest; - - getQuery(): string; - setQuery(value: string): LibrarySearchRequest; - + getOmitReleasesDetails(): boolean; + setOmitReleasesDetails(value: boolean): LibrarySearchRequest; + getSearchArgs(): string; + setSearchArgs(value: string): LibrarySearchRequest; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): LibrarySearchRequest.AsObject; @@ -420,7 +565,8 @@ export class LibrarySearchRequest extends jspb.Message { export namespace LibrarySearchRequest { export type AsObject = { instance?: cc_arduino_cli_commands_v1_common_pb.Instance.AsObject, - query: string, + omitReleasesDetails: boolean, + searchArgs: string, } } @@ -429,11 +575,9 @@ export class LibrarySearchResponse extends jspb.Message { getLibrariesList(): Array<SearchedLibrary>; setLibrariesList(value: Array<SearchedLibrary>): LibrarySearchResponse; addLibraries(value?: SearchedLibrary, index?: number): SearchedLibrary; - getStatus(): LibrarySearchStatus; setStatus(value: LibrarySearchStatus): LibrarySearchResponse; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): LibrarySearchResponse.AsObject; static toObject(includeInstance: boolean, msg: LibrarySearchResponse): LibrarySearchResponse.AsObject; @@ -455,16 +599,17 @@ export class SearchedLibrary extends jspb.Message { getName(): string; setName(value: string): SearchedLibrary; - getReleasesMap(): jspb.Map<string, LibraryRelease>; clearReleasesMap(): void; - hasLatest(): boolean; clearLatest(): void; getLatest(): LibraryRelease | undefined; setLatest(value?: LibraryRelease): SearchedLibrary; - + clearAvailableVersionsList(): void; + getAvailableVersionsList(): Array<string>; + setAvailableVersionsList(value: Array<string>): SearchedLibrary; + addAvailableVersions(value: string, index?: number): string; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): SearchedLibrary.AsObject; @@ -482,61 +627,49 @@ export namespace SearchedLibrary { releasesMap: Array<[string, LibraryRelease.AsObject]>, latest?: LibraryRelease.AsObject, + availableVersionsList: Array<string>, } } export class LibraryRelease extends jspb.Message { getAuthor(): string; setAuthor(value: string): LibraryRelease; - getVersion(): string; setVersion(value: string): LibraryRelease; - getMaintainer(): string; setMaintainer(value: string): LibraryRelease; - getSentence(): string; setSentence(value: string): LibraryRelease; - getParagraph(): string; setParagraph(value: string): LibraryRelease; - getWebsite(): string; setWebsite(value: string): LibraryRelease; - getCategory(): string; setCategory(value: string): LibraryRelease; - clearArchitecturesList(): void; getArchitecturesList(): Array<string>; setArchitecturesList(value: Array<string>): LibraryRelease; addArchitectures(value: string, index?: number): string; - clearTypesList(): void; getTypesList(): Array<string>; setTypesList(value: Array<string>): LibraryRelease; addTypes(value: string, index?: number): string; - hasResources(): boolean; clearResources(): void; getResources(): DownloadResource | undefined; setResources(value?: DownloadResource): LibraryRelease; - getLicense(): string; setLicense(value: string): LibraryRelease; - clearProvidesIncludesList(): void; getProvidesIncludesList(): Array<string>; setProvidesIncludesList(value: Array<string>): LibraryRelease; addProvidesIncludes(value: string, index?: number): string; - clearDependenciesList(): void; getDependenciesList(): Array<LibraryDependency>; setDependenciesList(value: Array<LibraryDependency>): LibraryRelease; addDependencies(value?: LibraryDependency, index?: number): LibraryDependency; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): LibraryRelease.AsObject; static toObject(includeInstance: boolean, msg: LibraryRelease): LibraryRelease.AsObject; @@ -568,11 +701,9 @@ export namespace LibraryRelease { export class LibraryDependency extends jspb.Message { getName(): string; setName(value: string): LibraryDependency; - getVersionConstraint(): string; setVersionConstraint(value: string): LibraryDependency; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): LibraryDependency.AsObject; static toObject(includeInstance: boolean, msg: LibraryDependency): LibraryDependency.AsObject; @@ -593,20 +724,15 @@ export namespace LibraryDependency { export class DownloadResource extends jspb.Message { getUrl(): string; setUrl(value: string): DownloadResource; - getArchiveFilename(): string; setArchiveFilename(value: string): DownloadResource; - getChecksum(): string; setChecksum(value: string): DownloadResource; - getSize(): number; setSize(value: number): DownloadResource; - getCachePath(): string; setCachePath(value: string): DownloadResource; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): DownloadResource.AsObject; static toObject(includeInstance: boolean, msg: DownloadResource): DownloadResource.AsObject; @@ -633,20 +759,15 @@ export class LibraryListRequest extends jspb.Message { clearInstance(): void; getInstance(): cc_arduino_cli_commands_v1_common_pb.Instance | undefined; setInstance(value?: cc_arduino_cli_commands_v1_common_pb.Instance): LibraryListRequest; - getAll(): boolean; setAll(value: boolean): LibraryListRequest; - getUpdatable(): boolean; setUpdatable(value: boolean): LibraryListRequest; - getName(): string; setName(value: string): LibraryListRequest; - getFqbn(): string; setFqbn(value: string): LibraryListRequest; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): LibraryListRequest.AsObject; static toObject(includeInstance: boolean, msg: LibraryListRequest): LibraryListRequest.AsObject; @@ -673,7 +794,6 @@ export class LibraryListResponse extends jspb.Message { setInstalledLibrariesList(value: Array<InstalledLibrary>): LibraryListResponse; addInstalledLibraries(value?: InstalledLibrary, index?: number): InstalledLibrary; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): LibraryListResponse.AsObject; static toObject(includeInstance: boolean, msg: LibraryListResponse): LibraryListResponse.AsObject; @@ -697,13 +817,11 @@ export class InstalledLibrary extends jspb.Message { getLibrary(): Library | undefined; setLibrary(value?: Library): InstalledLibrary; - hasRelease(): boolean; clearRelease(): void; getRelease(): LibraryRelease | undefined; setRelease(value?: LibraryRelease): InstalledLibrary; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): InstalledLibrary.AsObject; static toObject(includeInstance: boolean, msg: InstalledLibrary): InstalledLibrary.AsObject; @@ -724,92 +842,66 @@ export namespace InstalledLibrary { export class Library extends jspb.Message { getName(): string; setName(value: string): Library; - getAuthor(): string; setAuthor(value: string): Library; - getMaintainer(): string; setMaintainer(value: string): Library; - getSentence(): string; setSentence(value: string): Library; - getParagraph(): string; setParagraph(value: string): Library; - getWebsite(): string; setWebsite(value: string): Library; - getCategory(): string; setCategory(value: string): Library; - clearArchitecturesList(): void; getArchitecturesList(): Array<string>; setArchitecturesList(value: Array<string>): Library; addArchitectures(value: string, index?: number): string; - clearTypesList(): void; getTypesList(): Array<string>; setTypesList(value: Array<string>): Library; addTypes(value: string, index?: number): string; - getInstallDir(): string; setInstallDir(value: string): Library; - getSourceDir(): string; setSourceDir(value: string): Library; - getUtilityDir(): string; setUtilityDir(value: string): Library; - getContainerPlatform(): string; setContainerPlatform(value: string): Library; - - getRealName(): string; - setRealName(value: string): Library; - getDotALinkage(): boolean; setDotALinkage(value: boolean): Library; - getPrecompiled(): boolean; setPrecompiled(value: boolean): Library; - getLdFlags(): string; setLdFlags(value: string): Library; - getIsLegacy(): boolean; setIsLegacy(value: boolean): Library; - getVersion(): string; setVersion(value: string): Library; - getLicense(): string; setLicense(value: string): Library; - getPropertiesMap(): jspb.Map<string, string>; clearPropertiesMap(): void; - getLocation(): LibraryLocation; setLocation(value: LibraryLocation): Library; - getLayout(): LibraryLayout; setLayout(value: LibraryLayout): Library; - clearExamplesList(): void; getExamplesList(): Array<string>; setExamplesList(value: Array<string>): Library; addExamples(value: string, index?: number): string; - clearProvidesIncludesList(): void; getProvidesIncludesList(): Array<string>; setProvidesIncludesList(value: Array<string>): Library; addProvidesIncludes(value: string, index?: number): string; - getCompatibleWithMap(): jspb.Map<string, boolean>; clearCompatibleWithMap(): void; - + getInDevelopment(): boolean; + setInDevelopment(value: boolean): Library; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): Library.AsObject; @@ -836,7 +928,6 @@ export namespace Library { sourceDir: string, utilityDir: string, containerPlatform: string, - realName: string, dotALinkage: boolean, precompiled: boolean, ldFlags: string, @@ -851,6 +942,7 @@ export namespace Library { providesIncludesList: Array<string>, compatibleWithMap: Array<[string, boolean]>, + inDevelopment: boolean, } } @@ -860,14 +952,11 @@ export class ZipLibraryInstallRequest extends jspb.Message { clearInstance(): void; getInstance(): cc_arduino_cli_commands_v1_common_pb.Instance | undefined; setInstance(value?: cc_arduino_cli_commands_v1_common_pb.Instance): ZipLibraryInstallRequest; - getPath(): string; setPath(value: string): ZipLibraryInstallRequest; - getOverwrite(): boolean; setOverwrite(value: boolean): ZipLibraryInstallRequest; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): ZipLibraryInstallRequest.AsObject; static toObject(includeInstance: boolean, msg: ZipLibraryInstallRequest): ZipLibraryInstallRequest.AsObject; @@ -893,6 +982,12 @@ export class ZipLibraryInstallResponse extends jspb.Message { getTaskProgress(): cc_arduino_cli_commands_v1_common_pb.TaskProgress | undefined; setTaskProgress(value?: cc_arduino_cli_commands_v1_common_pb.TaskProgress): ZipLibraryInstallResponse; + hasResult(): boolean; + clearResult(): void; + getResult(): ZipLibraryInstallResponse.Result | undefined; + setResult(value?: ZipLibraryInstallResponse.Result): ZipLibraryInstallResponse; + + getMessageCase(): ZipLibraryInstallResponse.MessageCase; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): ZipLibraryInstallResponse.AsObject; @@ -907,7 +1002,34 @@ export class ZipLibraryInstallResponse extends jspb.Message { export namespace ZipLibraryInstallResponse { export type AsObject = { taskProgress?: cc_arduino_cli_commands_v1_common_pb.TaskProgress.AsObject, + result?: ZipLibraryInstallResponse.Result.AsObject, + } + + + export class Result extends jspb.Message { + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Result.AsObject; + static toObject(includeInstance: boolean, msg: Result): Result.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: Result, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Result; + static deserializeBinaryFromReader(message: Result, reader: jspb.BinaryReader): Result; + } + + export namespace Result { + export type AsObject = { + } + } + + + export enum MessageCase { + MESSAGE_NOT_SET = 0, + TASK_PROGRESS = 1, + RESULT = 2, } + } export class GitLibraryInstallRequest extends jspb.Message { @@ -916,14 +1038,11 @@ export class GitLibraryInstallRequest extends jspb.Message { clearInstance(): void; getInstance(): cc_arduino_cli_commands_v1_common_pb.Instance | undefined; setInstance(value?: cc_arduino_cli_commands_v1_common_pb.Instance): GitLibraryInstallRequest; - getUrl(): string; setUrl(value: string): GitLibraryInstallRequest; - getOverwrite(): boolean; setOverwrite(value: boolean): GitLibraryInstallRequest; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): GitLibraryInstallRequest.AsObject; static toObject(includeInstance: boolean, msg: GitLibraryInstallRequest): GitLibraryInstallRequest.AsObject; @@ -949,6 +1068,12 @@ export class GitLibraryInstallResponse extends jspb.Message { getTaskProgress(): cc_arduino_cli_commands_v1_common_pb.TaskProgress | undefined; setTaskProgress(value?: cc_arduino_cli_commands_v1_common_pb.TaskProgress): GitLibraryInstallResponse; + hasResult(): boolean; + clearResult(): void; + getResult(): GitLibraryInstallResponse.Result | undefined; + setResult(value?: GitLibraryInstallResponse.Result): GitLibraryInstallResponse; + + getMessageCase(): GitLibraryInstallResponse.MessageCase; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): GitLibraryInstallResponse.AsObject; @@ -963,7 +1088,34 @@ export class GitLibraryInstallResponse extends jspb.Message { export namespace GitLibraryInstallResponse { export type AsObject = { taskProgress?: cc_arduino_cli_commands_v1_common_pb.TaskProgress.AsObject, + result?: GitLibraryInstallResponse.Result.AsObject, } + + + export class Result extends jspb.Message { + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Result.AsObject; + static toObject(includeInstance: boolean, msg: Result): Result.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: Result, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Result; + static deserializeBinaryFromReader(message: Result, reader: jspb.BinaryReader): Result; + } + + export namespace Result { + export type AsObject = { + } + } + + + export enum MessageCase { + MESSAGE_NOT_SET = 0, + TASK_PROGRESS = 1, + RESULT = 2, + } + } export enum LibraryInstallLocation { diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/lib_pb.js b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/lib_pb.js index 6c9c870f1..74e4f2818 100644 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/lib_pb.js +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/lib_pb.js @@ -13,22 +13,34 @@ var jspb = require('google-protobuf'); var goog = jspb; -var global = Function('return this')(); +var global = (function() { + if (this) { return this; } + if (typeof window !== 'undefined') { return window; } + if (typeof global !== 'undefined') { return global; } + if (typeof self !== 'undefined') { return self; } + return Function('return this')(); +}.call(null)); var cc_arduino_cli_commands_v1_common_pb = require('../../../../../cc/arduino/cli/commands/v1/common_pb.js'); goog.object.extend(proto, cc_arduino_cli_commands_v1_common_pb); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.DownloadResource', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.GitLibraryInstallRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.MessageCase', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.Result', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.InstalledLibrary', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.Library', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.LibraryDependency', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.LibraryDependencyStatus', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.LibraryDownloadRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.MessageCase', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.Result', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.LibraryInstallLocation', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.LibraryInstallRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.LibraryInstallResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.MessageCase', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.Result', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.LibraryLayout', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.LibraryListRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.LibraryListResponse', null, global); @@ -41,13 +53,21 @@ goog.exportSymbol('proto.cc.arduino.cli.commands.v1.LibrarySearchResponse', null goog.exportSymbol('proto.cc.arduino.cli.commands.v1.LibrarySearchStatus', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.LibraryUninstallRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.MessageCase', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.Result', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.MessageCase', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.Result', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.LibraryUpgradeRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.MessageCase', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.Result', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.SearchedLibrary', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.ZipLibraryInstallRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.MessageCase', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.Result', null, global); /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -80,7 +100,7 @@ if (goog.DEBUG && !COMPILED) { * @constructor */ proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.oneofGroups_); }; goog.inherits(proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { @@ -90,6 +110,27 @@ if (goog.DEBUG && !COMPILED) { */ proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.displayName = 'proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse'; } +/** + * 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.LibraryDownloadResponse.Result = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.Result, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.Result.displayName = 'proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.Result'; +} /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -122,7 +163,7 @@ if (goog.DEBUG && !COMPILED) { * @constructor */ proto.cc.arduino.cli.commands.v1.LibraryInstallResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.oneofGroups_); }; goog.inherits(proto.cc.arduino.cli.commands.v1.LibraryInstallResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { @@ -132,6 +173,27 @@ if (goog.DEBUG && !COMPILED) { */ proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.displayName = 'proto.cc.arduino.cli.commands.v1.LibraryInstallResponse'; } +/** + * 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.LibraryInstallResponse.Result = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.Result, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.Result.displayName = 'proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.Result'; +} /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -164,7 +226,7 @@ if (goog.DEBUG && !COMPILED) { * @constructor */ proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.oneofGroups_); }; goog.inherits(proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { @@ -174,6 +236,27 @@ if (goog.DEBUG && !COMPILED) { */ proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.displayName = 'proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse'; } +/** + * 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.LibraryUpgradeResponse.Result = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.Result, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.Result.displayName = 'proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.Result'; +} /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -206,7 +289,7 @@ if (goog.DEBUG && !COMPILED) { * @constructor */ proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.oneofGroups_); }; goog.inherits(proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { @@ -216,6 +299,27 @@ if (goog.DEBUG && !COMPILED) { */ proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.displayName = 'proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse'; } +/** + * 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.LibraryUninstallResponse.Result = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.Result, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.Result.displayName = 'proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.Result'; +} /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -248,7 +352,7 @@ if (goog.DEBUG && !COMPILED) { * @constructor */ proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.oneofGroups_); }; goog.inherits(proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { @@ -258,6 +362,27 @@ if (goog.DEBUG && !COMPILED) { */ proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.displayName = 'proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse'; } +/** + * 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.LibraryUpgradeAllResponse.Result = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.Result, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.Result.displayName = 'proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.Result'; +} /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -374,7 +499,7 @@ if (goog.DEBUG && !COMPILED) { * @constructor */ proto.cc.arduino.cli.commands.v1.SearchedLibrary = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); + jspb.Message.initialize(this, opt_data, 0, -1, proto.cc.arduino.cli.commands.v1.SearchedLibrary.repeatedFields_, null); }; goog.inherits(proto.cc.arduino.cli.commands.v1.SearchedLibrary, jspb.Message); if (goog.DEBUG && !COMPILED) { @@ -563,7 +688,7 @@ if (goog.DEBUG && !COMPILED) { * @constructor */ proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.oneofGroups_); }; goog.inherits(proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { @@ -573,6 +698,27 @@ if (goog.DEBUG && !COMPILED) { */ proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.displayName = 'proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse'; } +/** + * 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.ZipLibraryInstallResponse.Result = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.Result, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.Result.displayName = 'proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.Result'; +} /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -605,7 +751,7 @@ if (goog.DEBUG && !COMPILED) { * @constructor */ proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.oneofGroups_); }; goog.inherits(proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { @@ -615,6 +761,27 @@ if (goog.DEBUG && !COMPILED) { */ proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.displayName = 'proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse'; } +/** + * 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.GitLibraryInstallResponse.Result = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.Result, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.Result.displayName = 'proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.Result'; +} @@ -827,6 +994,32 @@ proto.cc.arduino.cli.commands.v1.LibraryDownloadRequest.prototype.setVersion = f +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.MessageCase = { + MESSAGE_NOT_SET: 0, + PROGRESS: 1, + RESULT: 2 +}; + +/** + * @return {proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.MessageCase} + */ +proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.prototype.getMessageCase = function() { + return /** @type {proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.MessageCase} */(jspb.Message.computeOneofCase(this, proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.oneofGroups_[0])); +}; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -858,7 +1051,8 @@ proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.prototype.toObject = fu */ proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.toObject = function(includeInstance, msg) { var f, obj = { - progress: (f = msg.getProgress()) && cc_arduino_cli_commands_v1_common_pb.DownloadProgress.toObject(includeInstance, f) + progress: (f = msg.getProgress()) && cc_arduino_cli_commands_v1_common_pb.DownloadProgress.toObject(includeInstance, f), + result: (f = msg.getResult()) && proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.Result.toObject(includeInstance, f) }; if (includeInstance) { @@ -900,6 +1094,11 @@ proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.deserializeBinaryFromRe reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.DownloadProgress.deserializeBinaryFromReader); msg.setProgress(value); break; + case 2: + var value = new proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.Result; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.Result.deserializeBinaryFromReader); + msg.setResult(value); + break; default: reader.skipField(); break; @@ -937,43 +1136,14 @@ proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.serializeBinaryToWriter cc_arduino_cli_commands_v1_common_pb.DownloadProgress.serializeBinaryToWriter ); } -}; - - -/** - * optional DownloadProgress progress = 1; - * @return {?proto.cc.arduino.cli.commands.v1.DownloadProgress} - */ -proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.prototype.getProgress = function() { - return /** @type{?proto.cc.arduino.cli.commands.v1.DownloadProgress} */ ( - jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.DownloadProgress, 1)); -}; - - -/** - * @param {?proto.cc.arduino.cli.commands.v1.DownloadProgress|undefined} value - * @return {!proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse} returns this -*/ -proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.prototype.setProgress = function(value) { - return jspb.Message.setWrapperField(this, 1, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse} returns this - */ -proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.prototype.clearProgress = function() { - return this.setProgress(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.prototype.hasProgress = function() { - return jspb.Message.getField(this, 1) != null; + f = message.getResult(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.Result.serializeBinaryToWriter + ); + } }; @@ -993,8 +1163,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.LibraryInstallRequest.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.LibraryInstallRequest.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.Result.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.Result.toObject(opt_includeInstance, this); }; @@ -1003,18 +1173,13 @@ proto.cc.arduino.cli.commands.v1.LibraryInstallRequest.prototype.toObject = func * @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.LibraryInstallRequest} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.Result} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.LibraryInstallRequest.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.Result.toObject = function(includeInstance, msg) { var f, obj = { - instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f), - name: jspb.Message.getFieldWithDefault(msg, 2, ""), - version: jspb.Message.getFieldWithDefault(msg, 3, ""), - noDeps: jspb.Message.getBooleanFieldWithDefault(msg, 4, false), - noOverwrite: jspb.Message.getBooleanFieldWithDefault(msg, 5, false), - installLocation: jspb.Message.getFieldWithDefault(msg, 6, 0) + }; if (includeInstance) { @@ -1028,54 +1193,29 @@ proto.cc.arduino.cli.commands.v1.LibraryInstallRequest.toObject = function(inclu /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.LibraryInstallRequest} + * @return {!proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.Result} */ -proto.cc.arduino.cli.commands.v1.LibraryInstallRequest.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.Result.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.LibraryInstallRequest; - return proto.cc.arduino.cli.commands.v1.LibraryInstallRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.Result; + return proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.Result.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.LibraryInstallRequest} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.Result} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.LibraryInstallRequest} + * @return {!proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.Result} */ -proto.cc.arduino.cli.commands.v1.LibraryInstallRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.Result.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 = /** @type {string} */ (reader.readString()); - msg.setName(value); - break; - case 3: - var value = /** @type {string} */ (reader.readString()); - msg.setVersion(value); - break; - case 4: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setNoDeps(value); - break; - case 5: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setNoOverwrite(value); - break; - case 6: - var value = /** @type {!proto.cc.arduino.cli.commands.v1.LibraryInstallLocation} */ (reader.readEnum()); - msg.setInstallLocation(value); - break; default: reader.skipField(); break; @@ -1089,9 +1229,9 @@ proto.cc.arduino.cli.commands.v1.LibraryInstallRequest.deserializeBinaryFromRead * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.LibraryInstallRequest.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.Result.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.LibraryInstallRequest.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.Result.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -1099,28 +1239,233 @@ proto.cc.arduino.cli.commands.v1.LibraryInstallRequest.prototype.serializeBinary /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.LibraryInstallRequest} message + * @param {!proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.Result} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.LibraryInstallRequest.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.Result.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.getName(); - if (f.length > 0) { - writer.writeString( - 2, - f - ); - } - f = message.getVersion(); +}; + + +/** + * optional DownloadProgress progress = 1; + * @return {?proto.cc.arduino.cli.commands.v1.DownloadProgress} + */ +proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.prototype.getProgress = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.DownloadProgress} */ ( + jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.DownloadProgress, 1)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.DownloadProgress|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse} returns this +*/ +proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.prototype.setProgress = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.prototype.clearProgress = function() { + return this.setProgress(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.prototype.hasProgress = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional Result result = 2; + * @return {?proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.Result} + */ +proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.prototype.getResult = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.Result} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.Result, 2)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.Result|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse} returns this +*/ +proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.prototype.setResult = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.prototype.clearResult = function() { + return this.setResult(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.prototype.hasResult = function() { + return jspb.Message.getField(this, 2) != null; +}; + + + + + +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.LibraryInstallRequest.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.LibraryInstallRequest.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.LibraryInstallRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.LibraryInstallRequest.toObject = function(includeInstance, msg) { + var f, obj = { + instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f), + name: jspb.Message.getFieldWithDefault(msg, 2, ""), + version: jspb.Message.getFieldWithDefault(msg, 3, ""), + noDeps: jspb.Message.getBooleanFieldWithDefault(msg, 4, false), + noOverwrite: jspb.Message.getBooleanFieldWithDefault(msg, 5, false), + installLocation: jspb.Message.getFieldWithDefault(msg, 6, 0) + }; + + 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.LibraryInstallRequest} + */ +proto.cc.arduino.cli.commands.v1.LibraryInstallRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.LibraryInstallRequest; + return proto.cc.arduino.cli.commands.v1.LibraryInstallRequest.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.LibraryInstallRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.LibraryInstallRequest} + */ +proto.cc.arduino.cli.commands.v1.LibraryInstallRequest.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 = /** @type {string} */ (reader.readString()); + msg.setName(value); + break; + case 3: + var value = /** @type {string} */ (reader.readString()); + msg.setVersion(value); + break; + case 4: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setNoDeps(value); + break; + case 5: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setNoOverwrite(value); + break; + case 6: + var value = /** @type {!proto.cc.arduino.cli.commands.v1.LibraryInstallLocation} */ (reader.readEnum()); + msg.setInstallLocation(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.LibraryInstallRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.LibraryInstallRequest.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.LibraryInstallRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.LibraryInstallRequest.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.getName(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } + f = message.getVersion(); if (f.length > 0) { writer.writeString( 3, @@ -1279,6 +1624,33 @@ proto.cc.arduino.cli.commands.v1.LibraryInstallRequest.prototype.setInstallLocat +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.oneofGroups_ = [[1,2,3]]; + +/** + * @enum {number} + */ +proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.MessageCase = { + MESSAGE_NOT_SET: 0, + PROGRESS: 1, + TASK_PROGRESS: 2, + RESULT: 3 +}; + +/** + * @return {proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.MessageCase} + */ +proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.prototype.getMessageCase = function() { + return /** @type {proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.MessageCase} */(jspb.Message.computeOneofCase(this, proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.oneofGroups_[0])); +}; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -1311,7 +1683,8 @@ proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.prototype.toObject = fun proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.toObject = function(includeInstance, msg) { var f, obj = { progress: (f = msg.getProgress()) && cc_arduino_cli_commands_v1_common_pb.DownloadProgress.toObject(includeInstance, f), - taskProgress: (f = msg.getTaskProgress()) && cc_arduino_cli_commands_v1_common_pb.TaskProgress.toObject(includeInstance, f) + taskProgress: (f = msg.getTaskProgress()) && cc_arduino_cli_commands_v1_common_pb.TaskProgress.toObject(includeInstance, f), + result: (f = msg.getResult()) && proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.Result.toObject(includeInstance, f) }; if (includeInstance) { @@ -1358,6 +1731,11 @@ proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.deserializeBinaryFromRea reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.TaskProgress.deserializeBinaryFromReader); msg.setTaskProgress(value); break; + case 3: + var value = new proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.Result; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.Result.deserializeBinaryFromReader); + msg.setResult(value); + break; default: reader.skipField(); break; @@ -1403,6 +1781,115 @@ proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.serializeBinaryToWriter cc_arduino_cli_commands_v1_common_pb.TaskProgress.serializeBinaryToWriter ); } + f = message.getResult(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.Result.serializeBinaryToWriter + ); + } +}; + + + + + +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.LibraryInstallResponse.Result.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.Result.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.LibraryInstallResponse.Result} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.Result.toObject = function(includeInstance, msg) { + var f, obj = { + + }; + + 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.LibraryInstallResponse.Result} + */ +proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.Result.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.Result; + return proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.Result.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.LibraryInstallResponse.Result} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.Result} + */ +proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.Result.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.Result.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.Result.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.LibraryInstallResponse.Result} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.Result.serializeBinaryToWriter = function(message, writer) { + var f = undefined; }; @@ -1421,7 +1908,7 @@ proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.prototype.getProgress = * @return {!proto.cc.arduino.cli.commands.v1.LibraryInstallResponse} returns this */ proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.prototype.setProgress = function(value) { - return jspb.Message.setWrapperField(this, 1, value); + return jspb.Message.setOneofWrapperField(this, 1, proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.oneofGroups_[0], value); }; @@ -1458,7 +1945,7 @@ proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.prototype.getTaskProgres * @return {!proto.cc.arduino.cli.commands.v1.LibraryInstallResponse} returns this */ proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.prototype.setTaskProgress = function(value) { - return jspb.Message.setWrapperField(this, 2, value); + return jspb.Message.setOneofWrapperField(this, 2, proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.oneofGroups_[0], value); }; @@ -1480,6 +1967,43 @@ proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.prototype.hasTaskProgres }; +/** + * optional Result result = 3; + * @return {?proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.Result} + */ +proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.prototype.getResult = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.Result} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.Result, 3)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.Result|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.LibraryInstallResponse} returns this +*/ +proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.prototype.setResult = function(value) { + return jspb.Message.setOneofWrapperField(this, 3, proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.LibraryInstallResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.prototype.clearResult = function() { + return this.setResult(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.prototype.hasResult = function() { + return jspb.Message.getField(this, 3) != null; +}; + + @@ -1692,6 +2216,33 @@ proto.cc.arduino.cli.commands.v1.LibraryUpgradeRequest.prototype.setNoDeps = fun +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.oneofGroups_ = [[1,2,3]]; + +/** + * @enum {number} + */ +proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.MessageCase = { + MESSAGE_NOT_SET: 0, + PROGRESS: 1, + TASK_PROGRESS: 2, + RESULT: 3 +}; + +/** + * @return {proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.MessageCase} + */ +proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.prototype.getMessageCase = function() { + return /** @type {proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.MessageCase} */(jspb.Message.computeOneofCase(this, proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.oneofGroups_[0])); +}; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -1724,7 +2275,8 @@ proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.prototype.toObject = fun proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.toObject = function(includeInstance, msg) { var f, obj = { progress: (f = msg.getProgress()) && cc_arduino_cli_commands_v1_common_pb.DownloadProgress.toObject(includeInstance, f), - taskProgress: (f = msg.getTaskProgress()) && cc_arduino_cli_commands_v1_common_pb.TaskProgress.toObject(includeInstance, f) + taskProgress: (f = msg.getTaskProgress()) && cc_arduino_cli_commands_v1_common_pb.TaskProgress.toObject(includeInstance, f), + result: (f = msg.getResult()) && proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.Result.toObject(includeInstance, f) }; if (includeInstance) { @@ -1771,6 +2323,11 @@ proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.deserializeBinaryFromRea reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.TaskProgress.deserializeBinaryFromReader); msg.setTaskProgress(value); break; + case 3: + var value = new proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.Result; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.Result.deserializeBinaryFromReader); + msg.setResult(value); + break; default: reader.skipField(); break; @@ -1816,6 +2373,115 @@ proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.serializeBinaryToWriter cc_arduino_cli_commands_v1_common_pb.TaskProgress.serializeBinaryToWriter ); } + f = message.getResult(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.Result.serializeBinaryToWriter + ); + } +}; + + + + + +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.LibraryUpgradeResponse.Result.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.Result.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.LibraryUpgradeResponse.Result} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.Result.toObject = function(includeInstance, msg) { + var f, obj = { + + }; + + 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.LibraryUpgradeResponse.Result} + */ +proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.Result.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.Result; + return proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.Result.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.LibraryUpgradeResponse.Result} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.Result} + */ +proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.Result.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.Result.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.Result.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.LibraryUpgradeResponse.Result} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.Result.serializeBinaryToWriter = function(message, writer) { + var f = undefined; }; @@ -1834,7 +2500,7 @@ proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.prototype.getProgress = * @return {!proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse} returns this */ proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.prototype.setProgress = function(value) { - return jspb.Message.setWrapperField(this, 1, value); + return jspb.Message.setOneofWrapperField(this, 1, proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.oneofGroups_[0], value); }; @@ -1871,7 +2537,7 @@ proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.prototype.getTaskProgres * @return {!proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse} returns this */ proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.prototype.setTaskProgress = function(value) { - return jspb.Message.setWrapperField(this, 2, value); + return jspb.Message.setOneofWrapperField(this, 2, proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.oneofGroups_[0], value); }; @@ -1893,6 +2559,43 @@ proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.prototype.hasTaskProgres }; +/** + * optional Result result = 3; + * @return {?proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.Result} + */ +proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.prototype.getResult = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.Result} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.Result, 3)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.Result|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse} returns this +*/ +proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.prototype.setResult = function(value) { + return jspb.Message.setOneofWrapperField(this, 3, proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.prototype.clearResult = function() { + return this.setResult(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.prototype.hasResult = function() { + return jspb.Message.getField(this, 3) != null; +}; + + @@ -2105,6 +2808,32 @@ proto.cc.arduino.cli.commands.v1.LibraryUninstallRequest.prototype.setVersion = +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.MessageCase = { + MESSAGE_NOT_SET: 0, + TASK_PROGRESS: 1, + RESULT: 2 +}; + +/** + * @return {proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.MessageCase} + */ +proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.prototype.getMessageCase = function() { + return /** @type {proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.MessageCase} */(jspb.Message.computeOneofCase(this, proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.oneofGroups_[0])); +}; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -2136,7 +2865,8 @@ proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.prototype.toObject = f */ proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.toObject = function(includeInstance, msg) { var f, obj = { - taskProgress: (f = msg.getTaskProgress()) && cc_arduino_cli_commands_v1_common_pb.TaskProgress.toObject(includeInstance, f) + taskProgress: (f = msg.getTaskProgress()) && cc_arduino_cli_commands_v1_common_pb.TaskProgress.toObject(includeInstance, f), + result: (f = msg.getResult()) && proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.Result.toObject(includeInstance, f) }; if (includeInstance) { @@ -2178,6 +2908,11 @@ proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.deserializeBinaryFromR reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.TaskProgress.deserializeBinaryFromReader); msg.setTaskProgress(value); break; + case 2: + var value = new proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.Result; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.Result.deserializeBinaryFromReader); + msg.setResult(value); + break; default: reader.skipField(); break; @@ -2215,6 +2950,115 @@ proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.serializeBinaryToWrite cc_arduino_cli_commands_v1_common_pb.TaskProgress.serializeBinaryToWriter ); } + f = message.getResult(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.Result.serializeBinaryToWriter + ); + } +}; + + + + + +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.LibraryUninstallResponse.Result.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.Result.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.LibraryUninstallResponse.Result} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.Result.toObject = function(includeInstance, msg) { + var f, obj = { + + }; + + 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.LibraryUninstallResponse.Result} + */ +proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.Result.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.Result; + return proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.Result.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.LibraryUninstallResponse.Result} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.Result} + */ +proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.Result.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.Result.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.Result.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.LibraryUninstallResponse.Result} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.Result.serializeBinaryToWriter = function(message, writer) { + var f = undefined; }; @@ -2233,7 +3077,7 @@ proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.prototype.getTaskProgr * @return {!proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse} returns this */ proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.prototype.setTaskProgress = function(value) { - return jspb.Message.setWrapperField(this, 1, value); + return jspb.Message.setOneofWrapperField(this, 1, proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.oneofGroups_[0], value); }; @@ -2255,6 +3099,43 @@ proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.prototype.hasTaskProgr }; +/** + * optional Result result = 2; + * @return {?proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.Result} + */ +proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.prototype.getResult = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.Result} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.Result, 2)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.Result|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse} returns this +*/ +proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.prototype.setResult = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.prototype.clearResult = function() { + return this.setResult(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.prototype.hasResult = function() { + return jspb.Message.getField(this, 2) != null; +}; + + @@ -2398,11 +3279,180 @@ proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllRequest.prototype.clearInstanc /** - * Returns whether this field is set. - * @return {boolean} + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllRequest.prototype.hasInstance = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.oneofGroups_ = [[1,2,3]]; + +/** + * @enum {number} + */ +proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.MessageCase = { + MESSAGE_NOT_SET: 0, + PROGRESS: 1, + TASK_PROGRESS: 2, + RESULT: 3 +}; + +/** + * @return {proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.MessageCase} + */ +proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.prototype.getMessageCase = function() { + return /** @type {proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.MessageCase} */(jspb.Message.computeOneofCase(this, proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.oneofGroups_[0])); +}; + + + +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.LibraryUpgradeAllResponse.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.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.LibraryUpgradeAllResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.toObject = function(includeInstance, msg) { + var f, obj = { + progress: (f = msg.getProgress()) && cc_arduino_cli_commands_v1_common_pb.DownloadProgress.toObject(includeInstance, f), + taskProgress: (f = msg.getTaskProgress()) && cc_arduino_cli_commands_v1_common_pb.TaskProgress.toObject(includeInstance, f), + result: (f = msg.getResult()) && proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.Result.toObject(includeInstance, f) + }; + + 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.LibraryUpgradeAllResponse} + */ +proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse; + return proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.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.LibraryUpgradeAllResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse} + */ +proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.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.DownloadProgress; + reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.DownloadProgress.deserializeBinaryFromReader); + msg.setProgress(value); + break; + case 2: + var value = new cc_arduino_cli_commands_v1_common_pb.TaskProgress; + reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.TaskProgress.deserializeBinaryFromReader); + msg.setTaskProgress(value); + break; + case 3: + var value = new proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.Result; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.Result.deserializeBinaryFromReader); + msg.setResult(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.LibraryUpgradeAllResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.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.LibraryUpgradeAllResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllRequest.prototype.hasInstance = function() { - return jspb.Message.getField(this, 1) != null; +proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getProgress(); + if (f != null) { + writer.writeMessage( + 1, + f, + cc_arduino_cli_commands_v1_common_pb.DownloadProgress.serializeBinaryToWriter + ); + } + f = message.getTaskProgress(); + if (f != null) { + writer.writeMessage( + 2, + f, + cc_arduino_cli_commands_v1_common_pb.TaskProgress.serializeBinaryToWriter + ); + } + f = message.getResult(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.Result.serializeBinaryToWriter + ); + } }; @@ -2422,8 +3472,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.Result.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.Result.toObject(opt_includeInstance, this); }; @@ -2432,14 +3482,13 @@ proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.prototype.toObject = * @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.LibraryUpgradeAllResponse} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.Result} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.Result.toObject = function(includeInstance, msg) { var f, obj = { - progress: (f = msg.getProgress()) && cc_arduino_cli_commands_v1_common_pb.DownloadProgress.toObject(includeInstance, f), - taskProgress: (f = msg.getTaskProgress()) && cc_arduino_cli_commands_v1_common_pb.TaskProgress.toObject(includeInstance, f) + }; if (includeInstance) { @@ -2453,39 +3502,29 @@ proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.toObject = function(i /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse} + * @return {!proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.Result} */ -proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.Result.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse; - return proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.Result; + return proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.Result.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.LibraryUpgradeAllResponse} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.Result} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse} + * @return {!proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.Result} */ -proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.Result.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.DownloadProgress; - reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.DownloadProgress.deserializeBinaryFromReader); - msg.setProgress(value); - break; - case 2: - var value = new cc_arduino_cli_commands_v1_common_pb.TaskProgress; - reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.TaskProgress.deserializeBinaryFromReader); - msg.setTaskProgress(value); - break; default: reader.skipField(); break; @@ -2499,9 +3538,9 @@ proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.deserializeBinaryFrom * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.Result.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.Result.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -2509,28 +3548,12 @@ proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.prototype.serializeBi /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse} message + * @param {!proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.Result} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.Result.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getProgress(); - if (f != null) { - writer.writeMessage( - 1, - f, - cc_arduino_cli_commands_v1_common_pb.DownloadProgress.serializeBinaryToWriter - ); - } - f = message.getTaskProgress(); - if (f != null) { - writer.writeMessage( - 2, - f, - cc_arduino_cli_commands_v1_common_pb.TaskProgress.serializeBinaryToWriter - ); - } }; @@ -2549,7 +3572,7 @@ proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.prototype.getProgress * @return {!proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse} returns this */ proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.prototype.setProgress = function(value) { - return jspb.Message.setWrapperField(this, 1, value); + return jspb.Message.setOneofWrapperField(this, 1, proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.oneofGroups_[0], value); }; @@ -2586,7 +3609,7 @@ proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.prototype.getTaskProg * @return {!proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse} returns this */ proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.prototype.setTaskProgress = function(value) { - return jspb.Message.setWrapperField(this, 2, value); + return jspb.Message.setOneofWrapperField(this, 2, proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.oneofGroups_[0], value); }; @@ -2608,6 +3631,43 @@ proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.prototype.hasTaskProg }; +/** + * optional Result result = 3; + * @return {?proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.Result} + */ +proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.prototype.getResult = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.Result} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.Result, 3)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.Result|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse} returns this +*/ +proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.prototype.setResult = function(value) { + return jspb.Message.setOneofWrapperField(this, 3, proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.prototype.clearResult = function() { + return this.setResult(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.prototype.hasResult = function() { + return jspb.Message.getField(this, 3) != null; +}; + + @@ -2642,7 +3702,8 @@ proto.cc.arduino.cli.commands.v1.LibraryResolveDependenciesRequest.toObject = fu var f, obj = { instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f), name: jspb.Message.getFieldWithDefault(msg, 2, ""), - version: jspb.Message.getFieldWithDefault(msg, 3, "") + version: jspb.Message.getFieldWithDefault(msg, 3, ""), + doNotUpdateInstalledLibraries: jspb.Message.getBooleanFieldWithDefault(msg, 4, false) }; if (includeInstance) { @@ -2692,6 +3753,10 @@ proto.cc.arduino.cli.commands.v1.LibraryResolveDependenciesRequest.deserializeBi var value = /** @type {string} */ (reader.readString()); msg.setVersion(value); break; + case 4: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setDoNotUpdateInstalledLibraries(value); + break; default: reader.skipField(); break; @@ -2743,6 +3808,13 @@ proto.cc.arduino.cli.commands.v1.LibraryResolveDependenciesRequest.serializeBina f ); } + f = message.getDoNotUpdateInstalledLibraries(); + if (f) { + writer.writeBool( + 4, + f + ); + } }; @@ -2819,6 +3891,24 @@ proto.cc.arduino.cli.commands.v1.LibraryResolveDependenciesRequest.prototype.set }; +/** + * optional bool do_not_update_installed_libraries = 4; + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.LibraryResolveDependenciesRequest.prototype.getDoNotUpdateInstalledLibraries = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 4, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.LibraryResolveDependenciesRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.LibraryResolveDependenciesRequest.prototype.setDoNotUpdateInstalledLibraries = function(value) { + return jspb.Message.setProto3BooleanField(this, 4, value); +}; + + /** * List of repeated fields within this message type. @@ -3202,7 +4292,8 @@ proto.cc.arduino.cli.commands.v1.LibrarySearchRequest.prototype.toObject = funct proto.cc.arduino.cli.commands.v1.LibrarySearchRequest.toObject = function(includeInstance, msg) { var f, obj = { instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f), - query: jspb.Message.getFieldWithDefault(msg, 2, "") + omitReleasesDetails: jspb.Message.getBooleanFieldWithDefault(msg, 2, false), + searchArgs: jspb.Message.getFieldWithDefault(msg, 3, "") }; if (includeInstance) { @@ -3245,8 +4336,12 @@ proto.cc.arduino.cli.commands.v1.LibrarySearchRequest.deserializeBinaryFromReade msg.setInstance(value); break; case 2: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setOmitReleasesDetails(value); + break; + case 3: var value = /** @type {string} */ (reader.readString()); - msg.setQuery(value); + msg.setSearchArgs(value); break; default: reader.skipField(); @@ -3285,10 +4380,17 @@ proto.cc.arduino.cli.commands.v1.LibrarySearchRequest.serializeBinaryToWriter = cc_arduino_cli_commands_v1_common_pb.Instance.serializeBinaryToWriter ); } - f = message.getQuery(); + f = message.getOmitReleasesDetails(); + if (f) { + writer.writeBool( + 2, + f + ); + } + f = message.getSearchArgs(); if (f.length > 0) { writer.writeString( - 2, + 3, f ); } @@ -3333,11 +4435,29 @@ proto.cc.arduino.cli.commands.v1.LibrarySearchRequest.prototype.hasInstance = fu /** - * optional string query = 2; + * optional bool omit_releases_details = 2; + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.LibrarySearchRequest.prototype.getOmitReleasesDetails = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.LibrarySearchRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.LibrarySearchRequest.prototype.setOmitReleasesDetails = function(value) { + return jspb.Message.setProto3BooleanField(this, 2, value); +}; + + +/** + * optional string search_args = 3; * @return {string} */ -proto.cc.arduino.cli.commands.v1.LibrarySearchRequest.prototype.getQuery = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +proto.cc.arduino.cli.commands.v1.LibrarySearchRequest.prototype.getSearchArgs = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); }; @@ -3345,8 +4465,8 @@ proto.cc.arduino.cli.commands.v1.LibrarySearchRequest.prototype.getQuery = funct * @param {string} value * @return {!proto.cc.arduino.cli.commands.v1.LibrarySearchRequest} returns this */ -proto.cc.arduino.cli.commands.v1.LibrarySearchRequest.prototype.setQuery = function(value) { - return jspb.Message.setProto3StringField(this, 2, value); +proto.cc.arduino.cli.commands.v1.LibrarySearchRequest.prototype.setSearchArgs = function(value) { + return jspb.Message.setProto3StringField(this, 3, value); }; @@ -3541,6 +4661,13 @@ proto.cc.arduino.cli.commands.v1.LibrarySearchResponse.prototype.setStatus = fun +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.cc.arduino.cli.commands.v1.SearchedLibrary.repeatedFields_ = [4]; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -3574,7 +4701,8 @@ proto.cc.arduino.cli.commands.v1.SearchedLibrary.toObject = function(includeInst var f, obj = { name: jspb.Message.getFieldWithDefault(msg, 1, ""), releasesMap: (f = msg.getReleasesMap()) ? f.toObject(includeInstance, proto.cc.arduino.cli.commands.v1.LibraryRelease.toObject) : [], - latest: (f = msg.getLatest()) && proto.cc.arduino.cli.commands.v1.LibraryRelease.toObject(includeInstance, f) + latest: (f = msg.getLatest()) && proto.cc.arduino.cli.commands.v1.LibraryRelease.toObject(includeInstance, f), + availableVersionsList: (f = jspb.Message.getRepeatedField(msg, 4)) == null ? undefined : f }; if (includeInstance) { @@ -3626,6 +4754,10 @@ proto.cc.arduino.cli.commands.v1.SearchedLibrary.deserializeBinaryFromReader = f reader.readMessage(value,proto.cc.arduino.cli.commands.v1.LibraryRelease.deserializeBinaryFromReader); msg.setLatest(value); break; + case 4: + var value = /** @type {string} */ (reader.readString()); + msg.addAvailableVersions(value); + break; default: reader.skipField(); break; @@ -3674,6 +4806,13 @@ proto.cc.arduino.cli.commands.v1.SearchedLibrary.serializeBinaryToWriter = funct proto.cc.arduino.cli.commands.v1.LibraryRelease.serializeBinaryToWriter ); } + f = message.getAvailableVersionsList(); + if (f.length > 0) { + writer.writeRepeatedString( + 4, + f + ); + } }; @@ -3754,6 +4893,43 @@ proto.cc.arduino.cli.commands.v1.SearchedLibrary.prototype.hasLatest = function( }; +/** + * repeated string available_versions = 4; + * @return {!Array<string>} + */ +proto.cc.arduino.cli.commands.v1.SearchedLibrary.prototype.getAvailableVersionsList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 4)); +}; + + +/** + * @param {!Array<string>} value + * @return {!proto.cc.arduino.cli.commands.v1.SearchedLibrary} returns this + */ +proto.cc.arduino.cli.commands.v1.SearchedLibrary.prototype.setAvailableVersionsList = function(value) { + return jspb.Message.setField(this, 4, value || []); +}; + + +/** + * @param {string} value + * @param {number=} opt_index + * @return {!proto.cc.arduino.cli.commands.v1.SearchedLibrary} returns this + */ +proto.cc.arduino.cli.commands.v1.SearchedLibrary.prototype.addAvailableVersions = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 4, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.cc.arduino.cli.commands.v1.SearchedLibrary} returns this + */ +proto.cc.arduino.cli.commands.v1.SearchedLibrary.prototype.clearAvailableVersionsList = function() { + return this.setAvailableVersionsList([]); +}; + + /** * List of repeated fields within this message type. @@ -5447,7 +6623,6 @@ proto.cc.arduino.cli.commands.v1.Library.toObject = function(includeInstance, ms sourceDir: jspb.Message.getFieldWithDefault(msg, 11, ""), utilityDir: jspb.Message.getFieldWithDefault(msg, 12, ""), containerPlatform: jspb.Message.getFieldWithDefault(msg, 14, ""), - realName: jspb.Message.getFieldWithDefault(msg, 16, ""), dotALinkage: jspb.Message.getBooleanFieldWithDefault(msg, 17, false), precompiled: jspb.Message.getBooleanFieldWithDefault(msg, 18, false), ldFlags: jspb.Message.getFieldWithDefault(msg, 19, ""), @@ -5459,7 +6634,8 @@ proto.cc.arduino.cli.commands.v1.Library.toObject = function(includeInstance, ms layout: jspb.Message.getFieldWithDefault(msg, 25, 0), examplesList: (f = jspb.Message.getRepeatedField(msg, 26)) == null ? undefined : f, providesIncludesList: (f = jspb.Message.getRepeatedField(msg, 27)) == null ? undefined : f, - compatibleWithMap: (f = msg.getCompatibleWithMap()) ? f.toObject(includeInstance, undefined) : [] + compatibleWithMap: (f = msg.getCompatibleWithMap()) ? f.toObject(includeInstance, undefined) : [], + inDevelopment: jspb.Message.getBooleanFieldWithDefault(msg, 29, false) }; if (includeInstance) { @@ -5548,10 +6724,6 @@ proto.cc.arduino.cli.commands.v1.Library.deserializeBinaryFromReader = function( var value = /** @type {string} */ (reader.readString()); msg.setContainerPlatform(value); break; - case 16: - var value = /** @type {string} */ (reader.readString()); - msg.setRealName(value); - break; case 17: var value = /** @type {boolean} */ (reader.readBool()); msg.setDotALinkage(value); @@ -5604,6 +6776,10 @@ proto.cc.arduino.cli.commands.v1.Library.deserializeBinaryFromReader = function( jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readString, jspb.BinaryReader.prototype.readBool, null, "", false); }); break; + case 29: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setInDevelopment(value); + break; default: reader.skipField(); break; @@ -5724,13 +6900,6 @@ proto.cc.arduino.cli.commands.v1.Library.serializeBinaryToWriter = function(mess f ); } - f = message.getRealName(); - if (f.length > 0) { - writer.writeString( - 16, - f - ); - } f = message.getDotALinkage(); if (f) { writer.writeBool( @@ -5809,6 +6978,13 @@ proto.cc.arduino.cli.commands.v1.Library.serializeBinaryToWriter = function(mess if (f && f.getLength() > 0) { f.serializeBinary(28, writer, jspb.BinaryWriter.prototype.writeString, jspb.BinaryWriter.prototype.writeBool); } + f = message.getInDevelopment(); + if (f) { + writer.writeBool( + 29, + f + ); + } }; @@ -6084,24 +7260,6 @@ proto.cc.arduino.cli.commands.v1.Library.prototype.setContainerPlatform = functi }; -/** - * optional string real_name = 16; - * @return {string} - */ -proto.cc.arduino.cli.commands.v1.Library.prototype.getRealName = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 16, "")); -}; - - -/** - * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.Library} returns this - */ -proto.cc.arduino.cli.commands.v1.Library.prototype.setRealName = function(value) { - return jspb.Message.setProto3StringField(this, 16, value); -}; - - /** * optional bool dot_a_linkage = 17; * @return {boolean} @@ -6364,6 +7522,24 @@ proto.cc.arduino.cli.commands.v1.Library.prototype.clearCompatibleWithMap = func return this;}; +/** + * optional bool in_development = 29; + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.Library.prototype.getInDevelopment = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 29, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.Library} returns this + */ +proto.cc.arduino.cli.commands.v1.Library.prototype.setInDevelopment = function(value) { + return jspb.Message.setProto3BooleanField(this, 29, value); +}; + + @@ -6576,6 +7752,32 @@ proto.cc.arduino.cli.commands.v1.ZipLibraryInstallRequest.prototype.setOverwrite +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.MessageCase = { + MESSAGE_NOT_SET: 0, + TASK_PROGRESS: 1, + RESULT: 2 +}; + +/** + * @return {proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.MessageCase} + */ +proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.prototype.getMessageCase = function() { + return /** @type {proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.MessageCase} */(jspb.Message.computeOneofCase(this, proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.oneofGroups_[0])); +}; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -6607,7 +7809,8 @@ proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.prototype.toObject = */ proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.toObject = function(includeInstance, msg) { var f, obj = { - taskProgress: (f = msg.getTaskProgress()) && cc_arduino_cli_commands_v1_common_pb.TaskProgress.toObject(includeInstance, f) + taskProgress: (f = msg.getTaskProgress()) && cc_arduino_cli_commands_v1_common_pb.TaskProgress.toObject(includeInstance, f), + result: (f = msg.getResult()) && proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.Result.toObject(includeInstance, f) }; if (includeInstance) { @@ -6649,6 +7852,11 @@ proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.deserializeBinaryFrom reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.TaskProgress.deserializeBinaryFromReader); msg.setTaskProgress(value); break; + case 2: + var value = new proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.Result; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.Result.deserializeBinaryFromReader); + msg.setResult(value); + break; default: reader.skipField(); break; @@ -6686,6 +7894,115 @@ proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.serializeBinaryToWrit cc_arduino_cli_commands_v1_common_pb.TaskProgress.serializeBinaryToWriter ); } + f = message.getResult(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.Result.serializeBinaryToWriter + ); + } +}; + + + + + +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.ZipLibraryInstallResponse.Result.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.Result.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.ZipLibraryInstallResponse.Result} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.Result.toObject = function(includeInstance, msg) { + var f, obj = { + + }; + + 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.ZipLibraryInstallResponse.Result} + */ +proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.Result.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.Result; + return proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.Result.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.ZipLibraryInstallResponse.Result} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.Result} + */ +proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.Result.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.Result.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.Result.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.ZipLibraryInstallResponse.Result} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.Result.serializeBinaryToWriter = function(message, writer) { + var f = undefined; }; @@ -6704,7 +8021,7 @@ proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.prototype.getTaskProg * @return {!proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse} returns this */ proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.prototype.setTaskProgress = function(value) { - return jspb.Message.setWrapperField(this, 1, value); + return jspb.Message.setOneofWrapperField(this, 1, proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.oneofGroups_[0], value); }; @@ -6726,6 +8043,43 @@ proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.prototype.hasTaskProg }; +/** + * optional Result result = 2; + * @return {?proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.Result} + */ +proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.prototype.getResult = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.Result} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.Result, 2)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.Result|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse} returns this +*/ +proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.prototype.setResult = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.prototype.clearResult = function() { + return this.setResult(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.prototype.hasResult = function() { + return jspb.Message.getField(this, 2) != null; +}; + + @@ -6938,6 +8292,32 @@ proto.cc.arduino.cli.commands.v1.GitLibraryInstallRequest.prototype.setOverwrite +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.MessageCase = { + MESSAGE_NOT_SET: 0, + TASK_PROGRESS: 1, + RESULT: 2 +}; + +/** + * @return {proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.MessageCase} + */ +proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.prototype.getMessageCase = function() { + return /** @type {proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.MessageCase} */(jspb.Message.computeOneofCase(this, proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.oneofGroups_[0])); +}; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -6969,7 +8349,8 @@ proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.prototype.toObject = */ proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.toObject = function(includeInstance, msg) { var f, obj = { - taskProgress: (f = msg.getTaskProgress()) && cc_arduino_cli_commands_v1_common_pb.TaskProgress.toObject(includeInstance, f) + taskProgress: (f = msg.getTaskProgress()) && cc_arduino_cli_commands_v1_common_pb.TaskProgress.toObject(includeInstance, f), + result: (f = msg.getResult()) && proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.Result.toObject(includeInstance, f) }; if (includeInstance) { @@ -7011,6 +8392,11 @@ proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.deserializeBinaryFrom reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.TaskProgress.deserializeBinaryFromReader); msg.setTaskProgress(value); break; + case 2: + var value = new proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.Result; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.Result.deserializeBinaryFromReader); + msg.setResult(value); + break; default: reader.skipField(); break; @@ -7048,6 +8434,115 @@ proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.serializeBinaryToWrit cc_arduino_cli_commands_v1_common_pb.TaskProgress.serializeBinaryToWriter ); } + f = message.getResult(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.Result.serializeBinaryToWriter + ); + } +}; + + + + + +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.GitLibraryInstallResponse.Result.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.Result.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.GitLibraryInstallResponse.Result} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.Result.toObject = function(includeInstance, msg) { + var f, obj = { + + }; + + 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.GitLibraryInstallResponse.Result} + */ +proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.Result.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.Result; + return proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.Result.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.GitLibraryInstallResponse.Result} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.Result} + */ +proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.Result.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.Result.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.Result.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.GitLibraryInstallResponse.Result} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.Result.serializeBinaryToWriter = function(message, writer) { + var f = undefined; }; @@ -7066,7 +8561,7 @@ proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.prototype.getTaskProg * @return {!proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse} returns this */ proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.prototype.setTaskProgress = function(value) { - return jspb.Message.setWrapperField(this, 1, value); + return jspb.Message.setOneofWrapperField(this, 1, proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.oneofGroups_[0], value); }; @@ -7088,6 +8583,43 @@ proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.prototype.hasTaskProg }; +/** + * optional Result result = 2; + * @return {?proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.Result} + */ +proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.prototype.getResult = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.Result} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.Result, 2)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.Result|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse} returns this +*/ +proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.prototype.setResult = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.prototype.clearResult = function() { + return this.setResult(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.prototype.hasResult = function() { + return jspb.Message.getField(this, 2) != null; +}; + + /** * @enum {number} */ diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/monitor_pb.d.ts b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/monitor_pb.d.ts index 4d65f4723..9af18f09d 100644 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/monitor_pb.d.ts +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/monitor_pb.d.ts @@ -10,31 +10,29 @@ import * as cc_arduino_cli_commands_v1_port_pb from "../../../../../cc/arduino/c export class MonitorRequest 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): MonitorRequest; - - - hasPort(): boolean; - clearPort(): void; - getPort(): cc_arduino_cli_commands_v1_port_pb.Port | undefined; - setPort(value?: cc_arduino_cli_commands_v1_port_pb.Port): MonitorRequest; - - getFqbn(): string; - setFqbn(value: string): MonitorRequest; + hasOpenRequest(): boolean; + clearOpenRequest(): void; + getOpenRequest(): MonitorPortOpenRequest | undefined; + setOpenRequest(value?: MonitorPortOpenRequest): MonitorRequest; + hasTxData(): boolean; + clearTxData(): void; getTxData(): Uint8Array | string; getTxData_asU8(): Uint8Array; getTxData_asB64(): string; setTxData(value: Uint8Array | string): MonitorRequest; + hasUpdatedConfiguration(): boolean; + clearUpdatedConfiguration(): void; + getUpdatedConfiguration(): cc_arduino_cli_commands_v1_common_pb.MonitorPortConfiguration | undefined; + setUpdatedConfiguration(value?: cc_arduino_cli_commands_v1_common_pb.MonitorPortConfiguration): MonitorRequest; - hasPortConfiguration(): boolean; - clearPortConfiguration(): void; - getPortConfiguration(): MonitorPortConfiguration | undefined; - setPortConfiguration(value?: MonitorPortConfiguration): MonitorRequest; + hasClose(): boolean; + clearClose(): void; + getClose(): boolean; + setClose(value: boolean): MonitorRequest; + getMessageCase(): MonitorRequest.MessageCase; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): MonitorRequest.AsObject; @@ -48,54 +46,85 @@ export class MonitorRequest extends jspb.Message { export namespace MonitorRequest { export type AsObject = { - instance?: cc_arduino_cli_commands_v1_common_pb.Instance.AsObject, - port?: cc_arduino_cli_commands_v1_port_pb.Port.AsObject, - fqbn: string, + openRequest?: MonitorPortOpenRequest.AsObject, txData: Uint8Array | string, - portConfiguration?: MonitorPortConfiguration.AsObject, + updatedConfiguration?: cc_arduino_cli_commands_v1_common_pb.MonitorPortConfiguration.AsObject, + close: boolean, } + + export enum MessageCase { + MESSAGE_NOT_SET = 0, + OPEN_REQUEST = 1, + TX_DATA = 2, + UPDATED_CONFIGURATION = 3, + CLOSE = 4, + } + } -export class MonitorPortConfiguration extends jspb.Message { - clearSettingsList(): void; - getSettingsList(): Array<MonitorPortSetting>; - setSettingsList(value: Array<MonitorPortSetting>): MonitorPortConfiguration; - addSettings(value?: MonitorPortSetting, index?: number): MonitorPortSetting; +export class MonitorPortOpenRequest 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): MonitorPortOpenRequest; + hasPort(): boolean; + clearPort(): void; + getPort(): cc_arduino_cli_commands_v1_port_pb.Port | undefined; + setPort(value?: cc_arduino_cli_commands_v1_port_pb.Port): MonitorPortOpenRequest; + getFqbn(): string; + setFqbn(value: string): MonitorPortOpenRequest; + + hasPortConfiguration(): boolean; + clearPortConfiguration(): void; + getPortConfiguration(): cc_arduino_cli_commands_v1_common_pb.MonitorPortConfiguration | undefined; + setPortConfiguration(value?: cc_arduino_cli_commands_v1_common_pb.MonitorPortConfiguration): MonitorPortOpenRequest; serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): MonitorPortConfiguration.AsObject; - static toObject(includeInstance: boolean, msg: MonitorPortConfiguration): MonitorPortConfiguration.AsObject; + toObject(includeInstance?: boolean): MonitorPortOpenRequest.AsObject; + static toObject(includeInstance: boolean, msg: MonitorPortOpenRequest): MonitorPortOpenRequest.AsObject; static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: MonitorPortConfiguration, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): MonitorPortConfiguration; - static deserializeBinaryFromReader(message: MonitorPortConfiguration, reader: jspb.BinaryReader): MonitorPortConfiguration; + static serializeBinaryToWriter(message: MonitorPortOpenRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): MonitorPortOpenRequest; + static deserializeBinaryFromReader(message: MonitorPortOpenRequest, reader: jspb.BinaryReader): MonitorPortOpenRequest; } -export namespace MonitorPortConfiguration { +export namespace MonitorPortOpenRequest { export type AsObject = { - settingsList: Array<MonitorPortSetting.AsObject>, + instance?: cc_arduino_cli_commands_v1_common_pb.Instance.AsObject, + port?: cc_arduino_cli_commands_v1_port_pb.Port.AsObject, + fqbn: string, + portConfiguration?: cc_arduino_cli_commands_v1_common_pb.MonitorPortConfiguration.AsObject, } } export class MonitorResponse extends jspb.Message { + + hasError(): boolean; + clearError(): void; getError(): string; setError(value: string): MonitorResponse; + hasRxData(): boolean; + clearRxData(): void; getRxData(): Uint8Array | string; getRxData_asU8(): Uint8Array; getRxData_asB64(): string; setRxData(value: Uint8Array | string): MonitorResponse; - clearAppliedSettingsList(): void; - getAppliedSettingsList(): Array<MonitorPortSetting>; - setAppliedSettingsList(value: Array<MonitorPortSetting>): MonitorResponse; - addAppliedSettings(value?: MonitorPortSetting, index?: number): MonitorPortSetting; + hasAppliedSettings(): boolean; + clearAppliedSettings(): void; + getAppliedSettings(): cc_arduino_cli_commands_v1_common_pb.MonitorPortConfiguration | undefined; + setAppliedSettings(value?: cc_arduino_cli_commands_v1_common_pb.MonitorPortConfiguration): MonitorResponse; + hasSuccess(): boolean; + clearSuccess(): void; getSuccess(): boolean; setSuccess(value: boolean): MonitorResponse; + getMessageCase(): MonitorResponse.MessageCase; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): MonitorResponse.AsObject; @@ -111,34 +140,18 @@ export namespace MonitorResponse { export type AsObject = { error: string, rxData: Uint8Array | string, - appliedSettingsList: Array<MonitorPortSetting.AsObject>, + appliedSettings?: cc_arduino_cli_commands_v1_common_pb.MonitorPortConfiguration.AsObject, success: boolean, } -} - -export class MonitorPortSetting extends jspb.Message { - getSettingId(): string; - setSettingId(value: string): MonitorPortSetting; - getValue(): string; - setValue(value: string): MonitorPortSetting; - - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): MonitorPortSetting.AsObject; - static toObject(includeInstance: boolean, msg: MonitorPortSetting): MonitorPortSetting.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: MonitorPortSetting, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): MonitorPortSetting; - static deserializeBinaryFromReader(message: MonitorPortSetting, reader: jspb.BinaryReader): MonitorPortSetting; -} - -export namespace MonitorPortSetting { - export type AsObject = { - settingId: string, - value: string, + export enum MessageCase { + MESSAGE_NOT_SET = 0, + ERROR = 1, + RX_DATA = 2, + APPLIED_SETTINGS = 3, + SUCCESS = 4, } + } export class EnumerateMonitorPortSettingsRequest extends jspb.Message { @@ -147,14 +160,11 @@ export class EnumerateMonitorPortSettingsRequest extends jspb.Message { clearInstance(): void; getInstance(): cc_arduino_cli_commands_v1_common_pb.Instance | undefined; setInstance(value?: cc_arduino_cli_commands_v1_common_pb.Instance): EnumerateMonitorPortSettingsRequest; - getPortProtocol(): string; setPortProtocol(value: string): EnumerateMonitorPortSettingsRequest; - getFqbn(): string; setFqbn(value: string): EnumerateMonitorPortSettingsRequest; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): EnumerateMonitorPortSettingsRequest.AsObject; static toObject(includeInstance: boolean, msg: EnumerateMonitorPortSettingsRequest): EnumerateMonitorPortSettingsRequest.AsObject; @@ -179,7 +189,6 @@ export class EnumerateMonitorPortSettingsResponse extends jspb.Message { setSettingsList(value: Array<MonitorPortSettingDescriptor>): EnumerateMonitorPortSettingsResponse; addSettings(value?: MonitorPortSettingDescriptor, index?: number): MonitorPortSettingDescriptor; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): EnumerateMonitorPortSettingsResponse.AsObject; static toObject(includeInstance: boolean, msg: EnumerateMonitorPortSettingsResponse): EnumerateMonitorPortSettingsResponse.AsObject; @@ -199,22 +208,17 @@ export namespace EnumerateMonitorPortSettingsResponse { export class MonitorPortSettingDescriptor extends jspb.Message { getSettingId(): string; setSettingId(value: string): MonitorPortSettingDescriptor; - getLabel(): string; setLabel(value: string): MonitorPortSettingDescriptor; - getType(): string; setType(value: string): MonitorPortSettingDescriptor; - clearEnumValuesList(): void; getEnumValuesList(): Array<string>; setEnumValuesList(value: Array<string>): MonitorPortSettingDescriptor; addEnumValues(value: string, index?: number): string; - getValue(): string; setValue(value: string): MonitorPortSettingDescriptor; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): MonitorPortSettingDescriptor.AsObject; static toObject(includeInstance: boolean, msg: MonitorPortSettingDescriptor): MonitorPortSettingDescriptor.AsObject; diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/monitor_pb.js b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/monitor_pb.js index 0a2889c04..46039c58b 100644 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/monitor_pb.js +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/monitor_pb.js @@ -13,7 +13,13 @@ var jspb = require('google-protobuf'); var goog = jspb; -var global = Function('return this')(); +var global = (function() { + if (this) { return this; } + if (typeof window !== 'undefined') { return window; } + if (typeof global !== 'undefined') { return global; } + if (typeof self !== 'undefined') { return self; } + return Function('return this')(); +}.call(null)); var cc_arduino_cli_commands_v1_common_pb = require('../../../../../cc/arduino/cli/commands/v1/common_pb.js'); goog.object.extend(proto, cc_arduino_cli_commands_v1_common_pb); @@ -21,11 +27,12 @@ var cc_arduino_cli_commands_v1_port_pb = require('../../../../../cc/arduino/cli/ goog.object.extend(proto, cc_arduino_cli_commands_v1_port_pb); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.EnumerateMonitorPortSettingsRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.EnumerateMonitorPortSettingsResponse', null, global); -goog.exportSymbol('proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration', null, global); -goog.exportSymbol('proto.cc.arduino.cli.commands.v1.MonitorPortSetting', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.MonitorPortSettingDescriptor', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.MonitorRequest', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.MonitorRequest.MessageCase', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.MonitorResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.MonitorResponse.MessageCase', null, global); /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -37,7 +44,7 @@ goog.exportSymbol('proto.cc.arduino.cli.commands.v1.MonitorResponse', null, glob * @constructor */ proto.cc.arduino.cli.commands.v1.MonitorRequest = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.cc.arduino.cli.commands.v1.MonitorRequest.oneofGroups_); }; goog.inherits(proto.cc.arduino.cli.commands.v1.MonitorRequest, jspb.Message); if (goog.DEBUG && !COMPILED) { @@ -57,16 +64,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.repeatedFields_, null); +proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration, jspb.Message); +goog.inherits(proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.displayName = 'proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration'; + proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest.displayName = 'proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest'; } /** * Generated by JsPbCodeGenerator. @@ -79,7 +86,7 @@ if (goog.DEBUG && !COMPILED) { * @constructor */ proto.cc.arduino.cli.commands.v1.MonitorResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, proto.cc.arduino.cli.commands.v1.MonitorResponse.repeatedFields_, null); + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.cc.arduino.cli.commands.v1.MonitorResponse.oneofGroups_); }; goog.inherits(proto.cc.arduino.cli.commands.v1.MonitorResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { @@ -89,27 +96,6 @@ if (goog.DEBUG && !COMPILED) { */ proto.cc.arduino.cli.commands.v1.MonitorResponse.displayName = 'proto.cc.arduino.cli.commands.v1.MonitorResponse'; } -/** - * 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.MonitorPortSetting = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.cc.arduino.cli.commands.v1.MonitorPortSetting, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.cc.arduino.cli.commands.v1.MonitorPortSetting.displayName = 'proto.cc.arduino.cli.commands.v1.MonitorPortSetting'; -} /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -174,6 +160,34 @@ if (goog.DEBUG && !COMPILED) { proto.cc.arduino.cli.commands.v1.MonitorPortSettingDescriptor.displayName = 'proto.cc.arduino.cli.commands.v1.MonitorPortSettingDescriptor'; } +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.cc.arduino.cli.commands.v1.MonitorRequest.oneofGroups_ = [[1,2,3,4]]; + +/** + * @enum {number} + */ +proto.cc.arduino.cli.commands.v1.MonitorRequest.MessageCase = { + MESSAGE_NOT_SET: 0, + OPEN_REQUEST: 1, + TX_DATA: 2, + UPDATED_CONFIGURATION: 3, + CLOSE: 4 +}; + +/** + * @return {proto.cc.arduino.cli.commands.v1.MonitorRequest.MessageCase} + */ +proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.getMessageCase = function() { + return /** @type {proto.cc.arduino.cli.commands.v1.MonitorRequest.MessageCase} */(jspb.Message.computeOneofCase(this, proto.cc.arduino.cli.commands.v1.MonitorRequest.oneofGroups_[0])); +}; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -205,11 +219,10 @@ proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.toObject = function(op */ proto.cc.arduino.cli.commands.v1.MonitorRequest.toObject = function(includeInstance, msg) { var f, obj = { - instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f), - port: (f = msg.getPort()) && cc_arduino_cli_commands_v1_port_pb.Port.toObject(includeInstance, f), - fqbn: jspb.Message.getFieldWithDefault(msg, 3, ""), + openRequest: (f = msg.getOpenRequest()) && proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest.toObject(includeInstance, f), txData: msg.getTxData_asB64(), - portConfiguration: (f = msg.getPortConfiguration()) && proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.toObject(includeInstance, f) + updatedConfiguration: (f = msg.getUpdatedConfiguration()) && cc_arduino_cli_commands_v1_common_pb.MonitorPortConfiguration.toObject(includeInstance, f), + close: jspb.Message.getBooleanFieldWithDefault(msg, 4, false) }; if (includeInstance) { @@ -247,27 +260,22 @@ proto.cc.arduino.cli.commands.v1.MonitorRequest.deserializeBinaryFromReader = fu 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); + var value = new proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest.deserializeBinaryFromReader); + msg.setOpenRequest(value); break; case 2: - var value = new cc_arduino_cli_commands_v1_port_pb.Port; - reader.readMessage(value,cc_arduino_cli_commands_v1_port_pb.Port.deserializeBinaryFromReader); - msg.setPort(value); + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setTxData(value); break; case 3: - var value = /** @type {string} */ (reader.readString()); - msg.setFqbn(value); + var value = new cc_arduino_cli_commands_v1_common_pb.MonitorPortConfiguration; + reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.MonitorPortConfiguration.deserializeBinaryFromReader); + msg.setUpdatedConfiguration(value); break; case 4: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setTxData(value); - break; - case 5: - var value = new proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration; - reader.readMessage(value,proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.deserializeBinaryFromReader); - msg.setPortConfiguration(value); + var value = /** @type {boolean} */ (reader.readBool()); + msg.setClose(value); break; default: reader.skipField(); @@ -298,63 +306,55 @@ proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.serializeBinary = func */ proto.cc.arduino.cli.commands.v1.MonitorRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getInstance(); + f = message.getOpenRequest(); if (f != null) { writer.writeMessage( 1, f, - cc_arduino_cli_commands_v1_common_pb.Instance.serializeBinaryToWriter + proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest.serializeBinaryToWriter ); } - f = message.getPort(); + f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 2)); if (f != null) { - writer.writeMessage( + writer.writeBytes( 2, - f, - cc_arduino_cli_commands_v1_port_pb.Port.serializeBinaryToWriter + f ); } - f = message.getFqbn(); - if (f.length > 0) { - writer.writeString( + f = message.getUpdatedConfiguration(); + if (f != null) { + writer.writeMessage( 3, - f + f, + cc_arduino_cli_commands_v1_common_pb.MonitorPortConfiguration.serializeBinaryToWriter ); } - f = message.getTxData_asU8(); - if (f.length > 0) { - writer.writeBytes( + f = /** @type {boolean} */ (jspb.Message.getField(message, 4)); + if (f != null) { + writer.writeBool( 4, f ); } - f = message.getPortConfiguration(); - if (f != null) { - writer.writeMessage( - 5, - f, - proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.serializeBinaryToWriter - ); - } }; /** - * optional Instance instance = 1; - * @return {?proto.cc.arduino.cli.commands.v1.Instance} + * optional MonitorPortOpenRequest open_request = 1; + * @return {?proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest} */ -proto.cc.arduino.cli.commands.v1.MonitorRequest.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)); +proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.getOpenRequest = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest, 1)); }; /** - * @param {?proto.cc.arduino.cli.commands.v1.Instance|undefined} value + * @param {?proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest|undefined} value * @return {!proto.cc.arduino.cli.commands.v1.MonitorRequest} returns this */ -proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.setInstance = function(value) { - return jspb.Message.setWrapperField(this, 1, value); +proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.setOpenRequest = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.cc.arduino.cli.commands.v1.MonitorRequest.oneofGroups_[0], value); }; @@ -362,8 +362,8 @@ proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.setInstance = function * Clears the message field making it undefined. * @return {!proto.cc.arduino.cli.commands.v1.MonitorRequest} returns this */ -proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.clearInstance = function() { - return this.setInstance(undefined); +proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.clearOpenRequest = function() { + return this.setOpenRequest(undefined); }; @@ -371,133 +371,132 @@ proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.clearInstance = functi * Returns whether this field is set. * @return {boolean} */ -proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.hasInstance = function() { +proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.hasOpenRequest = function() { return jspb.Message.getField(this, 1) != null; }; /** - * optional Port port = 2; - * @return {?proto.cc.arduino.cli.commands.v1.Port} + * optional bytes tx_data = 2; + * @return {!(string|Uint8Array)} */ -proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.getPort = function() { - return /** @type{?proto.cc.arduino.cli.commands.v1.Port} */ ( - jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_port_pb.Port, 2)); +proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.getTxData = function() { + return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 2, "")); }; /** - * @param {?proto.cc.arduino.cli.commands.v1.Port|undefined} value - * @return {!proto.cc.arduino.cli.commands.v1.MonitorRequest} returns this -*/ -proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.setPort = function(value) { - return jspb.Message.setWrapperField(this, 2, value); + * optional bytes tx_data = 2; + * This is a type-conversion wrapper around `getTxData()` + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.getTxData_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getTxData())); }; /** - * Clears the message field making it undefined. - * @return {!proto.cc.arduino.cli.commands.v1.MonitorRequest} returns this + * optional bytes tx_data = 2; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getTxData()` + * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.clearPort = function() { - return this.setPort(undefined); +proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.getTxData_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getTxData())); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {!(string|Uint8Array)} value + * @return {!proto.cc.arduino.cli.commands.v1.MonitorRequest} returns this */ -proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.hasPort = function() { - return jspb.Message.getField(this, 2) != null; +proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.setTxData = function(value) { + return jspb.Message.setOneofField(this, 2, proto.cc.arduino.cli.commands.v1.MonitorRequest.oneofGroups_[0], value); }; /** - * optional string fqbn = 3; - * @return {string} + * Clears the field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.MonitorRequest} returns this */ -proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.getFqbn = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.clearTxData = function() { + return jspb.Message.setOneofField(this, 2, proto.cc.arduino.cli.commands.v1.MonitorRequest.oneofGroups_[0], undefined); }; /** - * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.MonitorRequest} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.setFqbn = function(value) { - return jspb.Message.setProto3StringField(this, 3, value); +proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.hasTxData = function() { + return jspb.Message.getField(this, 2) != null; }; /** - * optional bytes tx_data = 4; - * @return {!(string|Uint8Array)} + * optional MonitorPortConfiguration updated_configuration = 3; + * @return {?proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration} */ -proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.getTxData = function() { - return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 4, "")); +proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.getUpdatedConfiguration = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration} */ ( + jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.MonitorPortConfiguration, 3)); }; /** - * optional bytes tx_data = 4; - * This is a type-conversion wrapper around `getTxData()` - * @return {string} - */ -proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.getTxData_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getTxData())); + * @param {?proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.MonitorRequest} returns this +*/ +proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.setUpdatedConfiguration = function(value) { + return jspb.Message.setOneofWrapperField(this, 3, proto.cc.arduino.cli.commands.v1.MonitorRequest.oneofGroups_[0], value); }; /** - * optional bytes tx_data = 4; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getTxData()` - * @return {!Uint8Array} + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.MonitorRequest} returns this */ -proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.getTxData_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getTxData())); +proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.clearUpdatedConfiguration = function() { + return this.setUpdatedConfiguration(undefined); }; /** - * @param {!(string|Uint8Array)} value - * @return {!proto.cc.arduino.cli.commands.v1.MonitorRequest} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.setTxData = function(value) { - return jspb.Message.setProto3BytesField(this, 4, value); +proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.hasUpdatedConfiguration = function() { + return jspb.Message.getField(this, 3) != null; }; /** - * optional MonitorPortConfiguration port_configuration = 5; - * @return {?proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration} + * optional bool close = 4; + * @return {boolean} */ -proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.getPortConfiguration = function() { - return /** @type{?proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration} */ ( - jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration, 5)); +proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.getClose = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 4, false)); }; /** - * @param {?proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration|undefined} value + * @param {boolean} value * @return {!proto.cc.arduino.cli.commands.v1.MonitorRequest} returns this -*/ -proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.setPortConfiguration = function(value) { - return jspb.Message.setWrapperField(this, 5, value); + */ +proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.setClose = function(value) { + return jspb.Message.setOneofField(this, 4, proto.cc.arduino.cli.commands.v1.MonitorRequest.oneofGroups_[0], value); }; /** - * Clears the message field making it undefined. + * Clears the field making it undefined. * @return {!proto.cc.arduino.cli.commands.v1.MonitorRequest} returns this */ -proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.clearPortConfiguration = function() { - return this.setPortConfiguration(undefined); +proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.clearClose = function() { + return jspb.Message.setOneofField(this, 4, proto.cc.arduino.cli.commands.v1.MonitorRequest.oneofGroups_[0], undefined); }; @@ -505,19 +504,12 @@ proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.clearPortConfiguration * Returns whether this field is set. * @return {boolean} */ -proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.hasPortConfiguration = function() { - return jspb.Message.getField(this, 5) != null; +proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.hasClose = function() { + return jspb.Message.getField(this, 4) != null; }; -/** - * List of repeated fields within this message type. - * @private {!Array<number>} - * @const - */ -proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.repeatedFields_ = [1]; - if (jspb.Message.GENERATE_TO_OBJECT) { @@ -533,8 +525,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest.toObject(opt_includeInstance, this); }; @@ -543,14 +535,16 @@ proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.prototype.toObject = f * @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.MonitorPortConfiguration} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest.toObject = function(includeInstance, msg) { var f, obj = { - settingsList: jspb.Message.toObjectList(msg.getSettingsList(), - proto.cc.arduino.cli.commands.v1.MonitorPortSetting.toObject, includeInstance) + instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f), + port: (f = msg.getPort()) && cc_arduino_cli_commands_v1_port_pb.Port.toObject(includeInstance, f), + fqbn: jspb.Message.getFieldWithDefault(msg, 3, ""), + portConfiguration: (f = msg.getPortConfiguration()) && cc_arduino_cli_commands_v1_common_pb.MonitorPortConfiguration.toObject(includeInstance, f) }; if (includeInstance) { @@ -564,23 +558,23 @@ proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.toObject = function(in /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration} + * @return {!proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest} */ -proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration; - return proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest; + return proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest.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.MonitorPortConfiguration} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration} + * @return {!proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest} */ -proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -588,9 +582,23 @@ proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.deserializeBinaryFromR var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.cc.arduino.cli.commands.v1.MonitorPortSetting; - reader.readMessage(value,proto.cc.arduino.cli.commands.v1.MonitorPortSetting.deserializeBinaryFromReader); - msg.addSettings(value); + 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 = new cc_arduino_cli_commands_v1_port_pb.Port; + reader.readMessage(value,cc_arduino_cli_commands_v1_port_pb.Port.deserializeBinaryFromReader); + msg.setPort(value); + break; + case 3: + var value = /** @type {string} */ (reader.readString()); + msg.setFqbn(value); + break; + case 4: + var value = new cc_arduino_cli_commands_v1_common_pb.MonitorPortConfiguration; + reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.MonitorPortConfiguration.deserializeBinaryFromReader); + msg.setPortConfiguration(value); break; default: reader.skipField(); @@ -605,9 +613,9 @@ proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.deserializeBinaryFromR * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -615,68 +623,203 @@ proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.prototype.serializeBin /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration} message + * @param {!proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getSettingsList(); - if (f.length > 0) { - writer.writeRepeatedMessage( + f = message.getInstance(); + if (f != null) { + writer.writeMessage( 1, f, - proto.cc.arduino.cli.commands.v1.MonitorPortSetting.serializeBinaryToWriter + cc_arduino_cli_commands_v1_common_pb.Instance.serializeBinaryToWriter + ); + } + f = message.getPort(); + if (f != null) { + writer.writeMessage( + 2, + f, + cc_arduino_cli_commands_v1_port_pb.Port.serializeBinaryToWriter + ); + } + f = message.getFqbn(); + if (f.length > 0) { + writer.writeString( + 3, + f + ); + } + f = message.getPortConfiguration(); + if (f != null) { + writer.writeMessage( + 4, + f, + cc_arduino_cli_commands_v1_common_pb.MonitorPortConfiguration.serializeBinaryToWriter ); } }; /** - * repeated MonitorPortSetting settings = 1; - * @return {!Array<!proto.cc.arduino.cli.commands.v1.MonitorPortSetting>} + * optional Instance instance = 1; + * @return {?proto.cc.arduino.cli.commands.v1.Instance} */ -proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.prototype.getSettingsList = function() { - return /** @type{!Array<!proto.cc.arduino.cli.commands.v1.MonitorPortSetting>} */ ( - jspb.Message.getRepeatedWrapperField(this, proto.cc.arduino.cli.commands.v1.MonitorPortSetting, 1)); +proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest.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 {!Array<!proto.cc.arduino.cli.commands.v1.MonitorPortSetting>} value - * @return {!proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration} returns this + * @param {?proto.cc.arduino.cli.commands.v1.Instance|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest} returns this */ -proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.prototype.setSettingsList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 1, value); +proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest.prototype.setInstance = function(value) { + return jspb.Message.setWrapperField(this, 1, value); }; /** - * @param {!proto.cc.arduino.cli.commands.v1.MonitorPortSetting=} opt_value - * @param {number=} opt_index - * @return {!proto.cc.arduino.cli.commands.v1.MonitorPortSetting} + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest} returns this */ -proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.prototype.addSettings = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.cc.arduino.cli.commands.v1.MonitorPortSetting, opt_index); +proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest.prototype.clearInstance = function() { + return this.setInstance(undefined); }; /** - * Clears the list making it empty but non-null. - * @return {!proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.prototype.clearSettingsList = function() { - return this.setSettingsList([]); +proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest.prototype.hasInstance = function() { + return jspb.Message.getField(this, 1) != null; }; +/** + * optional Port port = 2; + * @return {?proto.cc.arduino.cli.commands.v1.Port} + */ +proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest.prototype.getPort = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.Port} */ ( + jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_port_pb.Port, 2)); +}; + /** - * List of repeated fields within this message type. - * @private {!Array<number>} + * @param {?proto.cc.arduino.cli.commands.v1.Port|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest} returns this +*/ +proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest.prototype.setPort = function(value) { + return jspb.Message.setWrapperField(this, 2, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest.prototype.clearPort = function() { + return this.setPort(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest.prototype.hasPort = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional string fqbn = 3; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest.prototype.getFqbn = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest.prototype.setFqbn = function(value) { + return jspb.Message.setProto3StringField(this, 3, value); +}; + + +/** + * optional MonitorPortConfiguration port_configuration = 4; + * @return {?proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration} + */ +proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest.prototype.getPortConfiguration = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration} */ ( + jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.MonitorPortConfiguration, 4)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest} returns this +*/ +proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest.prototype.setPortConfiguration = function(value) { + return jspb.Message.setWrapperField(this, 4, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest.prototype.clearPortConfiguration = function() { + return this.setPortConfiguration(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest.prototype.hasPortConfiguration = function() { + return jspb.Message.getField(this, 4) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} * @const */ -proto.cc.arduino.cli.commands.v1.MonitorResponse.repeatedFields_ = [3]; +proto.cc.arduino.cli.commands.v1.MonitorResponse.oneofGroups_ = [[1,2,3,4]]; + +/** + * @enum {number} + */ +proto.cc.arduino.cli.commands.v1.MonitorResponse.MessageCase = { + MESSAGE_NOT_SET: 0, + ERROR: 1, + RX_DATA: 2, + APPLIED_SETTINGS: 3, + SUCCESS: 4 +}; + +/** + * @return {proto.cc.arduino.cli.commands.v1.MonitorResponse.MessageCase} + */ +proto.cc.arduino.cli.commands.v1.MonitorResponse.prototype.getMessageCase = function() { + return /** @type {proto.cc.arduino.cli.commands.v1.MonitorResponse.MessageCase} */(jspb.Message.computeOneofCase(this, proto.cc.arduino.cli.commands.v1.MonitorResponse.oneofGroups_[0])); +}; @@ -711,8 +854,7 @@ proto.cc.arduino.cli.commands.v1.MonitorResponse.toObject = function(includeInst var f, obj = { error: jspb.Message.getFieldWithDefault(msg, 1, ""), rxData: msg.getRxData_asB64(), - appliedSettingsList: jspb.Message.toObjectList(msg.getAppliedSettingsList(), - proto.cc.arduino.cli.commands.v1.MonitorPortSetting.toObject, includeInstance), + appliedSettings: (f = msg.getAppliedSettings()) && cc_arduino_cli_commands_v1_common_pb.MonitorPortConfiguration.toObject(includeInstance, f), success: jspb.Message.getBooleanFieldWithDefault(msg, 4, false) }; @@ -759,9 +901,9 @@ proto.cc.arduino.cli.commands.v1.MonitorResponse.deserializeBinaryFromReader = f msg.setRxData(value); break; case 3: - var value = new proto.cc.arduino.cli.commands.v1.MonitorPortSetting; - reader.readMessage(value,proto.cc.arduino.cli.commands.v1.MonitorPortSetting.deserializeBinaryFromReader); - msg.addAppliedSettings(value); + var value = new cc_arduino_cli_commands_v1_common_pb.MonitorPortConfiguration; + reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.MonitorPortConfiguration.deserializeBinaryFromReader); + msg.setAppliedSettings(value); break; case 4: var value = /** @type {boolean} */ (reader.readBool()); @@ -796,30 +938,30 @@ proto.cc.arduino.cli.commands.v1.MonitorResponse.prototype.serializeBinary = fun */ proto.cc.arduino.cli.commands.v1.MonitorResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getError(); - if (f.length > 0) { + f = /** @type {string} */ (jspb.Message.getField(message, 1)); + if (f != null) { writer.writeString( 1, f ); } - f = message.getRxData_asU8(); - if (f.length > 0) { + f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 2)); + if (f != null) { writer.writeBytes( 2, f ); } - f = message.getAppliedSettingsList(); - if (f.length > 0) { - writer.writeRepeatedMessage( + f = message.getAppliedSettings(); + if (f != null) { + writer.writeMessage( 3, f, - proto.cc.arduino.cli.commands.v1.MonitorPortSetting.serializeBinaryToWriter + cc_arduino_cli_commands_v1_common_pb.MonitorPortConfiguration.serializeBinaryToWriter ); } - f = message.getSuccess(); - if (f) { + f = /** @type {boolean} */ (jspb.Message.getField(message, 4)); + if (f != null) { writer.writeBool( 4, f @@ -842,7 +984,25 @@ proto.cc.arduino.cli.commands.v1.MonitorResponse.prototype.getError = function() * @return {!proto.cc.arduino.cli.commands.v1.MonitorResponse} returns this */ proto.cc.arduino.cli.commands.v1.MonitorResponse.prototype.setError = function(value) { - return jspb.Message.setProto3StringField(this, 1, value); + return jspb.Message.setOneofField(this, 1, proto.cc.arduino.cli.commands.v1.MonitorResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.MonitorResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.MonitorResponse.prototype.clearError = function() { + return jspb.Message.setOneofField(this, 1, proto.cc.arduino.cli.commands.v1.MonitorResponse.oneofGroups_[0], undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.MonitorResponse.prototype.hasError = function() { + return jspb.Message.getField(this, 1) != null; }; @@ -884,223 +1044,98 @@ proto.cc.arduino.cli.commands.v1.MonitorResponse.prototype.getRxData_asU8 = func * @return {!proto.cc.arduino.cli.commands.v1.MonitorResponse} returns this */ proto.cc.arduino.cli.commands.v1.MonitorResponse.prototype.setRxData = function(value) { - return jspb.Message.setProto3BytesField(this, 2, value); -}; - - -/** - * repeated MonitorPortSetting applied_settings = 3; - * @return {!Array<!proto.cc.arduino.cli.commands.v1.MonitorPortSetting>} - */ -proto.cc.arduino.cli.commands.v1.MonitorResponse.prototype.getAppliedSettingsList = function() { - return /** @type{!Array<!proto.cc.arduino.cli.commands.v1.MonitorPortSetting>} */ ( - jspb.Message.getRepeatedWrapperField(this, proto.cc.arduino.cli.commands.v1.MonitorPortSetting, 3)); -}; - - -/** - * @param {!Array<!proto.cc.arduino.cli.commands.v1.MonitorPortSetting>} value - * @return {!proto.cc.arduino.cli.commands.v1.MonitorResponse} returns this -*/ -proto.cc.arduino.cli.commands.v1.MonitorResponse.prototype.setAppliedSettingsList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 3, value); + return jspb.Message.setOneofField(this, 2, proto.cc.arduino.cli.commands.v1.MonitorResponse.oneofGroups_[0], value); }; /** - * @param {!proto.cc.arduino.cli.commands.v1.MonitorPortSetting=} opt_value - * @param {number=} opt_index - * @return {!proto.cc.arduino.cli.commands.v1.MonitorPortSetting} - */ -proto.cc.arduino.cli.commands.v1.MonitorResponse.prototype.addAppliedSettings = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 3, opt_value, proto.cc.arduino.cli.commands.v1.MonitorPortSetting, opt_index); -}; - - -/** - * Clears the list making it empty but non-null. + * Clears the field making it undefined. * @return {!proto.cc.arduino.cli.commands.v1.MonitorResponse} returns this */ -proto.cc.arduino.cli.commands.v1.MonitorResponse.prototype.clearAppliedSettingsList = function() { - return this.setAppliedSettingsList([]); +proto.cc.arduino.cli.commands.v1.MonitorResponse.prototype.clearRxData = function() { + return jspb.Message.setOneofField(this, 2, proto.cc.arduino.cli.commands.v1.MonitorResponse.oneofGroups_[0], undefined); }; /** - * optional bool success = 4; + * Returns whether this field is set. * @return {boolean} */ -proto.cc.arduino.cli.commands.v1.MonitorResponse.prototype.getSuccess = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 4, false)); -}; - - -/** - * @param {boolean} value - * @return {!proto.cc.arduino.cli.commands.v1.MonitorResponse} returns this - */ -proto.cc.arduino.cli.commands.v1.MonitorResponse.prototype.setSuccess = function(value) { - return jspb.Message.setProto3BooleanField(this, 4, value); -}; - - - - - -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.MonitorPortSetting.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.MonitorPortSetting.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.MonitorPortSetting} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.commands.v1.MonitorPortSetting.toObject = function(includeInstance, msg) { - var f, obj = { - settingId: jspb.Message.getFieldWithDefault(msg, 1, ""), - value: jspb.Message.getFieldWithDefault(msg, 2, "") - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; +proto.cc.arduino.cli.commands.v1.MonitorResponse.prototype.hasRxData = function() { + return jspb.Message.getField(this, 2) != null; }; -} /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.MonitorPortSetting} + * optional MonitorPortConfiguration applied_settings = 3; + * @return {?proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration} */ -proto.cc.arduino.cli.commands.v1.MonitorPortSetting.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.MonitorPortSetting; - return proto.cc.arduino.cli.commands.v1.MonitorPortSetting.deserializeBinaryFromReader(msg, reader); +proto.cc.arduino.cli.commands.v1.MonitorResponse.prototype.getAppliedSettings = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration} */ ( + jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.MonitorPortConfiguration, 3)); }; /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.cc.arduino.cli.commands.v1.MonitorPortSetting} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.MonitorPortSetting} - */ -proto.cc.arduino.cli.commands.v1.MonitorPortSetting.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {string} */ (reader.readString()); - msg.setSettingId(value); - break; - case 2: - var value = /** @type {string} */ (reader.readString()); - msg.setValue(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; + * @param {?proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.MonitorResponse} returns this +*/ +proto.cc.arduino.cli.commands.v1.MonitorResponse.prototype.setAppliedSettings = function(value) { + return jspb.Message.setOneofWrapperField(this, 3, proto.cc.arduino.cli.commands.v1.MonitorResponse.oneofGroups_[0], value); }; /** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.MonitorResponse} returns this */ -proto.cc.arduino.cli.commands.v1.MonitorPortSetting.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.MonitorPortSetting.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); +proto.cc.arduino.cli.commands.v1.MonitorResponse.prototype.clearAppliedSettings = function() { + return this.setAppliedSettings(undefined); }; /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.MonitorPortSetting} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * Returns whether this field is set. + * @return {boolean} */ -proto.cc.arduino.cli.commands.v1.MonitorPortSetting.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getSettingId(); - if (f.length > 0) { - writer.writeString( - 1, - f - ); - } - f = message.getValue(); - if (f.length > 0) { - writer.writeString( - 2, - f - ); - } +proto.cc.arduino.cli.commands.v1.MonitorResponse.prototype.hasAppliedSettings = function() { + return jspb.Message.getField(this, 3) != null; }; /** - * optional string setting_id = 1; - * @return {string} + * optional bool success = 4; + * @return {boolean} */ -proto.cc.arduino.cli.commands.v1.MonitorPortSetting.prototype.getSettingId = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +proto.cc.arduino.cli.commands.v1.MonitorResponse.prototype.getSuccess = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 4, false)); }; /** - * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.MonitorPortSetting} returns this + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.MonitorResponse} returns this */ -proto.cc.arduino.cli.commands.v1.MonitorPortSetting.prototype.setSettingId = function(value) { - return jspb.Message.setProto3StringField(this, 1, value); +proto.cc.arduino.cli.commands.v1.MonitorResponse.prototype.setSuccess = function(value) { + return jspb.Message.setOneofField(this, 4, proto.cc.arduino.cli.commands.v1.MonitorResponse.oneofGroups_[0], value); }; /** - * optional string value = 2; - * @return {string} + * Clears the field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.MonitorResponse} returns this */ -proto.cc.arduino.cli.commands.v1.MonitorPortSetting.prototype.getValue = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +proto.cc.arduino.cli.commands.v1.MonitorResponse.prototype.clearSuccess = function() { + return jspb.Message.setOneofField(this, 4, proto.cc.arduino.cli.commands.v1.MonitorResponse.oneofGroups_[0], undefined); }; /** - * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.MonitorPortSetting} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.cc.arduino.cli.commands.v1.MonitorPortSetting.prototype.setValue = function(value) { - return jspb.Message.setProto3StringField(this, 2, value); +proto.cc.arduino.cli.commands.v1.MonitorResponse.prototype.hasSuccess = function() { + return jspb.Message.getField(this, 4) != null; }; diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/port_pb.d.ts b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/port_pb.d.ts index 233f0d59f..8904be349 100644 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/port_pb.d.ts +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/port_pb.d.ts @@ -9,20 +9,17 @@ import * as jspb from "google-protobuf"; export class Port extends jspb.Message { getAddress(): string; setAddress(value: string): Port; - getLabel(): string; setLabel(value: string): Port; - getProtocol(): string; setProtocol(value: string): Port; - getProtocolLabel(): string; setProtocolLabel(value: string): Port; - getPropertiesMap(): jspb.Map<string, string>; clearPropertiesMap(): void; - + getHardwareId(): string; + setHardwareId(value: string): Port; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): Port.AsObject; @@ -42,5 +39,6 @@ export namespace Port { protocolLabel: string, propertiesMap: Array<[string, string]>, + hardwareId: string, } } diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/port_pb.js b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/port_pb.js index 6b8eacaee..8ab777b53 100644 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/port_pb.js +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/port_pb.js @@ -13,7 +13,13 @@ var jspb = require('google-protobuf'); var goog = jspb; -var global = Function('return this')(); +var global = (function() { + if (this) { return this; } + if (typeof window !== 'undefined') { return window; } + if (typeof global !== 'undefined') { return global; } + if (typeof self !== 'undefined') { return self; } + return Function('return this')(); +}.call(null)); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.Port', null, global); /** @@ -73,7 +79,8 @@ proto.cc.arduino.cli.commands.v1.Port.toObject = function(includeInstance, msg) label: jspb.Message.getFieldWithDefault(msg, 2, ""), protocol: jspb.Message.getFieldWithDefault(msg, 3, ""), protocolLabel: jspb.Message.getFieldWithDefault(msg, 4, ""), - propertiesMap: (f = msg.getPropertiesMap()) ? f.toObject(includeInstance, undefined) : [] + propertiesMap: (f = msg.getPropertiesMap()) ? f.toObject(includeInstance, undefined) : [], + hardwareId: jspb.Message.getFieldWithDefault(msg, 6, "") }; if (includeInstance) { @@ -132,6 +139,10 @@ proto.cc.arduino.cli.commands.v1.Port.deserializeBinaryFromReader = function(msg jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readString, jspb.BinaryReader.prototype.readString, null, "", ""); }); break; + case 6: + var value = /** @type {string} */ (reader.readString()); + msg.setHardwareId(value); + break; default: reader.skipField(); break; @@ -193,6 +204,13 @@ proto.cc.arduino.cli.commands.v1.Port.serializeBinaryToWriter = function(message if (f && f.getLength() > 0) { f.serializeBinary(5, writer, jspb.BinaryWriter.prototype.writeString, jspb.BinaryWriter.prototype.writeString); } + f = message.getHardwareId(); + if (f.length > 0) { + writer.writeString( + 6, + f + ); + } }; @@ -290,4 +308,22 @@ proto.cc.arduino.cli.commands.v1.Port.prototype.clearPropertiesMap = function() return this;}; +/** + * optional string hardware_id = 6; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.Port.prototype.getHardwareId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 6, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.Port} returns this + */ +proto.cc.arduino.cli.commands.v1.Port.prototype.setHardwareId = function(value) { + return jspb.Message.setProto3StringField(this, 6, value); +}; + + goog.object.extend(exports, proto.cc.arduino.cli.commands.v1); diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/settings_grpc_pb.js b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/settings_grpc_pb.js new file mode 100644 index 000000000..97b3a2461 --- /dev/null +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/settings_grpc_pb.js @@ -0,0 +1 @@ +// GENERATED CODE -- NO SERVICES IN PROTO \ No newline at end of file diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/settings_pb.d.ts b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/settings_pb.d.ts new file mode 100644 index 000000000..0ce3d8a8e --- /dev/null +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/settings_pb.d.ts @@ -0,0 +1,627 @@ +// package: cc.arduino.cli.commands.v1 +// file: cc/arduino/cli/commands/v1/settings.proto + +/* tslint:disable */ +/* eslint-disable */ + +import * as jspb from "google-protobuf"; + +export class Configuration extends jspb.Message { + + hasDirectories(): boolean; + clearDirectories(): void; + getDirectories(): Configuration.Directories | undefined; + setDirectories(value?: Configuration.Directories): Configuration; + + hasNetwork(): boolean; + clearNetwork(): void; + getNetwork(): Configuration.Network | undefined; + setNetwork(value?: Configuration.Network): Configuration; + + hasSketch(): boolean; + clearSketch(): void; + getSketch(): Configuration.Sketch | undefined; + setSketch(value?: Configuration.Sketch): Configuration; + + hasBuildCache(): boolean; + clearBuildCache(): void; + getBuildCache(): Configuration.BuildCache | undefined; + setBuildCache(value?: Configuration.BuildCache): Configuration; + + hasBoardManager(): boolean; + clearBoardManager(): void; + getBoardManager(): Configuration.BoardManager | undefined; + setBoardManager(value?: Configuration.BoardManager): Configuration; + + hasDaemon(): boolean; + clearDaemon(): void; + getDaemon(): Configuration.Daemon | undefined; + setDaemon(value?: Configuration.Daemon): Configuration; + + hasOutput(): boolean; + clearOutput(): void; + getOutput(): Configuration.Output | undefined; + setOutput(value?: Configuration.Output): Configuration; + + hasLogging(): boolean; + clearLogging(): void; + getLogging(): Configuration.Logging | undefined; + setLogging(value?: Configuration.Logging): Configuration; + + hasLibrary(): boolean; + clearLibrary(): void; + getLibrary(): Configuration.Library | undefined; + setLibrary(value?: Configuration.Library): Configuration; + + hasUpdater(): boolean; + clearUpdater(): void; + getUpdater(): Configuration.Updater | undefined; + setUpdater(value?: Configuration.Updater): Configuration; + + hasLocale(): boolean; + clearLocale(): void; + getLocale(): string | undefined; + setLocale(value: string): Configuration; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Configuration.AsObject; + static toObject(includeInstance: boolean, msg: Configuration): Configuration.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: Configuration, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Configuration; + static deserializeBinaryFromReader(message: Configuration, reader: jspb.BinaryReader): Configuration; +} + +export namespace Configuration { + export type AsObject = { + directories?: Configuration.Directories.AsObject, + network?: Configuration.Network.AsObject, + sketch?: Configuration.Sketch.AsObject, + buildCache?: Configuration.BuildCache.AsObject, + boardManager?: Configuration.BoardManager.AsObject, + daemon?: Configuration.Daemon.AsObject, + output?: Configuration.Output.AsObject, + logging?: Configuration.Logging.AsObject, + library?: Configuration.Library.AsObject, + updater?: Configuration.Updater.AsObject, + locale?: string, + } + + + export class Directories extends jspb.Message { + getData(): string; + setData(value: string): Directories; + getUser(): string; + setUser(value: string): Directories; + getDownloads(): string; + setDownloads(value: string): Directories; + + hasBuiltin(): boolean; + clearBuiltin(): void; + getBuiltin(): Configuration.Directories.Builtin | undefined; + setBuiltin(value?: Configuration.Directories.Builtin): Directories; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Directories.AsObject; + static toObject(includeInstance: boolean, msg: Directories): Directories.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: Directories, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Directories; + static deserializeBinaryFromReader(message: Directories, reader: jspb.BinaryReader): Directories; + } + + export namespace Directories { + export type AsObject = { + data: string, + user: string, + downloads: string, + builtin?: Configuration.Directories.Builtin.AsObject, + } + + + export class Builtin extends jspb.Message { + + hasLibraries(): boolean; + clearLibraries(): void; + getLibraries(): string | undefined; + setLibraries(value: string): Builtin; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Builtin.AsObject; + static toObject(includeInstance: boolean, msg: Builtin): Builtin.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: Builtin, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Builtin; + static deserializeBinaryFromReader(message: Builtin, reader: jspb.BinaryReader): Builtin; + } + + export namespace Builtin { + export type AsObject = { + libraries?: string, + } + } + + } + + export class Network extends jspb.Message { + + hasExtraUserAgent(): boolean; + clearExtraUserAgent(): void; + getExtraUserAgent(): string | undefined; + setExtraUserAgent(value: string): Network; + + hasProxy(): boolean; + clearProxy(): void; + getProxy(): string | undefined; + setProxy(value: string): Network; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Network.AsObject; + static toObject(includeInstance: boolean, msg: Network): Network.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: Network, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Network; + static deserializeBinaryFromReader(message: Network, reader: jspb.BinaryReader): Network; + } + + export namespace Network { + export type AsObject = { + extraUserAgent?: string, + proxy?: string, + } + } + + export class Sketch extends jspb.Message { + getAlwaysExportBinaries(): boolean; + setAlwaysExportBinaries(value: boolean): Sketch; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Sketch.AsObject; + static toObject(includeInstance: boolean, msg: Sketch): Sketch.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: Sketch, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Sketch; + static deserializeBinaryFromReader(message: Sketch, reader: jspb.BinaryReader): Sketch; + } + + export namespace Sketch { + export type AsObject = { + alwaysExportBinaries: boolean, + } + } + + export class BuildCache extends jspb.Message { + getCompilationsBeforePurge(): number; + setCompilationsBeforePurge(value: number): BuildCache; + getTtlSecs(): number; + setTtlSecs(value: number): BuildCache; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): BuildCache.AsObject; + static toObject(includeInstance: boolean, msg: BuildCache): BuildCache.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: BuildCache, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): BuildCache; + static deserializeBinaryFromReader(message: BuildCache, reader: jspb.BinaryReader): BuildCache; + } + + export namespace BuildCache { + export type AsObject = { + compilationsBeforePurge: number, + ttlSecs: number, + } + } + + export class BoardManager extends jspb.Message { + clearAdditionalUrlsList(): void; + getAdditionalUrlsList(): Array<string>; + setAdditionalUrlsList(value: Array<string>): BoardManager; + addAdditionalUrls(value: string, index?: number): string; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): BoardManager.AsObject; + static toObject(includeInstance: boolean, msg: BoardManager): BoardManager.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: BoardManager, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): BoardManager; + static deserializeBinaryFromReader(message: BoardManager, reader: jspb.BinaryReader): BoardManager; + } + + export namespace BoardManager { + export type AsObject = { + additionalUrlsList: Array<string>, + } + } + + export class Daemon extends jspb.Message { + getPort(): string; + setPort(value: string): Daemon; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Daemon.AsObject; + static toObject(includeInstance: boolean, msg: Daemon): Daemon.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: Daemon, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Daemon; + static deserializeBinaryFromReader(message: Daemon, reader: jspb.BinaryReader): Daemon; + } + + export namespace Daemon { + export type AsObject = { + port: string, + } + } + + export class Output extends jspb.Message { + getNoColor(): boolean; + setNoColor(value: boolean): Output; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Output.AsObject; + static toObject(includeInstance: boolean, msg: Output): Output.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: Output, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Output; + static deserializeBinaryFromReader(message: Output, reader: jspb.BinaryReader): Output; + } + + export namespace Output { + export type AsObject = { + noColor: boolean, + } + } + + export class Logging extends jspb.Message { + getLevel(): string; + setLevel(value: string): Logging; + getFormat(): string; + setFormat(value: string): Logging; + + hasFile(): boolean; + clearFile(): void; + getFile(): string | undefined; + setFile(value: string): Logging; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Logging.AsObject; + static toObject(includeInstance: boolean, msg: Logging): Logging.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: Logging, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Logging; + static deserializeBinaryFromReader(message: Logging, reader: jspb.BinaryReader): Logging; + } + + export namespace Logging { + export type AsObject = { + level: string, + format: string, + file?: string, + } + } + + export class Library extends jspb.Message { + getEnableUnsafeInstall(): boolean; + setEnableUnsafeInstall(value: boolean): Library; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Library.AsObject; + static toObject(includeInstance: boolean, msg: Library): Library.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: Library, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Library; + static deserializeBinaryFromReader(message: Library, reader: jspb.BinaryReader): Library; + } + + export namespace Library { + export type AsObject = { + enableUnsafeInstall: boolean, + } + } + + export class Updater extends jspb.Message { + getEnableNotification(): boolean; + setEnableNotification(value: boolean): Updater; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Updater.AsObject; + static toObject(includeInstance: boolean, msg: Updater): Updater.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: Updater, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Updater; + static deserializeBinaryFromReader(message: Updater, reader: jspb.BinaryReader): Updater; + } + + export namespace Updater { + export type AsObject = { + enableNotification: boolean, + } + } + +} + +export class ConfigurationGetRequest extends jspb.Message { + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): ConfigurationGetRequest.AsObject; + static toObject(includeInstance: boolean, msg: ConfigurationGetRequest): ConfigurationGetRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: ConfigurationGetRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): ConfigurationGetRequest; + static deserializeBinaryFromReader(message: ConfigurationGetRequest, reader: jspb.BinaryReader): ConfigurationGetRequest; +} + +export namespace ConfigurationGetRequest { + export type AsObject = { + } +} + +export class ConfigurationGetResponse extends jspb.Message { + + hasConfiguration(): boolean; + clearConfiguration(): void; + getConfiguration(): Configuration | undefined; + setConfiguration(value?: Configuration): ConfigurationGetResponse; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): ConfigurationGetResponse.AsObject; + static toObject(includeInstance: boolean, msg: ConfigurationGetResponse): ConfigurationGetResponse.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: ConfigurationGetResponse, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): ConfigurationGetResponse; + static deserializeBinaryFromReader(message: ConfigurationGetResponse, reader: jspb.BinaryReader): ConfigurationGetResponse; +} + +export namespace ConfigurationGetResponse { + export type AsObject = { + configuration?: Configuration.AsObject, + } +} + +export class ConfigurationSaveRequest extends jspb.Message { + getSettingsFormat(): string; + setSettingsFormat(value: string): ConfigurationSaveRequest; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): ConfigurationSaveRequest.AsObject; + static toObject(includeInstance: boolean, msg: ConfigurationSaveRequest): ConfigurationSaveRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: ConfigurationSaveRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): ConfigurationSaveRequest; + static deserializeBinaryFromReader(message: ConfigurationSaveRequest, reader: jspb.BinaryReader): ConfigurationSaveRequest; +} + +export namespace ConfigurationSaveRequest { + export type AsObject = { + settingsFormat: string, + } +} + +export class ConfigurationSaveResponse extends jspb.Message { + getEncodedSettings(): string; + setEncodedSettings(value: string): ConfigurationSaveResponse; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): ConfigurationSaveResponse.AsObject; + static toObject(includeInstance: boolean, msg: ConfigurationSaveResponse): ConfigurationSaveResponse.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: ConfigurationSaveResponse, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): ConfigurationSaveResponse; + static deserializeBinaryFromReader(message: ConfigurationSaveResponse, reader: jspb.BinaryReader): ConfigurationSaveResponse; +} + +export namespace ConfigurationSaveResponse { + export type AsObject = { + encodedSettings: string, + } +} + +export class ConfigurationOpenRequest extends jspb.Message { + getEncodedSettings(): string; + setEncodedSettings(value: string): ConfigurationOpenRequest; + getSettingsFormat(): string; + setSettingsFormat(value: string): ConfigurationOpenRequest; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): ConfigurationOpenRequest.AsObject; + static toObject(includeInstance: boolean, msg: ConfigurationOpenRequest): ConfigurationOpenRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: ConfigurationOpenRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): ConfigurationOpenRequest; + static deserializeBinaryFromReader(message: ConfigurationOpenRequest, reader: jspb.BinaryReader): ConfigurationOpenRequest; +} + +export namespace ConfigurationOpenRequest { + export type AsObject = { + encodedSettings: string, + settingsFormat: string, + } +} + +export class ConfigurationOpenResponse extends jspb.Message { + clearWarningsList(): void; + getWarningsList(): Array<string>; + setWarningsList(value: Array<string>): ConfigurationOpenResponse; + addWarnings(value: string, index?: number): string; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): ConfigurationOpenResponse.AsObject; + static toObject(includeInstance: boolean, msg: ConfigurationOpenResponse): ConfigurationOpenResponse.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: ConfigurationOpenResponse, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): ConfigurationOpenResponse; + static deserializeBinaryFromReader(message: ConfigurationOpenResponse, reader: jspb.BinaryReader): ConfigurationOpenResponse; +} + +export namespace ConfigurationOpenResponse { + export type AsObject = { + warningsList: Array<string>, + } +} + +export class SettingsGetValueRequest extends jspb.Message { + getKey(): string; + setKey(value: string): SettingsGetValueRequest; + getValueFormat(): string; + setValueFormat(value: string): SettingsGetValueRequest; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): SettingsGetValueRequest.AsObject; + static toObject(includeInstance: boolean, msg: SettingsGetValueRequest): SettingsGetValueRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: SettingsGetValueRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): SettingsGetValueRequest; + static deserializeBinaryFromReader(message: SettingsGetValueRequest, reader: jspb.BinaryReader): SettingsGetValueRequest; +} + +export namespace SettingsGetValueRequest { + export type AsObject = { + key: string, + valueFormat: string, + } +} + +export class SettingsGetValueResponse extends jspb.Message { + getEncodedValue(): string; + setEncodedValue(value: string): SettingsGetValueResponse; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): SettingsGetValueResponse.AsObject; + static toObject(includeInstance: boolean, msg: SettingsGetValueResponse): SettingsGetValueResponse.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: SettingsGetValueResponse, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): SettingsGetValueResponse; + static deserializeBinaryFromReader(message: SettingsGetValueResponse, reader: jspb.BinaryReader): SettingsGetValueResponse; +} + +export namespace SettingsGetValueResponse { + export type AsObject = { + encodedValue: string, + } +} + +export class SettingsSetValueRequest extends jspb.Message { + getKey(): string; + setKey(value: string): SettingsSetValueRequest; + getEncodedValue(): string; + setEncodedValue(value: string): SettingsSetValueRequest; + getValueFormat(): string; + setValueFormat(value: string): SettingsSetValueRequest; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): SettingsSetValueRequest.AsObject; + static toObject(includeInstance: boolean, msg: SettingsSetValueRequest): SettingsSetValueRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: SettingsSetValueRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): SettingsSetValueRequest; + static deserializeBinaryFromReader(message: SettingsSetValueRequest, reader: jspb.BinaryReader): SettingsSetValueRequest; +} + +export namespace SettingsSetValueRequest { + export type AsObject = { + key: string, + encodedValue: string, + valueFormat: string, + } +} + +export class SettingsSetValueResponse extends jspb.Message { + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): SettingsSetValueResponse.AsObject; + static toObject(includeInstance: boolean, msg: SettingsSetValueResponse): SettingsSetValueResponse.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: SettingsSetValueResponse, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): SettingsSetValueResponse; + static deserializeBinaryFromReader(message: SettingsSetValueResponse, reader: jspb.BinaryReader): SettingsSetValueResponse; +} + +export namespace SettingsSetValueResponse { + export type AsObject = { + } +} + +export class SettingsEnumerateRequest extends jspb.Message { + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): SettingsEnumerateRequest.AsObject; + static toObject(includeInstance: boolean, msg: SettingsEnumerateRequest): SettingsEnumerateRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: SettingsEnumerateRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): SettingsEnumerateRequest; + static deserializeBinaryFromReader(message: SettingsEnumerateRequest, reader: jspb.BinaryReader): SettingsEnumerateRequest; +} + +export namespace SettingsEnumerateRequest { + export type AsObject = { + } +} + +export class SettingsEnumerateResponse extends jspb.Message { + clearEntriesList(): void; + getEntriesList(): Array<SettingsEnumerateResponse.Entry>; + setEntriesList(value: Array<SettingsEnumerateResponse.Entry>): SettingsEnumerateResponse; + addEntries(value?: SettingsEnumerateResponse.Entry, index?: number): SettingsEnumerateResponse.Entry; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): SettingsEnumerateResponse.AsObject; + static toObject(includeInstance: boolean, msg: SettingsEnumerateResponse): SettingsEnumerateResponse.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: SettingsEnumerateResponse, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): SettingsEnumerateResponse; + static deserializeBinaryFromReader(message: SettingsEnumerateResponse, reader: jspb.BinaryReader): SettingsEnumerateResponse; +} + +export namespace SettingsEnumerateResponse { + export type AsObject = { + entriesList: Array<SettingsEnumerateResponse.Entry.AsObject>, + } + + + export class Entry extends jspb.Message { + getKey(): string; + setKey(value: string): Entry; + getType(): string; + setType(value: string): Entry; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Entry.AsObject; + static toObject(includeInstance: boolean, msg: Entry): Entry.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: Entry, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Entry; + static deserializeBinaryFromReader(message: Entry, reader: jspb.BinaryReader): Entry; + } + + export namespace Entry { + export type AsObject = { + key: string, + type: string, + } + } + +} diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/settings_pb.js b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/settings_pb.js new file mode 100644 index 000000000..1740aba5b --- /dev/null +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/settings_pb.js @@ -0,0 +1,4821 @@ +// source: cc/arduino/cli/commands/v1/settings.proto +/** + * @fileoverview + * @enhanceable + * @suppress {missingRequire} reports error on implicit type usages. + * @suppress {messageConventions} JS Compiler reports an error if a variable or + * field starts with 'MSG_' and isn't a translatable message. + * @public + */ +// GENERATED CODE -- DO NOT EDIT! +/* eslint-disable */ +// @ts-nocheck + +var jspb = require('google-protobuf'); +var goog = jspb; +var global = (function() { + if (this) { return this; } + if (typeof window !== 'undefined') { return window; } + if (typeof global !== 'undefined') { return global; } + if (typeof self !== 'undefined') { return self; } + return Function('return this')(); +}.call(null)); + +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.Configuration', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.Configuration.BoardManager', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.Configuration.BuildCache', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.Configuration.Daemon', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.Configuration.Directories', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.Configuration.Directories.Builtin', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.Configuration.Library', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.Configuration.Logging', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.Configuration.Network', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.Configuration.Output', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.Configuration.Sketch', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.Configuration.Updater', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.ConfigurationGetRequest', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.ConfigurationGetResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.ConfigurationOpenRequest', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.ConfigurationOpenResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.ConfigurationSaveRequest', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.ConfigurationSaveResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.SettingsEnumerateRequest', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.SettingsSetValueResponse', null, global); +/** + * 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.Configuration = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.Configuration, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.Configuration.displayName = 'proto.cc.arduino.cli.commands.v1.Configuration'; +} +/** + * 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.Configuration.Directories = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.Configuration.Directories, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.Configuration.Directories.displayName = 'proto.cc.arduino.cli.commands.v1.Configuration.Directories'; +} +/** + * 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.Configuration.Directories.Builtin = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.Configuration.Directories.Builtin, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.Configuration.Directories.Builtin.displayName = 'proto.cc.arduino.cli.commands.v1.Configuration.Directories.Builtin'; +} +/** + * 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.Configuration.Network = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.Configuration.Network, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.Configuration.Network.displayName = 'proto.cc.arduino.cli.commands.v1.Configuration.Network'; +} +/** + * 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.Configuration.Sketch = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.Configuration.Sketch, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.Configuration.Sketch.displayName = 'proto.cc.arduino.cli.commands.v1.Configuration.Sketch'; +} +/** + * 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.Configuration.BuildCache = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.Configuration.BuildCache, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.Configuration.BuildCache.displayName = 'proto.cc.arduino.cli.commands.v1.Configuration.BuildCache'; +} +/** + * 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.Configuration.BoardManager = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.cc.arduino.cli.commands.v1.Configuration.BoardManager.repeatedFields_, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.Configuration.BoardManager, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.Configuration.BoardManager.displayName = 'proto.cc.arduino.cli.commands.v1.Configuration.BoardManager'; +} +/** + * 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.Configuration.Daemon = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.Configuration.Daemon, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.Configuration.Daemon.displayName = 'proto.cc.arduino.cli.commands.v1.Configuration.Daemon'; +} +/** + * 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.Configuration.Output = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.Configuration.Output, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.Configuration.Output.displayName = 'proto.cc.arduino.cli.commands.v1.Configuration.Output'; +} +/** + * 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.Configuration.Logging = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.Configuration.Logging, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.Configuration.Logging.displayName = 'proto.cc.arduino.cli.commands.v1.Configuration.Logging'; +} +/** + * 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.Configuration.Library = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.Configuration.Library, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.Configuration.Library.displayName = 'proto.cc.arduino.cli.commands.v1.Configuration.Library'; +} +/** + * 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.Configuration.Updater = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.Configuration.Updater, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.Configuration.Updater.displayName = 'proto.cc.arduino.cli.commands.v1.Configuration.Updater'; +} +/** + * 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.ConfigurationGetRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.ConfigurationGetRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.ConfigurationGetRequest.displayName = 'proto.cc.arduino.cli.commands.v1.ConfigurationGetRequest'; +} +/** + * 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.ConfigurationGetResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.ConfigurationGetResponse, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.ConfigurationGetResponse.displayName = 'proto.cc.arduino.cli.commands.v1.ConfigurationGetResponse'; +} +/** + * 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.ConfigurationSaveRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.ConfigurationSaveRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.ConfigurationSaveRequest.displayName = 'proto.cc.arduino.cli.commands.v1.ConfigurationSaveRequest'; +} +/** + * 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.ConfigurationSaveResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.ConfigurationSaveResponse, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.ConfigurationSaveResponse.displayName = 'proto.cc.arduino.cli.commands.v1.ConfigurationSaveResponse'; +} +/** + * 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.ConfigurationOpenRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.ConfigurationOpenRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.ConfigurationOpenRequest.displayName = 'proto.cc.arduino.cli.commands.v1.ConfigurationOpenRequest'; +} +/** + * 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.ConfigurationOpenResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.cc.arduino.cli.commands.v1.ConfigurationOpenResponse.repeatedFields_, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.ConfigurationOpenResponse, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.ConfigurationOpenResponse.displayName = 'proto.cc.arduino.cli.commands.v1.ConfigurationOpenResponse'; +} +/** + * 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.SettingsGetValueRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest.displayName = 'proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest'; +} +/** + * 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.SettingsGetValueResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse.displayName = 'proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse'; +} +/** + * 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.SettingsSetValueRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.displayName = 'proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest'; +} +/** + * 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.SettingsSetValueResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.SettingsSetValueResponse, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.SettingsSetValueResponse.displayName = 'proto.cc.arduino.cli.commands.v1.SettingsSetValueResponse'; +} +/** + * 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.SettingsEnumerateRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.SettingsEnumerateRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.SettingsEnumerateRequest.displayName = 'proto.cc.arduino.cli.commands.v1.SettingsEnumerateRequest'; +} +/** + * 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.SettingsEnumerateResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.repeatedFields_, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.displayName = 'proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse'; +} +/** + * 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.SettingsEnumerateResponse.Entry = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry.displayName = 'proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry'; +} + + + +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.Configuration.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.Configuration.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.Configuration} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.Configuration.toObject = function(includeInstance, msg) { + var f, obj = { + directories: (f = msg.getDirectories()) && proto.cc.arduino.cli.commands.v1.Configuration.Directories.toObject(includeInstance, f), + network: (f = msg.getNetwork()) && proto.cc.arduino.cli.commands.v1.Configuration.Network.toObject(includeInstance, f), + sketch: (f = msg.getSketch()) && proto.cc.arduino.cli.commands.v1.Configuration.Sketch.toObject(includeInstance, f), + buildCache: (f = msg.getBuildCache()) && proto.cc.arduino.cli.commands.v1.Configuration.BuildCache.toObject(includeInstance, f), + boardManager: (f = msg.getBoardManager()) && proto.cc.arduino.cli.commands.v1.Configuration.BoardManager.toObject(includeInstance, f), + daemon: (f = msg.getDaemon()) && proto.cc.arduino.cli.commands.v1.Configuration.Daemon.toObject(includeInstance, f), + output: (f = msg.getOutput()) && proto.cc.arduino.cli.commands.v1.Configuration.Output.toObject(includeInstance, f), + logging: (f = msg.getLogging()) && proto.cc.arduino.cli.commands.v1.Configuration.Logging.toObject(includeInstance, f), + library: (f = msg.getLibrary()) && proto.cc.arduino.cli.commands.v1.Configuration.Library.toObject(includeInstance, f), + updater: (f = msg.getUpdater()) && proto.cc.arduino.cli.commands.v1.Configuration.Updater.toObject(includeInstance, f), + locale: jspb.Message.getFieldWithDefault(msg, 100, "") + }; + + 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.Configuration} + */ +proto.cc.arduino.cli.commands.v1.Configuration.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.Configuration; + return proto.cc.arduino.cli.commands.v1.Configuration.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.Configuration} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration} + */ +proto.cc.arduino.cli.commands.v1.Configuration.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.Configuration.Directories; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.Configuration.Directories.deserializeBinaryFromReader); + msg.setDirectories(value); + break; + case 2: + var value = new proto.cc.arduino.cli.commands.v1.Configuration.Network; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.Configuration.Network.deserializeBinaryFromReader); + msg.setNetwork(value); + break; + case 3: + var value = new proto.cc.arduino.cli.commands.v1.Configuration.Sketch; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.Configuration.Sketch.deserializeBinaryFromReader); + msg.setSketch(value); + break; + case 4: + var value = new proto.cc.arduino.cli.commands.v1.Configuration.BuildCache; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.Configuration.BuildCache.deserializeBinaryFromReader); + msg.setBuildCache(value); + break; + case 5: + var value = new proto.cc.arduino.cli.commands.v1.Configuration.BoardManager; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.Configuration.BoardManager.deserializeBinaryFromReader); + msg.setBoardManager(value); + break; + case 6: + var value = new proto.cc.arduino.cli.commands.v1.Configuration.Daemon; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.Configuration.Daemon.deserializeBinaryFromReader); + msg.setDaemon(value); + break; + case 7: + var value = new proto.cc.arduino.cli.commands.v1.Configuration.Output; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.Configuration.Output.deserializeBinaryFromReader); + msg.setOutput(value); + break; + case 8: + var value = new proto.cc.arduino.cli.commands.v1.Configuration.Logging; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.Configuration.Logging.deserializeBinaryFromReader); + msg.setLogging(value); + break; + case 9: + var value = new proto.cc.arduino.cli.commands.v1.Configuration.Library; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.Configuration.Library.deserializeBinaryFromReader); + msg.setLibrary(value); + break; + case 10: + var value = new proto.cc.arduino.cli.commands.v1.Configuration.Updater; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.Configuration.Updater.deserializeBinaryFromReader); + msg.setUpdater(value); + break; + case 100: + var value = /** @type {string} */ (reader.readString()); + msg.setLocale(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.Configuration.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.Configuration.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.Configuration} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.Configuration.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getDirectories(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.cc.arduino.cli.commands.v1.Configuration.Directories.serializeBinaryToWriter + ); + } + f = message.getNetwork(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.cc.arduino.cli.commands.v1.Configuration.Network.serializeBinaryToWriter + ); + } + f = message.getSketch(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.cc.arduino.cli.commands.v1.Configuration.Sketch.serializeBinaryToWriter + ); + } + f = message.getBuildCache(); + if (f != null) { + writer.writeMessage( + 4, + f, + proto.cc.arduino.cli.commands.v1.Configuration.BuildCache.serializeBinaryToWriter + ); + } + f = message.getBoardManager(); + if (f != null) { + writer.writeMessage( + 5, + f, + proto.cc.arduino.cli.commands.v1.Configuration.BoardManager.serializeBinaryToWriter + ); + } + f = message.getDaemon(); + if (f != null) { + writer.writeMessage( + 6, + f, + proto.cc.arduino.cli.commands.v1.Configuration.Daemon.serializeBinaryToWriter + ); + } + f = message.getOutput(); + if (f != null) { + writer.writeMessage( + 7, + f, + proto.cc.arduino.cli.commands.v1.Configuration.Output.serializeBinaryToWriter + ); + } + f = message.getLogging(); + if (f != null) { + writer.writeMessage( + 8, + f, + proto.cc.arduino.cli.commands.v1.Configuration.Logging.serializeBinaryToWriter + ); + } + f = message.getLibrary(); + if (f != null) { + writer.writeMessage( + 9, + f, + proto.cc.arduino.cli.commands.v1.Configuration.Library.serializeBinaryToWriter + ); + } + f = message.getUpdater(); + if (f != null) { + writer.writeMessage( + 10, + f, + proto.cc.arduino.cli.commands.v1.Configuration.Updater.serializeBinaryToWriter + ); + } + f = /** @type {string} */ (jspb.Message.getField(message, 100)); + if (f != null) { + writer.writeString( + 100, + f + ); + } +}; + + + + + +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.Configuration.Directories.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.Configuration.Directories.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.Configuration.Directories} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.Configuration.Directories.toObject = function(includeInstance, msg) { + var f, obj = { + data: jspb.Message.getFieldWithDefault(msg, 1, ""), + user: jspb.Message.getFieldWithDefault(msg, 2, ""), + downloads: jspb.Message.getFieldWithDefault(msg, 3, ""), + builtin: (f = msg.getBuiltin()) && proto.cc.arduino.cli.commands.v1.Configuration.Directories.Builtin.toObject(includeInstance, f) + }; + + 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.Configuration.Directories} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Directories.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.Configuration.Directories; + return proto.cc.arduino.cli.commands.v1.Configuration.Directories.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.Configuration.Directories} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Directories} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Directories.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setData(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setUser(value); + break; + case 3: + var value = /** @type {string} */ (reader.readString()); + msg.setDownloads(value); + break; + case 4: + var value = new proto.cc.arduino.cli.commands.v1.Configuration.Directories.Builtin; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.Configuration.Directories.Builtin.deserializeBinaryFromReader); + msg.setBuiltin(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.Configuration.Directories.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.Configuration.Directories.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.Configuration.Directories} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.Configuration.Directories.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getData(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } + f = message.getUser(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } + f = message.getDownloads(); + if (f.length > 0) { + writer.writeString( + 3, + f + ); + } + f = message.getBuiltin(); + if (f != null) { + writer.writeMessage( + 4, + f, + proto.cc.arduino.cli.commands.v1.Configuration.Directories.Builtin.serializeBinaryToWriter + ); + } +}; + + + + + +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.Configuration.Directories.Builtin.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.Configuration.Directories.Builtin.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.Configuration.Directories.Builtin} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.Configuration.Directories.Builtin.toObject = function(includeInstance, msg) { + var f, obj = { + libraries: jspb.Message.getFieldWithDefault(msg, 1, "") + }; + + 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.Configuration.Directories.Builtin} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Directories.Builtin.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.Configuration.Directories.Builtin; + return proto.cc.arduino.cli.commands.v1.Configuration.Directories.Builtin.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.Configuration.Directories.Builtin} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Directories.Builtin} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Directories.Builtin.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setLibraries(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.Configuration.Directories.Builtin.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.Configuration.Directories.Builtin.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.Configuration.Directories.Builtin} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.Configuration.Directories.Builtin.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = /** @type {string} */ (jspb.Message.getField(message, 1)); + if (f != null) { + writer.writeString( + 1, + f + ); + } +}; + + +/** + * optional string libraries = 1; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Directories.Builtin.prototype.getLibraries = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Directories.Builtin} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.Directories.Builtin.prototype.setLibraries = function(value) { + return jspb.Message.setField(this, 1, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Directories.Builtin} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.Directories.Builtin.prototype.clearLibraries = function() { + return jspb.Message.setField(this, 1, undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Directories.Builtin.prototype.hasLibraries = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional string data = 1; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Directories.prototype.getData = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Directories} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.Directories.prototype.setData = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + +/** + * optional string user = 2; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Directories.prototype.getUser = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Directories} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.Directories.prototype.setUser = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + +/** + * optional string downloads = 3; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Directories.prototype.getDownloads = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Directories} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.Directories.prototype.setDownloads = function(value) { + return jspb.Message.setProto3StringField(this, 3, value); +}; + + +/** + * optional Builtin builtin = 4; + * @return {?proto.cc.arduino.cli.commands.v1.Configuration.Directories.Builtin} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Directories.prototype.getBuiltin = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.Configuration.Directories.Builtin} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.Configuration.Directories.Builtin, 4)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.Configuration.Directories.Builtin|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Directories} returns this +*/ +proto.cc.arduino.cli.commands.v1.Configuration.Directories.prototype.setBuiltin = function(value) { + return jspb.Message.setWrapperField(this, 4, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Directories} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.Directories.prototype.clearBuiltin = function() { + return this.setBuiltin(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Directories.prototype.hasBuiltin = function() { + return jspb.Message.getField(this, 4) != null; +}; + + + + + +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.Configuration.Network.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.Configuration.Network.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.Configuration.Network} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.Configuration.Network.toObject = function(includeInstance, msg) { + var f, obj = { + extraUserAgent: jspb.Message.getFieldWithDefault(msg, 1, ""), + proxy: jspb.Message.getFieldWithDefault(msg, 2, "") + }; + + 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.Configuration.Network} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Network.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.Configuration.Network; + return proto.cc.arduino.cli.commands.v1.Configuration.Network.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.Configuration.Network} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Network} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Network.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setExtraUserAgent(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setProxy(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.Configuration.Network.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.Configuration.Network.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.Configuration.Network} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.Configuration.Network.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = /** @type {string} */ (jspb.Message.getField(message, 1)); + if (f != null) { + writer.writeString( + 1, + f + ); + } + f = /** @type {string} */ (jspb.Message.getField(message, 2)); + if (f != null) { + writer.writeString( + 2, + f + ); + } +}; + + +/** + * optional string extra_user_agent = 1; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Network.prototype.getExtraUserAgent = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Network} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.Network.prototype.setExtraUserAgent = function(value) { + return jspb.Message.setField(this, 1, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Network} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.Network.prototype.clearExtraUserAgent = function() { + return jspb.Message.setField(this, 1, undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Network.prototype.hasExtraUserAgent = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional string proxy = 2; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Network.prototype.getProxy = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Network} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.Network.prototype.setProxy = function(value) { + return jspb.Message.setField(this, 2, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Network} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.Network.prototype.clearProxy = function() { + return jspb.Message.setField(this, 2, undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Network.prototype.hasProxy = function() { + return jspb.Message.getField(this, 2) != null; +}; + + + + + +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.Configuration.Sketch.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.Configuration.Sketch.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.Configuration.Sketch} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.Configuration.Sketch.toObject = function(includeInstance, msg) { + var f, obj = { + alwaysExportBinaries: jspb.Message.getBooleanFieldWithDefault(msg, 1, 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.Configuration.Sketch} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Sketch.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.Configuration.Sketch; + return proto.cc.arduino.cli.commands.v1.Configuration.Sketch.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.Configuration.Sketch} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Sketch} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Sketch.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setAlwaysExportBinaries(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.Configuration.Sketch.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.Configuration.Sketch.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.Configuration.Sketch} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.Configuration.Sketch.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getAlwaysExportBinaries(); + if (f) { + writer.writeBool( + 1, + f + ); + } +}; + + +/** + * optional bool always_export_binaries = 1; + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Sketch.prototype.getAlwaysExportBinaries = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 1, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Sketch} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.Sketch.prototype.setAlwaysExportBinaries = function(value) { + return jspb.Message.setProto3BooleanField(this, 1, value); +}; + + + + + +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.Configuration.BuildCache.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.Configuration.BuildCache.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.Configuration.BuildCache} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.Configuration.BuildCache.toObject = function(includeInstance, msg) { + var f, obj = { + compilationsBeforePurge: jspb.Message.getFieldWithDefault(msg, 1, 0), + ttlSecs: jspb.Message.getFieldWithDefault(msg, 2, 0) + }; + + 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.Configuration.BuildCache} + */ +proto.cc.arduino.cli.commands.v1.Configuration.BuildCache.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.Configuration.BuildCache; + return proto.cc.arduino.cli.commands.v1.Configuration.BuildCache.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.Configuration.BuildCache} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.BuildCache} + */ +proto.cc.arduino.cli.commands.v1.Configuration.BuildCache.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {number} */ (reader.readUint64()); + msg.setCompilationsBeforePurge(value); + break; + case 2: + var value = /** @type {number} */ (reader.readUint64()); + msg.setTtlSecs(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.Configuration.BuildCache.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.Configuration.BuildCache.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.Configuration.BuildCache} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.Configuration.BuildCache.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getCompilationsBeforePurge(); + if (f !== 0) { + writer.writeUint64( + 1, + f + ); + } + f = message.getTtlSecs(); + if (f !== 0) { + writer.writeUint64( + 2, + f + ); + } +}; + + +/** + * optional uint64 compilations_before_purge = 1; + * @return {number} + */ +proto.cc.arduino.cli.commands.v1.Configuration.BuildCache.prototype.getCompilationsBeforePurge = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.BuildCache} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.BuildCache.prototype.setCompilationsBeforePurge = function(value) { + return jspb.Message.setProto3IntField(this, 1, value); +}; + + +/** + * optional uint64 ttl_secs = 2; + * @return {number} + */ +proto.cc.arduino.cli.commands.v1.Configuration.BuildCache.prototype.getTtlSecs = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.BuildCache} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.BuildCache.prototype.setTtlSecs = function(value) { + return jspb.Message.setProto3IntField(this, 2, value); +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.cc.arduino.cli.commands.v1.Configuration.BoardManager.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.Configuration.BoardManager.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.Configuration.BoardManager.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.Configuration.BoardManager} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.Configuration.BoardManager.toObject = function(includeInstance, msg) { + var f, obj = { + additionalUrlsList: (f = jspb.Message.getRepeatedField(msg, 1)) == null ? undefined : f + }; + + 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.Configuration.BoardManager} + */ +proto.cc.arduino.cli.commands.v1.Configuration.BoardManager.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.Configuration.BoardManager; + return proto.cc.arduino.cli.commands.v1.Configuration.BoardManager.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.Configuration.BoardManager} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.BoardManager} + */ +proto.cc.arduino.cli.commands.v1.Configuration.BoardManager.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.addAdditionalUrls(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.Configuration.BoardManager.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.Configuration.BoardManager.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.Configuration.BoardManager} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.Configuration.BoardManager.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getAdditionalUrlsList(); + if (f.length > 0) { + writer.writeRepeatedString( + 1, + f + ); + } +}; + + +/** + * repeated string additional_urls = 1; + * @return {!Array<string>} + */ +proto.cc.arduino.cli.commands.v1.Configuration.BoardManager.prototype.getAdditionalUrlsList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 1)); +}; + + +/** + * @param {!Array<string>} value + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.BoardManager} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.BoardManager.prototype.setAdditionalUrlsList = function(value) { + return jspb.Message.setField(this, 1, value || []); +}; + + +/** + * @param {string} value + * @param {number=} opt_index + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.BoardManager} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.BoardManager.prototype.addAdditionalUrls = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 1, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.BoardManager} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.BoardManager.prototype.clearAdditionalUrlsList = function() { + return this.setAdditionalUrlsList([]); +}; + + + + + +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.Configuration.Daemon.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.Configuration.Daemon.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.Configuration.Daemon} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.Configuration.Daemon.toObject = function(includeInstance, msg) { + var f, obj = { + port: jspb.Message.getFieldWithDefault(msg, 1, "") + }; + + 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.Configuration.Daemon} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Daemon.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.Configuration.Daemon; + return proto.cc.arduino.cli.commands.v1.Configuration.Daemon.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.Configuration.Daemon} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Daemon} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Daemon.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setPort(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.Configuration.Daemon.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.Configuration.Daemon.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.Configuration.Daemon} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.Configuration.Daemon.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getPort(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } +}; + + +/** + * optional string port = 1; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Daemon.prototype.getPort = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Daemon} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.Daemon.prototype.setPort = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + + + + +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.Configuration.Output.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.Configuration.Output.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.Configuration.Output} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.Configuration.Output.toObject = function(includeInstance, msg) { + var f, obj = { + noColor: jspb.Message.getBooleanFieldWithDefault(msg, 1, 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.Configuration.Output} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Output.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.Configuration.Output; + return proto.cc.arduino.cli.commands.v1.Configuration.Output.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.Configuration.Output} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Output} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Output.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setNoColor(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.Configuration.Output.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.Configuration.Output.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.Configuration.Output} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.Configuration.Output.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getNoColor(); + if (f) { + writer.writeBool( + 1, + f + ); + } +}; + + +/** + * optional bool no_color = 1; + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Output.prototype.getNoColor = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 1, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Output} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.Output.prototype.setNoColor = function(value) { + return jspb.Message.setProto3BooleanField(this, 1, value); +}; + + + + + +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.Configuration.Logging.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.Configuration.Logging.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.Configuration.Logging} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.Configuration.Logging.toObject = function(includeInstance, msg) { + var f, obj = { + level: jspb.Message.getFieldWithDefault(msg, 1, ""), + format: jspb.Message.getFieldWithDefault(msg, 2, ""), + file: jspb.Message.getFieldWithDefault(msg, 3, "") + }; + + 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.Configuration.Logging} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Logging.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.Configuration.Logging; + return proto.cc.arduino.cli.commands.v1.Configuration.Logging.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.Configuration.Logging} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Logging} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Logging.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setLevel(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setFormat(value); + break; + case 3: + var value = /** @type {string} */ (reader.readString()); + msg.setFile(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.Configuration.Logging.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.Configuration.Logging.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.Configuration.Logging} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.Configuration.Logging.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getLevel(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } + f = message.getFormat(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } + f = /** @type {string} */ (jspb.Message.getField(message, 3)); + if (f != null) { + writer.writeString( + 3, + f + ); + } +}; + + +/** + * optional string level = 1; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Logging.prototype.getLevel = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Logging} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.Logging.prototype.setLevel = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + +/** + * optional string format = 2; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Logging.prototype.getFormat = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Logging} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.Logging.prototype.setFormat = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + +/** + * optional string file = 3; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Logging.prototype.getFile = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Logging} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.Logging.prototype.setFile = function(value) { + return jspb.Message.setField(this, 3, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Logging} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.Logging.prototype.clearFile = function() { + return jspb.Message.setField(this, 3, undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Logging.prototype.hasFile = function() { + return jspb.Message.getField(this, 3) != null; +}; + + + + + +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.Configuration.Library.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.Configuration.Library.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.Configuration.Library} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.Configuration.Library.toObject = function(includeInstance, msg) { + var f, obj = { + enableUnsafeInstall: jspb.Message.getBooleanFieldWithDefault(msg, 1, 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.Configuration.Library} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Library.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.Configuration.Library; + return proto.cc.arduino.cli.commands.v1.Configuration.Library.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.Configuration.Library} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Library} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Library.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setEnableUnsafeInstall(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.Configuration.Library.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.Configuration.Library.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.Configuration.Library} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.Configuration.Library.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getEnableUnsafeInstall(); + if (f) { + writer.writeBool( + 1, + f + ); + } +}; + + +/** + * optional bool enable_unsafe_install = 1; + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Library.prototype.getEnableUnsafeInstall = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 1, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Library} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.Library.prototype.setEnableUnsafeInstall = function(value) { + return jspb.Message.setProto3BooleanField(this, 1, value); +}; + + + + + +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.Configuration.Updater.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.Configuration.Updater.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.Configuration.Updater} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.Configuration.Updater.toObject = function(includeInstance, msg) { + var f, obj = { + enableNotification: jspb.Message.getBooleanFieldWithDefault(msg, 1, 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.Configuration.Updater} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Updater.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.Configuration.Updater; + return proto.cc.arduino.cli.commands.v1.Configuration.Updater.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.Configuration.Updater} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Updater} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Updater.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setEnableNotification(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.Configuration.Updater.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.Configuration.Updater.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.Configuration.Updater} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.Configuration.Updater.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getEnableNotification(); + if (f) { + writer.writeBool( + 1, + f + ); + } +}; + + +/** + * optional bool enable_notification = 1; + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Updater.prototype.getEnableNotification = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 1, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Updater} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.Updater.prototype.setEnableNotification = function(value) { + return jspb.Message.setProto3BooleanField(this, 1, value); +}; + + +/** + * optional Directories directories = 1; + * @return {?proto.cc.arduino.cli.commands.v1.Configuration.Directories} + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.getDirectories = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.Configuration.Directories} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.Configuration.Directories, 1)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.Configuration.Directories|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.Configuration} returns this +*/ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.setDirectories = function(value) { + return jspb.Message.setWrapperField(this, 1, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.clearDirectories = function() { + return this.setDirectories(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.hasDirectories = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional Network network = 2; + * @return {?proto.cc.arduino.cli.commands.v1.Configuration.Network} + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.getNetwork = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.Configuration.Network} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.Configuration.Network, 2)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.Configuration.Network|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.Configuration} returns this +*/ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.setNetwork = function(value) { + return jspb.Message.setWrapperField(this, 2, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.clearNetwork = function() { + return this.setNetwork(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.hasNetwork = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional Sketch sketch = 3; + * @return {?proto.cc.arduino.cli.commands.v1.Configuration.Sketch} + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.getSketch = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.Configuration.Sketch} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.Configuration.Sketch, 3)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.Configuration.Sketch|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.Configuration} returns this +*/ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.setSketch = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.clearSketch = function() { + return this.setSketch(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.hasSketch = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional BuildCache build_cache = 4; + * @return {?proto.cc.arduino.cli.commands.v1.Configuration.BuildCache} + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.getBuildCache = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.Configuration.BuildCache} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.Configuration.BuildCache, 4)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.Configuration.BuildCache|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.Configuration} returns this +*/ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.setBuildCache = function(value) { + return jspb.Message.setWrapperField(this, 4, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.clearBuildCache = function() { + return this.setBuildCache(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.hasBuildCache = function() { + return jspb.Message.getField(this, 4) != null; +}; + + +/** + * optional BoardManager board_manager = 5; + * @return {?proto.cc.arduino.cli.commands.v1.Configuration.BoardManager} + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.getBoardManager = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.Configuration.BoardManager} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.Configuration.BoardManager, 5)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.Configuration.BoardManager|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.Configuration} returns this +*/ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.setBoardManager = function(value) { + return jspb.Message.setWrapperField(this, 5, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.clearBoardManager = function() { + return this.setBoardManager(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.hasBoardManager = function() { + return jspb.Message.getField(this, 5) != null; +}; + + +/** + * optional Daemon daemon = 6; + * @return {?proto.cc.arduino.cli.commands.v1.Configuration.Daemon} + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.getDaemon = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.Configuration.Daemon} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.Configuration.Daemon, 6)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.Configuration.Daemon|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.Configuration} returns this +*/ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.setDaemon = function(value) { + return jspb.Message.setWrapperField(this, 6, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.clearDaemon = function() { + return this.setDaemon(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.hasDaemon = function() { + return jspb.Message.getField(this, 6) != null; +}; + + +/** + * optional Output output = 7; + * @return {?proto.cc.arduino.cli.commands.v1.Configuration.Output} + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.getOutput = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.Configuration.Output} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.Configuration.Output, 7)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.Configuration.Output|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.Configuration} returns this +*/ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.setOutput = function(value) { + return jspb.Message.setWrapperField(this, 7, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.clearOutput = function() { + return this.setOutput(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.hasOutput = function() { + return jspb.Message.getField(this, 7) != null; +}; + + +/** + * optional Logging logging = 8; + * @return {?proto.cc.arduino.cli.commands.v1.Configuration.Logging} + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.getLogging = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.Configuration.Logging} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.Configuration.Logging, 8)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.Configuration.Logging|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.Configuration} returns this +*/ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.setLogging = function(value) { + return jspb.Message.setWrapperField(this, 8, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.clearLogging = function() { + return this.setLogging(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.hasLogging = function() { + return jspb.Message.getField(this, 8) != null; +}; + + +/** + * optional Library library = 9; + * @return {?proto.cc.arduino.cli.commands.v1.Configuration.Library} + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.getLibrary = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.Configuration.Library} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.Configuration.Library, 9)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.Configuration.Library|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.Configuration} returns this +*/ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.setLibrary = function(value) { + return jspb.Message.setWrapperField(this, 9, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.clearLibrary = function() { + return this.setLibrary(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.hasLibrary = function() { + return jspb.Message.getField(this, 9) != null; +}; + + +/** + * optional Updater updater = 10; + * @return {?proto.cc.arduino.cli.commands.v1.Configuration.Updater} + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.getUpdater = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.Configuration.Updater} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.Configuration.Updater, 10)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.Configuration.Updater|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.Configuration} returns this +*/ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.setUpdater = function(value) { + return jspb.Message.setWrapperField(this, 10, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.clearUpdater = function() { + return this.setUpdater(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.hasUpdater = function() { + return jspb.Message.getField(this, 10) != null; +}; + + +/** + * optional string locale = 100; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.getLocale = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 100, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.Configuration} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.setLocale = function(value) { + return jspb.Message.setField(this, 100, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.clearLocale = function() { + return jspb.Message.setField(this, 100, undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.hasLocale = function() { + return jspb.Message.getField(this, 100) != null; +}; + + + + + +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.ConfigurationGetRequest.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.ConfigurationGetRequest.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.ConfigurationGetRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.ConfigurationGetRequest.toObject = function(includeInstance, msg) { + var f, obj = { + + }; + + 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.ConfigurationGetRequest} + */ +proto.cc.arduino.cli.commands.v1.ConfigurationGetRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.ConfigurationGetRequest; + return proto.cc.arduino.cli.commands.v1.ConfigurationGetRequest.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.ConfigurationGetRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.ConfigurationGetRequest} + */ +proto.cc.arduino.cli.commands.v1.ConfigurationGetRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.ConfigurationGetRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.ConfigurationGetRequest.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.ConfigurationGetRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.ConfigurationGetRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; +}; + + + + + +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.ConfigurationGetResponse.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.ConfigurationGetResponse.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.ConfigurationGetResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.ConfigurationGetResponse.toObject = function(includeInstance, msg) { + var f, obj = { + configuration: (f = msg.getConfiguration()) && proto.cc.arduino.cli.commands.v1.Configuration.toObject(includeInstance, f) + }; + + 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.ConfigurationGetResponse} + */ +proto.cc.arduino.cli.commands.v1.ConfigurationGetResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.ConfigurationGetResponse; + return proto.cc.arduino.cli.commands.v1.ConfigurationGetResponse.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.ConfigurationGetResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.ConfigurationGetResponse} + */ +proto.cc.arduino.cli.commands.v1.ConfigurationGetResponse.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.Configuration; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.Configuration.deserializeBinaryFromReader); + msg.setConfiguration(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.ConfigurationGetResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.ConfigurationGetResponse.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.ConfigurationGetResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.ConfigurationGetResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getConfiguration(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.cc.arduino.cli.commands.v1.Configuration.serializeBinaryToWriter + ); + } +}; + + +/** + * optional Configuration configuration = 1; + * @return {?proto.cc.arduino.cli.commands.v1.Configuration} + */ +proto.cc.arduino.cli.commands.v1.ConfigurationGetResponse.prototype.getConfiguration = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.Configuration} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.Configuration, 1)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.Configuration|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.ConfigurationGetResponse} returns this +*/ +proto.cc.arduino.cli.commands.v1.ConfigurationGetResponse.prototype.setConfiguration = function(value) { + return jspb.Message.setWrapperField(this, 1, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.ConfigurationGetResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.ConfigurationGetResponse.prototype.clearConfiguration = function() { + return this.setConfiguration(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.ConfigurationGetResponse.prototype.hasConfiguration = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + + + +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.ConfigurationSaveRequest.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.ConfigurationSaveRequest.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.ConfigurationSaveRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.ConfigurationSaveRequest.toObject = function(includeInstance, msg) { + var f, obj = { + settingsFormat: jspb.Message.getFieldWithDefault(msg, 1, "") + }; + + 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.ConfigurationSaveRequest} + */ +proto.cc.arduino.cli.commands.v1.ConfigurationSaveRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.ConfigurationSaveRequest; + return proto.cc.arduino.cli.commands.v1.ConfigurationSaveRequest.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.ConfigurationSaveRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.ConfigurationSaveRequest} + */ +proto.cc.arduino.cli.commands.v1.ConfigurationSaveRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setSettingsFormat(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.ConfigurationSaveRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.ConfigurationSaveRequest.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.ConfigurationSaveRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.ConfigurationSaveRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getSettingsFormat(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } +}; + + +/** + * optional string settings_format = 1; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.ConfigurationSaveRequest.prototype.getSettingsFormat = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.ConfigurationSaveRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.ConfigurationSaveRequest.prototype.setSettingsFormat = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + + + + +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.ConfigurationSaveResponse.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.ConfigurationSaveResponse.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.ConfigurationSaveResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.ConfigurationSaveResponse.toObject = function(includeInstance, msg) { + var f, obj = { + encodedSettings: jspb.Message.getFieldWithDefault(msg, 1, "") + }; + + 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.ConfigurationSaveResponse} + */ +proto.cc.arduino.cli.commands.v1.ConfigurationSaveResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.ConfigurationSaveResponse; + return proto.cc.arduino.cli.commands.v1.ConfigurationSaveResponse.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.ConfigurationSaveResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.ConfigurationSaveResponse} + */ +proto.cc.arduino.cli.commands.v1.ConfigurationSaveResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setEncodedSettings(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.ConfigurationSaveResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.ConfigurationSaveResponse.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.ConfigurationSaveResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.ConfigurationSaveResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getEncodedSettings(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } +}; + + +/** + * optional string encoded_settings = 1; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.ConfigurationSaveResponse.prototype.getEncodedSettings = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.ConfigurationSaveResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.ConfigurationSaveResponse.prototype.setEncodedSettings = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + + + + +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.ConfigurationOpenRequest.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.ConfigurationOpenRequest.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.ConfigurationOpenRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.ConfigurationOpenRequest.toObject = function(includeInstance, msg) { + var f, obj = { + encodedSettings: jspb.Message.getFieldWithDefault(msg, 1, ""), + settingsFormat: jspb.Message.getFieldWithDefault(msg, 2, "") + }; + + 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.ConfigurationOpenRequest} + */ +proto.cc.arduino.cli.commands.v1.ConfigurationOpenRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.ConfigurationOpenRequest; + return proto.cc.arduino.cli.commands.v1.ConfigurationOpenRequest.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.ConfigurationOpenRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.ConfigurationOpenRequest} + */ +proto.cc.arduino.cli.commands.v1.ConfigurationOpenRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setEncodedSettings(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setSettingsFormat(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.ConfigurationOpenRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.ConfigurationOpenRequest.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.ConfigurationOpenRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.ConfigurationOpenRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getEncodedSettings(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } + f = message.getSettingsFormat(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } +}; + + +/** + * optional string encoded_settings = 1; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.ConfigurationOpenRequest.prototype.getEncodedSettings = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.ConfigurationOpenRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.ConfigurationOpenRequest.prototype.setEncodedSettings = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + +/** + * optional string settings_format = 2; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.ConfigurationOpenRequest.prototype.getSettingsFormat = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.ConfigurationOpenRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.ConfigurationOpenRequest.prototype.setSettingsFormat = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.cc.arduino.cli.commands.v1.ConfigurationOpenResponse.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.ConfigurationOpenResponse.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.ConfigurationOpenResponse.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.ConfigurationOpenResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.ConfigurationOpenResponse.toObject = function(includeInstance, msg) { + var f, obj = { + warningsList: (f = jspb.Message.getRepeatedField(msg, 1)) == null ? undefined : f + }; + + 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.ConfigurationOpenResponse} + */ +proto.cc.arduino.cli.commands.v1.ConfigurationOpenResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.ConfigurationOpenResponse; + return proto.cc.arduino.cli.commands.v1.ConfigurationOpenResponse.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.ConfigurationOpenResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.ConfigurationOpenResponse} + */ +proto.cc.arduino.cli.commands.v1.ConfigurationOpenResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.addWarnings(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.ConfigurationOpenResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.ConfigurationOpenResponse.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.ConfigurationOpenResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.ConfigurationOpenResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getWarningsList(); + if (f.length > 0) { + writer.writeRepeatedString( + 1, + f + ); + } +}; + + +/** + * repeated string warnings = 1; + * @return {!Array<string>} + */ +proto.cc.arduino.cli.commands.v1.ConfigurationOpenResponse.prototype.getWarningsList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 1)); +}; + + +/** + * @param {!Array<string>} value + * @return {!proto.cc.arduino.cli.commands.v1.ConfigurationOpenResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.ConfigurationOpenResponse.prototype.setWarningsList = function(value) { + return jspb.Message.setField(this, 1, value || []); +}; + + +/** + * @param {string} value + * @param {number=} opt_index + * @return {!proto.cc.arduino.cli.commands.v1.ConfigurationOpenResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.ConfigurationOpenResponse.prototype.addWarnings = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 1, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.cc.arduino.cli.commands.v1.ConfigurationOpenResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.ConfigurationOpenResponse.prototype.clearWarningsList = function() { + return this.setWarningsList([]); +}; + + + + + +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.SettingsGetValueRequest.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest.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.SettingsGetValueRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest.toObject = function(includeInstance, msg) { + var f, obj = { + key: jspb.Message.getFieldWithDefault(msg, 1, ""), + valueFormat: jspb.Message.getFieldWithDefault(msg, 2, "") + }; + + 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.SettingsGetValueRequest} + */ +proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest; + return proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest.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.SettingsGetValueRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest} + */ +proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setKey(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setValueFormat(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.SettingsGetValueRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest.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.SettingsGetValueRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getKey(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } + f = message.getValueFormat(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } +}; + + +/** + * optional string key = 1; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest.prototype.getKey = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest.prototype.setKey = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + +/** + * optional string value_format = 2; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest.prototype.getValueFormat = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest.prototype.setValueFormat = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + + + + +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.SettingsGetValueResponse.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse.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.SettingsGetValueResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse.toObject = function(includeInstance, msg) { + var f, obj = { + encodedValue: jspb.Message.getFieldWithDefault(msg, 1, "") + }; + + 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.SettingsGetValueResponse} + */ +proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse; + return proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse.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.SettingsGetValueResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse} + */ +proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setEncodedValue(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.SettingsGetValueResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse.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.SettingsGetValueResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getEncodedValue(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } +}; + + +/** + * optional string encoded_value = 1; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse.prototype.getEncodedValue = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse.prototype.setEncodedValue = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + + + + +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.SettingsSetValueRequest.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.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.SettingsSetValueRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.toObject = function(includeInstance, msg) { + var f, obj = { + key: jspb.Message.getFieldWithDefault(msg, 1, ""), + encodedValue: jspb.Message.getFieldWithDefault(msg, 2, ""), + valueFormat: jspb.Message.getFieldWithDefault(msg, 3, "") + }; + + 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.SettingsSetValueRequest} + */ +proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest; + return proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.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.SettingsSetValueRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest} + */ +proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setKey(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setEncodedValue(value); + break; + case 3: + var value = /** @type {string} */ (reader.readString()); + msg.setValueFormat(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.SettingsSetValueRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.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.SettingsSetValueRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getKey(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } + f = message.getEncodedValue(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } + f = message.getValueFormat(); + if (f.length > 0) { + writer.writeString( + 3, + f + ); + } +}; + + +/** + * optional string key = 1; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.prototype.getKey = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.prototype.setKey = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + +/** + * optional string encoded_value = 2; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.prototype.getEncodedValue = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.prototype.setEncodedValue = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + +/** + * optional string value_format = 3; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.prototype.getValueFormat = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.prototype.setValueFormat = function(value) { + return jspb.Message.setProto3StringField(this, 3, value); +}; + + + + + +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.SettingsSetValueResponse.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.SettingsSetValueResponse.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.SettingsSetValueResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.SettingsSetValueResponse.toObject = function(includeInstance, msg) { + var f, obj = { + + }; + + 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.SettingsSetValueResponse} + */ +proto.cc.arduino.cli.commands.v1.SettingsSetValueResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.SettingsSetValueResponse; + return proto.cc.arduino.cli.commands.v1.SettingsSetValueResponse.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.SettingsSetValueResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.SettingsSetValueResponse} + */ +proto.cc.arduino.cli.commands.v1.SettingsSetValueResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.SettingsSetValueResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.SettingsSetValueResponse.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.SettingsSetValueResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.SettingsSetValueResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; +}; + + + + + +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.SettingsEnumerateRequest.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.SettingsEnumerateRequest.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.SettingsEnumerateRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.SettingsEnumerateRequest.toObject = function(includeInstance, msg) { + var f, obj = { + + }; + + 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.SettingsEnumerateRequest} + */ +proto.cc.arduino.cli.commands.v1.SettingsEnumerateRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.SettingsEnumerateRequest; + return proto.cc.arduino.cli.commands.v1.SettingsEnumerateRequest.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.SettingsEnumerateRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.SettingsEnumerateRequest} + */ +proto.cc.arduino.cli.commands.v1.SettingsEnumerateRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.SettingsEnumerateRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.SettingsEnumerateRequest.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.SettingsEnumerateRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.SettingsEnumerateRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.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.SettingsEnumerateResponse.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.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.SettingsEnumerateResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.toObject = function(includeInstance, msg) { + var f, obj = { + entriesList: jspb.Message.toObjectList(msg.getEntriesList(), + proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry.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.SettingsEnumerateResponse} + */ +proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse; + return proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.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.SettingsEnumerateResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse} + */ +proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.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.SettingsEnumerateResponse.Entry; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry.deserializeBinaryFromReader); + msg.addEntries(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.SettingsEnumerateResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.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.SettingsEnumerateResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getEntriesList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 1, + f, + proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry.serializeBinaryToWriter + ); + } +}; + + + + + +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.SettingsEnumerateResponse.Entry.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry.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.SettingsEnumerateResponse.Entry} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry.toObject = function(includeInstance, msg) { + var f, obj = { + key: jspb.Message.getFieldWithDefault(msg, 1, ""), + type: jspb.Message.getFieldWithDefault(msg, 2, "") + }; + + 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.SettingsEnumerateResponse.Entry} + */ +proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry; + return proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry.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.SettingsEnumerateResponse.Entry} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry} + */ +proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setKey(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setType(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.SettingsEnumerateResponse.Entry.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry.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.SettingsEnumerateResponse.Entry} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getKey(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } + f = message.getType(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } +}; + + +/** + * optional string key = 1; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry.prototype.getKey = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry} returns this + */ +proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry.prototype.setKey = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + +/** + * optional string type = 2; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry.prototype.getType = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry} returns this + */ +proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry.prototype.setType = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + +/** + * repeated Entry entries = 1; + * @return {!Array<!proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry>} + */ +proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.prototype.getEntriesList = function() { + return /** @type{!Array<!proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry, 1)); +}; + + +/** + * @param {!Array<!proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry>} value + * @return {!proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse} returns this +*/ +proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.prototype.setEntriesList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 1, value); +}; + + +/** + * @param {!proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry=} opt_value + * @param {number=} opt_index + * @return {!proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry} + */ +proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.prototype.addEntries = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.prototype.clearEntriesList = function() { + return this.setEntriesList([]); +}; + + +goog.object.extend(exports, proto.cc.arduino.cli.commands.v1); diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/upload_pb.d.ts b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/upload_pb.d.ts index 4427473a6..19add9232 100644 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/upload_pb.d.ts +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/upload_pb.d.ts @@ -14,41 +14,34 @@ export class UploadRequest extends jspb.Message { clearInstance(): void; getInstance(): cc_arduino_cli_commands_v1_common_pb.Instance | undefined; setInstance(value?: cc_arduino_cli_commands_v1_common_pb.Instance): UploadRequest; - getFqbn(): string; setFqbn(value: string): UploadRequest; - getSketchPath(): string; setSketchPath(value: string): UploadRequest; - hasPort(): boolean; clearPort(): void; getPort(): cc_arduino_cli_commands_v1_port_pb.Port | undefined; setPort(value?: cc_arduino_cli_commands_v1_port_pb.Port): UploadRequest; - getVerbose(): boolean; setVerbose(value: boolean): UploadRequest; - getVerify(): boolean; setVerify(value: boolean): UploadRequest; - getImportFile(): string; setImportFile(value: string): UploadRequest; - getImportDir(): string; setImportDir(value: string): UploadRequest; - getProgrammer(): string; setProgrammer(value: string): UploadRequest; - getDryRun(): boolean; setDryRun(value: boolean): UploadRequest; - getUserFieldsMap(): jspb.Map<string, string>; clearUserFieldsMap(): void; - + clearUploadPropertiesList(): void; + getUploadPropertiesList(): Array<string>; + setUploadPropertiesList(value: Array<string>): UploadRequest; + addUploadProperties(value: string, index?: number): string; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): UploadRequest.AsObject; @@ -74,20 +67,32 @@ export namespace UploadRequest { dryRun: boolean, userFieldsMap: Array<[string, string]>, + uploadPropertiesList: Array<string>, } } export class UploadResponse extends jspb.Message { + + hasOutStream(): boolean; + clearOutStream(): void; getOutStream(): Uint8Array | string; getOutStream_asU8(): Uint8Array; getOutStream_asB64(): string; setOutStream(value: Uint8Array | string): UploadResponse; + hasErrStream(): boolean; + clearErrStream(): void; getErrStream(): Uint8Array | string; getErrStream_asU8(): Uint8Array; getErrStream_asB64(): string; setErrStream(value: Uint8Array | string): UploadResponse; + hasResult(): boolean; + clearResult(): void; + getResult(): UploadResult | undefined; + setResult(value?: UploadResult): UploadResponse; + + getMessageCase(): UploadResponse.MessageCase; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): UploadResponse.AsObject; @@ -103,6 +108,38 @@ export namespace UploadResponse { export type AsObject = { outStream: Uint8Array | string, errStream: Uint8Array | string, + result?: UploadResult.AsObject, + } + + export enum MessageCase { + MESSAGE_NOT_SET = 0, + OUT_STREAM = 1, + ERR_STREAM = 2, + RESULT = 3, + } + +} + +export class UploadResult extends jspb.Message { + + hasUpdatedUploadPort(): boolean; + clearUpdatedUploadPort(): void; + getUpdatedUploadPort(): cc_arduino_cli_commands_v1_port_pb.Port | undefined; + setUpdatedUploadPort(value?: cc_arduino_cli_commands_v1_port_pb.Port): UploadResult; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): UploadResult.AsObject; + static toObject(includeInstance: boolean, msg: UploadResult): UploadResult.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: UploadResult, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): UploadResult; + static deserializeBinaryFromReader(message: UploadResult, reader: jspb.BinaryReader): UploadResult; +} + +export namespace UploadResult { + export type AsObject = { + updatedUploadPort?: cc_arduino_cli_commands_v1_port_pb.Port.AsObject, } } @@ -129,41 +166,34 @@ export class UploadUsingProgrammerRequest extends jspb.Message { clearInstance(): void; getInstance(): cc_arduino_cli_commands_v1_common_pb.Instance | undefined; setInstance(value?: cc_arduino_cli_commands_v1_common_pb.Instance): UploadUsingProgrammerRequest; - getFqbn(): string; setFqbn(value: string): UploadUsingProgrammerRequest; - getSketchPath(): string; setSketchPath(value: string): UploadUsingProgrammerRequest; - hasPort(): boolean; clearPort(): void; getPort(): cc_arduino_cli_commands_v1_port_pb.Port | undefined; setPort(value?: cc_arduino_cli_commands_v1_port_pb.Port): UploadUsingProgrammerRequest; - getVerbose(): boolean; setVerbose(value: boolean): UploadUsingProgrammerRequest; - getVerify(): boolean; setVerify(value: boolean): UploadUsingProgrammerRequest; - getImportFile(): string; setImportFile(value: string): UploadUsingProgrammerRequest; - getImportDir(): string; setImportDir(value: string): UploadUsingProgrammerRequest; - getProgrammer(): string; setProgrammer(value: string): UploadUsingProgrammerRequest; - getDryRun(): boolean; setDryRun(value: boolean): UploadUsingProgrammerRequest; - getUserFieldsMap(): jspb.Map<string, string>; clearUserFieldsMap(): void; - + clearUploadPropertiesList(): void; + getUploadPropertiesList(): Array<string>; + setUploadPropertiesList(value: Array<string>): UploadUsingProgrammerRequest; + addUploadProperties(value: string, index?: number): string; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): UploadUsingProgrammerRequest.AsObject; @@ -189,20 +219,27 @@ export namespace UploadUsingProgrammerRequest { dryRun: boolean, userFieldsMap: Array<[string, string]>, + uploadPropertiesList: Array<string>, } } export class UploadUsingProgrammerResponse extends jspb.Message { + + hasOutStream(): boolean; + clearOutStream(): void; getOutStream(): Uint8Array | string; getOutStream_asU8(): Uint8Array; getOutStream_asB64(): string; setOutStream(value: Uint8Array | string): UploadUsingProgrammerResponse; + hasErrStream(): boolean; + clearErrStream(): void; getErrStream(): Uint8Array | string; getErrStream_asU8(): Uint8Array; getErrStream_asB64(): string; setErrStream(value: Uint8Array | string): UploadUsingProgrammerResponse; + getMessageCase(): UploadUsingProgrammerResponse.MessageCase; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): UploadUsingProgrammerResponse.AsObject; @@ -219,6 +256,13 @@ export namespace UploadUsingProgrammerResponse { outStream: Uint8Array | string, errStream: Uint8Array | string, } + + export enum MessageCase { + MESSAGE_NOT_SET = 0, + OUT_STREAM = 1, + ERR_STREAM = 2, + } + } export class BurnBootloaderRequest extends jspb.Message { @@ -227,32 +271,28 @@ export class BurnBootloaderRequest extends jspb.Message { clearInstance(): void; getInstance(): cc_arduino_cli_commands_v1_common_pb.Instance | undefined; setInstance(value?: cc_arduino_cli_commands_v1_common_pb.Instance): BurnBootloaderRequest; - getFqbn(): string; setFqbn(value: string): BurnBootloaderRequest; - hasPort(): boolean; clearPort(): void; getPort(): cc_arduino_cli_commands_v1_port_pb.Port | undefined; setPort(value?: cc_arduino_cli_commands_v1_port_pb.Port): BurnBootloaderRequest; - getVerbose(): boolean; setVerbose(value: boolean): BurnBootloaderRequest; - getVerify(): boolean; setVerify(value: boolean): BurnBootloaderRequest; - getProgrammer(): string; setProgrammer(value: string): BurnBootloaderRequest; - getDryRun(): boolean; setDryRun(value: boolean): BurnBootloaderRequest; - getUserFieldsMap(): jspb.Map<string, string>; clearUserFieldsMap(): void; - + clearUploadPropertiesList(): void; + getUploadPropertiesList(): Array<string>; + setUploadPropertiesList(value: Array<string>): BurnBootloaderRequest; + addUploadProperties(value: string, index?: number): string; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): BurnBootloaderRequest.AsObject; @@ -275,20 +315,27 @@ export namespace BurnBootloaderRequest { dryRun: boolean, userFieldsMap: Array<[string, string]>, + uploadPropertiesList: Array<string>, } } export class BurnBootloaderResponse extends jspb.Message { + + hasOutStream(): boolean; + clearOutStream(): void; getOutStream(): Uint8Array | string; getOutStream_asU8(): Uint8Array; getOutStream_asB64(): string; setOutStream(value: Uint8Array | string): BurnBootloaderResponse; + hasErrStream(): boolean; + clearErrStream(): void; getErrStream(): Uint8Array | string; getErrStream_asU8(): Uint8Array; getErrStream_asB64(): string; setErrStream(value: Uint8Array | string): BurnBootloaderResponse; + getMessageCase(): BurnBootloaderResponse.MessageCase; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): BurnBootloaderResponse.AsObject; @@ -305,6 +352,13 @@ export namespace BurnBootloaderResponse { outStream: Uint8Array | string, errStream: Uint8Array | string, } + + export enum MessageCase { + MESSAGE_NOT_SET = 0, + OUT_STREAM = 1, + ERR_STREAM = 2, + } + } export class ListProgrammersAvailableForUploadRequest extends jspb.Message { @@ -313,11 +367,9 @@ export class ListProgrammersAvailableForUploadRequest extends jspb.Message { clearInstance(): void; getInstance(): cc_arduino_cli_commands_v1_common_pb.Instance | undefined; setInstance(value?: cc_arduino_cli_commands_v1_common_pb.Instance): ListProgrammersAvailableForUploadRequest; - getFqbn(): string; setFqbn(value: string): ListProgrammersAvailableForUploadRequest; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): ListProgrammersAvailableForUploadRequest.AsObject; static toObject(includeInstance: boolean, msg: ListProgrammersAvailableForUploadRequest): ListProgrammersAvailableForUploadRequest.AsObject; @@ -341,7 +393,6 @@ export class ListProgrammersAvailableForUploadResponse extends jspb.Message { setProgrammersList(value: Array<cc_arduino_cli_commands_v1_common_pb.Programmer>): ListProgrammersAvailableForUploadResponse; addProgrammers(value?: cc_arduino_cli_commands_v1_common_pb.Programmer, index?: number): cc_arduino_cli_commands_v1_common_pb.Programmer; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): ListProgrammersAvailableForUploadResponse.AsObject; static toObject(includeInstance: boolean, msg: ListProgrammersAvailableForUploadResponse): ListProgrammersAvailableForUploadResponse.AsObject; @@ -364,14 +415,11 @@ export class SupportedUserFieldsRequest extends jspb.Message { clearInstance(): void; getInstance(): cc_arduino_cli_commands_v1_common_pb.Instance | undefined; setInstance(value?: cc_arduino_cli_commands_v1_common_pb.Instance): SupportedUserFieldsRequest; - getFqbn(): string; setFqbn(value: string): SupportedUserFieldsRequest; - getProtocol(): string; setProtocol(value: string): SupportedUserFieldsRequest; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): SupportedUserFieldsRequest.AsObject; static toObject(includeInstance: boolean, msg: SupportedUserFieldsRequest): SupportedUserFieldsRequest.AsObject; @@ -393,17 +441,13 @@ export namespace SupportedUserFieldsRequest { export class UserField extends jspb.Message { getToolId(): string; setToolId(value: string): UserField; - getName(): string; setName(value: string): UserField; - getLabel(): string; setLabel(value: string): UserField; - getSecret(): boolean; setSecret(value: boolean): UserField; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): UserField.AsObject; static toObject(includeInstance: boolean, msg: UserField): UserField.AsObject; @@ -429,7 +473,6 @@ export class SupportedUserFieldsResponse extends jspb.Message { setUserFieldsList(value: Array<UserField>): SupportedUserFieldsResponse; addUserFields(value?: UserField, index?: number): UserField; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): SupportedUserFieldsResponse.AsObject; static toObject(includeInstance: boolean, msg: SupportedUserFieldsResponse): SupportedUserFieldsResponse.AsObject; diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/upload_pb.js b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/upload_pb.js index 8841575ad..d49f1b0d7 100644 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/upload_pb.js +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/upload_pb.js @@ -13,7 +13,13 @@ var jspb = require('google-protobuf'); var goog = jspb; -var global = Function('return this')(); +var global = (function() { + if (this) { return this; } + if (typeof window !== 'undefined') { return window; } + if (typeof global !== 'undefined') { return global; } + if (typeof self !== 'undefined') { return self; } + return Function('return this')(); +}.call(null)); var cc_arduino_cli_commands_v1_common_pb = require('../../../../../cc/arduino/cli/commands/v1/common_pb.js'); goog.object.extend(proto, cc_arduino_cli_commands_v1_common_pb); @@ -21,6 +27,7 @@ var cc_arduino_cli_commands_v1_port_pb = require('../../../../../cc/arduino/cli/ goog.object.extend(proto, cc_arduino_cli_commands_v1_port_pb); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.BurnBootloaderRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.BurnBootloaderResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.BurnBootloaderResponse.MessageCase', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.ListProgrammersAvailableForUploadRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.ListProgrammersAvailableForUploadResponse', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.ProgrammerIsRequiredForUploadError', null, global); @@ -28,8 +35,11 @@ goog.exportSymbol('proto.cc.arduino.cli.commands.v1.SupportedUserFieldsRequest', goog.exportSymbol('proto.cc.arduino.cli.commands.v1.SupportedUserFieldsResponse', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.UploadRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.UploadResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.UploadResponse.MessageCase', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.UploadResult', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerResponse.MessageCase', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.UserField', null, global); /** * Generated by JsPbCodeGenerator. @@ -42,7 +52,7 @@ goog.exportSymbol('proto.cc.arduino.cli.commands.v1.UserField', null, global); * @constructor */ proto.cc.arduino.cli.commands.v1.UploadRequest = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); + jspb.Message.initialize(this, opt_data, 0, -1, proto.cc.arduino.cli.commands.v1.UploadRequest.repeatedFields_, null); }; goog.inherits(proto.cc.arduino.cli.commands.v1.UploadRequest, jspb.Message); if (goog.DEBUG && !COMPILED) { @@ -63,7 +73,7 @@ if (goog.DEBUG && !COMPILED) { * @constructor */ proto.cc.arduino.cli.commands.v1.UploadResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.cc.arduino.cli.commands.v1.UploadResponse.oneofGroups_); }; goog.inherits(proto.cc.arduino.cli.commands.v1.UploadResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { @@ -73,6 +83,27 @@ if (goog.DEBUG && !COMPILED) { */ proto.cc.arduino.cli.commands.v1.UploadResponse.displayName = 'proto.cc.arduino.cli.commands.v1.UploadResponse'; } +/** + * 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.UploadResult = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.UploadResult, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.UploadResult.displayName = 'proto.cc.arduino.cli.commands.v1.UploadResult'; +} /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -105,7 +136,7 @@ if (goog.DEBUG && !COMPILED) { * @constructor */ proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerRequest = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); + jspb.Message.initialize(this, opt_data, 0, -1, proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerRequest.repeatedFields_, null); }; goog.inherits(proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerRequest, jspb.Message); if (goog.DEBUG && !COMPILED) { @@ -126,7 +157,7 @@ if (goog.DEBUG && !COMPILED) { * @constructor */ proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerResponse.oneofGroups_); }; goog.inherits(proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { @@ -147,7 +178,7 @@ if (goog.DEBUG && !COMPILED) { * @constructor */ proto.cc.arduino.cli.commands.v1.BurnBootloaderRequest = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); + jspb.Message.initialize(this, opt_data, 0, -1, proto.cc.arduino.cli.commands.v1.BurnBootloaderRequest.repeatedFields_, null); }; goog.inherits(proto.cc.arduino.cli.commands.v1.BurnBootloaderRequest, jspb.Message); if (goog.DEBUG && !COMPILED) { @@ -168,7 +199,7 @@ if (goog.DEBUG && !COMPILED) { * @constructor */ proto.cc.arduino.cli.commands.v1.BurnBootloaderResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.cc.arduino.cli.commands.v1.BurnBootloaderResponse.oneofGroups_); }; goog.inherits(proto.cc.arduino.cli.commands.v1.BurnBootloaderResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { @@ -284,6 +315,13 @@ if (goog.DEBUG && !COMPILED) { proto.cc.arduino.cli.commands.v1.SupportedUserFieldsResponse.displayName = 'proto.cc.arduino.cli.commands.v1.SupportedUserFieldsResponse'; } +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.cc.arduino.cli.commands.v1.UploadRequest.repeatedFields_ = [12]; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -325,7 +363,8 @@ proto.cc.arduino.cli.commands.v1.UploadRequest.toObject = function(includeInstan importDir: jspb.Message.getFieldWithDefault(msg, 8, ""), programmer: jspb.Message.getFieldWithDefault(msg, 9, ""), dryRun: jspb.Message.getBooleanFieldWithDefault(msg, 10, false), - userFieldsMap: (f = msg.getUserFieldsMap()) ? f.toObject(includeInstance, undefined) : [] + userFieldsMap: (f = msg.getUserFieldsMap()) ? f.toObject(includeInstance, undefined) : [], + uploadPropertiesList: (f = jspb.Message.getRepeatedField(msg, 12)) == null ? undefined : f }; if (includeInstance) { @@ -410,6 +449,10 @@ proto.cc.arduino.cli.commands.v1.UploadRequest.deserializeBinaryFromReader = fun jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readString, jspb.BinaryReader.prototype.readString, null, "", ""); }); break; + case 12: + var value = /** @type {string} */ (reader.readString()); + msg.addUploadProperties(value); + break; default: reader.skipField(); break; @@ -515,6 +558,13 @@ proto.cc.arduino.cli.commands.v1.UploadRequest.serializeBinaryToWriter = functio if (f && f.getLength() > 0) { f.serializeBinary(11, writer, jspb.BinaryWriter.prototype.writeString, jspb.BinaryWriter.prototype.writeString); } + f = message.getUploadPropertiesList(); + if (f.length > 0) { + writer.writeRepeatedString( + 12, + f + ); + } }; @@ -758,6 +808,70 @@ proto.cc.arduino.cli.commands.v1.UploadRequest.prototype.clearUserFieldsMap = fu return this;}; +/** + * repeated string upload_properties = 12; + * @return {!Array<string>} + */ +proto.cc.arduino.cli.commands.v1.UploadRequest.prototype.getUploadPropertiesList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 12)); +}; + + +/** + * @param {!Array<string>} value + * @return {!proto.cc.arduino.cli.commands.v1.UploadRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.UploadRequest.prototype.setUploadPropertiesList = function(value) { + return jspb.Message.setField(this, 12, value || []); +}; + + +/** + * @param {string} value + * @param {number=} opt_index + * @return {!proto.cc.arduino.cli.commands.v1.UploadRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.UploadRequest.prototype.addUploadProperties = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 12, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.cc.arduino.cli.commands.v1.UploadRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.UploadRequest.prototype.clearUploadPropertiesList = function() { + return this.setUploadPropertiesList([]); +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.cc.arduino.cli.commands.v1.UploadResponse.oneofGroups_ = [[1,2,3]]; + +/** + * @enum {number} + */ +proto.cc.arduino.cli.commands.v1.UploadResponse.MessageCase = { + MESSAGE_NOT_SET: 0, + OUT_STREAM: 1, + ERR_STREAM: 2, + RESULT: 3 +}; + +/** + * @return {proto.cc.arduino.cli.commands.v1.UploadResponse.MessageCase} + */ +proto.cc.arduino.cli.commands.v1.UploadResponse.prototype.getMessageCase = function() { + return /** @type {proto.cc.arduino.cli.commands.v1.UploadResponse.MessageCase} */(jspb.Message.computeOneofCase(this, proto.cc.arduino.cli.commands.v1.UploadResponse.oneofGroups_[0])); +}; @@ -791,7 +905,8 @@ proto.cc.arduino.cli.commands.v1.UploadResponse.prototype.toObject = function(op proto.cc.arduino.cli.commands.v1.UploadResponse.toObject = function(includeInstance, msg) { var f, obj = { outStream: msg.getOutStream_asB64(), - errStream: msg.getErrStream_asB64() + errStream: msg.getErrStream_asB64(), + result: (f = msg.getResult()) && proto.cc.arduino.cli.commands.v1.UploadResult.toObject(includeInstance, f) }; if (includeInstance) { @@ -836,6 +951,11 @@ proto.cc.arduino.cli.commands.v1.UploadResponse.deserializeBinaryFromReader = fu var value = /** @type {!Uint8Array} */ (reader.readBytes()); msg.setErrStream(value); break; + case 3: + var value = new proto.cc.arduino.cli.commands.v1.UploadResult; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.UploadResult.deserializeBinaryFromReader); + msg.setResult(value); + break; default: reader.skipField(); break; @@ -865,20 +985,28 @@ proto.cc.arduino.cli.commands.v1.UploadResponse.prototype.serializeBinary = func */ proto.cc.arduino.cli.commands.v1.UploadResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getOutStream_asU8(); - if (f.length > 0) { + f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 1)); + if (f != null) { writer.writeBytes( 1, f ); } - f = message.getErrStream_asU8(); - if (f.length > 0) { + f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 2)); + if (f != null) { writer.writeBytes( 2, f ); } + f = message.getResult(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.cc.arduino.cli.commands.v1.UploadResult.serializeBinaryToWriter + ); + } }; @@ -920,7 +1048,25 @@ proto.cc.arduino.cli.commands.v1.UploadResponse.prototype.getOutStream_asU8 = fu * @return {!proto.cc.arduino.cli.commands.v1.UploadResponse} returns this */ proto.cc.arduino.cli.commands.v1.UploadResponse.prototype.setOutStream = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); + return jspb.Message.setOneofField(this, 1, proto.cc.arduino.cli.commands.v1.UploadResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.UploadResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.UploadResponse.prototype.clearOutStream = function() { + return jspb.Message.setOneofField(this, 1, proto.cc.arduino.cli.commands.v1.UploadResponse.oneofGroups_[0], undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.UploadResponse.prototype.hasOutStream = function() { + return jspb.Message.getField(this, 1) != null; }; @@ -962,7 +1108,213 @@ proto.cc.arduino.cli.commands.v1.UploadResponse.prototype.getErrStream_asU8 = fu * @return {!proto.cc.arduino.cli.commands.v1.UploadResponse} returns this */ proto.cc.arduino.cli.commands.v1.UploadResponse.prototype.setErrStream = function(value) { - return jspb.Message.setProto3BytesField(this, 2, value); + return jspb.Message.setOneofField(this, 2, proto.cc.arduino.cli.commands.v1.UploadResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.UploadResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.UploadResponse.prototype.clearErrStream = function() { + return jspb.Message.setOneofField(this, 2, proto.cc.arduino.cli.commands.v1.UploadResponse.oneofGroups_[0], undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.UploadResponse.prototype.hasErrStream = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional UploadResult result = 3; + * @return {?proto.cc.arduino.cli.commands.v1.UploadResult} + */ +proto.cc.arduino.cli.commands.v1.UploadResponse.prototype.getResult = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.UploadResult} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.UploadResult, 3)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.UploadResult|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.UploadResponse} returns this +*/ +proto.cc.arduino.cli.commands.v1.UploadResponse.prototype.setResult = function(value) { + return jspb.Message.setOneofWrapperField(this, 3, proto.cc.arduino.cli.commands.v1.UploadResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.UploadResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.UploadResponse.prototype.clearResult = function() { + return this.setResult(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.UploadResponse.prototype.hasResult = function() { + return jspb.Message.getField(this, 3) != null; +}; + + + + + +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.UploadResult.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.UploadResult.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.UploadResult} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.UploadResult.toObject = function(includeInstance, msg) { + var f, obj = { + updatedUploadPort: (f = msg.getUpdatedUploadPort()) && cc_arduino_cli_commands_v1_port_pb.Port.toObject(includeInstance, f) + }; + + 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.UploadResult} + */ +proto.cc.arduino.cli.commands.v1.UploadResult.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.UploadResult; + return proto.cc.arduino.cli.commands.v1.UploadResult.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.UploadResult} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.UploadResult} + */ +proto.cc.arduino.cli.commands.v1.UploadResult.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_port_pb.Port; + reader.readMessage(value,cc_arduino_cli_commands_v1_port_pb.Port.deserializeBinaryFromReader); + msg.setUpdatedUploadPort(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.UploadResult.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.UploadResult.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.UploadResult} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.UploadResult.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getUpdatedUploadPort(); + if (f != null) { + writer.writeMessage( + 1, + f, + cc_arduino_cli_commands_v1_port_pb.Port.serializeBinaryToWriter + ); + } +}; + + +/** + * optional Port updated_upload_port = 1; + * @return {?proto.cc.arduino.cli.commands.v1.Port} + */ +proto.cc.arduino.cli.commands.v1.UploadResult.prototype.getUpdatedUploadPort = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.Port} */ ( + jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_port_pb.Port, 1)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.Port|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.UploadResult} returns this +*/ +proto.cc.arduino.cli.commands.v1.UploadResult.prototype.setUpdatedUploadPort = function(value) { + return jspb.Message.setWrapperField(this, 1, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.UploadResult} returns this + */ +proto.cc.arduino.cli.commands.v1.UploadResult.prototype.clearUpdatedUploadPort = function() { + return this.setUpdatedUploadPort(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.UploadResult.prototype.hasUpdatedUploadPort = function() { + return jspb.Message.getField(this, 1) != null; }; @@ -1068,6 +1420,13 @@ proto.cc.arduino.cli.commands.v1.ProgrammerIsRequiredForUploadError.serializeBin +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerRequest.repeatedFields_ = [12]; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -1109,7 +1468,8 @@ proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerRequest.toObject = functio importDir: jspb.Message.getFieldWithDefault(msg, 8, ""), programmer: jspb.Message.getFieldWithDefault(msg, 9, ""), dryRun: jspb.Message.getBooleanFieldWithDefault(msg, 10, false), - userFieldsMap: (f = msg.getUserFieldsMap()) ? f.toObject(includeInstance, undefined) : [] + userFieldsMap: (f = msg.getUserFieldsMap()) ? f.toObject(includeInstance, undefined) : [], + uploadPropertiesList: (f = jspb.Message.getRepeatedField(msg, 12)) == null ? undefined : f }; if (includeInstance) { @@ -1194,6 +1554,10 @@ proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerRequest.deserializeBinaryF jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readString, jspb.BinaryReader.prototype.readString, null, "", ""); }); break; + case 12: + var value = /** @type {string} */ (reader.readString()); + msg.addUploadProperties(value); + break; default: reader.skipField(); break; @@ -1299,6 +1663,13 @@ proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerRequest.serializeBinaryToW if (f && f.getLength() > 0) { f.serializeBinary(11, writer, jspb.BinaryWriter.prototype.writeString, jspb.BinaryWriter.prototype.writeString); } + f = message.getUploadPropertiesList(); + if (f.length > 0) { + writer.writeRepeatedString( + 12, + f + ); + } }; @@ -1542,6 +1913,69 @@ proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerRequest.prototype.clearUse return this;}; +/** + * repeated string upload_properties = 12; + * @return {!Array<string>} + */ +proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerRequest.prototype.getUploadPropertiesList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 12)); +}; + + +/** + * @param {!Array<string>} value + * @return {!proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerRequest.prototype.setUploadPropertiesList = function(value) { + return jspb.Message.setField(this, 12, value || []); +}; + + +/** + * @param {string} value + * @param {number=} opt_index + * @return {!proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerRequest.prototype.addUploadProperties = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 12, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerRequest.prototype.clearUploadPropertiesList = function() { + return this.setUploadPropertiesList([]); +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerResponse.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerResponse.MessageCase = { + MESSAGE_NOT_SET: 0, + OUT_STREAM: 1, + ERR_STREAM: 2 +}; + +/** + * @return {proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerResponse.MessageCase} + */ +proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerResponse.prototype.getMessageCase = function() { + return /** @type {proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerResponse.MessageCase} */(jspb.Message.computeOneofCase(this, proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerResponse.oneofGroups_[0])); +}; @@ -1649,15 +2083,15 @@ proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerResponse.prototype.seriali */ proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getOutStream_asU8(); - if (f.length > 0) { + f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 1)); + if (f != null) { writer.writeBytes( 1, f ); } - f = message.getErrStream_asU8(); - if (f.length > 0) { + f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 2)); + if (f != null) { writer.writeBytes( 2, f @@ -1704,7 +2138,25 @@ proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerResponse.prototype.getOutS * @return {!proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerResponse} returns this */ proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerResponse.prototype.setOutStream = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); + return jspb.Message.setOneofField(this, 1, proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerResponse.prototype.clearOutStream = function() { + return jspb.Message.setOneofField(this, 1, proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerResponse.oneofGroups_[0], undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerResponse.prototype.hasOutStream = function() { + return jspb.Message.getField(this, 1) != null; }; @@ -1746,10 +2198,35 @@ proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerResponse.prototype.getErrS * @return {!proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerResponse} returns this */ proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerResponse.prototype.setErrStream = function(value) { - return jspb.Message.setProto3BytesField(this, 2, value); + return jspb.Message.setOneofField(this, 2, proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerResponse.oneofGroups_[0], value); }; +/** + * Clears the field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerResponse.prototype.clearErrStream = function() { + return jspb.Message.setOneofField(this, 2, proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerResponse.oneofGroups_[0], undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerResponse.prototype.hasErrStream = function() { + return jspb.Message.getField(this, 2) != null; +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.cc.arduino.cli.commands.v1.BurnBootloaderRequest.repeatedFields_ = [12]; @@ -1789,7 +2266,8 @@ proto.cc.arduino.cli.commands.v1.BurnBootloaderRequest.toObject = function(inclu verify: jspb.Message.getBooleanFieldWithDefault(msg, 5, false), programmer: jspb.Message.getFieldWithDefault(msg, 6, ""), dryRun: jspb.Message.getBooleanFieldWithDefault(msg, 7, false), - userFieldsMap: (f = msg.getUserFieldsMap()) ? f.toObject(includeInstance, undefined) : [] + userFieldsMap: (f = msg.getUserFieldsMap()) ? f.toObject(includeInstance, undefined) : [], + uploadPropertiesList: (f = jspb.Message.getRepeatedField(msg, 12)) == null ? undefined : f }; if (includeInstance) { @@ -1862,6 +2340,10 @@ proto.cc.arduino.cli.commands.v1.BurnBootloaderRequest.deserializeBinaryFromRead jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readString, jspb.BinaryReader.prototype.readString, null, "", ""); }); break; + case 12: + var value = /** @type {string} */ (reader.readString()); + msg.addUploadProperties(value); + break; default: reader.skipField(); break; @@ -1946,6 +2428,13 @@ proto.cc.arduino.cli.commands.v1.BurnBootloaderRequest.serializeBinaryToWriter = if (f && f.getLength() > 0) { f.serializeBinary(11, writer, jspb.BinaryWriter.prototype.writeString, jspb.BinaryWriter.prototype.writeString); } + f = message.getUploadPropertiesList(); + if (f.length > 0) { + writer.writeRepeatedString( + 12, + f + ); + } }; @@ -2135,6 +2624,69 @@ proto.cc.arduino.cli.commands.v1.BurnBootloaderRequest.prototype.clearUserFields return this;}; +/** + * repeated string upload_properties = 12; + * @return {!Array<string>} + */ +proto.cc.arduino.cli.commands.v1.BurnBootloaderRequest.prototype.getUploadPropertiesList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 12)); +}; + + +/** + * @param {!Array<string>} value + * @return {!proto.cc.arduino.cli.commands.v1.BurnBootloaderRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.BurnBootloaderRequest.prototype.setUploadPropertiesList = function(value) { + return jspb.Message.setField(this, 12, value || []); +}; + + +/** + * @param {string} value + * @param {number=} opt_index + * @return {!proto.cc.arduino.cli.commands.v1.BurnBootloaderRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.BurnBootloaderRequest.prototype.addUploadProperties = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 12, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.cc.arduino.cli.commands.v1.BurnBootloaderRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.BurnBootloaderRequest.prototype.clearUploadPropertiesList = function() { + return this.setUploadPropertiesList([]); +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.cc.arduino.cli.commands.v1.BurnBootloaderResponse.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.cc.arduino.cli.commands.v1.BurnBootloaderResponse.MessageCase = { + MESSAGE_NOT_SET: 0, + OUT_STREAM: 1, + ERR_STREAM: 2 +}; + +/** + * @return {proto.cc.arduino.cli.commands.v1.BurnBootloaderResponse.MessageCase} + */ +proto.cc.arduino.cli.commands.v1.BurnBootloaderResponse.prototype.getMessageCase = function() { + return /** @type {proto.cc.arduino.cli.commands.v1.BurnBootloaderResponse.MessageCase} */(jspb.Message.computeOneofCase(this, proto.cc.arduino.cli.commands.v1.BurnBootloaderResponse.oneofGroups_[0])); +}; @@ -2242,15 +2794,15 @@ proto.cc.arduino.cli.commands.v1.BurnBootloaderResponse.prototype.serializeBinar */ proto.cc.arduino.cli.commands.v1.BurnBootloaderResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getOutStream_asU8(); - if (f.length > 0) { + f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 1)); + if (f != null) { writer.writeBytes( 1, f ); } - f = message.getErrStream_asU8(); - if (f.length > 0) { + f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 2)); + if (f != null) { writer.writeBytes( 2, f @@ -2297,7 +2849,25 @@ proto.cc.arduino.cli.commands.v1.BurnBootloaderResponse.prototype.getOutStream_a * @return {!proto.cc.arduino.cli.commands.v1.BurnBootloaderResponse} returns this */ proto.cc.arduino.cli.commands.v1.BurnBootloaderResponse.prototype.setOutStream = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); + return jspb.Message.setOneofField(this, 1, proto.cc.arduino.cli.commands.v1.BurnBootloaderResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.BurnBootloaderResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.BurnBootloaderResponse.prototype.clearOutStream = function() { + return jspb.Message.setOneofField(this, 1, proto.cc.arduino.cli.commands.v1.BurnBootloaderResponse.oneofGroups_[0], undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.BurnBootloaderResponse.prototype.hasOutStream = function() { + return jspb.Message.getField(this, 1) != null; }; @@ -2339,7 +2909,25 @@ proto.cc.arduino.cli.commands.v1.BurnBootloaderResponse.prototype.getErrStream_a * @return {!proto.cc.arduino.cli.commands.v1.BurnBootloaderResponse} returns this */ proto.cc.arduino.cli.commands.v1.BurnBootloaderResponse.prototype.setErrStream = function(value) { - return jspb.Message.setProto3BytesField(this, 2, value); + return jspb.Message.setOneofField(this, 2, proto.cc.arduino.cli.commands.v1.BurnBootloaderResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.BurnBootloaderResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.BurnBootloaderResponse.prototype.clearErrStream = function() { + return jspb.Message.setOneofField(this, 2, proto.cc.arduino.cli.commands.v1.BurnBootloaderResponse.oneofGroups_[0], undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.BurnBootloaderResponse.prototype.hasErrStream = function() { + return jspb.Message.getField(this, 2) != null; }; diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/debug/v1/debug_grpc_pb.d.ts b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/debug/v1/debug_grpc_pb.d.ts deleted file mode 100644 index ad1daba69..000000000 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/debug/v1/debug_grpc_pb.d.ts +++ /dev/null @@ -1,60 +0,0 @@ -// package: cc.arduino.cli.debug.v1 -// file: cc/arduino/cli/debug/v1/debug.proto - -/* tslint:disable */ -/* eslint-disable */ - -import * as grpc from "@grpc/grpc-js"; -import {handleClientStreamingCall} from "@grpc/grpc-js/build/src/server-call"; -import * as cc_arduino_cli_debug_v1_debug_pb from "../../../../../cc/arduino/cli/debug/v1/debug_pb"; -import * as cc_arduino_cli_commands_v1_common_pb from "../../../../../cc/arduino/cli/commands/v1/common_pb"; -import * as cc_arduino_cli_commands_v1_port_pb from "../../../../../cc/arduino/cli/commands/v1/port_pb"; - -interface IDebugServiceService extends grpc.ServiceDefinition<grpc.UntypedServiceImplementation> { - debug: IDebugServiceService_IDebug; - getDebugConfig: IDebugServiceService_IGetDebugConfig; -} - -interface IDebugServiceService_IDebug extends grpc.MethodDefinition<cc_arduino_cli_debug_v1_debug_pb.DebugRequest, cc_arduino_cli_debug_v1_debug_pb.DebugResponse> { - path: "/cc.arduino.cli.debug.v1.DebugService/Debug"; - requestStream: true; - responseStream: true; - requestSerialize: grpc.serialize<cc_arduino_cli_debug_v1_debug_pb.DebugRequest>; - requestDeserialize: grpc.deserialize<cc_arduino_cli_debug_v1_debug_pb.DebugRequest>; - responseSerialize: grpc.serialize<cc_arduino_cli_debug_v1_debug_pb.DebugResponse>; - responseDeserialize: grpc.deserialize<cc_arduino_cli_debug_v1_debug_pb.DebugResponse>; -} -interface IDebugServiceService_IGetDebugConfig extends grpc.MethodDefinition<cc_arduino_cli_debug_v1_debug_pb.DebugConfigRequest, cc_arduino_cli_debug_v1_debug_pb.GetDebugConfigResponse> { - path: "/cc.arduino.cli.debug.v1.DebugService/GetDebugConfig"; - requestStream: false; - responseStream: false; - requestSerialize: grpc.serialize<cc_arduino_cli_debug_v1_debug_pb.DebugConfigRequest>; - requestDeserialize: grpc.deserialize<cc_arduino_cli_debug_v1_debug_pb.DebugConfigRequest>; - responseSerialize: grpc.serialize<cc_arduino_cli_debug_v1_debug_pb.GetDebugConfigResponse>; - responseDeserialize: grpc.deserialize<cc_arduino_cli_debug_v1_debug_pb.GetDebugConfigResponse>; -} - -export const DebugServiceService: IDebugServiceService; - -export interface IDebugServiceServer { - debug: grpc.handleBidiStreamingCall<cc_arduino_cli_debug_v1_debug_pb.DebugRequest, cc_arduino_cli_debug_v1_debug_pb.DebugResponse>; - getDebugConfig: grpc.handleUnaryCall<cc_arduino_cli_debug_v1_debug_pb.DebugConfigRequest, cc_arduino_cli_debug_v1_debug_pb.GetDebugConfigResponse>; -} - -export interface IDebugServiceClient { - debug(): grpc.ClientDuplexStream<cc_arduino_cli_debug_v1_debug_pb.DebugRequest, cc_arduino_cli_debug_v1_debug_pb.DebugResponse>; - debug(options: Partial<grpc.CallOptions>): grpc.ClientDuplexStream<cc_arduino_cli_debug_v1_debug_pb.DebugRequest, cc_arduino_cli_debug_v1_debug_pb.DebugResponse>; - debug(metadata: grpc.Metadata, options?: Partial<grpc.CallOptions>): grpc.ClientDuplexStream<cc_arduino_cli_debug_v1_debug_pb.DebugRequest, cc_arduino_cli_debug_v1_debug_pb.DebugResponse>; - getDebugConfig(request: cc_arduino_cli_debug_v1_debug_pb.DebugConfigRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_debug_v1_debug_pb.GetDebugConfigResponse) => void): grpc.ClientUnaryCall; - getDebugConfig(request: cc_arduino_cli_debug_v1_debug_pb.DebugConfigRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_debug_v1_debug_pb.GetDebugConfigResponse) => void): grpc.ClientUnaryCall; - getDebugConfig(request: cc_arduino_cli_debug_v1_debug_pb.DebugConfigRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_debug_v1_debug_pb.GetDebugConfigResponse) => void): grpc.ClientUnaryCall; -} - -export class DebugServiceClient extends grpc.Client implements IDebugServiceClient { - constructor(address: string, credentials: grpc.ChannelCredentials, options?: Partial<grpc.ClientOptions>); - public debug(options?: Partial<grpc.CallOptions>): grpc.ClientDuplexStream<cc_arduino_cli_debug_v1_debug_pb.DebugRequest, cc_arduino_cli_debug_v1_debug_pb.DebugResponse>; - public debug(metadata?: grpc.Metadata, options?: Partial<grpc.CallOptions>): grpc.ClientDuplexStream<cc_arduino_cli_debug_v1_debug_pb.DebugRequest, cc_arduino_cli_debug_v1_debug_pb.DebugResponse>; - public getDebugConfig(request: cc_arduino_cli_debug_v1_debug_pb.DebugConfigRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_debug_v1_debug_pb.GetDebugConfigResponse) => void): grpc.ClientUnaryCall; - public getDebugConfig(request: cc_arduino_cli_debug_v1_debug_pb.DebugConfigRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_debug_v1_debug_pb.GetDebugConfigResponse) => void): grpc.ClientUnaryCall; - public getDebugConfig(request: cc_arduino_cli_debug_v1_debug_pb.DebugConfigRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_debug_v1_debug_pb.GetDebugConfigResponse) => void): grpc.ClientUnaryCall; -} diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/debug/v1/debug_grpc_pb.js b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/debug/v1/debug_grpc_pb.js deleted file mode 100644 index 829ca77d3..000000000 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/debug/v1/debug_grpc_pb.js +++ /dev/null @@ -1,95 +0,0 @@ -// GENERATED CODE -- DO NOT EDIT! - -// Original file comments: -// This file is part of arduino-cli. -// -// Copyright 2020 ARDUINO SA (http://www.arduino.cc/) -// -// This software is released under the GNU General Public License version 3, -// which covers the main part of arduino-cli. -// The terms of this license can be found at: -// https://www.gnu.org/licenses/gpl-3.0.en.html -// -// You can be released from the requirements of the above licenses by purchasing -// a commercial license. Buying such a license is mandatory if you want to -// modify or otherwise use the software for commercial activities involving the -// Arduino software without disclosing the source code of your own applications. -// To purchase a commercial license, send an email to license@arduino.cc. -// -'use strict'; -var cc_arduino_cli_debug_v1_debug_pb = require('../../../../../cc/arduino/cli/debug/v1/debug_pb.js'); -var cc_arduino_cli_commands_v1_common_pb = require('../../../../../cc/arduino/cli/commands/v1/common_pb.js'); -var cc_arduino_cli_commands_v1_port_pb = require('../../../../../cc/arduino/cli/commands/v1/port_pb.js'); - -function serialize_cc_arduino_cli_debug_v1_DebugConfigRequest(arg) { - if (!(arg instanceof cc_arduino_cli_debug_v1_debug_pb.DebugConfigRequest)) { - throw new Error('Expected argument of type cc.arduino.cli.debug.v1.DebugConfigRequest'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_cc_arduino_cli_debug_v1_DebugConfigRequest(buffer_arg) { - return cc_arduino_cli_debug_v1_debug_pb.DebugConfigRequest.deserializeBinary(new Uint8Array(buffer_arg)); -} - -function serialize_cc_arduino_cli_debug_v1_DebugRequest(arg) { - if (!(arg instanceof cc_arduino_cli_debug_v1_debug_pb.DebugRequest)) { - throw new Error('Expected argument of type cc.arduino.cli.debug.v1.DebugRequest'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_cc_arduino_cli_debug_v1_DebugRequest(buffer_arg) { - return cc_arduino_cli_debug_v1_debug_pb.DebugRequest.deserializeBinary(new Uint8Array(buffer_arg)); -} - -function serialize_cc_arduino_cli_debug_v1_DebugResponse(arg) { - if (!(arg instanceof cc_arduino_cli_debug_v1_debug_pb.DebugResponse)) { - throw new Error('Expected argument of type cc.arduino.cli.debug.v1.DebugResponse'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_cc_arduino_cli_debug_v1_DebugResponse(buffer_arg) { - return cc_arduino_cli_debug_v1_debug_pb.DebugResponse.deserializeBinary(new Uint8Array(buffer_arg)); -} - -function serialize_cc_arduino_cli_debug_v1_GetDebugConfigResponse(arg) { - if (!(arg instanceof cc_arduino_cli_debug_v1_debug_pb.GetDebugConfigResponse)) { - throw new Error('Expected argument of type cc.arduino.cli.debug.v1.GetDebugConfigResponse'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_cc_arduino_cli_debug_v1_GetDebugConfigResponse(buffer_arg) { - return cc_arduino_cli_debug_v1_debug_pb.GetDebugConfigResponse.deserializeBinary(new Uint8Array(buffer_arg)); -} - - -// DebugService abstracts a debug Session usage -var DebugServiceService = exports['cc.arduino.cli.debug.v1.DebugService'] = { - // Start a debug session and communicate with the debugger tool. -debug: { - path: '/cc.arduino.cli.debug.v1.DebugService/Debug', - requestStream: true, - responseStream: true, - requestType: cc_arduino_cli_debug_v1_debug_pb.DebugRequest, - responseType: cc_arduino_cli_debug_v1_debug_pb.DebugResponse, - requestSerialize: serialize_cc_arduino_cli_debug_v1_DebugRequest, - requestDeserialize: deserialize_cc_arduino_cli_debug_v1_DebugRequest, - responseSerialize: serialize_cc_arduino_cli_debug_v1_DebugResponse, - responseDeserialize: deserialize_cc_arduino_cli_debug_v1_DebugResponse, - }, - getDebugConfig: { - path: '/cc.arduino.cli.debug.v1.DebugService/GetDebugConfig', - requestStream: false, - responseStream: false, - requestType: cc_arduino_cli_debug_v1_debug_pb.DebugConfigRequest, - responseType: cc_arduino_cli_debug_v1_debug_pb.GetDebugConfigResponse, - requestSerialize: serialize_cc_arduino_cli_debug_v1_DebugConfigRequest, - requestDeserialize: deserialize_cc_arduino_cli_debug_v1_DebugConfigRequest, - responseSerialize: serialize_cc_arduino_cli_debug_v1_GetDebugConfigResponse, - responseDeserialize: deserialize_cc_arduino_cli_debug_v1_GetDebugConfigResponse, - }, -}; - diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/debug/v1/debug_pb.d.ts b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/debug/v1/debug_pb.d.ts deleted file mode 100644 index 7f353d557..000000000 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/debug/v1/debug_pb.d.ts +++ /dev/null @@ -1,174 +0,0 @@ -// package: cc.arduino.cli.debug.v1 -// file: cc/arduino/cli/debug/v1/debug.proto - -/* tslint:disable */ -/* eslint-disable */ - -import * as jspb from "google-protobuf"; -import * as cc_arduino_cli_commands_v1_common_pb from "../../../../../cc/arduino/cli/commands/v1/common_pb"; -import * as cc_arduino_cli_commands_v1_port_pb from "../../../../../cc/arduino/cli/commands/v1/port_pb"; - -export class DebugRequest extends jspb.Message { - - hasDebugRequest(): boolean; - clearDebugRequest(): void; - getDebugRequest(): DebugConfigRequest | undefined; - setDebugRequest(value?: DebugConfigRequest): DebugRequest; - - getData(): Uint8Array | string; - getData_asU8(): Uint8Array; - getData_asB64(): string; - setData(value: Uint8Array | string): DebugRequest; - - getSendInterrupt(): boolean; - setSendInterrupt(value: boolean): DebugRequest; - - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): DebugRequest.AsObject; - static toObject(includeInstance: boolean, msg: DebugRequest): DebugRequest.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: DebugRequest, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): DebugRequest; - static deserializeBinaryFromReader(message: DebugRequest, reader: jspb.BinaryReader): DebugRequest; -} - -export namespace DebugRequest { - export type AsObject = { - debugRequest?: DebugConfigRequest.AsObject, - data: Uint8Array | string, - sendInterrupt: boolean, - } -} - -export class DebugConfigRequest 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): DebugConfigRequest; - - getFqbn(): string; - setFqbn(value: string): DebugConfigRequest; - - getSketchPath(): string; - setSketchPath(value: string): DebugConfigRequest; - - - hasPort(): boolean; - clearPort(): void; - getPort(): cc_arduino_cli_commands_v1_port_pb.Port | undefined; - setPort(value?: cc_arduino_cli_commands_v1_port_pb.Port): DebugConfigRequest; - - getInterpreter(): string; - setInterpreter(value: string): DebugConfigRequest; - - getImportDir(): string; - setImportDir(value: string): DebugConfigRequest; - - getProgrammer(): string; - setProgrammer(value: string): DebugConfigRequest; - - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): DebugConfigRequest.AsObject; - static toObject(includeInstance: boolean, msg: DebugConfigRequest): DebugConfigRequest.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: DebugConfigRequest, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): DebugConfigRequest; - static deserializeBinaryFromReader(message: DebugConfigRequest, reader: jspb.BinaryReader): DebugConfigRequest; -} - -export namespace DebugConfigRequest { - export type AsObject = { - instance?: cc_arduino_cli_commands_v1_common_pb.Instance.AsObject, - fqbn: string, - sketchPath: string, - port?: cc_arduino_cli_commands_v1_port_pb.Port.AsObject, - interpreter: string, - importDir: string, - programmer: string, - } -} - -export class DebugResponse extends jspb.Message { - getData(): Uint8Array | string; - getData_asU8(): Uint8Array; - getData_asB64(): string; - setData(value: Uint8Array | string): DebugResponse; - - getError(): string; - setError(value: string): DebugResponse; - - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): DebugResponse.AsObject; - static toObject(includeInstance: boolean, msg: DebugResponse): DebugResponse.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: DebugResponse, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): DebugResponse; - static deserializeBinaryFromReader(message: DebugResponse, reader: jspb.BinaryReader): DebugResponse; -} - -export namespace DebugResponse { - export type AsObject = { - data: Uint8Array | string, - error: string, - } -} - -export class GetDebugConfigResponse extends jspb.Message { - getExecutable(): string; - setExecutable(value: string): GetDebugConfigResponse; - - getToolchain(): string; - setToolchain(value: string): GetDebugConfigResponse; - - getToolchainPath(): string; - setToolchainPath(value: string): GetDebugConfigResponse; - - getToolchainPrefix(): string; - setToolchainPrefix(value: string): GetDebugConfigResponse; - - getServer(): string; - setServer(value: string): GetDebugConfigResponse; - - getServerPath(): string; - setServerPath(value: string): GetDebugConfigResponse; - - - getToolchainConfigurationMap(): jspb.Map<string, string>; - clearToolchainConfigurationMap(): void; - - - getServerConfigurationMap(): jspb.Map<string, string>; - clearServerConfigurationMap(): void; - - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): GetDebugConfigResponse.AsObject; - static toObject(includeInstance: boolean, msg: GetDebugConfigResponse): GetDebugConfigResponse.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: GetDebugConfigResponse, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): GetDebugConfigResponse; - static deserializeBinaryFromReader(message: GetDebugConfigResponse, reader: jspb.BinaryReader): GetDebugConfigResponse; -} - -export namespace GetDebugConfigResponse { - export type AsObject = { - executable: string, - toolchain: string, - toolchainPath: string, - toolchainPrefix: string, - server: string, - serverPath: string, - - toolchainConfigurationMap: Array<[string, string]>, - - serverConfigurationMap: Array<[string, string]>, - } -} diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/debug/v1/debug_pb.js b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/debug/v1/debug_pb.js deleted file mode 100644 index 12b38a6a5..000000000 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/debug/v1/debug_pb.js +++ /dev/null @@ -1,1227 +0,0 @@ -// source: cc/arduino/cli/debug/v1/debug.proto -/** - * @fileoverview - * @enhanceable - * @suppress {missingRequire} reports error on implicit type usages. - * @suppress {messageConventions} JS Compiler reports an error if a variable or - * field starts with 'MSG_' and isn't a translatable message. - * @public - */ -// GENERATED CODE -- DO NOT EDIT! -/* eslint-disable */ -// @ts-nocheck - -var jspb = require('google-protobuf'); -var goog = jspb; -var global = Function('return this')(); - -var cc_arduino_cli_commands_v1_common_pb = require('../../../../../cc/arduino/cli/commands/v1/common_pb.js'); -goog.object.extend(proto, cc_arduino_cli_commands_v1_common_pb); -var cc_arduino_cli_commands_v1_port_pb = require('../../../../../cc/arduino/cli/commands/v1/port_pb.js'); -goog.object.extend(proto, cc_arduino_cli_commands_v1_port_pb); -goog.exportSymbol('proto.cc.arduino.cli.debug.v1.DebugConfigRequest', null, global); -goog.exportSymbol('proto.cc.arduino.cli.debug.v1.DebugRequest', null, global); -goog.exportSymbol('proto.cc.arduino.cli.debug.v1.DebugResponse', null, global); -goog.exportSymbol('proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse', null, global); -/** - * 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.debug.v1.DebugRequest = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.cc.arduino.cli.debug.v1.DebugRequest, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.cc.arduino.cli.debug.v1.DebugRequest.displayName = 'proto.cc.arduino.cli.debug.v1.DebugRequest'; -} -/** - * 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.debug.v1.DebugConfigRequest = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.cc.arduino.cli.debug.v1.DebugConfigRequest, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.cc.arduino.cli.debug.v1.DebugConfigRequest.displayName = 'proto.cc.arduino.cli.debug.v1.DebugConfigRequest'; -} -/** - * 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.debug.v1.DebugResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.cc.arduino.cli.debug.v1.DebugResponse, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.cc.arduino.cli.debug.v1.DebugResponse.displayName = 'proto.cc.arduino.cli.debug.v1.DebugResponse'; -} -/** - * 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.debug.v1.GetDebugConfigResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse.displayName = 'proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse'; -} - - - -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.debug.v1.DebugRequest.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.debug.v1.DebugRequest.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.debug.v1.DebugRequest} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.debug.v1.DebugRequest.toObject = function(includeInstance, msg) { - var f, obj = { - debugRequest: (f = msg.getDebugRequest()) && proto.cc.arduino.cli.debug.v1.DebugConfigRequest.toObject(includeInstance, f), - data: msg.getData_asB64(), - sendInterrupt: 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.debug.v1.DebugRequest} - */ -proto.cc.arduino.cli.debug.v1.DebugRequest.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.debug.v1.DebugRequest; - return proto.cc.arduino.cli.debug.v1.DebugRequest.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.cc.arduino.cli.debug.v1.DebugRequest} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.debug.v1.DebugRequest} - */ -proto.cc.arduino.cli.debug.v1.DebugRequest.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.debug.v1.DebugConfigRequest; - reader.readMessage(value,proto.cc.arduino.cli.debug.v1.DebugConfigRequest.deserializeBinaryFromReader); - msg.setDebugRequest(value); - break; - case 2: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setData(value); - break; - case 3: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setSendInterrupt(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.cc.arduino.cli.debug.v1.DebugRequest.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.debug.v1.DebugRequest.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.debug.v1.DebugRequest} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.debug.v1.DebugRequest.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getDebugRequest(); - if (f != null) { - writer.writeMessage( - 1, - f, - proto.cc.arduino.cli.debug.v1.DebugConfigRequest.serializeBinaryToWriter - ); - } - f = message.getData_asU8(); - if (f.length > 0) { - writer.writeBytes( - 2, - f - ); - } - f = message.getSendInterrupt(); - if (f) { - writer.writeBool( - 3, - f - ); - } -}; - - -/** - * optional DebugConfigRequest debug_request = 1; - * @return {?proto.cc.arduino.cli.debug.v1.DebugConfigRequest} - */ -proto.cc.arduino.cli.debug.v1.DebugRequest.prototype.getDebugRequest = function() { - return /** @type{?proto.cc.arduino.cli.debug.v1.DebugConfigRequest} */ ( - jspb.Message.getWrapperField(this, proto.cc.arduino.cli.debug.v1.DebugConfigRequest, 1)); -}; - - -/** - * @param {?proto.cc.arduino.cli.debug.v1.DebugConfigRequest|undefined} value - * @return {!proto.cc.arduino.cli.debug.v1.DebugRequest} returns this -*/ -proto.cc.arduino.cli.debug.v1.DebugRequest.prototype.setDebugRequest = function(value) { - return jspb.Message.setWrapperField(this, 1, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.cc.arduino.cli.debug.v1.DebugRequest} returns this - */ -proto.cc.arduino.cli.debug.v1.DebugRequest.prototype.clearDebugRequest = function() { - return this.setDebugRequest(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.cc.arduino.cli.debug.v1.DebugRequest.prototype.hasDebugRequest = function() { - return jspb.Message.getField(this, 1) != null; -}; - - -/** - * optional bytes data = 2; - * @return {!(string|Uint8Array)} - */ -proto.cc.arduino.cli.debug.v1.DebugRequest.prototype.getData = function() { - return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 2, "")); -}; - - -/** - * optional bytes data = 2; - * This is a type-conversion wrapper around `getData()` - * @return {string} - */ -proto.cc.arduino.cli.debug.v1.DebugRequest.prototype.getData_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getData())); -}; - - -/** - * optional bytes data = 2; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getData()` - * @return {!Uint8Array} - */ -proto.cc.arduino.cli.debug.v1.DebugRequest.prototype.getData_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getData())); -}; - - -/** - * @param {!(string|Uint8Array)} value - * @return {!proto.cc.arduino.cli.debug.v1.DebugRequest} returns this - */ -proto.cc.arduino.cli.debug.v1.DebugRequest.prototype.setData = function(value) { - return jspb.Message.setProto3BytesField(this, 2, value); -}; - - -/** - * optional bool send_interrupt = 3; - * @return {boolean} - */ -proto.cc.arduino.cli.debug.v1.DebugRequest.prototype.getSendInterrupt = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); -}; - - -/** - * @param {boolean} value - * @return {!proto.cc.arduino.cli.debug.v1.DebugRequest} returns this - */ -proto.cc.arduino.cli.debug.v1.DebugRequest.prototype.setSendInterrupt = function(value) { - return jspb.Message.setProto3BooleanField(this, 3, value); -}; - - - - - -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.debug.v1.DebugConfigRequest.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.debug.v1.DebugConfigRequest.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.debug.v1.DebugConfigRequest} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.debug.v1.DebugConfigRequest.toObject = function(includeInstance, msg) { - var f, obj = { - instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f), - fqbn: jspb.Message.getFieldWithDefault(msg, 2, ""), - sketchPath: jspb.Message.getFieldWithDefault(msg, 3, ""), - port: (f = msg.getPort()) && cc_arduino_cli_commands_v1_port_pb.Port.toObject(includeInstance, f), - interpreter: jspb.Message.getFieldWithDefault(msg, 5, ""), - importDir: jspb.Message.getFieldWithDefault(msg, 8, ""), - programmer: jspb.Message.getFieldWithDefault(msg, 9, "") - }; - - 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.debug.v1.DebugConfigRequest} - */ -proto.cc.arduino.cli.debug.v1.DebugConfigRequest.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.debug.v1.DebugConfigRequest; - return proto.cc.arduino.cli.debug.v1.DebugConfigRequest.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.cc.arduino.cli.debug.v1.DebugConfigRequest} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.debug.v1.DebugConfigRequest} - */ -proto.cc.arduino.cli.debug.v1.DebugConfigRequest.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 = /** @type {string} */ (reader.readString()); - msg.setFqbn(value); - break; - case 3: - var value = /** @type {string} */ (reader.readString()); - msg.setSketchPath(value); - break; - case 4: - var value = new cc_arduino_cli_commands_v1_port_pb.Port; - reader.readMessage(value,cc_arduino_cli_commands_v1_port_pb.Port.deserializeBinaryFromReader); - msg.setPort(value); - break; - case 5: - var value = /** @type {string} */ (reader.readString()); - msg.setInterpreter(value); - break; - case 8: - var value = /** @type {string} */ (reader.readString()); - msg.setImportDir(value); - break; - case 9: - var value = /** @type {string} */ (reader.readString()); - msg.setProgrammer(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.cc.arduino.cli.debug.v1.DebugConfigRequest.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.debug.v1.DebugConfigRequest.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.debug.v1.DebugConfigRequest} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.debug.v1.DebugConfigRequest.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.getFqbn(); - if (f.length > 0) { - writer.writeString( - 2, - f - ); - } - f = message.getSketchPath(); - if (f.length > 0) { - writer.writeString( - 3, - f - ); - } - f = message.getPort(); - if (f != null) { - writer.writeMessage( - 4, - f, - cc_arduino_cli_commands_v1_port_pb.Port.serializeBinaryToWriter - ); - } - f = message.getInterpreter(); - if (f.length > 0) { - writer.writeString( - 5, - f - ); - } - f = message.getImportDir(); - if (f.length > 0) { - writer.writeString( - 8, - f - ); - } - f = message.getProgrammer(); - if (f.length > 0) { - writer.writeString( - 9, - f - ); - } -}; - - -/** - * optional cc.arduino.cli.commands.v1.Instance instance = 1; - * @return {?proto.cc.arduino.cli.commands.v1.Instance} - */ -proto.cc.arduino.cli.debug.v1.DebugConfigRequest.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.debug.v1.DebugConfigRequest} returns this -*/ -proto.cc.arduino.cli.debug.v1.DebugConfigRequest.prototype.setInstance = function(value) { - return jspb.Message.setWrapperField(this, 1, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.cc.arduino.cli.debug.v1.DebugConfigRequest} returns this - */ -proto.cc.arduino.cli.debug.v1.DebugConfigRequest.prototype.clearInstance = function() { - return this.setInstance(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.cc.arduino.cli.debug.v1.DebugConfigRequest.prototype.hasInstance = function() { - return jspb.Message.getField(this, 1) != null; -}; - - -/** - * optional string fqbn = 2; - * @return {string} - */ -proto.cc.arduino.cli.debug.v1.DebugConfigRequest.prototype.getFqbn = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); -}; - - -/** - * @param {string} value - * @return {!proto.cc.arduino.cli.debug.v1.DebugConfigRequest} returns this - */ -proto.cc.arduino.cli.debug.v1.DebugConfigRequest.prototype.setFqbn = function(value) { - return jspb.Message.setProto3StringField(this, 2, value); -}; - - -/** - * optional string sketch_path = 3; - * @return {string} - */ -proto.cc.arduino.cli.debug.v1.DebugConfigRequest.prototype.getSketchPath = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); -}; - - -/** - * @param {string} value - * @return {!proto.cc.arduino.cli.debug.v1.DebugConfigRequest} returns this - */ -proto.cc.arduino.cli.debug.v1.DebugConfigRequest.prototype.setSketchPath = function(value) { - return jspb.Message.setProto3StringField(this, 3, value); -}; - - -/** - * optional cc.arduino.cli.commands.v1.Port port = 4; - * @return {?proto.cc.arduino.cli.commands.v1.Port} - */ -proto.cc.arduino.cli.debug.v1.DebugConfigRequest.prototype.getPort = function() { - return /** @type{?proto.cc.arduino.cli.commands.v1.Port} */ ( - jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_port_pb.Port, 4)); -}; - - -/** - * @param {?proto.cc.arduino.cli.commands.v1.Port|undefined} value - * @return {!proto.cc.arduino.cli.debug.v1.DebugConfigRequest} returns this -*/ -proto.cc.arduino.cli.debug.v1.DebugConfigRequest.prototype.setPort = function(value) { - return jspb.Message.setWrapperField(this, 4, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.cc.arduino.cli.debug.v1.DebugConfigRequest} returns this - */ -proto.cc.arduino.cli.debug.v1.DebugConfigRequest.prototype.clearPort = function() { - return this.setPort(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.cc.arduino.cli.debug.v1.DebugConfigRequest.prototype.hasPort = function() { - return jspb.Message.getField(this, 4) != null; -}; - - -/** - * optional string interpreter = 5; - * @return {string} - */ -proto.cc.arduino.cli.debug.v1.DebugConfigRequest.prototype.getInterpreter = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 5, "")); -}; - - -/** - * @param {string} value - * @return {!proto.cc.arduino.cli.debug.v1.DebugConfigRequest} returns this - */ -proto.cc.arduino.cli.debug.v1.DebugConfigRequest.prototype.setInterpreter = function(value) { - return jspb.Message.setProto3StringField(this, 5, value); -}; - - -/** - * optional string import_dir = 8; - * @return {string} - */ -proto.cc.arduino.cli.debug.v1.DebugConfigRequest.prototype.getImportDir = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 8, "")); -}; - - -/** - * @param {string} value - * @return {!proto.cc.arduino.cli.debug.v1.DebugConfigRequest} returns this - */ -proto.cc.arduino.cli.debug.v1.DebugConfigRequest.prototype.setImportDir = function(value) { - return jspb.Message.setProto3StringField(this, 8, value); -}; - - -/** - * optional string programmer = 9; - * @return {string} - */ -proto.cc.arduino.cli.debug.v1.DebugConfigRequest.prototype.getProgrammer = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 9, "")); -}; - - -/** - * @param {string} value - * @return {!proto.cc.arduino.cli.debug.v1.DebugConfigRequest} returns this - */ -proto.cc.arduino.cli.debug.v1.DebugConfigRequest.prototype.setProgrammer = function(value) { - return jspb.Message.setProto3StringField(this, 9, value); -}; - - - - - -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.debug.v1.DebugResponse.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.debug.v1.DebugResponse.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.debug.v1.DebugResponse} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.debug.v1.DebugResponse.toObject = function(includeInstance, msg) { - var f, obj = { - data: msg.getData_asB64(), - error: jspb.Message.getFieldWithDefault(msg, 2, "") - }; - - 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.debug.v1.DebugResponse} - */ -proto.cc.arduino.cli.debug.v1.DebugResponse.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.debug.v1.DebugResponse; - return proto.cc.arduino.cli.debug.v1.DebugResponse.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.cc.arduino.cli.debug.v1.DebugResponse} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.debug.v1.DebugResponse} - */ -proto.cc.arduino.cli.debug.v1.DebugResponse.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setData(value); - break; - case 2: - var value = /** @type {string} */ (reader.readString()); - msg.setError(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.cc.arduino.cli.debug.v1.DebugResponse.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.debug.v1.DebugResponse.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.debug.v1.DebugResponse} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.debug.v1.DebugResponse.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getData_asU8(); - if (f.length > 0) { - writer.writeBytes( - 1, - f - ); - } - f = message.getError(); - if (f.length > 0) { - writer.writeString( - 2, - f - ); - } -}; - - -/** - * optional bytes data = 1; - * @return {!(string|Uint8Array)} - */ -proto.cc.arduino.cli.debug.v1.DebugResponse.prototype.getData = function() { - return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * optional bytes data = 1; - * This is a type-conversion wrapper around `getData()` - * @return {string} - */ -proto.cc.arduino.cli.debug.v1.DebugResponse.prototype.getData_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getData())); -}; - - -/** - * optional bytes data = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getData()` - * @return {!Uint8Array} - */ -proto.cc.arduino.cli.debug.v1.DebugResponse.prototype.getData_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getData())); -}; - - -/** - * @param {!(string|Uint8Array)} value - * @return {!proto.cc.arduino.cli.debug.v1.DebugResponse} returns this - */ -proto.cc.arduino.cli.debug.v1.DebugResponse.prototype.setData = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); -}; - - -/** - * optional string error = 2; - * @return {string} - */ -proto.cc.arduino.cli.debug.v1.DebugResponse.prototype.getError = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); -}; - - -/** - * @param {string} value - * @return {!proto.cc.arduino.cli.debug.v1.DebugResponse} returns this - */ -proto.cc.arduino.cli.debug.v1.DebugResponse.prototype.setError = function(value) { - return jspb.Message.setProto3StringField(this, 2, value); -}; - - - - - -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.debug.v1.GetDebugConfigResponse.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse.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.debug.v1.GetDebugConfigResponse} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse.toObject = function(includeInstance, msg) { - var f, obj = { - executable: jspb.Message.getFieldWithDefault(msg, 1, ""), - toolchain: jspb.Message.getFieldWithDefault(msg, 2, ""), - toolchainPath: jspb.Message.getFieldWithDefault(msg, 3, ""), - toolchainPrefix: jspb.Message.getFieldWithDefault(msg, 4, ""), - server: jspb.Message.getFieldWithDefault(msg, 5, ""), - serverPath: jspb.Message.getFieldWithDefault(msg, 6, ""), - toolchainConfigurationMap: (f = msg.getToolchainConfigurationMap()) ? f.toObject(includeInstance, undefined) : [], - serverConfigurationMap: (f = msg.getServerConfigurationMap()) ? f.toObject(includeInstance, undefined) : [] - }; - - 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.debug.v1.GetDebugConfigResponse} - */ -proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse; - return proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse} - */ -proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {string} */ (reader.readString()); - msg.setExecutable(value); - break; - case 2: - var value = /** @type {string} */ (reader.readString()); - msg.setToolchain(value); - break; - case 3: - var value = /** @type {string} */ (reader.readString()); - msg.setToolchainPath(value); - break; - case 4: - var value = /** @type {string} */ (reader.readString()); - msg.setToolchainPrefix(value); - break; - case 5: - var value = /** @type {string} */ (reader.readString()); - msg.setServer(value); - break; - case 6: - var value = /** @type {string} */ (reader.readString()); - msg.setServerPath(value); - break; - case 7: - var value = msg.getToolchainConfigurationMap(); - reader.readMessage(value, function(message, reader) { - jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readString, jspb.BinaryReader.prototype.readString, null, "", ""); - }); - break; - case 8: - var value = msg.getServerConfigurationMap(); - reader.readMessage(value, function(message, reader) { - jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readString, jspb.BinaryReader.prototype.readString, null, "", ""); - }); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse.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.debug.v1.GetDebugConfigResponse} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getExecutable(); - if (f.length > 0) { - writer.writeString( - 1, - f - ); - } - f = message.getToolchain(); - if (f.length > 0) { - writer.writeString( - 2, - f - ); - } - f = message.getToolchainPath(); - if (f.length > 0) { - writer.writeString( - 3, - f - ); - } - f = message.getToolchainPrefix(); - if (f.length > 0) { - writer.writeString( - 4, - f - ); - } - f = message.getServer(); - if (f.length > 0) { - writer.writeString( - 5, - f - ); - } - f = message.getServerPath(); - if (f.length > 0) { - writer.writeString( - 6, - f - ); - } - f = message.getToolchainConfigurationMap(true); - if (f && f.getLength() > 0) { - f.serializeBinary(7, writer, jspb.BinaryWriter.prototype.writeString, jspb.BinaryWriter.prototype.writeString); - } - f = message.getServerConfigurationMap(true); - if (f && f.getLength() > 0) { - f.serializeBinary(8, writer, jspb.BinaryWriter.prototype.writeString, jspb.BinaryWriter.prototype.writeString); - } -}; - - -/** - * optional string executable = 1; - * @return {string} - */ -proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse.prototype.getExecutable = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * @param {string} value - * @return {!proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse} returns this - */ -proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse.prototype.setExecutable = function(value) { - return jspb.Message.setProto3StringField(this, 1, value); -}; - - -/** - * optional string toolchain = 2; - * @return {string} - */ -proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse.prototype.getToolchain = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); -}; - - -/** - * @param {string} value - * @return {!proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse} returns this - */ -proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse.prototype.setToolchain = function(value) { - return jspb.Message.setProto3StringField(this, 2, value); -}; - - -/** - * optional string toolchain_path = 3; - * @return {string} - */ -proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse.prototype.getToolchainPath = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); -}; - - -/** - * @param {string} value - * @return {!proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse} returns this - */ -proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse.prototype.setToolchainPath = function(value) { - return jspb.Message.setProto3StringField(this, 3, value); -}; - - -/** - * optional string toolchain_prefix = 4; - * @return {string} - */ -proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse.prototype.getToolchainPrefix = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); -}; - - -/** - * @param {string} value - * @return {!proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse} returns this - */ -proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse.prototype.setToolchainPrefix = function(value) { - return jspb.Message.setProto3StringField(this, 4, value); -}; - - -/** - * optional string server = 5; - * @return {string} - */ -proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse.prototype.getServer = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 5, "")); -}; - - -/** - * @param {string} value - * @return {!proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse} returns this - */ -proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse.prototype.setServer = function(value) { - return jspb.Message.setProto3StringField(this, 5, value); -}; - - -/** - * optional string server_path = 6; - * @return {string} - */ -proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse.prototype.getServerPath = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 6, "")); -}; - - -/** - * @param {string} value - * @return {!proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse} returns this - */ -proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse.prototype.setServerPath = function(value) { - return jspb.Message.setProto3StringField(this, 6, value); -}; - - -/** - * map<string, string> toolchain_configuration = 7; - * @param {boolean=} opt_noLazyCreate Do not create the map if - * empty, instead returning `undefined` - * @return {!jspb.Map<string,string>} - */ -proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse.prototype.getToolchainConfigurationMap = function(opt_noLazyCreate) { - return /** @type {!jspb.Map<string,string>} */ ( - jspb.Message.getMapField(this, 7, opt_noLazyCreate, - null)); -}; - - -/** - * Clears values from the map. The map will be non-null. - * @return {!proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse} returns this - */ -proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse.prototype.clearToolchainConfigurationMap = function() { - this.getToolchainConfigurationMap().clear(); - return this;}; - - -/** - * map<string, string> server_configuration = 8; - * @param {boolean=} opt_noLazyCreate Do not create the map if - * empty, instead returning `undefined` - * @return {!jspb.Map<string,string>} - */ -proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse.prototype.getServerConfigurationMap = function(opt_noLazyCreate) { - return /** @type {!jspb.Map<string,string>} */ ( - jspb.Message.getMapField(this, 8, opt_noLazyCreate, - null)); -}; - - -/** - * Clears values from the map. The map will be non-null. - * @return {!proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse} returns this - */ -proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse.prototype.clearServerConfigurationMap = function() { - this.getServerConfigurationMap().clear(); - return this;}; - - -goog.object.extend(exports, proto.cc.arduino.cli.debug.v1); diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/monitor/v1/monitor_grpc_pb.d.ts b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/monitor/v1/monitor_grpc_pb.d.ts deleted file mode 100644 index 981a1da92..000000000 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/monitor/v1/monitor_grpc_pb.d.ts +++ /dev/null @@ -1,42 +0,0 @@ -// package: cc.arduino.cli.monitor.v1 -// file: cc/arduino/cli/monitor/v1/monitor.proto - -/* tslint:disable */ -/* eslint-disable */ - -import * as grpc from "@grpc/grpc-js"; -import {handleClientStreamingCall} from "@grpc/grpc-js/build/src/server-call"; -import * as cc_arduino_cli_monitor_v1_monitor_pb from "../../../../../cc/arduino/cli/monitor/v1/monitor_pb"; -import * as google_protobuf_struct_pb from "google-protobuf/google/protobuf/struct_pb"; - -interface IMonitorServiceService extends grpc.ServiceDefinition<grpc.UntypedServiceImplementation> { - streamingOpen: IMonitorServiceService_IStreamingOpen; -} - -interface IMonitorServiceService_IStreamingOpen extends grpc.MethodDefinition<cc_arduino_cli_monitor_v1_monitor_pb.StreamingOpenRequest, cc_arduino_cli_monitor_v1_monitor_pb.StreamingOpenResponse> { - path: "/cc.arduino.cli.monitor.v1.MonitorService/StreamingOpen"; - requestStream: true; - responseStream: true; - requestSerialize: grpc.serialize<cc_arduino_cli_monitor_v1_monitor_pb.StreamingOpenRequest>; - requestDeserialize: grpc.deserialize<cc_arduino_cli_monitor_v1_monitor_pb.StreamingOpenRequest>; - responseSerialize: grpc.serialize<cc_arduino_cli_monitor_v1_monitor_pb.StreamingOpenResponse>; - responseDeserialize: grpc.deserialize<cc_arduino_cli_monitor_v1_monitor_pb.StreamingOpenResponse>; -} - -export const MonitorServiceService: IMonitorServiceService; - -export interface IMonitorServiceServer { - streamingOpen: grpc.handleBidiStreamingCall<cc_arduino_cli_monitor_v1_monitor_pb.StreamingOpenRequest, cc_arduino_cli_monitor_v1_monitor_pb.StreamingOpenResponse>; -} - -export interface IMonitorServiceClient { - streamingOpen(): grpc.ClientDuplexStream<cc_arduino_cli_monitor_v1_monitor_pb.StreamingOpenRequest, cc_arduino_cli_monitor_v1_monitor_pb.StreamingOpenResponse>; - streamingOpen(options: Partial<grpc.CallOptions>): grpc.ClientDuplexStream<cc_arduino_cli_monitor_v1_monitor_pb.StreamingOpenRequest, cc_arduino_cli_monitor_v1_monitor_pb.StreamingOpenResponse>; - streamingOpen(metadata: grpc.Metadata, options?: Partial<grpc.CallOptions>): grpc.ClientDuplexStream<cc_arduino_cli_monitor_v1_monitor_pb.StreamingOpenRequest, cc_arduino_cli_monitor_v1_monitor_pb.StreamingOpenResponse>; -} - -export class MonitorServiceClient extends grpc.Client implements IMonitorServiceClient { - constructor(address: string, credentials: grpc.ChannelCredentials, options?: Partial<grpc.ClientOptions>); - public streamingOpen(options?: Partial<grpc.CallOptions>): grpc.ClientDuplexStream<cc_arduino_cli_monitor_v1_monitor_pb.StreamingOpenRequest, cc_arduino_cli_monitor_v1_monitor_pb.StreamingOpenResponse>; - public streamingOpen(metadata?: grpc.Metadata, options?: Partial<grpc.CallOptions>): grpc.ClientDuplexStream<cc_arduino_cli_monitor_v1_monitor_pb.StreamingOpenRequest, cc_arduino_cli_monitor_v1_monitor_pb.StreamingOpenResponse>; -} diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/monitor/v1/monitor_grpc_pb.js b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/monitor/v1/monitor_grpc_pb.js deleted file mode 100644 index f20982617..000000000 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/monitor/v1/monitor_grpc_pb.js +++ /dev/null @@ -1,65 +0,0 @@ -// GENERATED CODE -- DO NOT EDIT! - -// Original file comments: -// This file is part of arduino-cli. -// -// Copyright 2020 ARDUINO SA (http://www.arduino.cc/) -// -// This software is released under the GNU General Public License version 3, -// which covers the main part of arduino-cli. -// The terms of this license can be found at: -// https://www.gnu.org/licenses/gpl-3.0.en.html -// -// You can be released from the requirements of the above licenses by purchasing -// a commercial license. Buying such a license is mandatory if you want to -// modify or otherwise use the software for commercial activities involving the -// Arduino software without disclosing the source code of your own applications. -// To purchase a commercial license, send an email to license@arduino.cc. -// -'use strict'; -var cc_arduino_cli_monitor_v1_monitor_pb = require('../../../../../cc/arduino/cli/monitor/v1/monitor_pb.js'); -var google_protobuf_struct_pb = require('google-protobuf/google/protobuf/struct_pb.js'); - -function serialize_cc_arduino_cli_monitor_v1_StreamingOpenRequest(arg) { - if (!(arg instanceof cc_arduino_cli_monitor_v1_monitor_pb.StreamingOpenRequest)) { - throw new Error('Expected argument of type cc.arduino.cli.monitor.v1.StreamingOpenRequest'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_cc_arduino_cli_monitor_v1_StreamingOpenRequest(buffer_arg) { - return cc_arduino_cli_monitor_v1_monitor_pb.StreamingOpenRequest.deserializeBinary(new Uint8Array(buffer_arg)); -} - -function serialize_cc_arduino_cli_monitor_v1_StreamingOpenResponse(arg) { - if (!(arg instanceof cc_arduino_cli_monitor_v1_monitor_pb.StreamingOpenResponse)) { - throw new Error('Expected argument of type cc.arduino.cli.monitor.v1.StreamingOpenResponse'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_cc_arduino_cli_monitor_v1_StreamingOpenResponse(buffer_arg) { - return cc_arduino_cli_monitor_v1_monitor_pb.StreamingOpenResponse.deserializeBinary(new Uint8Array(buffer_arg)); -} - - -// MonitorService provides services for boards monitor. -// DEPRECATION WARNING: MonitorService is deprecated and will be removed in a -// future release. Use ArduinoCoreService.Monitor and -// ArduinoCoreService.EnumerateMonitorPortSettings instead. -var MonitorServiceService = exports['cc.arduino.cli.monitor.v1.MonitorService'] = { - // Open a bidirectional monitor stream. This can be used to implement -// something similar to the Arduino IDE's Serial Monitor. -streamingOpen: { - path: '/cc.arduino.cli.monitor.v1.MonitorService/StreamingOpen', - requestStream: true, - responseStream: true, - requestType: cc_arduino_cli_monitor_v1_monitor_pb.StreamingOpenRequest, - responseType: cc_arduino_cli_monitor_v1_monitor_pb.StreamingOpenResponse, - requestSerialize: serialize_cc_arduino_cli_monitor_v1_StreamingOpenRequest, - requestDeserialize: deserialize_cc_arduino_cli_monitor_v1_StreamingOpenRequest, - responseSerialize: serialize_cc_arduino_cli_monitor_v1_StreamingOpenResponse, - responseDeserialize: deserialize_cc_arduino_cli_monitor_v1_StreamingOpenResponse, - }, -}; - diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/monitor/v1/monitor_pb.d.ts b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/monitor/v1/monitor_pb.d.ts deleted file mode 100644 index 9d158dd24..000000000 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/monitor/v1/monitor_pb.d.ts +++ /dev/null @@ -1,131 +0,0 @@ -// package: cc.arduino.cli.monitor.v1 -// file: cc/arduino/cli/monitor/v1/monitor.proto - -/* tslint:disable */ -/* eslint-disable */ - -import * as jspb from "google-protobuf"; -import * as google_protobuf_struct_pb from "google-protobuf/google/protobuf/struct_pb"; - -export class StreamingOpenRequest extends jspb.Message { - - hasConfig(): boolean; - clearConfig(): void; - getConfig(): MonitorConfig | undefined; - setConfig(value?: MonitorConfig): StreamingOpenRequest; - - - hasData(): boolean; - clearData(): void; - getData(): Uint8Array | string; - getData_asU8(): Uint8Array; - getData_asB64(): string; - setData(value: Uint8Array | string): StreamingOpenRequest; - - - hasRecvAcknowledge(): boolean; - clearRecvAcknowledge(): void; - getRecvAcknowledge(): number; - setRecvAcknowledge(value: number): StreamingOpenRequest; - - - getContentCase(): StreamingOpenRequest.ContentCase; - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): StreamingOpenRequest.AsObject; - static toObject(includeInstance: boolean, msg: StreamingOpenRequest): StreamingOpenRequest.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: StreamingOpenRequest, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): StreamingOpenRequest; - static deserializeBinaryFromReader(message: StreamingOpenRequest, reader: jspb.BinaryReader): StreamingOpenRequest; -} - -export namespace StreamingOpenRequest { - export type AsObject = { - config?: MonitorConfig.AsObject, - data: Uint8Array | string, - recvAcknowledge: number, - } - - export enum ContentCase { - CONTENT_NOT_SET = 0, - - CONFIG = 1, - - DATA = 2, - - RECV_ACKNOWLEDGE = 3, - - } - -} - -export class MonitorConfig extends jspb.Message { - getTarget(): string; - setTarget(value: string): MonitorConfig; - - getType(): MonitorConfig.TargetType; - setType(value: MonitorConfig.TargetType): MonitorConfig; - - - hasAdditionalConfig(): boolean; - clearAdditionalConfig(): void; - getAdditionalConfig(): google_protobuf_struct_pb.Struct | undefined; - setAdditionalConfig(value?: google_protobuf_struct_pb.Struct): MonitorConfig; - - getRecvRateLimitBuffer(): number; - setRecvRateLimitBuffer(value: number): MonitorConfig; - - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): MonitorConfig.AsObject; - static toObject(includeInstance: boolean, msg: MonitorConfig): MonitorConfig.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: MonitorConfig, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): MonitorConfig; - static deserializeBinaryFromReader(message: MonitorConfig, reader: jspb.BinaryReader): MonitorConfig; -} - -export namespace MonitorConfig { - export type AsObject = { - target: string, - type: MonitorConfig.TargetType, - additionalConfig?: google_protobuf_struct_pb.Struct.AsObject, - recvRateLimitBuffer: number, - } - - export enum TargetType { - TARGET_TYPE_SERIAL = 0, - TARGET_TYPE_NULL = 99, - } - -} - -export class StreamingOpenResponse extends jspb.Message { - getData(): Uint8Array | string; - getData_asU8(): Uint8Array; - getData_asB64(): string; - setData(value: Uint8Array | string): StreamingOpenResponse; - - getDropped(): number; - setDropped(value: number): StreamingOpenResponse; - - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): StreamingOpenResponse.AsObject; - static toObject(includeInstance: boolean, msg: StreamingOpenResponse): StreamingOpenResponse.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: StreamingOpenResponse, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): StreamingOpenResponse; - static deserializeBinaryFromReader(message: StreamingOpenResponse, reader: jspb.BinaryReader): StreamingOpenResponse; -} - -export namespace StreamingOpenResponse { - export type AsObject = { - data: Uint8Array | string, - dropped: number, - } -} diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/monitor/v1/monitor_pb.js b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/monitor/v1/monitor_pb.js deleted file mode 100644 index 4546fe982..000000000 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/monitor/v1/monitor_pb.js +++ /dev/null @@ -1,819 +0,0 @@ -// source: cc/arduino/cli/monitor/v1/monitor.proto -/** - * @fileoverview - * @enhanceable - * @suppress {missingRequire} reports error on implicit type usages. - * @suppress {messageConventions} JS Compiler reports an error if a variable or - * field starts with 'MSG_' and isn't a translatable message. - * @public - */ -// GENERATED CODE -- DO NOT EDIT! -/* eslint-disable */ -// @ts-nocheck - -var jspb = require('google-protobuf'); -var goog = jspb; -var global = Function('return this')(); - -var google_protobuf_struct_pb = require('google-protobuf/google/protobuf/struct_pb.js'); -goog.object.extend(proto, google_protobuf_struct_pb); -goog.exportSymbol('proto.cc.arduino.cli.monitor.v1.MonitorConfig', null, global); -goog.exportSymbol('proto.cc.arduino.cli.monitor.v1.MonitorConfig.TargetType', null, global); -goog.exportSymbol('proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest', null, global); -goog.exportSymbol('proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.ContentCase', null, global); -goog.exportSymbol('proto.cc.arduino.cli.monitor.v1.StreamingOpenResponse', null, global); -/** - * 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.monitor.v1.StreamingOpenRequest = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.oneofGroups_); -}; -goog.inherits(proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.displayName = 'proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest'; -} -/** - * 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.monitor.v1.MonitorConfig = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.cc.arduino.cli.monitor.v1.MonitorConfig, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.cc.arduino.cli.monitor.v1.MonitorConfig.displayName = 'proto.cc.arduino.cli.monitor.v1.MonitorConfig'; -} -/** - * 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.monitor.v1.StreamingOpenResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.cc.arduino.cli.monitor.v1.StreamingOpenResponse, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.cc.arduino.cli.monitor.v1.StreamingOpenResponse.displayName = 'proto.cc.arduino.cli.monitor.v1.StreamingOpenResponse'; -} - -/** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} - * @const - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.oneofGroups_ = [[1,2,3]]; - -/** - * @enum {number} - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.ContentCase = { - CONTENT_NOT_SET: 0, - CONFIG: 1, - DATA: 2, - RECV_ACKNOWLEDGE: 3 -}; - -/** - * @return {proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.ContentCase} - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.prototype.getContentCase = function() { - return /** @type {proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.ContentCase} */(jspb.Message.computeOneofCase(this, proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.oneofGroups_[0])); -}; - - - -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.monitor.v1.StreamingOpenRequest.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.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.monitor.v1.StreamingOpenRequest} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.toObject = function(includeInstance, msg) { - var f, obj = { - config: (f = msg.getConfig()) && proto.cc.arduino.cli.monitor.v1.MonitorConfig.toObject(includeInstance, f), - data: msg.getData_asB64(), - recvAcknowledge: jspb.Message.getFieldWithDefault(msg, 3, 0) - }; - - 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.monitor.v1.StreamingOpenRequest} - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest; - return proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest} - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.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.monitor.v1.MonitorConfig; - reader.readMessage(value,proto.cc.arduino.cli.monitor.v1.MonitorConfig.deserializeBinaryFromReader); - msg.setConfig(value); - break; - case 2: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setData(value); - break; - case 3: - var value = /** @type {number} */ (reader.readInt32()); - msg.setRecvAcknowledge(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.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.monitor.v1.StreamingOpenRequest} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getConfig(); - if (f != null) { - writer.writeMessage( - 1, - f, - proto.cc.arduino.cli.monitor.v1.MonitorConfig.serializeBinaryToWriter - ); - } - f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 2)); - if (f != null) { - writer.writeBytes( - 2, - f - ); - } - f = /** @type {number} */ (jspb.Message.getField(message, 3)); - if (f != null) { - writer.writeInt32( - 3, - f - ); - } -}; - - -/** - * optional MonitorConfig config = 1; - * @return {?proto.cc.arduino.cli.monitor.v1.MonitorConfig} - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.prototype.getConfig = function() { - return /** @type{?proto.cc.arduino.cli.monitor.v1.MonitorConfig} */ ( - jspb.Message.getWrapperField(this, proto.cc.arduino.cli.monitor.v1.MonitorConfig, 1)); -}; - - -/** - * @param {?proto.cc.arduino.cli.monitor.v1.MonitorConfig|undefined} value - * @return {!proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest} returns this -*/ -proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.prototype.setConfig = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.oneofGroups_[0], value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest} returns this - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.prototype.clearConfig = function() { - return this.setConfig(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.prototype.hasConfig = function() { - return jspb.Message.getField(this, 1) != null; -}; - - -/** - * optional bytes data = 2; - * @return {!(string|Uint8Array)} - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.prototype.getData = function() { - return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 2, "")); -}; - - -/** - * optional bytes data = 2; - * This is a type-conversion wrapper around `getData()` - * @return {string} - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.prototype.getData_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getData())); -}; - - -/** - * optional bytes data = 2; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getData()` - * @return {!Uint8Array} - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.prototype.getData_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getData())); -}; - - -/** - * @param {!(string|Uint8Array)} value - * @return {!proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest} returns this - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.prototype.setData = function(value) { - return jspb.Message.setOneofField(this, 2, proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.oneofGroups_[0], value); -}; - - -/** - * Clears the field making it undefined. - * @return {!proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest} returns this - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.prototype.clearData = function() { - return jspb.Message.setOneofField(this, 2, proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.oneofGroups_[0], undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.prototype.hasData = function() { - return jspb.Message.getField(this, 2) != null; -}; - - -/** - * optional int32 recv_acknowledge = 3; - * @return {number} - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.prototype.getRecvAcknowledge = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest} returns this - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.prototype.setRecvAcknowledge = function(value) { - return jspb.Message.setOneofField(this, 3, proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.oneofGroups_[0], value); -}; - - -/** - * Clears the field making it undefined. - * @return {!proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest} returns this - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.prototype.clearRecvAcknowledge = function() { - return jspb.Message.setOneofField(this, 3, proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.oneofGroups_[0], undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.prototype.hasRecvAcknowledge = function() { - return jspb.Message.getField(this, 3) != null; -}; - - - - - -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.monitor.v1.MonitorConfig.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.monitor.v1.MonitorConfig.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.monitor.v1.MonitorConfig} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.monitor.v1.MonitorConfig.toObject = function(includeInstance, msg) { - var f, obj = { - target: jspb.Message.getFieldWithDefault(msg, 1, ""), - type: jspb.Message.getFieldWithDefault(msg, 2, 0), - additionalConfig: (f = msg.getAdditionalConfig()) && google_protobuf_struct_pb.Struct.toObject(includeInstance, f), - recvRateLimitBuffer: jspb.Message.getFieldWithDefault(msg, 4, 0) - }; - - 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.monitor.v1.MonitorConfig} - */ -proto.cc.arduino.cli.monitor.v1.MonitorConfig.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.monitor.v1.MonitorConfig; - return proto.cc.arduino.cli.monitor.v1.MonitorConfig.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.cc.arduino.cli.monitor.v1.MonitorConfig} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.monitor.v1.MonitorConfig} - */ -proto.cc.arduino.cli.monitor.v1.MonitorConfig.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {string} */ (reader.readString()); - msg.setTarget(value); - break; - case 2: - var value = /** @type {!proto.cc.arduino.cli.monitor.v1.MonitorConfig.TargetType} */ (reader.readEnum()); - msg.setType(value); - break; - case 3: - var value = new google_protobuf_struct_pb.Struct; - reader.readMessage(value,google_protobuf_struct_pb.Struct.deserializeBinaryFromReader); - msg.setAdditionalConfig(value); - break; - case 4: - var value = /** @type {number} */ (reader.readInt32()); - msg.setRecvRateLimitBuffer(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.cc.arduino.cli.monitor.v1.MonitorConfig.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.monitor.v1.MonitorConfig.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.monitor.v1.MonitorConfig} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.monitor.v1.MonitorConfig.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getTarget(); - if (f.length > 0) { - writer.writeString( - 1, - f - ); - } - f = message.getType(); - if (f !== 0.0) { - writer.writeEnum( - 2, - f - ); - } - f = message.getAdditionalConfig(); - if (f != null) { - writer.writeMessage( - 3, - f, - google_protobuf_struct_pb.Struct.serializeBinaryToWriter - ); - } - f = message.getRecvRateLimitBuffer(); - if (f !== 0) { - writer.writeInt32( - 4, - f - ); - } -}; - - -/** - * @enum {number} - */ -proto.cc.arduino.cli.monitor.v1.MonitorConfig.TargetType = { - TARGET_TYPE_SERIAL: 0, - TARGET_TYPE_NULL: 99 -}; - -/** - * optional string target = 1; - * @return {string} - */ -proto.cc.arduino.cli.monitor.v1.MonitorConfig.prototype.getTarget = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * @param {string} value - * @return {!proto.cc.arduino.cli.monitor.v1.MonitorConfig} returns this - */ -proto.cc.arduino.cli.monitor.v1.MonitorConfig.prototype.setTarget = function(value) { - return jspb.Message.setProto3StringField(this, 1, value); -}; - - -/** - * optional TargetType type = 2; - * @return {!proto.cc.arduino.cli.monitor.v1.MonitorConfig.TargetType} - */ -proto.cc.arduino.cli.monitor.v1.MonitorConfig.prototype.getType = function() { - return /** @type {!proto.cc.arduino.cli.monitor.v1.MonitorConfig.TargetType} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); -}; - - -/** - * @param {!proto.cc.arduino.cli.monitor.v1.MonitorConfig.TargetType} value - * @return {!proto.cc.arduino.cli.monitor.v1.MonitorConfig} returns this - */ -proto.cc.arduino.cli.monitor.v1.MonitorConfig.prototype.setType = function(value) { - return jspb.Message.setProto3EnumField(this, 2, value); -}; - - -/** - * optional google.protobuf.Struct additional_config = 3; - * @return {?proto.google.protobuf.Struct} - */ -proto.cc.arduino.cli.monitor.v1.MonitorConfig.prototype.getAdditionalConfig = function() { - return /** @type{?proto.google.protobuf.Struct} */ ( - jspb.Message.getWrapperField(this, google_protobuf_struct_pb.Struct, 3)); -}; - - -/** - * @param {?proto.google.protobuf.Struct|undefined} value - * @return {!proto.cc.arduino.cli.monitor.v1.MonitorConfig} returns this -*/ -proto.cc.arduino.cli.monitor.v1.MonitorConfig.prototype.setAdditionalConfig = function(value) { - return jspb.Message.setWrapperField(this, 3, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.cc.arduino.cli.monitor.v1.MonitorConfig} returns this - */ -proto.cc.arduino.cli.monitor.v1.MonitorConfig.prototype.clearAdditionalConfig = function() { - return this.setAdditionalConfig(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.cc.arduino.cli.monitor.v1.MonitorConfig.prototype.hasAdditionalConfig = function() { - return jspb.Message.getField(this, 3) != null; -}; - - -/** - * optional int32 recv_rate_limit_buffer = 4; - * @return {number} - */ -proto.cc.arduino.cli.monitor.v1.MonitorConfig.prototype.getRecvRateLimitBuffer = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.cc.arduino.cli.monitor.v1.MonitorConfig} returns this - */ -proto.cc.arduino.cli.monitor.v1.MonitorConfig.prototype.setRecvRateLimitBuffer = function(value) { - return jspb.Message.setProto3IntField(this, 4, value); -}; - - - - - -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.monitor.v1.StreamingOpenResponse.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.monitor.v1.StreamingOpenResponse.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.monitor.v1.StreamingOpenResponse} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenResponse.toObject = function(includeInstance, msg) { - var f, obj = { - data: msg.getData_asB64(), - dropped: jspb.Message.getFieldWithDefault(msg, 2, 0) - }; - - 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.monitor.v1.StreamingOpenResponse} - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenResponse.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.monitor.v1.StreamingOpenResponse; - return proto.cc.arduino.cli.monitor.v1.StreamingOpenResponse.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.cc.arduino.cli.monitor.v1.StreamingOpenResponse} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.monitor.v1.StreamingOpenResponse} - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenResponse.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setData(value); - break; - case 2: - var value = /** @type {number} */ (reader.readInt32()); - msg.setDropped(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenResponse.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.monitor.v1.StreamingOpenResponse.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.monitor.v1.StreamingOpenResponse} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenResponse.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getData_asU8(); - if (f.length > 0) { - writer.writeBytes( - 1, - f - ); - } - f = message.getDropped(); - if (f !== 0) { - writer.writeInt32( - 2, - f - ); - } -}; - - -/** - * optional bytes data = 1; - * @return {!(string|Uint8Array)} - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenResponse.prototype.getData = function() { - return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * optional bytes data = 1; - * This is a type-conversion wrapper around `getData()` - * @return {string} - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenResponse.prototype.getData_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getData())); -}; - - -/** - * optional bytes data = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getData()` - * @return {!Uint8Array} - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenResponse.prototype.getData_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getData())); -}; - - -/** - * @param {!(string|Uint8Array)} value - * @return {!proto.cc.arduino.cli.monitor.v1.StreamingOpenResponse} returns this - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenResponse.prototype.setData = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); -}; - - -/** - * optional int32 dropped = 2; - * @return {number} - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenResponse.prototype.getDropped = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.cc.arduino.cli.monitor.v1.StreamingOpenResponse} returns this - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenResponse.prototype.setDropped = function(value) { - return jspb.Message.setProto3IntField(this, 2, value); -}; - - -goog.object.extend(exports, proto.cc.arduino.cli.monitor.v1); diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/settings/v1/settings_grpc_pb.d.ts b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/settings/v1/settings_grpc_pb.d.ts deleted file mode 100644 index f08b64d21..000000000 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/settings/v1/settings_grpc_pb.d.ts +++ /dev/null @@ -1,110 +0,0 @@ -// package: cc.arduino.cli.settings.v1 -// file: cc/arduino/cli/settings/v1/settings.proto - -/* tslint:disable */ -/* eslint-disable */ - -import * as grpc from "@grpc/grpc-js"; -import {handleClientStreamingCall} from "@grpc/grpc-js/build/src/server-call"; -import * as cc_arduino_cli_settings_v1_settings_pb from "../../../../../cc/arduino/cli/settings/v1/settings_pb"; - -interface ISettingsServiceService extends grpc.ServiceDefinition<grpc.UntypedServiceImplementation> { - getAll: ISettingsServiceService_IGetAll; - merge: ISettingsServiceService_IMerge; - getValue: ISettingsServiceService_IGetValue; - setValue: ISettingsServiceService_ISetValue; - write: ISettingsServiceService_IWrite; -} - -interface ISettingsServiceService_IGetAll extends grpc.MethodDefinition<cc_arduino_cli_settings_v1_settings_pb.GetAllRequest, cc_arduino_cli_settings_v1_settings_pb.GetAllResponse> { - path: "/cc.arduino.cli.settings.v1.SettingsService/GetAll"; - requestStream: false; - responseStream: false; - requestSerialize: grpc.serialize<cc_arduino_cli_settings_v1_settings_pb.GetAllRequest>; - requestDeserialize: grpc.deserialize<cc_arduino_cli_settings_v1_settings_pb.GetAllRequest>; - responseSerialize: grpc.serialize<cc_arduino_cli_settings_v1_settings_pb.GetAllResponse>; - responseDeserialize: grpc.deserialize<cc_arduino_cli_settings_v1_settings_pb.GetAllResponse>; -} -interface ISettingsServiceService_IMerge extends grpc.MethodDefinition<cc_arduino_cli_settings_v1_settings_pb.MergeRequest, cc_arduino_cli_settings_v1_settings_pb.MergeResponse> { - path: "/cc.arduino.cli.settings.v1.SettingsService/Merge"; - requestStream: false; - responseStream: false; - requestSerialize: grpc.serialize<cc_arduino_cli_settings_v1_settings_pb.MergeRequest>; - requestDeserialize: grpc.deserialize<cc_arduino_cli_settings_v1_settings_pb.MergeRequest>; - responseSerialize: grpc.serialize<cc_arduino_cli_settings_v1_settings_pb.MergeResponse>; - responseDeserialize: grpc.deserialize<cc_arduino_cli_settings_v1_settings_pb.MergeResponse>; -} -interface ISettingsServiceService_IGetValue extends grpc.MethodDefinition<cc_arduino_cli_settings_v1_settings_pb.GetValueRequest, cc_arduino_cli_settings_v1_settings_pb.GetValueResponse> { - path: "/cc.arduino.cli.settings.v1.SettingsService/GetValue"; - requestStream: false; - responseStream: false; - requestSerialize: grpc.serialize<cc_arduino_cli_settings_v1_settings_pb.GetValueRequest>; - requestDeserialize: grpc.deserialize<cc_arduino_cli_settings_v1_settings_pb.GetValueRequest>; - responseSerialize: grpc.serialize<cc_arduino_cli_settings_v1_settings_pb.GetValueResponse>; - responseDeserialize: grpc.deserialize<cc_arduino_cli_settings_v1_settings_pb.GetValueResponse>; -} -interface ISettingsServiceService_ISetValue extends grpc.MethodDefinition<cc_arduino_cli_settings_v1_settings_pb.SetValueRequest, cc_arduino_cli_settings_v1_settings_pb.SetValueResponse> { - path: "/cc.arduino.cli.settings.v1.SettingsService/SetValue"; - requestStream: false; - responseStream: false; - requestSerialize: grpc.serialize<cc_arduino_cli_settings_v1_settings_pb.SetValueRequest>; - requestDeserialize: grpc.deserialize<cc_arduino_cli_settings_v1_settings_pb.SetValueRequest>; - responseSerialize: grpc.serialize<cc_arduino_cli_settings_v1_settings_pb.SetValueResponse>; - responseDeserialize: grpc.deserialize<cc_arduino_cli_settings_v1_settings_pb.SetValueResponse>; -} -interface ISettingsServiceService_IWrite extends grpc.MethodDefinition<cc_arduino_cli_settings_v1_settings_pb.WriteRequest, cc_arduino_cli_settings_v1_settings_pb.WriteResponse> { - path: "/cc.arduino.cli.settings.v1.SettingsService/Write"; - requestStream: false; - responseStream: false; - requestSerialize: grpc.serialize<cc_arduino_cli_settings_v1_settings_pb.WriteRequest>; - requestDeserialize: grpc.deserialize<cc_arduino_cli_settings_v1_settings_pb.WriteRequest>; - responseSerialize: grpc.serialize<cc_arduino_cli_settings_v1_settings_pb.WriteResponse>; - responseDeserialize: grpc.deserialize<cc_arduino_cli_settings_v1_settings_pb.WriteResponse>; -} - -export const SettingsServiceService: ISettingsServiceService; - -export interface ISettingsServiceServer { - getAll: grpc.handleUnaryCall<cc_arduino_cli_settings_v1_settings_pb.GetAllRequest, cc_arduino_cli_settings_v1_settings_pb.GetAllResponse>; - merge: grpc.handleUnaryCall<cc_arduino_cli_settings_v1_settings_pb.MergeRequest, cc_arduino_cli_settings_v1_settings_pb.MergeResponse>; - getValue: grpc.handleUnaryCall<cc_arduino_cli_settings_v1_settings_pb.GetValueRequest, cc_arduino_cli_settings_v1_settings_pb.GetValueResponse>; - setValue: grpc.handleUnaryCall<cc_arduino_cli_settings_v1_settings_pb.SetValueRequest, cc_arduino_cli_settings_v1_settings_pb.SetValueResponse>; - write: grpc.handleUnaryCall<cc_arduino_cli_settings_v1_settings_pb.WriteRequest, cc_arduino_cli_settings_v1_settings_pb.WriteResponse>; -} - -export interface ISettingsServiceClient { - getAll(request: cc_arduino_cli_settings_v1_settings_pb.GetAllRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.GetAllResponse) => void): grpc.ClientUnaryCall; - getAll(request: cc_arduino_cli_settings_v1_settings_pb.GetAllRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.GetAllResponse) => void): grpc.ClientUnaryCall; - getAll(request: cc_arduino_cli_settings_v1_settings_pb.GetAllRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.GetAllResponse) => void): grpc.ClientUnaryCall; - merge(request: cc_arduino_cli_settings_v1_settings_pb.MergeRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.MergeResponse) => void): grpc.ClientUnaryCall; - merge(request: cc_arduino_cli_settings_v1_settings_pb.MergeRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.MergeResponse) => void): grpc.ClientUnaryCall; - merge(request: cc_arduino_cli_settings_v1_settings_pb.MergeRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.MergeResponse) => void): grpc.ClientUnaryCall; - getValue(request: cc_arduino_cli_settings_v1_settings_pb.GetValueRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.GetValueResponse) => void): grpc.ClientUnaryCall; - getValue(request: cc_arduino_cli_settings_v1_settings_pb.GetValueRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.GetValueResponse) => void): grpc.ClientUnaryCall; - getValue(request: cc_arduino_cli_settings_v1_settings_pb.GetValueRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.GetValueResponse) => void): grpc.ClientUnaryCall; - setValue(request: cc_arduino_cli_settings_v1_settings_pb.SetValueRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.SetValueResponse) => void): grpc.ClientUnaryCall; - setValue(request: cc_arduino_cli_settings_v1_settings_pb.SetValueRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.SetValueResponse) => void): grpc.ClientUnaryCall; - setValue(request: cc_arduino_cli_settings_v1_settings_pb.SetValueRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.SetValueResponse) => void): grpc.ClientUnaryCall; - write(request: cc_arduino_cli_settings_v1_settings_pb.WriteRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.WriteResponse) => void): grpc.ClientUnaryCall; - write(request: cc_arduino_cli_settings_v1_settings_pb.WriteRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.WriteResponse) => void): grpc.ClientUnaryCall; - write(request: cc_arduino_cli_settings_v1_settings_pb.WriteRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.WriteResponse) => void): grpc.ClientUnaryCall; -} - -export class SettingsServiceClient extends grpc.Client implements ISettingsServiceClient { - constructor(address: string, credentials: grpc.ChannelCredentials, options?: Partial<grpc.ClientOptions>); - public getAll(request: cc_arduino_cli_settings_v1_settings_pb.GetAllRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.GetAllResponse) => void): grpc.ClientUnaryCall; - public getAll(request: cc_arduino_cli_settings_v1_settings_pb.GetAllRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.GetAllResponse) => void): grpc.ClientUnaryCall; - public getAll(request: cc_arduino_cli_settings_v1_settings_pb.GetAllRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.GetAllResponse) => void): grpc.ClientUnaryCall; - public merge(request: cc_arduino_cli_settings_v1_settings_pb.MergeRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.MergeResponse) => void): grpc.ClientUnaryCall; - public merge(request: cc_arduino_cli_settings_v1_settings_pb.MergeRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.MergeResponse) => void): grpc.ClientUnaryCall; - public merge(request: cc_arduino_cli_settings_v1_settings_pb.MergeRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.MergeResponse) => void): grpc.ClientUnaryCall; - public getValue(request: cc_arduino_cli_settings_v1_settings_pb.GetValueRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.GetValueResponse) => void): grpc.ClientUnaryCall; - public getValue(request: cc_arduino_cli_settings_v1_settings_pb.GetValueRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.GetValueResponse) => void): grpc.ClientUnaryCall; - public getValue(request: cc_arduino_cli_settings_v1_settings_pb.GetValueRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.GetValueResponse) => void): grpc.ClientUnaryCall; - public setValue(request: cc_arduino_cli_settings_v1_settings_pb.SetValueRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.SetValueResponse) => void): grpc.ClientUnaryCall; - public setValue(request: cc_arduino_cli_settings_v1_settings_pb.SetValueRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.SetValueResponse) => void): grpc.ClientUnaryCall; - public setValue(request: cc_arduino_cli_settings_v1_settings_pb.SetValueRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.SetValueResponse) => void): grpc.ClientUnaryCall; - public write(request: cc_arduino_cli_settings_v1_settings_pb.WriteRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.WriteResponse) => void): grpc.ClientUnaryCall; - public write(request: cc_arduino_cli_settings_v1_settings_pb.WriteRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.WriteResponse) => void): grpc.ClientUnaryCall; - public write(request: cc_arduino_cli_settings_v1_settings_pb.WriteRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.WriteResponse) => void): grpc.ClientUnaryCall; -} diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/settings/v1/settings_grpc_pb.js b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/settings/v1/settings_grpc_pb.js deleted file mode 100644 index fd3549cdc..000000000 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/settings/v1/settings_grpc_pb.js +++ /dev/null @@ -1,197 +0,0 @@ -// GENERATED CODE -- DO NOT EDIT! - -// Original file comments: -// This file is part of arduino-cli. -// -// Copyright 2020 ARDUINO SA (http://www.arduino.cc/) -// -// This software is released under the GNU General Public License version 3, -// which covers the main part of arduino-cli. -// The terms of this license can be found at: -// https://www.gnu.org/licenses/gpl-3.0.en.html -// -// You can be released from the requirements of the above licenses by purchasing -// a commercial license. Buying such a license is mandatory if you want to -// modify or otherwise use the software for commercial activities involving the -// Arduino software without disclosing the source code of your own applications. -// To purchase a commercial license, send an email to license@arduino.cc. -// -'use strict'; -var cc_arduino_cli_settings_v1_settings_pb = require('../../../../../cc/arduino/cli/settings/v1/settings_pb.js'); - -function serialize_cc_arduino_cli_settings_v1_GetAllRequest(arg) { - if (!(arg instanceof cc_arduino_cli_settings_v1_settings_pb.GetAllRequest)) { - throw new Error('Expected argument of type cc.arduino.cli.settings.v1.GetAllRequest'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_cc_arduino_cli_settings_v1_GetAllRequest(buffer_arg) { - return cc_arduino_cli_settings_v1_settings_pb.GetAllRequest.deserializeBinary(new Uint8Array(buffer_arg)); -} - -function serialize_cc_arduino_cli_settings_v1_GetAllResponse(arg) { - if (!(arg instanceof cc_arduino_cli_settings_v1_settings_pb.GetAllResponse)) { - throw new Error('Expected argument of type cc.arduino.cli.settings.v1.GetAllResponse'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_cc_arduino_cli_settings_v1_GetAllResponse(buffer_arg) { - return cc_arduino_cli_settings_v1_settings_pb.GetAllResponse.deserializeBinary(new Uint8Array(buffer_arg)); -} - -function serialize_cc_arduino_cli_settings_v1_GetValueRequest(arg) { - if (!(arg instanceof cc_arduino_cli_settings_v1_settings_pb.GetValueRequest)) { - throw new Error('Expected argument of type cc.arduino.cli.settings.v1.GetValueRequest'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_cc_arduino_cli_settings_v1_GetValueRequest(buffer_arg) { - return cc_arduino_cli_settings_v1_settings_pb.GetValueRequest.deserializeBinary(new Uint8Array(buffer_arg)); -} - -function serialize_cc_arduino_cli_settings_v1_GetValueResponse(arg) { - if (!(arg instanceof cc_arduino_cli_settings_v1_settings_pb.GetValueResponse)) { - throw new Error('Expected argument of type cc.arduino.cli.settings.v1.GetValueResponse'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_cc_arduino_cli_settings_v1_GetValueResponse(buffer_arg) { - return cc_arduino_cli_settings_v1_settings_pb.GetValueResponse.deserializeBinary(new Uint8Array(buffer_arg)); -} - -function serialize_cc_arduino_cli_settings_v1_MergeRequest(arg) { - if (!(arg instanceof cc_arduino_cli_settings_v1_settings_pb.MergeRequest)) { - throw new Error('Expected argument of type cc.arduino.cli.settings.v1.MergeRequest'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_cc_arduino_cli_settings_v1_MergeRequest(buffer_arg) { - return cc_arduino_cli_settings_v1_settings_pb.MergeRequest.deserializeBinary(new Uint8Array(buffer_arg)); -} - -function serialize_cc_arduino_cli_settings_v1_MergeResponse(arg) { - if (!(arg instanceof cc_arduino_cli_settings_v1_settings_pb.MergeResponse)) { - throw new Error('Expected argument of type cc.arduino.cli.settings.v1.MergeResponse'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_cc_arduino_cli_settings_v1_MergeResponse(buffer_arg) { - return cc_arduino_cli_settings_v1_settings_pb.MergeResponse.deserializeBinary(new Uint8Array(buffer_arg)); -} - -function serialize_cc_arduino_cli_settings_v1_SetValueRequest(arg) { - if (!(arg instanceof cc_arduino_cli_settings_v1_settings_pb.SetValueRequest)) { - throw new Error('Expected argument of type cc.arduino.cli.settings.v1.SetValueRequest'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_cc_arduino_cli_settings_v1_SetValueRequest(buffer_arg) { - return cc_arduino_cli_settings_v1_settings_pb.SetValueRequest.deserializeBinary(new Uint8Array(buffer_arg)); -} - -function serialize_cc_arduino_cli_settings_v1_SetValueResponse(arg) { - if (!(arg instanceof cc_arduino_cli_settings_v1_settings_pb.SetValueResponse)) { - throw new Error('Expected argument of type cc.arduino.cli.settings.v1.SetValueResponse'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_cc_arduino_cli_settings_v1_SetValueResponse(buffer_arg) { - return cc_arduino_cli_settings_v1_settings_pb.SetValueResponse.deserializeBinary(new Uint8Array(buffer_arg)); -} - -function serialize_cc_arduino_cli_settings_v1_WriteRequest(arg) { - if (!(arg instanceof cc_arduino_cli_settings_v1_settings_pb.WriteRequest)) { - throw new Error('Expected argument of type cc.arduino.cli.settings.v1.WriteRequest'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_cc_arduino_cli_settings_v1_WriteRequest(buffer_arg) { - return cc_arduino_cli_settings_v1_settings_pb.WriteRequest.deserializeBinary(new Uint8Array(buffer_arg)); -} - -function serialize_cc_arduino_cli_settings_v1_WriteResponse(arg) { - if (!(arg instanceof cc_arduino_cli_settings_v1_settings_pb.WriteResponse)) { - throw new Error('Expected argument of type cc.arduino.cli.settings.v1.WriteResponse'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_cc_arduino_cli_settings_v1_WriteResponse(buffer_arg) { - return cc_arduino_cli_settings_v1_settings_pb.WriteResponse.deserializeBinary(new Uint8Array(buffer_arg)); -} - - -// The SettingsService provides an interface to Arduino CLI configuration -// options -var SettingsServiceService = exports['cc.arduino.cli.settings.v1.SettingsService'] = { - // List all the settings. -getAll: { - path: '/cc.arduino.cli.settings.v1.SettingsService/GetAll', - requestStream: false, - responseStream: false, - requestType: cc_arduino_cli_settings_v1_settings_pb.GetAllRequest, - responseType: cc_arduino_cli_settings_v1_settings_pb.GetAllResponse, - requestSerialize: serialize_cc_arduino_cli_settings_v1_GetAllRequest, - requestDeserialize: deserialize_cc_arduino_cli_settings_v1_GetAllRequest, - responseSerialize: serialize_cc_arduino_cli_settings_v1_GetAllResponse, - responseDeserialize: deserialize_cc_arduino_cli_settings_v1_GetAllResponse, - }, - // Set multiple settings values at once. -merge: { - path: '/cc.arduino.cli.settings.v1.SettingsService/Merge', - requestStream: false, - responseStream: false, - requestType: cc_arduino_cli_settings_v1_settings_pb.MergeRequest, - responseType: cc_arduino_cli_settings_v1_settings_pb.MergeResponse, - requestSerialize: serialize_cc_arduino_cli_settings_v1_MergeRequest, - requestDeserialize: deserialize_cc_arduino_cli_settings_v1_MergeRequest, - responseSerialize: serialize_cc_arduino_cli_settings_v1_MergeResponse, - responseDeserialize: deserialize_cc_arduino_cli_settings_v1_MergeResponse, - }, - // Get the value of a specific setting. -getValue: { - path: '/cc.arduino.cli.settings.v1.SettingsService/GetValue', - requestStream: false, - responseStream: false, - requestType: cc_arduino_cli_settings_v1_settings_pb.GetValueRequest, - responseType: cc_arduino_cli_settings_v1_settings_pb.GetValueResponse, - requestSerialize: serialize_cc_arduino_cli_settings_v1_GetValueRequest, - requestDeserialize: deserialize_cc_arduino_cli_settings_v1_GetValueRequest, - responseSerialize: serialize_cc_arduino_cli_settings_v1_GetValueResponse, - responseDeserialize: deserialize_cc_arduino_cli_settings_v1_GetValueResponse, - }, - // Set the value of a specific setting. -setValue: { - path: '/cc.arduino.cli.settings.v1.SettingsService/SetValue', - requestStream: false, - responseStream: false, - requestType: cc_arduino_cli_settings_v1_settings_pb.SetValueRequest, - responseType: cc_arduino_cli_settings_v1_settings_pb.SetValueResponse, - requestSerialize: serialize_cc_arduino_cli_settings_v1_SetValueRequest, - requestDeserialize: deserialize_cc_arduino_cli_settings_v1_SetValueRequest, - responseSerialize: serialize_cc_arduino_cli_settings_v1_SetValueResponse, - responseDeserialize: deserialize_cc_arduino_cli_settings_v1_SetValueResponse, - }, - // Writes to file settings currently stored in memory -write: { - path: '/cc.arduino.cli.settings.v1.SettingsService/Write', - requestStream: false, - responseStream: false, - requestType: cc_arduino_cli_settings_v1_settings_pb.WriteRequest, - responseType: cc_arduino_cli_settings_v1_settings_pb.WriteResponse, - requestSerialize: serialize_cc_arduino_cli_settings_v1_WriteRequest, - requestDeserialize: deserialize_cc_arduino_cli_settings_v1_WriteRequest, - responseSerialize: serialize_cc_arduino_cli_settings_v1_WriteResponse, - responseDeserialize: deserialize_cc_arduino_cli_settings_v1_WriteResponse, - }, -}; - diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/settings/v1/settings_pb.d.ts b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/settings/v1/settings_pb.d.ts deleted file mode 100644 index 2453b6879..000000000 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/settings/v1/settings_pb.d.ts +++ /dev/null @@ -1,209 +0,0 @@ -// package: cc.arduino.cli.settings.v1 -// file: cc/arduino/cli/settings/v1/settings.proto - -/* tslint:disable */ -/* eslint-disable */ - -import * as jspb from "google-protobuf"; - -export class GetAllResponse extends jspb.Message { - getJsonData(): string; - setJsonData(value: string): GetAllResponse; - - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): GetAllResponse.AsObject; - static toObject(includeInstance: boolean, msg: GetAllResponse): GetAllResponse.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: GetAllResponse, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): GetAllResponse; - static deserializeBinaryFromReader(message: GetAllResponse, reader: jspb.BinaryReader): GetAllResponse; -} - -export namespace GetAllResponse { - export type AsObject = { - jsonData: string, - } -} - -export class MergeRequest extends jspb.Message { - getJsonData(): string; - setJsonData(value: string): MergeRequest; - - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): MergeRequest.AsObject; - static toObject(includeInstance: boolean, msg: MergeRequest): MergeRequest.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: MergeRequest, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): MergeRequest; - static deserializeBinaryFromReader(message: MergeRequest, reader: jspb.BinaryReader): MergeRequest; -} - -export namespace MergeRequest { - export type AsObject = { - jsonData: string, - } -} - -export class GetValueResponse extends jspb.Message { - getKey(): string; - setKey(value: string): GetValueResponse; - - getJsonData(): string; - setJsonData(value: string): GetValueResponse; - - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): GetValueResponse.AsObject; - static toObject(includeInstance: boolean, msg: GetValueResponse): GetValueResponse.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: GetValueResponse, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): GetValueResponse; - static deserializeBinaryFromReader(message: GetValueResponse, reader: jspb.BinaryReader): GetValueResponse; -} - -export namespace GetValueResponse { - export type AsObject = { - key: string, - jsonData: string, - } -} - -export class SetValueRequest extends jspb.Message { - getKey(): string; - setKey(value: string): SetValueRequest; - - getJsonData(): string; - setJsonData(value: string): SetValueRequest; - - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): SetValueRequest.AsObject; - static toObject(includeInstance: boolean, msg: SetValueRequest): SetValueRequest.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: SetValueRequest, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): SetValueRequest; - static deserializeBinaryFromReader(message: SetValueRequest, reader: jspb.BinaryReader): SetValueRequest; -} - -export namespace SetValueRequest { - export type AsObject = { - key: string, - jsonData: string, - } -} - -export class GetAllRequest extends jspb.Message { - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): GetAllRequest.AsObject; - static toObject(includeInstance: boolean, msg: GetAllRequest): GetAllRequest.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: GetAllRequest, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): GetAllRequest; - static deserializeBinaryFromReader(message: GetAllRequest, reader: jspb.BinaryReader): GetAllRequest; -} - -export namespace GetAllRequest { - export type AsObject = { - } -} - -export class GetValueRequest extends jspb.Message { - getKey(): string; - setKey(value: string): GetValueRequest; - - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): GetValueRequest.AsObject; - static toObject(includeInstance: boolean, msg: GetValueRequest): GetValueRequest.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: GetValueRequest, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): GetValueRequest; - static deserializeBinaryFromReader(message: GetValueRequest, reader: jspb.BinaryReader): GetValueRequest; -} - -export namespace GetValueRequest { - export type AsObject = { - key: string, - } -} - -export class MergeResponse extends jspb.Message { - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): MergeResponse.AsObject; - static toObject(includeInstance: boolean, msg: MergeResponse): MergeResponse.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: MergeResponse, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): MergeResponse; - static deserializeBinaryFromReader(message: MergeResponse, reader: jspb.BinaryReader): MergeResponse; -} - -export namespace MergeResponse { - export type AsObject = { - } -} - -export class SetValueResponse extends jspb.Message { - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): SetValueResponse.AsObject; - static toObject(includeInstance: boolean, msg: SetValueResponse): SetValueResponse.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: SetValueResponse, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): SetValueResponse; - static deserializeBinaryFromReader(message: SetValueResponse, reader: jspb.BinaryReader): SetValueResponse; -} - -export namespace SetValueResponse { - export type AsObject = { - } -} - -export class WriteRequest extends jspb.Message { - getFilePath(): string; - setFilePath(value: string): WriteRequest; - - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): WriteRequest.AsObject; - static toObject(includeInstance: boolean, msg: WriteRequest): WriteRequest.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: WriteRequest, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): WriteRequest; - static deserializeBinaryFromReader(message: WriteRequest, reader: jspb.BinaryReader): WriteRequest; -} - -export namespace WriteRequest { - export type AsObject = { - filePath: string, - } -} - -export class WriteResponse extends jspb.Message { - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): WriteResponse.AsObject; - static toObject(includeInstance: boolean, msg: WriteResponse): WriteResponse.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: WriteResponse, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): WriteResponse; - static deserializeBinaryFromReader(message: WriteResponse, reader: jspb.BinaryReader): WriteResponse; -} - -export namespace WriteResponse { - export type AsObject = { - } -} diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/settings/v1/settings_pb.js b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/settings/v1/settings_pb.js deleted file mode 100644 index e5aa89e6c..000000000 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/settings/v1/settings_pb.js +++ /dev/null @@ -1,1482 +0,0 @@ -// source: cc/arduino/cli/settings/v1/settings.proto -/** - * @fileoverview - * @enhanceable - * @suppress {missingRequire} reports error on implicit type usages. - * @suppress {messageConventions} JS Compiler reports an error if a variable or - * field starts with 'MSG_' and isn't a translatable message. - * @public - */ -// GENERATED CODE -- DO NOT EDIT! -/* eslint-disable */ -// @ts-nocheck - -var jspb = require('google-protobuf'); -var goog = jspb; -var global = Function('return this')(); - -goog.exportSymbol('proto.cc.arduino.cli.settings.v1.GetAllRequest', null, global); -goog.exportSymbol('proto.cc.arduino.cli.settings.v1.GetAllResponse', null, global); -goog.exportSymbol('proto.cc.arduino.cli.settings.v1.GetValueRequest', null, global); -goog.exportSymbol('proto.cc.arduino.cli.settings.v1.GetValueResponse', null, global); -goog.exportSymbol('proto.cc.arduino.cli.settings.v1.MergeRequest', null, global); -goog.exportSymbol('proto.cc.arduino.cli.settings.v1.MergeResponse', null, global); -goog.exportSymbol('proto.cc.arduino.cli.settings.v1.SetValueRequest', null, global); -goog.exportSymbol('proto.cc.arduino.cli.settings.v1.SetValueResponse', null, global); -goog.exportSymbol('proto.cc.arduino.cli.settings.v1.WriteRequest', null, global); -goog.exportSymbol('proto.cc.arduino.cli.settings.v1.WriteResponse', null, global); -/** - * 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.settings.v1.GetAllResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.cc.arduino.cli.settings.v1.GetAllResponse, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.cc.arduino.cli.settings.v1.GetAllResponse.displayName = 'proto.cc.arduino.cli.settings.v1.GetAllResponse'; -} -/** - * 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.settings.v1.MergeRequest = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.cc.arduino.cli.settings.v1.MergeRequest, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.cc.arduino.cli.settings.v1.MergeRequest.displayName = 'proto.cc.arduino.cli.settings.v1.MergeRequest'; -} -/** - * 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.settings.v1.GetValueResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.cc.arduino.cli.settings.v1.GetValueResponse, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.cc.arduino.cli.settings.v1.GetValueResponse.displayName = 'proto.cc.arduino.cli.settings.v1.GetValueResponse'; -} -/** - * 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.settings.v1.SetValueRequest = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.cc.arduino.cli.settings.v1.SetValueRequest, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.cc.arduino.cli.settings.v1.SetValueRequest.displayName = 'proto.cc.arduino.cli.settings.v1.SetValueRequest'; -} -/** - * 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.settings.v1.GetAllRequest = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.cc.arduino.cli.settings.v1.GetAllRequest, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.cc.arduino.cli.settings.v1.GetAllRequest.displayName = 'proto.cc.arduino.cli.settings.v1.GetAllRequest'; -} -/** - * 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.settings.v1.GetValueRequest = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.cc.arduino.cli.settings.v1.GetValueRequest, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.cc.arduino.cli.settings.v1.GetValueRequest.displayName = 'proto.cc.arduino.cli.settings.v1.GetValueRequest'; -} -/** - * 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.settings.v1.MergeResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.cc.arduino.cli.settings.v1.MergeResponse, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.cc.arduino.cli.settings.v1.MergeResponse.displayName = 'proto.cc.arduino.cli.settings.v1.MergeResponse'; -} -/** - * 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.settings.v1.SetValueResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.cc.arduino.cli.settings.v1.SetValueResponse, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.cc.arduino.cli.settings.v1.SetValueResponse.displayName = 'proto.cc.arduino.cli.settings.v1.SetValueResponse'; -} -/** - * 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.settings.v1.WriteRequest = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.cc.arduino.cli.settings.v1.WriteRequest, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.cc.arduino.cli.settings.v1.WriteRequest.displayName = 'proto.cc.arduino.cli.settings.v1.WriteRequest'; -} -/** - * 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.settings.v1.WriteResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.cc.arduino.cli.settings.v1.WriteResponse, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.cc.arduino.cli.settings.v1.WriteResponse.displayName = 'proto.cc.arduino.cli.settings.v1.WriteResponse'; -} - - - -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.settings.v1.GetAllResponse.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.settings.v1.GetAllResponse.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.settings.v1.GetAllResponse} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.settings.v1.GetAllResponse.toObject = function(includeInstance, msg) { - var f, obj = { - jsonData: jspb.Message.getFieldWithDefault(msg, 1, "") - }; - - 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.settings.v1.GetAllResponse} - */ -proto.cc.arduino.cli.settings.v1.GetAllResponse.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.settings.v1.GetAllResponse; - return proto.cc.arduino.cli.settings.v1.GetAllResponse.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.cc.arduino.cli.settings.v1.GetAllResponse} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.settings.v1.GetAllResponse} - */ -proto.cc.arduino.cli.settings.v1.GetAllResponse.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {string} */ (reader.readString()); - msg.setJsonData(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.cc.arduino.cli.settings.v1.GetAllResponse.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.settings.v1.GetAllResponse.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.settings.v1.GetAllResponse} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.settings.v1.GetAllResponse.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getJsonData(); - if (f.length > 0) { - writer.writeString( - 1, - f - ); - } -}; - - -/** - * optional string json_data = 1; - * @return {string} - */ -proto.cc.arduino.cli.settings.v1.GetAllResponse.prototype.getJsonData = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * @param {string} value - * @return {!proto.cc.arduino.cli.settings.v1.GetAllResponse} returns this - */ -proto.cc.arduino.cli.settings.v1.GetAllResponse.prototype.setJsonData = function(value) { - return jspb.Message.setProto3StringField(this, 1, value); -}; - - - - - -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.settings.v1.MergeRequest.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.settings.v1.MergeRequest.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.settings.v1.MergeRequest} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.settings.v1.MergeRequest.toObject = function(includeInstance, msg) { - var f, obj = { - jsonData: jspb.Message.getFieldWithDefault(msg, 1, "") - }; - - 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.settings.v1.MergeRequest} - */ -proto.cc.arduino.cli.settings.v1.MergeRequest.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.settings.v1.MergeRequest; - return proto.cc.arduino.cli.settings.v1.MergeRequest.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.cc.arduino.cli.settings.v1.MergeRequest} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.settings.v1.MergeRequest} - */ -proto.cc.arduino.cli.settings.v1.MergeRequest.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {string} */ (reader.readString()); - msg.setJsonData(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.cc.arduino.cli.settings.v1.MergeRequest.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.settings.v1.MergeRequest.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.settings.v1.MergeRequest} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.settings.v1.MergeRequest.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getJsonData(); - if (f.length > 0) { - writer.writeString( - 1, - f - ); - } -}; - - -/** - * optional string json_data = 1; - * @return {string} - */ -proto.cc.arduino.cli.settings.v1.MergeRequest.prototype.getJsonData = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * @param {string} value - * @return {!proto.cc.arduino.cli.settings.v1.MergeRequest} returns this - */ -proto.cc.arduino.cli.settings.v1.MergeRequest.prototype.setJsonData = function(value) { - return jspb.Message.setProto3StringField(this, 1, value); -}; - - - - - -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.settings.v1.GetValueResponse.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.settings.v1.GetValueResponse.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.settings.v1.GetValueResponse} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.settings.v1.GetValueResponse.toObject = function(includeInstance, msg) { - var f, obj = { - key: jspb.Message.getFieldWithDefault(msg, 1, ""), - jsonData: jspb.Message.getFieldWithDefault(msg, 2, "") - }; - - 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.settings.v1.GetValueResponse} - */ -proto.cc.arduino.cli.settings.v1.GetValueResponse.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.settings.v1.GetValueResponse; - return proto.cc.arduino.cli.settings.v1.GetValueResponse.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.cc.arduino.cli.settings.v1.GetValueResponse} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.settings.v1.GetValueResponse} - */ -proto.cc.arduino.cli.settings.v1.GetValueResponse.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {string} */ (reader.readString()); - msg.setKey(value); - break; - case 2: - var value = /** @type {string} */ (reader.readString()); - msg.setJsonData(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.cc.arduino.cli.settings.v1.GetValueResponse.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.settings.v1.GetValueResponse.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.settings.v1.GetValueResponse} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.settings.v1.GetValueResponse.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getKey(); - if (f.length > 0) { - writer.writeString( - 1, - f - ); - } - f = message.getJsonData(); - if (f.length > 0) { - writer.writeString( - 2, - f - ); - } -}; - - -/** - * optional string key = 1; - * @return {string} - */ -proto.cc.arduino.cli.settings.v1.GetValueResponse.prototype.getKey = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * @param {string} value - * @return {!proto.cc.arduino.cli.settings.v1.GetValueResponse} returns this - */ -proto.cc.arduino.cli.settings.v1.GetValueResponse.prototype.setKey = function(value) { - return jspb.Message.setProto3StringField(this, 1, value); -}; - - -/** - * optional string json_data = 2; - * @return {string} - */ -proto.cc.arduino.cli.settings.v1.GetValueResponse.prototype.getJsonData = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); -}; - - -/** - * @param {string} value - * @return {!proto.cc.arduino.cli.settings.v1.GetValueResponse} returns this - */ -proto.cc.arduino.cli.settings.v1.GetValueResponse.prototype.setJsonData = function(value) { - return jspb.Message.setProto3StringField(this, 2, value); -}; - - - - - -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.settings.v1.SetValueRequest.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.settings.v1.SetValueRequest.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.settings.v1.SetValueRequest} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.settings.v1.SetValueRequest.toObject = function(includeInstance, msg) { - var f, obj = { - key: jspb.Message.getFieldWithDefault(msg, 1, ""), - jsonData: jspb.Message.getFieldWithDefault(msg, 2, "") - }; - - 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.settings.v1.SetValueRequest} - */ -proto.cc.arduino.cli.settings.v1.SetValueRequest.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.settings.v1.SetValueRequest; - return proto.cc.arduino.cli.settings.v1.SetValueRequest.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.cc.arduino.cli.settings.v1.SetValueRequest} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.settings.v1.SetValueRequest} - */ -proto.cc.arduino.cli.settings.v1.SetValueRequest.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {string} */ (reader.readString()); - msg.setKey(value); - break; - case 2: - var value = /** @type {string} */ (reader.readString()); - msg.setJsonData(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.cc.arduino.cli.settings.v1.SetValueRequest.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.settings.v1.SetValueRequest.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.settings.v1.SetValueRequest} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.settings.v1.SetValueRequest.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getKey(); - if (f.length > 0) { - writer.writeString( - 1, - f - ); - } - f = message.getJsonData(); - if (f.length > 0) { - writer.writeString( - 2, - f - ); - } -}; - - -/** - * optional string key = 1; - * @return {string} - */ -proto.cc.arduino.cli.settings.v1.SetValueRequest.prototype.getKey = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * @param {string} value - * @return {!proto.cc.arduino.cli.settings.v1.SetValueRequest} returns this - */ -proto.cc.arduino.cli.settings.v1.SetValueRequest.prototype.setKey = function(value) { - return jspb.Message.setProto3StringField(this, 1, value); -}; - - -/** - * optional string json_data = 2; - * @return {string} - */ -proto.cc.arduino.cli.settings.v1.SetValueRequest.prototype.getJsonData = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); -}; - - -/** - * @param {string} value - * @return {!proto.cc.arduino.cli.settings.v1.SetValueRequest} returns this - */ -proto.cc.arduino.cli.settings.v1.SetValueRequest.prototype.setJsonData = function(value) { - return jspb.Message.setProto3StringField(this, 2, value); -}; - - - - - -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.settings.v1.GetAllRequest.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.settings.v1.GetAllRequest.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.settings.v1.GetAllRequest} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.settings.v1.GetAllRequest.toObject = function(includeInstance, msg) { - var f, obj = { - - }; - - 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.settings.v1.GetAllRequest} - */ -proto.cc.arduino.cli.settings.v1.GetAllRequest.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.settings.v1.GetAllRequest; - return proto.cc.arduino.cli.settings.v1.GetAllRequest.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.cc.arduino.cli.settings.v1.GetAllRequest} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.settings.v1.GetAllRequest} - */ -proto.cc.arduino.cli.settings.v1.GetAllRequest.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.cc.arduino.cli.settings.v1.GetAllRequest.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.settings.v1.GetAllRequest.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.settings.v1.GetAllRequest} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.settings.v1.GetAllRequest.serializeBinaryToWriter = function(message, writer) { - var f = undefined; -}; - - - - - -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.settings.v1.GetValueRequest.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.settings.v1.GetValueRequest.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.settings.v1.GetValueRequest} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.settings.v1.GetValueRequest.toObject = function(includeInstance, msg) { - var f, obj = { - key: jspb.Message.getFieldWithDefault(msg, 1, "") - }; - - 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.settings.v1.GetValueRequest} - */ -proto.cc.arduino.cli.settings.v1.GetValueRequest.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.settings.v1.GetValueRequest; - return proto.cc.arduino.cli.settings.v1.GetValueRequest.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.cc.arduino.cli.settings.v1.GetValueRequest} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.settings.v1.GetValueRequest} - */ -proto.cc.arduino.cli.settings.v1.GetValueRequest.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {string} */ (reader.readString()); - msg.setKey(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.cc.arduino.cli.settings.v1.GetValueRequest.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.settings.v1.GetValueRequest.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.settings.v1.GetValueRequest} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.settings.v1.GetValueRequest.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getKey(); - if (f.length > 0) { - writer.writeString( - 1, - f - ); - } -}; - - -/** - * optional string key = 1; - * @return {string} - */ -proto.cc.arduino.cli.settings.v1.GetValueRequest.prototype.getKey = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * @param {string} value - * @return {!proto.cc.arduino.cli.settings.v1.GetValueRequest} returns this - */ -proto.cc.arduino.cli.settings.v1.GetValueRequest.prototype.setKey = function(value) { - return jspb.Message.setProto3StringField(this, 1, value); -}; - - - - - -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.settings.v1.MergeResponse.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.settings.v1.MergeResponse.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.settings.v1.MergeResponse} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.settings.v1.MergeResponse.toObject = function(includeInstance, msg) { - var f, obj = { - - }; - - 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.settings.v1.MergeResponse} - */ -proto.cc.arduino.cli.settings.v1.MergeResponse.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.settings.v1.MergeResponse; - return proto.cc.arduino.cli.settings.v1.MergeResponse.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.cc.arduino.cli.settings.v1.MergeResponse} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.settings.v1.MergeResponse} - */ -proto.cc.arduino.cli.settings.v1.MergeResponse.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.cc.arduino.cli.settings.v1.MergeResponse.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.settings.v1.MergeResponse.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.settings.v1.MergeResponse} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.settings.v1.MergeResponse.serializeBinaryToWriter = function(message, writer) { - var f = undefined; -}; - - - - - -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.settings.v1.SetValueResponse.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.settings.v1.SetValueResponse.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.settings.v1.SetValueResponse} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.settings.v1.SetValueResponse.toObject = function(includeInstance, msg) { - var f, obj = { - - }; - - 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.settings.v1.SetValueResponse} - */ -proto.cc.arduino.cli.settings.v1.SetValueResponse.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.settings.v1.SetValueResponse; - return proto.cc.arduino.cli.settings.v1.SetValueResponse.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.cc.arduino.cli.settings.v1.SetValueResponse} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.settings.v1.SetValueResponse} - */ -proto.cc.arduino.cli.settings.v1.SetValueResponse.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.cc.arduino.cli.settings.v1.SetValueResponse.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.settings.v1.SetValueResponse.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.settings.v1.SetValueResponse} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.settings.v1.SetValueResponse.serializeBinaryToWriter = function(message, writer) { - var f = undefined; -}; - - - - - -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.settings.v1.WriteRequest.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.settings.v1.WriteRequest.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.settings.v1.WriteRequest} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.settings.v1.WriteRequest.toObject = function(includeInstance, msg) { - var f, obj = { - filePath: jspb.Message.getFieldWithDefault(msg, 1, "") - }; - - 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.settings.v1.WriteRequest} - */ -proto.cc.arduino.cli.settings.v1.WriteRequest.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.settings.v1.WriteRequest; - return proto.cc.arduino.cli.settings.v1.WriteRequest.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.cc.arduino.cli.settings.v1.WriteRequest} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.settings.v1.WriteRequest} - */ -proto.cc.arduino.cli.settings.v1.WriteRequest.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {string} */ (reader.readString()); - msg.setFilePath(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.cc.arduino.cli.settings.v1.WriteRequest.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.settings.v1.WriteRequest.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.settings.v1.WriteRequest} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.settings.v1.WriteRequest.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getFilePath(); - if (f.length > 0) { - writer.writeString( - 1, - f - ); - } -}; - - -/** - * optional string file_path = 1; - * @return {string} - */ -proto.cc.arduino.cli.settings.v1.WriteRequest.prototype.getFilePath = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * @param {string} value - * @return {!proto.cc.arduino.cli.settings.v1.WriteRequest} returns this - */ -proto.cc.arduino.cli.settings.v1.WriteRequest.prototype.setFilePath = function(value) { - return jspb.Message.setProto3StringField(this, 1, value); -}; - - - - - -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.settings.v1.WriteResponse.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.settings.v1.WriteResponse.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.settings.v1.WriteResponse} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.settings.v1.WriteResponse.toObject = function(includeInstance, msg) { - var f, obj = { - - }; - - 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.settings.v1.WriteResponse} - */ -proto.cc.arduino.cli.settings.v1.WriteResponse.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.settings.v1.WriteResponse; - return proto.cc.arduino.cli.settings.v1.WriteResponse.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.cc.arduino.cli.settings.v1.WriteResponse} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.settings.v1.WriteResponse} - */ -proto.cc.arduino.cli.settings.v1.WriteResponse.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.cc.arduino.cli.settings.v1.WriteResponse.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.settings.v1.WriteResponse.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.settings.v1.WriteResponse} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.settings.v1.WriteResponse.serializeBinaryToWriter = function(message, writer) { - var f = undefined; -}; - - -goog.object.extend(exports, proto.cc.arduino.cli.settings.v1); diff --git a/arduino-ide-extension/src/node/cli-protocol/google/rpc/status_pb.d.ts b/arduino-ide-extension/src/node/cli-protocol/google/rpc/status_pb.d.ts index 91afcb7d5..c89b2f378 100644 --- a/arduino-ide-extension/src/node/cli-protocol/google/rpc/status_pb.d.ts +++ b/arduino-ide-extension/src/node/cli-protocol/google/rpc/status_pb.d.ts @@ -10,16 +10,13 @@ import * as google_protobuf_any_pb from "google-protobuf/google/protobuf/any_pb" export class Status extends jspb.Message { getCode(): number; setCode(value: number): Status; - getMessage(): string; setMessage(value: string): Status; - clearDetailsList(): void; getDetailsList(): Array<google_protobuf_any_pb.Any>; setDetailsList(value: Array<google_protobuf_any_pb.Any>): Status; addDetails(value?: google_protobuf_any_pb.Any, index?: number): google_protobuf_any_pb.Any; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): Status.AsObject; static toObject(includeInstance: boolean, msg: Status): Status.AsObject; diff --git a/arduino-ide-extension/src/node/cli-protocol/google/rpc/status_pb.js b/arduino-ide-extension/src/node/cli-protocol/google/rpc/status_pb.js index d96766756..7a618e45c 100644 --- a/arduino-ide-extension/src/node/cli-protocol/google/rpc/status_pb.js +++ b/arduino-ide-extension/src/node/cli-protocol/google/rpc/status_pb.js @@ -13,7 +13,13 @@ var jspb = require('google-protobuf'); var goog = jspb; -var global = Function('return this')(); +var global = (function() { + if (this) { return this; } + if (typeof window !== 'undefined') { return window; } + if (typeof global !== 'undefined') { return global; } + if (typeof self !== 'undefined') { return self; } + return Function('return this')(); +}.call(null)); var google_protobuf_any_pb = require('google-protobuf/google/protobuf/any_pb.js'); goog.object.extend(proto, google_protobuf_any_pb); diff --git a/arduino-ide-extension/src/node/config-service-impl.ts b/arduino-ide-extension/src/node/config-service-impl.ts index 27c560856..6686db1a3 100644 --- a/arduino-ide-extension/src/node/config-service-impl.ts +++ b/arduino-ide-extension/src/node/config-service-impl.ts @@ -1,11 +1,10 @@ -import { promises as fs } from 'fs'; -import { dirname } from 'path'; -import * as yaml from 'js-yaml'; -import * as grpc from '@grpc/grpc-js'; +import { promises as fs } from 'node:fs'; +import { dirname } from 'node:path'; +import yaml from 'js-yaml'; import { injectable, inject, named } from '@theia/core/shared/inversify'; import URI from '@theia/core/lib/common/uri'; 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 { BackendApplicationContribution } from '@theia/core/lib/node/backend-application'; import { @@ -13,20 +12,20 @@ import { Config, NotificationServiceServer, Network, + ConfigState, } from '../common/protocol'; import { spawnCommand } from './exec-util'; -import { - MergeRequest, - WriteRequest, -} from './cli-protocol/cc/arduino/cli/settings/v1/settings_pb'; -import { SettingsServiceClient } from './cli-protocol/cc/arduino/cli/settings/v1/settings_grpc_pb'; -import * as serviceGrpcPb from './cli-protocol/cc/arduino/cli/settings/v1/settings_grpc_pb'; import { ArduinoDaemonImpl } from './arduino-daemon-impl'; -import { DefaultCliConfig, CLI_CONFIG } from './cli-config'; +import { DefaultCliConfig, CLI_CONFIG, CliConfig } from './cli-config'; import { Deferred } from '@theia/core/lib/common/promise-util'; import { EnvVariablesServer } from '@theia/core/lib/common/env-variables'; -import { deepClone } from '@theia/core'; -import { duration } from '../common/decorators'; +import { deepClone, nls } from '@theia/core'; +import { ErrnoException } from './utils/errors'; +import { createArduinoCoreServiceClient } from './arduino-core-service-client'; +import { + ConfigurationSaveRequest, + SettingsSetValueRequest, +} from './cli-protocol/cc/arduino/cli/commands/v1/settings_pb'; const deepmerge = require('deepmerge'); @@ -36,43 +35,38 @@ export class ConfigServiceImpl { @inject(ILogger) @named('config') - protected readonly logger: ILogger; + private readonly logger: ILogger; @inject(EnvVariablesServer) - protected readonly envVariablesServer: EnvVariablesServer; + private readonly envVariablesServer: EnvVariablesServer; @inject(ArduinoDaemonImpl) - protected readonly daemon: ArduinoDaemonImpl; + private readonly daemon: ArduinoDaemonImpl; @inject(NotificationServiceServer) - protected readonly notificationService: NotificationServiceServer; + private readonly notificationService: NotificationServiceServer; - protected config: Config; - protected cliConfig: DefaultCliConfig | undefined; - protected ready = new Deferred<void>(); - protected readonly configChangeEmitter = new Emitter<Config>(); + private config: ConfigState = { + config: undefined, + messages: ['uninitialized'], + }; + private cliConfig: DefaultCliConfig | undefined; + private ready = new Deferred<void>(); + private readonly configChangeEmitter = new Emitter<{ + oldState: ConfigState; + newState: ConfigState; + }>(); onStart(): void { - this.loadCliConfig().then(async (cliConfig) => { - this.cliConfig = cliConfig; - if (this.cliConfig) { - const config = await this.mapCliConfigToAppConfig(this.cliConfig); - if (config) { - this.config = config; - this.ready.resolve(); - return; - } - } - this.fireInvalidConfig(); - }); + this.initConfig(); } - async getCliConfigFileUri(): Promise<string> { + private async getCliConfigFileUri(): Promise<string> { const configDirUri = await this.envVariablesServer.getConfigDirUri(); return new URI(configDirUri).resolve(CLI_CONFIG).toString(); } - async getConfiguration(): Promise<Config> { + async getConfiguration(): Promise<ConfigState> { await this.ready.promise; return { ...this.config }; } @@ -80,9 +74,10 @@ export class ConfigServiceImpl // Used by frontend to update the config. async setConfiguration(config: Config): Promise<void> { await this.ready.promise; - if (Config.sameAs(this.config, config)) { + if (Config.sameAs(this.config.config, config)) { return; } + const oldConfigState = deepClone(this.config); let copyDefaultCliConfig: DefaultCliConfig | undefined = deepClone( this.cliConfig ); @@ -100,52 +95,117 @@ export class ConfigServiceImpl }; copyDefaultCliConfig.locale = locale || 'en'; const proxy = Network.stringify(network); - copyDefaultCliConfig.network = { proxy }; + copyDefaultCliConfig.network = proxy ? { proxy } : {}; // must be an empty object to unset the default prop with the `WriteRequest`. // always use the port of the daemon const port = await this.daemon.getPort(); await this.updateDaemon(port, copyDefaultCliConfig); await this.writeDaemonState(port); - this.config = deepClone(config); + this.config.config = deepClone(config); this.cliConfig = copyDefaultCliConfig; - this.fireConfigChanged(this.config); + try { + await this.validateCliConfig(this.cliConfig); + delete this.config.messages; + this.fireConfigChanged(oldConfigState, this.config); + } catch (err) { + if (err instanceof InvalidConfigError) { + this.config.messages = err.errors; + this.fireConfigChanged(oldConfigState, this.config); + } else { + throw err; + } + } } get cliConfiguration(): DefaultCliConfig | undefined { return this.cliConfig; } - get onConfigChange(): Event<Config> { + get onConfigChange(): Event<{ + oldState: ConfigState; + newState: ConfigState; + }> { return this.configChangeEmitter.event; } - async getVersion(): Promise< - Readonly<{ version: string; commit: string; status?: string }> - > { - return this.daemon.getVersion(); + private async initConfig(): Promise<void> { + this.logger.info('>>> Initializing CLI configuration...'); + try { + const cliConfig = await this.loadCliConfig(); + this.logger.info('Loaded the CLI configuration.'); + this.cliConfig = cliConfig; + const [config] = await Promise.all([ + this.mapCliConfigToAppConfig(this.cliConfig), + this.ensureUserDirExists(this.cliConfig).catch((reason) => { + if (reason instanceof Error) { + this.logger.warn( + `Could not ensure user directory existence: ${this.cliConfig?.directories.user}`, + reason + ); + } + // NOOP. Try to create the folder if missing but swallow any errors. + // The validation will take care of the missing location handling. + }), + ]); + this.config.config = config; + this.logger.info( + `Mapped the CLI configuration: ${JSON.stringify(this.config.config)}` + ); + this.logger.info('Validating the CLI configuration...'); + await this.validateCliConfig(this.cliConfig); + delete this.config.messages; + this.logger.info('The CLI config is valid.'); + if (config) { + this.ready.resolve(); + this.logger.info('<<< Initialized the CLI configuration.'); + return; + } + } catch (err: unknown) { + this.logger.error('Failed to initialize the CLI configuration.', err); + if (err instanceof InvalidConfigError) { + this.config.messages = err.errors; + this.ready.resolve(); + } + } } - @duration() - protected async loadCliConfig( + private async loadCliConfig( initializeIfAbsent = true - ): Promise<DefaultCliConfig | undefined> { + ): Promise<DefaultCliConfig> { const cliConfigFileUri = await this.getCliConfigFileUri(); const cliConfigPath = FileUri.fsPath(cliConfigFileUri); + this.logger.info(`Loading CLI configuration from ${cliConfigPath}...`); try { const content = await fs.readFile(cliConfigPath, { encoding: 'utf8', }); - const model = (yaml.safeLoad(content) || {}) as DefaultCliConfig; - if (model.directories.data && model.directories.user) { - return model; + const model = (yaml.safeLoad(content) || {}) as CliConfig; + this.logger.info(`Loaded CLI configuration: ${JSON.stringify(model)}`); + if (model.directories?.data && model.directories?.user) { + this.logger.info( + "'directories.data' and 'directories.user' are set in the CLI configuration model." + ); + return model as DefaultCliConfig; } // The CLI can run with partial (missing `port`, `directories`), the IDE2 cannot. // We merge the default CLI config with the partial user's config. + this.logger.info( + "Loading fallback CLI configuration to get 'directories.data' and 'directories.user'" + ); const fallbackModel = await this.getFallbackCliConfig(); - return deepmerge(fallbackModel, model) as DefaultCliConfig; + this.logger.info( + `Loaded fallback CLI configuration: ${JSON.stringify(fallbackModel)}` + ); + const mergedModel = deepmerge(fallbackModel, model) as DefaultCliConfig; + this.logger.info( + `Merged CLI configuration with the fallback: ${JSON.stringify( + mergedModel + )}` + ); + return mergedModel; } catch (error) { - if ('code' in error && error.code === 'ENOENT') { + if (ErrnoException.isENOENT(error)) { if (initializeIfAbsent) { await this.initCliConfigTo(dirname(cliConfigPath)); return this.loadCliConfig(false); @@ -155,28 +215,27 @@ export class ConfigServiceImpl } } - protected async getFallbackCliConfig(): Promise<DefaultCliConfig> { - const cliPath = await this.daemon.getExecPath(); - const rawJson = await spawnCommand(`"${cliPath}"`, [ - 'config', - 'dump', - 'format', - '--json', + private async getFallbackCliConfig(): Promise<DefaultCliConfig> { + const cliPath = this.daemon.getExecPath(); + const [configRaw, directoriesRaw] = await Promise.all([ + spawnCommand(cliPath, ['config', 'dump', '--json']), + // Since CLI 1.0, the command `config dump` only returns user-modified values and not default ones. + // directories.user and directories.data are required by IDE2 so we get the default value explicitly. + spawnCommand(cliPath, ['config', 'get', 'directories', '--json']), ]); - return JSON.parse(rawJson); + + const config = JSON.parse(configRaw); + const { user, data } = JSON.parse(directoriesRaw); + + return { ...config.config, directories: { user, data } }; } - protected async initCliConfigTo(fsPathToDir: string): Promise<void> { - const cliPath = await this.daemon.getExecPath(); - await spawnCommand(`"${cliPath}"`, [ - 'config', - 'init', - '--dest-dir', - `"${fsPathToDir}"`, - ]); + private async initCliConfigTo(fsPathToDir: string): Promise<void> { + const cliPath = this.daemon.getExecPath(); + await spawnCommand(cliPath, ['config', 'init', '--dest-dir', fsPathToDir]); } - protected async mapCliConfigToAppConfig( + private async mapCliConfigToAppConfig( cliConfig: DefaultCliConfig ): Promise<Config> { const { directories, locale = 'en' } = cliConfig; @@ -197,70 +256,120 @@ export class ConfigServiceImpl }; } - protected fireConfigChanged(config: Config): void { - this.configChangeEmitter.fire(config); - this.notificationService.notifyConfigDidChange({ config }); + private fireConfigChanged( + oldState: ConfigState, + newState: ConfigState + ): void { + this.configChangeEmitter.fire({ oldState, newState }); + this.notificationService.notifyConfigDidChange(newState); + } + + private async validateCliConfig(config: DefaultCliConfig): Promise<void> { + const errors: string[] = []; + errors.push(...(await this.checkAccessible(config))); + if (errors.length) { + throw new InvalidConfigError(errors); + } } - protected fireInvalidConfig(): void { - this.notificationService.notifyConfigDidChange({ config: undefined }); + private async checkAccessible({ + directories, + }: DefaultCliConfig): Promise<string[]> { + try { + await fs.readdir(directories.user); + return []; + } catch (err) { + console.error( + `Check accessible failed for input: ${directories.user}`, + err + ); + return [ + nls.localize( + 'arduino/configuration/cli/inaccessibleDirectory', + "Could not access the sketchbook location at '{0}': {1}", + directories.user, + String(err) + ), + ]; + } } - protected async updateDaemon( - port: string | number, + private async updateDaemon( + port: number, config: DefaultCliConfig ): Promise<void> { - const client = this.createClient(port); - const req = new MergeRequest(); const json = JSON.stringify(config, null, 2); - req.setJsonData(json); - console.log(`Updating daemon with 'data': ${json}`); - return new Promise<void>((resolve, reject) => { - client.merge(req, (error) => { - try { + this.logger.info(`Updating daemon with 'data': ${json}`); + + const updatableConfig = { + locale: config.locale, + 'directories.user': config.directories.user, + 'directories.data': config.directories.data, + 'network.proxy': config.network?.proxy, + 'board_manager.additional_urls': + config.board_manager?.additional_urls || [], + }; + + const client = createArduinoCoreServiceClient({ port }); + + for (const [key, value] of Object.entries(updatableConfig)) { + const req = new SettingsSetValueRequest(); + req.setKey(key); + req.setEncodedValue(JSON.stringify(value)); + await new Promise<void>((resolve) => { + client.settingsSetValue(req, (error) => { if (error) { - reject(error); - return; + this.logger.error( + `Could not update config with key: ${key} and value: ${value}`, + error + ); } resolve(); - } finally { - client.close(); - } + }); }); - }); + } + + client.close(); } - protected async writeDaemonState(port: string | number): Promise<void> { - const client = this.createClient(port); - const req = new WriteRequest(); - const cliConfigUri = await this.getCliConfigFileUri(); - const cliConfigPath = FileUri.fsPath(cliConfigUri); - req.setFilePath(cliConfigPath); - return new Promise<void>((resolve, reject) => { - client.write(req, (error) => { + private async writeDaemonState(port: number): Promise<void> { + const client = createArduinoCoreServiceClient({ port }); + const req = new ConfigurationSaveRequest(); + req.setSettingsFormat('yaml'); + + const configRaw = await new Promise<string>((resolve, reject) => { + client.configurationSave(req, (error, resp) => { try { if (error) { reject(error); return; } - resolve(); + resolve(resp.getEncodedSettings()); } finally { client.close(); } }); }); + + const cliConfigUri = await this.getCliConfigFileUri(); + const cliConfigPath = FileUri.fsPath(cliConfigUri); + await fs.writeFile(cliConfigPath, configRaw, { encoding: 'utf-8' }); } - private createClient(port: string | number): SettingsServiceClient { - // https://github.com/agreatfool/grpc_tools_node_protoc_ts/blob/master/doc/grpcjs_support.md#usage - const SettingsServiceClient = grpc.makeClientConstructor( - // @ts-expect-error: ignore - serviceGrpcPb['cc.arduino.cli.settings.v1.SettingsService'], - 'SettingsServiceService' - ) as any; - return new SettingsServiceClient( - `localhost:${port}`, - grpc.credentials.createInsecure() - ) as SettingsServiceClient; + // #1445 + private async ensureUserDirExists( + cliConfig: DefaultCliConfig + ): Promise<void> { + await fs.mkdir(cliConfig.directories.user, { recursive: true }); + } +} + +class InvalidConfigError extends Error { + constructor(readonly errors: string[]) { + super('InvalidConfigError:\n - ' + errors.join('\n - ')); + if (!errors.length) { + throw new Error("Illegal argument: 'messages'. It must not be empty."); + } + Object.setPrototypeOf(this, InvalidConfigError.prototype); } } diff --git a/arduino-ide-extension/src/node/core-client-provider.ts b/arduino-ide-extension/src/node/core-client-provider.ts index 9c2395de9..f113b96c5 100644 --- a/arduino-ide-extension/src/node/core-client-provider.ts +++ b/arduino-ide-extension/src/node/core-client-provider.ts @@ -1,26 +1,32 @@ -import { join } from 'path'; +import { join } from 'node:path'; import * as grpc from '@grpc/grpc-js'; import { inject, injectable, postConstruct, } from '@theia/core/shared/inversify'; -import { Emitter, Event } from '@theia/core/lib/common/event'; +import { Emitter } from '@theia/core/lib/common/event'; import { ArduinoCoreServiceClient } from './cli-protocol/cc/arduino/cli/commands/v1/commands_grpc_pb'; import { Instance } from './cli-protocol/cc/arduino/cli/commands/v1/common_pb'; import { CreateRequest, InitRequest, InitResponse, - UpdateCoreLibrariesIndexResponse, UpdateIndexRequest, UpdateIndexResponse, UpdateLibrariesIndexRequest, UpdateLibrariesIndexResponse, } from './cli-protocol/cc/arduino/cli/commands/v1/commands_pb'; -import * as commandsGrpcPb from './cli-protocol/cc/arduino/cli/commands/v1/commands_grpc_pb'; -import { NotificationServiceServer } from '../common/protocol'; -import { Deferred, retry } from '@theia/core/lib/common/promise-util'; +import { + IndexType, + IndexUpdateDidCompleteParams, + IndexUpdateSummary, + IndexUpdateDidFailParams, + IndexUpdateWillStartParams, + NotificationServiceServer, + AdditionalUrls, +} from '../common/protocol'; +import { Deferred } from '@theia/core/lib/common/promise-util'; import { Status as RpcStatus, Status, @@ -32,9 +38,14 @@ import { Disposable } from '@theia/core/shared/vscode-languageserver-protocol'; import { IndexesUpdateProgressHandler, ExecuteWithProgress, + DownloadResult, } from './grpc-progressible'; import type { DefaultCliConfig } from './cli-config'; import { ServiceError } from './service-error'; +import { + createArduinoCoreServiceClient, + createDefaultChannelOptions, +} from './arduino-core-service-client'; @injectable() export class CoreClientProvider { @@ -45,16 +56,18 @@ export class CoreClientProvider { @inject(NotificationServiceServer) private readonly notificationService: NotificationServiceServer; - private ready = new Deferred<void>(); - private pending: Deferred<CoreClientProvider.Client> | undefined; - private _client: CoreClientProvider.Client | undefined; - private readonly toDisposeBeforeCreate = new DisposableCollection(); + /** + * See `CoreService#indexUpdateSummaryBeforeInit`. + */ + private readonly beforeInitSummary = {} as IndexUpdateSummary; + private readonly toDisposeOnCloseClient = new DisposableCollection(); private readonly toDisposeAfterDidCreate = new DisposableCollection(); private readonly onClientReadyEmitter = new Emitter<CoreClientProvider.Client>(); private readonly onClientReady = this.onClientReadyEmitter.event; - private readonly onClientDidRefreshEmitter = - new Emitter<CoreClientProvider.Client>(); + + private pending: Deferred<CoreClientProvider.Client> | undefined; + private _client: CoreClientProvider.Client | undefined; @postConstruct() protected init(): void { @@ -65,7 +78,27 @@ export class CoreClientProvider { }); this.daemon.onDaemonStarted((port) => this.create(port)); this.daemon.onDaemonStopped(() => this.closeClient()); - this.configService.onConfigChange(() => this.refreshIndexes()); + this.configService.onConfigChange(async ({ oldState, newState }) => { + if ( + !AdditionalUrls.sameAs( + oldState.config?.additionalUrls, + newState.config?.additionalUrls + ) + ) { + const client = await this.client; + this.updateIndex(client, ['platform']); + } else if ( + !!newState.config?.sketchDirUri && + oldState.config?.sketchDirUri !== newState.config.sketchDirUri + ) { + // If the sketchbook location has changed, the custom libraries has changed. + // Reinitialize the core client and fire an event so that the frontend can refresh. + // https://github.com/arduino/arduino-ide/issues/796 (see the file > examples and sketch > include examples) + const client = await this.client; + await this.initInstance(client); + this.notificationService.notifyDidReinitialize(); + } + }); } get tryGetClient(): CoreClientProvider.Client | undefined { @@ -80,7 +113,7 @@ export class CoreClientProvider { if (!this.pending) { this.pending = new Deferred(); this.toDisposeAfterDidCreate.pushAll([ - Disposable.create(() => (this.pending = undefined)), + Disposable.create(() => (this.pending = undefined)), // TODO: reject all pending requests before unsetting the ref? this.onClientReady((client) => { this.pending?.resolve(client); this.toDisposeAfterDidCreate.dispose(); @@ -90,30 +123,21 @@ export class CoreClientProvider { return this.pending.promise; } - get onClientDidRefresh(): Event<CoreClientProvider.Client> { - return this.onClientDidRefreshEmitter.event; + async refresh(): Promise<void> { + const client = await this.client; + await this.initInstance(client); } /** * Encapsulates both the gRPC core client creation (`CreateRequest`) and initialization (`InitRequest`). */ - private async create(port: string): Promise<CoreClientProvider.Client> { + private async create(port: number): Promise<CoreClientProvider.Client> { this.closeClient(); - const address = this.address(port); - const client = await this.createClient(address); - this.toDisposeBeforeCreate.pushAll([ + const client = await this.createClient(port); + this.toDisposeOnCloseClient.pushAll([ Disposable.create(() => client.client.close()), - Disposable.create(() => { - this.ready.reject( - new Error( - `Disposed. Creating a new gRPC core client on address ${address}.` - ) - ); - this.ready = new Deferred(); - }), ]); await this.initInstanceWithFallback(client); - setTimeout(async () => this.refreshIndexes(), 10_000); // Update the indexes asynchronously return this.useClient(client); } @@ -136,12 +160,17 @@ export class CoreClientProvider { try { await this.initInstance(client); } catch (err) { - if (err instanceof IndexUpdateRequiredBeforeInitError) { + if (err instanceof MustUpdateIndexesBeforeInitError) { console.error( 'The primary packages indexes are missing. Running indexes update before initializing the core gRPC client', err.message ); - await this.updateIndexes(client); // TODO: this should run without the 3rd party URLs + await this.updateIndex(client, Array.from(err.indexTypesToUpdate)); + const updatedAt = new Date().toISOString(); + // Clients will ask for it after they connect. + err.indexTypesToUpdate.forEach( + (type) => (this.beforeInitSummary[type] = updatedAt) + ); await this.initInstance(client); console.info( `Downloaded the primary package indexes, and successfully initialized the core gRPC client.` @@ -165,25 +194,12 @@ export class CoreClientProvider { } private closeClient(): void { - return this.toDisposeBeforeCreate.dispose(); + return this.toDisposeOnCloseClient.dispose(); } - private async createClient( - address: string - ): Promise<CoreClientProvider.Client> { - // https://github.com/agreatfool/grpc_tools_node_protoc_ts/blob/master/doc/grpcjs_support.md#usage - const ArduinoCoreServiceClient = grpc.makeClientConstructor( - // @ts-expect-error: ignore - commandsGrpcPb['cc.arduino.cli.commands.v1.ArduinoCoreService'], - 'ArduinoCoreServiceService' - // eslint-disable-next-line @typescript-eslint/no-explicit-any - ) as any; - const client = new ArduinoCoreServiceClient( - address, - grpc.credentials.createInsecure(), - this.channelOptions - ) as ArduinoCoreServiceClient; - + private async createClient(port: number): Promise<CoreClientProvider.Client> { + const channelOptions = createDefaultChannelOptions(this.version); + const client = createArduinoCoreServiceClient({ port, channelOptions }); const instance = await new Promise<Instance>((resolve, reject) => { client.create(new CreateRequest(), (err, resp) => { if (err) { @@ -227,8 +243,8 @@ export class CoreClientProvider { } }) .on('error', reject) - .on('end', () => { - const error = this.evaluateErrorStatus(errors); + .on('end', async () => { + const error = await this.evaluateErrorStatus(errors); if (error) { reject(error); return; @@ -238,7 +254,10 @@ export class CoreClientProvider { }); } - private evaluateErrorStatus(status: RpcStatus[]): Error | undefined { + private async evaluateErrorStatus( + status: RpcStatus[] + ): Promise<Error | undefined> { + await this.configService.getConfiguration(); // to ensure the CLI config service has been initialized. const { cliConfiguration } = this.configService; if (!cliConfiguration) { // If the CLI config is not available, do not even try to guess what went wrong. @@ -248,45 +267,66 @@ export class CoreClientProvider { } /** - * Updates all indexes and runs an init to [reload the indexes](https://github.com/arduino/arduino-cli/pull/1274#issue-866154638). + * `update3rdPartyPlatforms` has not effect if `types` is `['library']`. */ - private async refreshIndexes(): Promise<void> { - const client = this._client; - if (client) { - const progressHandler = this.createProgressHandler(); - try { - await this.updateIndexes(client, progressHandler); + async updateIndex( + client: CoreClientProvider.Client, + types: IndexType[] + ): Promise<void> { + let error: unknown | undefined = undefined; + const progressHandler = this.createProgressHandler(types); + try { + const updates: Promise<void>[] = []; + if (types.includes('platform')) { + updates.push(this.updatePlatformIndex(client, progressHandler)); + } + if (types.includes('library')) { + updates.push(this.updateLibraryIndex(client, progressHandler)); + } + await Promise.all(updates); + } catch (err) { + // This is suboptimal but the core client must be re-initialized even if the index update has failed and the request was rejected. + error = err; + } finally { + // IDE2 reloads the index only and if only at least one download success is available. + if ( + progressHandler.results.some( + (result) => !DownloadResult.isError(result) + ) + ) { await this.initInstance(client); // notify clients about the index update only after the client has been "re-initialized" and the new content is available. progressHandler.reportEnd(); - this.onClientDidRefreshEmitter.fire(client); - } catch (err) { - console.error('Failed to update indexes', err); - progressHandler.reportError( - ServiceError.is(err) ? err.details : String(err) - ); + } + if (error) { + console.error(`Failed to update ${types.join(', ')} indexes.`, error); + const downloadErrors = progressHandler.results + .filter(DownloadResult.isError) + .map(({ url, message }) => `${message}: ${url}`) + .join(' '); + const message = ServiceError.is(error) + ? `${error.details}${downloadErrors ? ` ${downloadErrors}` : ''}` + : String(error); + // IDE2 keeps only the most recent error message. Previous errors might have been fixed with the fallback initialization. + this.beforeInitSummary.message = message; + // Toast the error message, so tha the user has chance to fix it if it was a client error (HTTP 4xx). + progressHandler.reportError(message); } } } - private async updateIndexes( - client: CoreClientProvider.Client, - progressHandler?: IndexesUpdateProgressHandler - ): Promise<void> { - await Promise.all([ - this.updateIndex(client, progressHandler), - this.updateLibraryIndex(client, progressHandler), - ]); + get indexUpdateSummaryBeforeInit(): IndexUpdateSummary { + return { ...this.beforeInitSummary }; } - private async updateIndex( + private async updatePlatformIndex( client: CoreClientProvider.Client, progressHandler?: IndexesUpdateProgressHandler ): Promise<void> { return this.doUpdateIndex( () => client.client.updateIndex( - new UpdateIndexRequest().setInstance(client.instance) + new UpdateIndexRequest().setInstance(client.instance) // Always updates both the primary and the 3rd party package indexes. ), progressHandler, 'platform-index' @@ -308,72 +348,52 @@ export class CoreClientProvider { } private async doUpdateIndex< - R extends - | UpdateIndexResponse - | UpdateLibrariesIndexResponse - | UpdateCoreLibrariesIndexResponse // not used by IDE2 + R extends UpdateIndexResponse | UpdateLibrariesIndexResponse >( responseProvider: () => grpc.ClientReadableStream<R>, progressHandler?: IndexesUpdateProgressHandler, task?: string ): Promise<void> { const progressId = progressHandler?.progressId; - return retry( - () => - new Promise<void>((resolve, reject) => { - responseProvider() - .on( - 'data', - ExecuteWithProgress.createDataCallback({ - responseService: { - appendToOutput: ({ chunk: message }) => { - console.log( - `core-client-provider${task ? ` [${task}]` : ''}`, - message - ); - progressHandler?.reportProgress(message); - }, - }, - progressId, - }) - ) - .on('error', reject) - .on('end', resolve); - }), - 50, - 3 - ); + return new Promise<void>((resolve, reject) => { + responseProvider() + .on( + 'data', + ExecuteWithProgress.createDataCallback({ + responseService: { + appendToOutput: ({ chunk: message }) => { + console.log( + `core-client-provider${task ? ` [${task}]` : ''}`, + message + ); + progressHandler?.reportProgress(message); + }, + }, + reportResult: (result) => progressHandler?.reportResult(result), + progressId, + }) + ) + .on('error', reject) + .on('end', resolve); + }); } - private createProgressHandler(): IndexesUpdateProgressHandler { + private createProgressHandler( + types: IndexType[] + ): IndexesUpdateProgressHandler { const additionalUrlsCount = this.configService.cliConfiguration?.board_manager?.additional_urls ?.length ?? 0; - return new IndexesUpdateProgressHandler( - additionalUrlsCount, - (progressMessage) => + return new IndexesUpdateProgressHandler(types, additionalUrlsCount, { + onProgress: (progressMessage) => this.notificationService.notifyIndexUpdateDidProgress(progressMessage), - ({ progressId, message }) => - this.notificationService.notifyIndexUpdateDidFail({ - progressId, - message, - }), - (progressId) => - this.notificationService.notifyIndexWillUpdate(progressId), - (progressId) => this.notificationService.notifyIndexDidUpdate(progressId) - ); - } - - private address(port: string): string { - return `localhost:${port}`; - } - - private get channelOptions(): Record<string, unknown> { - return { - 'grpc.max_send_message_length': 512 * 1024 * 1024, - 'grpc.max_receive_message_length': 512 * 1024 * 1024, - 'grpc.primary_user_agent': `arduino-ide/${this.version}`, - }; + onError: (params: IndexUpdateDidFailParams) => + this.notificationService.notifyIndexUpdateDidFail(params), + onStart: (params: IndexUpdateWillStartParams) => + this.notificationService.notifyIndexUpdateWillStart(params), + onComplete: (params: IndexUpdateDidCompleteParams) => + this.notificationService.notifyIndexUpdateDidComplete(params), + }); } private _version: string | undefined; @@ -405,6 +425,7 @@ export namespace CoreClientProvider { export abstract class CoreClientAware { @inject(CoreClientProvider) private readonly coreClientProvider: CoreClientProvider; + /** * Returns with a promise that resolves when the core client is initialized and ready. */ @@ -412,20 +433,38 @@ export abstract class CoreClientAware { return this.coreClientProvider.client; } - protected get onClientDidRefresh(): Event<CoreClientProvider.Client> { - return this.coreClientProvider.onClientDidRefresh; + /** + * Updates the index of the given `type` and returns with a promise which resolves when the core gPRC client has been reinitialized. + */ + async updateIndex({ types }: { types: IndexType[] }): Promise<void> { + const client = await this.coreClient; + return this.coreClientProvider.updateIndex(client, types); + } + + async indexUpdateSummaryBeforeInit(): Promise<IndexUpdateSummary> { + await this.coreClient; + return this.coreClientProvider.indexUpdateSummaryBeforeInit; + } + + refresh(): Promise<void> { + return this.coreClientProvider.refresh(); } } -class IndexUpdateRequiredBeforeInitError extends Error { - constructor(causes: RpcStatus.AsObject[]) { +class MustUpdateIndexesBeforeInitError extends Error { + readonly indexTypesToUpdate: Set<IndexType>; + constructor(causes: [RpcStatus.AsObject, IndexType][]) { super(`The index of the cores and libraries must be updated before initializing the core gRPC client. The following problems were detected during the gRPC client initialization: ${causes - .map(({ code, message }) => ` - code: ${code}, message: ${message}`) + .map( + ([{ code, message }, type]) => + `[${type}-index] - code: ${code}, message: ${message}` + ) .join('\n')} `); - Object.setPrototypeOf(this, IndexUpdateRequiredBeforeInitError.prototype); + Object.setPrototypeOf(this, MustUpdateIndexesBeforeInitError.prototype); + this.indexTypesToUpdate = new Set(causes.map(([, type]) => type)); if (!causes.length) { throw new Error(`expected non-empty 'causes'`); } @@ -435,41 +474,63 @@ ${causes function isIndexUpdateRequiredBeforeInit( status: RpcStatus[], cliConfig: DefaultCliConfig -): IndexUpdateRequiredBeforeInitError | undefined { - const causes = status - .filter((s) => - IndexUpdateRequiredBeforeInit.map((predicate) => - predicate(s, cliConfig) - ).some(Boolean) - ) - .map((s) => RpcStatus.toObject(false, s)); +): MustUpdateIndexesBeforeInitError | undefined { + const causes = status.reduce((acc, curr) => { + for (const [predicate, type] of IndexUpdateRequiredPredicates) { + if (predicate(curr, cliConfig)) { + acc.push([curr.toObject(false), type]); + return acc; + } + } + return acc; + }, [] as [RpcStatus.AsObject, IndexType][]); return causes.length - ? new IndexUpdateRequiredBeforeInitError(causes) + ? new MustUpdateIndexesBeforeInitError(causes) : undefined; } -const IndexUpdateRequiredBeforeInit = [ - isPackageIndexMissingStatus, - isDiscoveryNotFoundStatus, +interface Predicate { + ( + status: RpcStatus, + { + directories: { data }, + }: DefaultCliConfig + ): boolean; +} +const IndexUpdateRequiredPredicates: [Predicate, IndexType][] = [ + [isPrimaryPackageIndexMissingStatus, 'platform'], + [isDiscoveryNotFoundStatus, 'platform'], + [isLibraryIndexMissingStatus, 'library'], ]; -function isPackageIndexMissingStatus( +// Loading index file: loading json index file /path/to/package_index.json: open /path/to/package_index.json: no such file or directory +function isPrimaryPackageIndexMissingStatus( status: RpcStatus, { directories: { data } }: DefaultCliConfig ): boolean { const predicate = ({ message }: RpcStatus.AsObject) => - message.includes('loading json index file') && - (message.includes(join(data, 'package_index.json')) || - message.includes(join(data, 'library_index.json'))); + message.includes(join(data, 'package_index.json')); // https://github.com/arduino/arduino-cli/blob/f0245bc2da6a56fccea7b2c9ea09e85fdcc52cb8/arduino/cores/packagemanager/package_manager.go#L247 return evaluate(status, predicate); } +// Error loading hardware platform: discovery $TOOL_NAME not found function isDiscoveryNotFoundStatus(status: RpcStatus): boolean { const predicate = ({ message }: RpcStatus.AsObject) => message.includes('discovery') && - (message.includes('not found') || message.includes('not installed')); + (message.includes('not found') || + message.includes('loading hardware platform')); // https://github.com/arduino/arduino-cli/blob/f0245bc2da6a56fccea7b2c9ea09e85fdcc52cb8/arduino/cores/packagemanager/loader.go#L740 // https://github.com/arduino/arduino-cli/blob/f0245bc2da6a56fccea7b2c9ea09e85fdcc52cb8/arduino/cores/packagemanager/loader.go#L744 return evaluate(status, predicate); } +// Loading index file: reading library_index.json: open /path/to/library_index.json: no such file or directory +function isLibraryIndexMissingStatus( + status: RpcStatus, + { directories: { data } }: DefaultCliConfig +): boolean { + const predicate = ({ message }: RpcStatus.AsObject) => + message.includes(join(data, 'library_index.json')); + // https://github.com/arduino/arduino-cli/blob/f0245bc2da6a56fccea7b2c9ea09e85fdcc52cb8/arduino/cores/packagemanager/package_manager.go#L247 + return evaluate(status, predicate); +} function evaluate( subject: RpcStatus, predicate: (error: RpcStatus.AsObject) => boolean diff --git a/arduino-ide-extension/src/node/core-service-impl.ts b/arduino-ide-extension/src/node/core-service-impl.ts index f438ca2e6..6789ffc11 100644 --- a/arduino-ide-extension/src/node/core-service-impl.ts +++ b/arduino-ide-extension/src/node/core-service-impl.ts @@ -1,144 +1,184 @@ -import { FileUri } from '@theia/core/lib/node/file-uri'; +import { type ClientReadableStream } from '@grpc/grpc-js'; +import { ApplicationError } from '@theia/core/lib/common/application-error'; +import type { CancellationToken } from '@theia/core/lib/common/cancellation'; +import { + Disposable, + DisposableCollection, +} from '@theia/core/lib/common/disposable'; +import { FileUri } from '@theia/core/lib/common/file-uri'; +import { nls } from '@theia/core/lib/common/nls'; +import type { Mutable } from '@theia/core/lib/common/types'; import { inject, injectable } from '@theia/core/shared/inversify'; -import { relative } from 'path'; import * as jspb from 'google-protobuf'; -import { BoolValue } from 'google-protobuf/google/protobuf/wrappers_pb'; -import { ClientReadableStream } from '@grpc/grpc-js'; +import path from 'node:path'; +import { userAbort } from '../common/nls'; +import { + UploadResponse as ApiUploadResponse, + OutputMessage, + Port, + PortIdentifier, + resolveDetectedPort, +} from '../common/protocol'; import { + CompileSummary, CompilerWarnings, - CoreService, CoreError, + CoreService, + isCompileSummary, + isUploadResponse, } from '../common/protocol/core-service'; +import { UserAbortApplicationError } from '../common/protocol/progressible'; +import { ResponseService } from '../common/protocol/response-service'; +import { firstToUpperCase, notEmpty } from '../common/utils'; +import { BoardDiscovery, createApiPort } from './board-discovery'; +import { tryParseError } from './cli-error-parser'; +import { ArduinoCoreServiceClient } from './cli-protocol/cc/arduino/cli/commands/v1/commands_grpc_pb'; +import { Instance } from './cli-protocol/cc/arduino/cli/commands/v1/common_pb'; import { CompileRequest, CompileResponse, + InstanceNeedsReinitializationError, } from './cli-protocol/cc/arduino/cli/commands/v1/compile_pb'; -import { CoreClientAware } from './core-client-provider'; +import { Port as RpcPort } from './cli-protocol/cc/arduino/cli/commands/v1/port_pb'; import { BurnBootloaderRequest, BurnBootloaderResponse, + ProgrammerIsRequiredForUploadError, UploadRequest, UploadResponse, UploadUsingProgrammerRequest, UploadUsingProgrammerResponse, } from './cli-protocol/cc/arduino/cli/commands/v1/upload_pb'; -import { ResponseService } from '../common/protocol/response-service'; -import { OutputMessage, Port, Status } from '../common/protocol'; -import { ArduinoCoreServiceClient } from './cli-protocol/cc/arduino/cli/commands/v1/commands_grpc_pb'; -import { Port as RpcPort } from './cli-protocol/cc/arduino/cli/commands/v1/port_pb'; -import { ApplicationError, CommandService, Disposable, nls } from '@theia/core'; +import { CoreClientAware } from './core-client-provider'; +import { ExecuteWithProgress, ProgressResponse } from './grpc-progressible'; import { MonitorManager } from './monitor-manager'; -import { AutoFlushingBuffer } from './utils/buffers'; -import { tryParseError } from './cli-error-parser'; -import { Instance } from './cli-protocol/cc/arduino/cli/commands/v1/common_pb'; -import { firstToUpperCase, notEmpty } from '../common/utils'; import { ServiceError } from './service-error'; -import { ExecuteWithProgress, ProgressResponse } from './grpc-progressible'; -import { BoardDiscovery } from './board-discovery'; +import { AutoFlushingBuffer } from './utils/buffers'; namespace Uploadable { export type Request = UploadRequest | UploadUsingProgrammerRequest; export type Response = UploadResponse | UploadUsingProgrammerResponse; } +type CompileSummaryFragment = Partial<Mutable<CompileSummary>>; + @injectable() export class CoreServiceImpl extends CoreClientAware implements CoreService { @inject(ResponseService) private readonly responseService: ResponseService; - @inject(MonitorManager) private readonly monitorManager: MonitorManager; - - @inject(CommandService) - private readonly commandService: CommandService; - @inject(BoardDiscovery) private readonly boardDiscovery: BoardDiscovery; - async compile(options: CoreService.Options.Compile): Promise<void> { + async compile( + options: CoreService.Options.Compile, + cancellationToken?: CancellationToken + ): Promise<CompileSummary | undefined> { const coreClient = await this.coreClient; const { client, instance } = coreClient; - let buildPath: string | undefined = undefined; + const request = this.compileRequest(options, instance); + const compileSummary = <CompileSummaryFragment>{}; const progressHandler = this.createProgressHandler(options); - const buildPathHandler = (response: CompileResponse) => { - const currentBuildPath = response.getBuildPath(); - if (currentBuildPath) { - buildPath = currentBuildPath; - } else { - if (!!buildPath && currentBuildPath !== buildPath) { - throw new Error( - `The CLI has already provided a build path: <${buildPath}>, and IDE received a new build path value: <${currentBuildPath}>.` - ); - } - } - }; + const compileSummaryHandler = (response: CompileResponse) => + updateCompileSummary(compileSummary, response); const handler = this.createOnDataHandler<CompileResponse>( progressHandler, - buildPathHandler + compileSummaryHandler ); - const request = this.compileRequest(options, instance); - return new Promise<void>((resolve, reject) => { - client - .compile(request) - .on('data', handler.onData) - .on('error', (error) => { - if (!ServiceError.is(error)) { - console.error( - 'Unexpected error occurred while compiling the sketch.', - error - ); - reject(error); - } else { - const compilerErrors = tryParseError({ - content: handler.content, - sketch: options.sketch, - }); - const message = nls.localize( - 'arduino/compile/error', - 'Compilation error: {0}', - compilerErrors - .map(({ message }) => message) - .filter(notEmpty) - .shift() ?? error.details - ); - this.sendResponse( - error.details + '\n\n' + message, - OutputMessage.Severity.Error - ); - reject(CoreError.VerifyFailed(message, compilerErrors)); - } - }) - .on('end', resolve); - }).finally(() => { - handler.dispose(); - if (!buildPath) { + const toDisposeOnFinally = new DisposableCollection(handler); + + return new Promise<CompileSummary | undefined>((resolve, reject) => { + let hasRetried = false; + + const handleUnexpectedError = (error: Error) => { console.error( - `Have not received the build path from the CLI while running the compilation.` + 'Unexpected error occurred while compiling the sketch.', + error ); - } else { - this.fireBuildDidComplete(FileUri.create(buildPath).toString()); - } - }); - } + reject(error); + }; - // This executes on the frontend, the VS Code extension receives it, and sends an `ino/buildDidComplete` notification to the language server. - private fireBuildDidComplete(buildOutputUri: string): void { - const params = { - buildOutputUri, - }; - console.info( - `Executing 'arduino.languageserver.notifyBuildDidComplete' with ${JSON.stringify( - params - )}` - ); - this.commandService - .executeCommand('arduino.languageserver.notifyBuildDidComplete', params) - .catch((err) => - console.error( - `Unexpected error when firing event on build did complete. ${buildOutputUri}`, - err - ) - ); + const handleCancellationError = () => { + console.log(userAbort); + reject(UserAbortApplicationError()); + }; + + const handleInstanceNeedsReinitializationError = async ( + error: ServiceError & InstanceNeedsReinitializationError + ) => { + if (hasRetried) { + // If error persists, send the error message to the output + return parseAndSendErrorResponse(error); + } + + hasRetried = true; + await this.refresh(); + return startCompileStream(); + }; + + const parseAndSendErrorResponse = (error: ServiceError) => { + const compilerErrors = tryParseError({ + content: handler.content, + sketch: options.sketch, + }); + const message = nls.localize( + 'arduino/compile/error', + 'Compilation error: {0}', + compilerErrors + .map(({ message }) => message) + .filter(notEmpty) + .shift() ?? error.details + ); + this.sendResponse( + error.details + '\n\n' + message, + OutputMessage.Severity.Error + ); + reject(CoreError.VerifyFailed(message, compilerErrors)); + }; + + const handleError = async (error: Error) => { + if (!ServiceError.is(error)) return handleUnexpectedError(error); + if (ServiceError.isCancel(error)) return handleCancellationError(); + + if ( + ServiceError.isInstanceOf(error, InstanceNeedsReinitializationError) + ) { + return await handleInstanceNeedsReinitializationError(error); + } + + parseAndSendErrorResponse(error); + }; + + const startCompileStream = () => { + const call = client.compile(request); + if (cancellationToken) { + toDisposeOnFinally.push( + cancellationToken.onCancellationRequested(() => call.cancel()) + ); + } + + call + .on('data', handler.onData) + .on('error', handleError) + .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(); + }).finally(() => { + toDisposeOnFinally.dispose(); + }); } private compileRequest( @@ -165,15 +205,16 @@ export class CoreServiceImpl extends CoreClientAware implements CoreService { request.setVerbose(options.verbose); request.setQuiet(false); if (typeof options.exportBinaries === 'boolean') { - const exportBinaries = new BoolValue(); - exportBinaries.setValue(options.exportBinaries); - request.setExportBinaries(exportBinaries); + request.setExportBinaries(options.exportBinaries); } this.mergeSourceOverrides(request, options); return request; } - upload(options: CoreService.Options.Upload): Promise<void> { + upload( + options: CoreService.Options.Upload, + cancellationToken?: CancellationToken + ): Promise<ApiUploadResponse> { const { usingProgrammer } = options; return this.doUpload( options, @@ -187,7 +228,8 @@ export class CoreServiceImpl extends CoreClientAware implements CoreService { usingProgrammer ? CoreError.UploadUsingProgrammerFailed : CoreError.UploadFailed, - `upload${usingProgrammer ? ' using programmer' : ''}` + `upload${usingProgrammer ? ' using programmer' : ''}`, + cancellationToken ); } @@ -201,44 +243,120 @@ export class CoreServiceImpl extends CoreClientAware implements CoreService { client: ArduinoCoreServiceClient ) => (request: REQ) => ClientReadableStream<RESP>, errorCtor: ApplicationError.Constructor<number, CoreError.ErrorLocation[]>, - task: string - ): Promise<void> { + task: string, + cancellationToken?: CancellationToken + ): Promise<ApiUploadResponse> { + const portBeforeUpload = options.port; + const uploadResponseFragment: Mutable<Partial<ApiUploadResponse>> = { + portAfterUpload: options.port, // assume no port changes during the upload + }; const coreClient = await this.coreClient; const { client, instance } = coreClient; const progressHandler = this.createProgressHandler(options); - const handler = this.createOnDataHandler(progressHandler); + // Track responses for port changes. No port changes are expected when uploading using a programmer. + const updateUploadResponseFragmentHandler = (response: RESP) => { + if (response instanceof UploadResponse) { + // TODO: this instanceof should not be here but in `upload`. the upload and upload using programmer gRPC APIs are not symmetric + const uploadResult = response.getResult(); + if (uploadResult) { + const port = uploadResult.getUpdatedUploadPort(); + if (port) { + uploadResponseFragment.portAfterUpload = createApiPort(port); + console.info( + `Received port after upload [${ + options.port ? Port.keyOf(options.port) : '' + }, ${options.fqbn}, ${ + options.sketch.name + }]. Before port: ${JSON.stringify( + portBeforeUpload + )}, after port: ${JSON.stringify( + uploadResponseFragment.portAfterUpload + )}` + ); + } + } + } + }; + const handler = this.createOnDataHandler( + progressHandler, + updateUploadResponseFragmentHandler + ); + const toDisposeOnFinally = new DisposableCollection(handler); const grpcCall = responseFactory(client); return this.notifyUploadWillStart(options).then(() => - new Promise<void>((resolve, reject) => { - grpcCall(this.initUploadRequest(request, options, instance)) + new Promise<ApiUploadResponse>((resolve, reject) => { + const call = grpcCall( + this.initUploadRequest(request, options, instance) + ); + if (cancellationToken) { + toDisposeOnFinally.push( + cancellationToken.onCancellationRequested(() => call.cancel()) + ); + } + call .on('data', handler.onData) .on('error', (error) => { if (!ServiceError.is(error)) { console.error(`Unexpected error occurred while ${task}.`, error); reject(error); + return; + } + if (ServiceError.isCancel(error)) { + console.log(userAbort); + reject(UserAbortApplicationError()); + return; + } + + if ( + ServiceError.isInstanceOf( + error, + ProgrammerIsRequiredForUploadError + ) + ) { + reject(CoreError.UploadRequiresProgrammer()); + return; + } + + const message = nls.localize( + 'arduino/upload/error', + '{0} error: {1}', + firstToUpperCase(task), + error.details + ); + + this.sendResponse(error.details, OutputMessage.Severity.Error); + reject( + errorCtor( + message, + tryParseError({ + content: handler.content, + sketch: options.sketch, + }) + ) + ); + }) + .on('end', () => { + if (isUploadResponse(uploadResponseFragment)) { + resolve(uploadResponseFragment); } else { - const message = nls.localize( - 'arduino/upload/error', - '{0} error: {1}', - firstToUpperCase(task), - error.details - ); - this.sendResponse(error.details, OutputMessage.Severity.Error); reject( - errorCtor( - message, - tryParseError({ - content: handler.content, - sketch: options.sketch, - }) + new Error( + `Could not detect the port after the upload. Upload options were: ${JSON.stringify( + options + )}, upload response was: ${JSON.stringify( + uploadResponseFragment + )}` ) ); } - }) - .on('end', resolve); + }); }).finally(async () => { - handler.dispose(); - await this.notifyUploadDidFinish(options); + toDisposeOnFinally.dispose(); + await this.notifyUploadDidFinish( + Object.assign(options, { + afterPort: uploadResponseFragment.portAfterUpload, + }) + ); }) ); } @@ -268,16 +386,25 @@ export class CoreServiceImpl extends CoreClientAware implements CoreService { return request; } - async burnBootloader(options: CoreService.Options.Bootloader): Promise<void> { + async burnBootloader( + options: CoreService.Options.Bootloader, + cancellationToken?: CancellationToken + ): Promise<void> { const coreClient = await this.coreClient; const { client, instance } = coreClient; const progressHandler = this.createProgressHandler(options); const handler = this.createOnDataHandler(progressHandler); const request = this.burnBootloaderRequest(options, instance); + const toDisposeOnFinally = new DisposableCollection(handler); return this.notifyUploadWillStart(options).then(() => new Promise<void>((resolve, reject) => { - client - .burnBootloader(request) + const call = client.burnBootloader(request); + if (cancellationToken) { + toDisposeOnFinally.push( + cancellationToken.onCancellationRequested(() => call.cancel()) + ); + } + call .on('data', handler.onData) .on('error', (error) => { if (!ServiceError.is(error)) { @@ -286,24 +413,31 @@ export class CoreServiceImpl extends CoreClientAware implements CoreService { error ); reject(error); - } else { - this.sendResponse(error.details, OutputMessage.Severity.Error); - reject( - CoreError.BurnBootloaderFailed( - nls.localize( - 'arduino/burnBootloader/error', - 'Error while burning the bootloader: {0}', - error.details - ), - tryParseError({ content: handler.content }) - ) - ); + return; } + if (ServiceError.isCancel(error)) { + console.log(userAbort); + reject(UserAbortApplicationError()); + return; + } + this.sendResponse(error.details, OutputMessage.Severity.Error); + reject( + CoreError.BurnBootloaderFailed( + nls.localize( + 'arduino/burnBootloader/error', + 'Error while burning the bootloader: {0}', + error.details + ), + tryParseError({ content: handler.content }) + ) + ); }) .on('end', resolve); }).finally(async () => { - handler.dispose(); - await this.notifyUploadDidFinish(options); + toDisposeOnFinally.dispose(); + await this.notifyUploadDidFinish( + Object.assign(options, { afterPort: options.port }) + ); }) ); } @@ -380,21 +514,25 @@ export class CoreServiceImpl extends CoreClientAware implements CoreService { port, }: { fqbn?: string | undefined; - port?: Port | undefined; + port?: PortIdentifier; }): Promise<void> { - this.boardDiscovery.setUploadInProgress(true); - return this.monitorManager.notifyUploadStarted(fqbn, port); + if (fqbn && port) { + return this.monitorManager.notifyUploadStarted(fqbn, port); + } } private async notifyUploadDidFinish({ fqbn, port, + afterPort, }: { fqbn?: string | undefined; - port?: Port | undefined; - }): Promise<Status> { - this.boardDiscovery.setUploadInProgress(false); - return this.monitorManager.notifyUploadFinished(fqbn, port); + port?: PortIdentifier; + afterPort?: PortIdentifier; + }): Promise<void> { + if (fqbn && port && afterPort) { + return this.monitorManager.notifyUploadFinished(fqbn, port, afterPort); + } } private mergeSourceOverrides( @@ -405,21 +543,32 @@ export class CoreServiceImpl extends CoreClientAware implements CoreService { for (const uri of Object.keys(options.sourceOverride)) { const content = options.sourceOverride[uri]; if (content) { - const relativePath = relative(sketchPath, FileUri.fsPath(uri)); + const relativePath = path.relative(sketchPath, FileUri.fsPath(uri)); req.getSourceOverrideMap().set(relativePath, content); } } } - private createPort(port: Port | undefined): RpcPort { + private createPort( + port: PortIdentifier | undefined, + resolve: (port: PortIdentifier) => Port | undefined = (port) => + resolveDetectedPort(port, this.boardDiscovery.detectedPorts) + ): RpcPort | undefined { + if (!port) { + return undefined; + } + const resolvedPort = resolve(port); const rpcPort = new RpcPort(); - if (port) { - rpcPort.setAddress(port.address); - rpcPort.setLabel(port.addressLabel); - rpcPort.setProtocol(port.protocol); - rpcPort.setProtocolLabel(port.protocolLabel); - if (port.properties) { - for (const [key, value] of Object.entries(port.properties)) { + rpcPort.setProtocol(port.protocol); + rpcPort.setAddress(port.address); + if (resolvedPort) { + rpcPort.setLabel(resolvedPort.addressLabel); + rpcPort.setProtocolLabel(resolvedPort.protocolLabel); + if (resolvedPort.hardwareId !== undefined) { + rpcPort.setHardwareId(resolvedPort.hardwareId); + } + if (resolvedPort.properties) { + for (const [key, value] of Object.entries(resolvedPort.properties)) { rpcPort.getPropertiesMap().set(key, value); } } @@ -461,3 +610,75 @@ namespace StreamingResponse { readonly handlers?: ((response: R) => void)[]; } } + +function updateCompileSummary( + compileSummary: CompileSummaryFragment, + response: CompileResponse +): CompileSummaryFragment { + const messageCase = response.getMessageCase(); + if (messageCase !== CompileResponse.MessageCase.RESULT) { + return compileSummary; + } + const result = response.getResult(); + if (!result) { + console.warn( + `Build result is missing from response: ${JSON.stringify( + response.toObject(false) + )}` + ); + return compileSummary; + } + const buildPath = result.getBuildPath(); + if (buildPath) { + compileSummary.buildPath = buildPath; + compileSummary.buildOutputUri = FileUri.create(buildPath).toString(); + } + const executableSectionsSize = result.getExecutableSectionsSizeList(); + if (executableSectionsSize) { + compileSummary.executableSectionsSize = executableSectionsSize.map((item) => + item.toObject(false) + ); + } + const usedLibraries = result.getUsedLibrariesList(); + if (usedLibraries) { + compileSummary.usedLibraries = usedLibraries.map((item) => { + const object = item.toObject(false); + const library = { + ...object, + architectures: object.architecturesList, + types: object.typesList, + examples: object.examplesList, + providesIncludes: object.providesIncludesList, + properties: object.propertiesMap.reduce((acc, [key, value]) => { + acc[key] = value; + return acc; + }, {} as Record<string, string>), + compatibleWith: object.compatibleWithMap.reduce((acc, [key, value]) => { + acc[key] = value; + return acc; + }, {} as Record<string, boolean>), + } as const; + const mutable = <Partial<Mutable<typeof library>>>library; + delete mutable.architecturesList; + delete mutable.typesList; + delete mutable.examplesList; + delete mutable.providesIncludesList; + delete mutable.propertiesMap; + delete mutable.compatibleWithMap; + return library; + }); + } + const boardPlatform = result.getBoardPlatform(); + if (boardPlatform) { + compileSummary.buildPlatform = boardPlatform.toObject(false); + } + const buildPlatform = result.getBuildPlatform(); + if (buildPlatform) { + compileSummary.buildPlatform = buildPlatform.toObject(false); + } + const buildProperties = result.getBuildPropertiesList(); + if (buildProperties) { + compileSummary.buildProperties = buildProperties.slice(); + } + return compileSummary; +} diff --git a/arduino-ide-extension/src/node/daemon-watcher.ts b/arduino-ide-extension/src/node/daemon-watcher.ts deleted file mode 100644 index 9c94e0ee6..000000000 --- a/arduino-ide-extension/src/node/daemon-watcher.ts +++ /dev/null @@ -1,19 +0,0 @@ -import * as psTree from 'ps-tree'; -const kill = require('tree-kill'); -const [theiaPid, daemonPid] = process.argv - .slice(2) - .map((id) => Number.parseInt(id, 10)); - -setInterval(() => { - try { - // Throws an exception if the Theia process doesn't exist anymore. - process.kill(theiaPid, 0); - } catch { - psTree(daemonPid, function (_, children) { - for (const { PID } of children) { - kill(PID); - } - kill(daemonPid, () => process.exit()); - }); - } -}, 1000); diff --git a/arduino-ide-extension/src/node/examples-service-impl.ts b/arduino-ide-extension/src/node/examples-service-impl.ts index 0028791a6..b9e94450a 100644 --- a/arduino-ide-extension/src/node/examples-service-impl.ts +++ b/arduino-ide-extension/src/node/examples-service-impl.ts @@ -3,22 +3,19 @@ import { injectable, postConstruct, } from '@theia/core/shared/inversify'; -import { join } from 'path'; -import * as fs from 'fs'; -import { FileUri } from '@theia/core/lib/node/file-uri'; +import { join } from 'node:path'; +import fs from 'node:fs'; +import { FileUri } from '@theia/core/lib/common/file-uri'; import { SketchRef, SketchContainer, } from '../common/protocol/sketches-service'; import { ExamplesService } from '../common/protocol/examples-service'; -import { - LibraryLocation, - LibraryPackage, - LibraryService, -} from '../common/protocol'; -import { duration } from '../common/decorators'; +import { LibraryLocation, LibraryPackage } from '../common/protocol'; import { URI } from '@theia/core/lib/common/uri'; import { Path } from '@theia/core/lib/common/path'; +import { LibraryServiceImpl } from './library-service-impl'; +import { examplesPath } from './resources'; interface BuiltInSketchRef { readonly name: string; @@ -68,7 +65,7 @@ export class BuiltInExamplesServiceImpl { if (this._builtIns) { return this._builtIns; } - const examplesRootPath = join(__dirname, '..', '..', 'Examples'); + const examplesRootPath = examplesPath; const examplesRootUri = FileUri.create(examplesRootPath); const rawJson = await fs.promises.readFile( join(examplesRootPath, 'examples.json'), @@ -84,8 +81,8 @@ export class BuiltInExamplesServiceImpl { @injectable() export class ExamplesServiceImpl implements ExamplesService { - @inject(LibraryService) - private readonly libraryService: LibraryService; + @inject(LibraryServiceImpl) + private readonly libraryService: LibraryServiceImpl; @inject(BuiltInExamplesServiceImpl) private readonly builtInExamplesService: BuiltInExamplesServiceImpl; @@ -94,7 +91,6 @@ export class ExamplesServiceImpl implements ExamplesService { return this.builtInExamplesService.builtIns(); } - @duration() async installed({ fqbn }: { fqbn?: string }): Promise<{ user: SketchContainer[]; current: SketchContainer[]; @@ -123,17 +119,27 @@ export class ExamplesServiceImpl implements ExamplesService { return { user, current, any }; } + async find(options: { libraryName: string }): Promise<SketchContainer[]> { + const { libraryName } = options; + const packages = await this.libraryService.list({ libraryName }); + return Promise.all( + packages + .filter(({ location }) => location === LibraryLocation.USER) + .map((pkg) => this.tryGroupExamples(pkg)) + ); + } + /** * The CLI provides direct FS paths to the examples so that menus and menu groups cannot be built for the UI by traversing the * folder hierarchy. This method tries to workaround it by falling back to the `installDirUri` and manually creating the * location of the examples. Otherwise it creates the example container from the direct examples FS paths. */ private async tryGroupExamples({ - label, + name, exampleUris, installDirUri, }: LibraryPackage): Promise<SketchContainer> { - const container = SketchContainer.create(label); + const container = SketchContainer.create(name); if (!installDirUri || !exampleUris.length) { return container; } diff --git a/arduino-ide-extension/src/node/exec-util.ts b/arduino-ide-extension/src/node/exec-util.ts index 6fa9aa92c..b93b48eb3 100644 --- a/arduino-ide-extension/src/node/exec-util.ts +++ b/arduino-ide-extension/src/node/exec-util.ts @@ -1,48 +1,4 @@ -import * as os from 'os'; -import * as which from 'which'; -import * as semver from 'semver'; -import { join } from 'path'; -import { spawn } from 'child_process'; - -export async function getExecPath( - commandName: string, - onError: (error: Error) => void = (error) => console.log(error), - versionArg?: string | undefined, - inBinDir?: boolean -): Promise<string> { - const execName = `${commandName}${os.platform() === 'win32' ? '.exe' : ''}`; - const relativePath = ['..', '..', 'build']; - if (inBinDir) { - relativePath.push('bin'); - } - const buildCommand = join(__dirname, ...relativePath, execName); - if (!versionArg) { - return buildCommand; - } - const versionRegexp = /\d+\.\d+\.\d+/; - const buildVersion = await spawnCommand( - `"${buildCommand}"`, - [versionArg], - onError - ); - const buildShortVersion = (buildVersion.match(versionRegexp) || [])[0]; - const pathCommand = await new Promise<string | undefined>((resolve) => - which(execName, (error, path) => resolve(error ? undefined : path)) - ); - if (!pathCommand) { - return buildCommand; - } - const pathVersion = await spawnCommand( - `"${pathCommand}"`, - [versionArg], - onError - ); - const pathShortVersion = (pathVersion.match(versionRegexp) || [])[0]; - if (semver.gt(pathShortVersion, buildShortVersion)) { - return pathCommand; - } - return buildCommand; -} +import { spawn } from 'node:child_process'; export function spawnCommand( command: string, @@ -51,7 +7,7 @@ export function spawnCommand( stdIn?: string ): Promise<string> { return new Promise<string>((resolve, reject) => { - const cp = spawn(command, args, { windowsHide: true, shell: true }); + const cp = spawn(command, args, { windowsHide: true }); const outBuffers: Buffer[] = []; const errBuffers: Buffer[] = []; cp.stdout.on('data', (b: Buffer) => outBuffers.push(b)); @@ -62,7 +18,7 @@ export function spawnCommand( }); cp.on('exit', (code, signal) => { if (code === 0) { - const result = Buffer.concat(outBuffers).toString('utf8').trim(); + const result = Buffer.concat(outBuffers).toString('utf8'); resolve(result); return; } diff --git a/arduino-ide-extension/src/node/executable-service-impl.ts b/arduino-ide-extension/src/node/executable-service-impl.ts index f731387d8..4f1eaf567 100644 --- a/arduino-ide-extension/src/node/executable-service-impl.ts +++ b/arduino-ide-extension/src/node/executable-service-impl.ts @@ -1,35 +1,23 @@ -import { injectable, inject } from '@theia/core/shared/inversify'; -import { ILogger } from '@theia/core/lib/common/logger'; -import { FileUri } from '@theia/core/lib/node/file-uri'; -import { getExecPath } from './exec-util'; +import { FileUri } from '@theia/core/lib/common/file-uri'; +import { injectable } from '@theia/core/shared/inversify'; import { ExecutableService } from '../common/protocol/executable-service'; +import { + arduinoCliPath, + arduinoLanguageServerPath, + clangdPath, +} from './resources'; @injectable() export class ExecutableServiceImpl implements ExecutableService { - @inject(ILogger) - protected logger: ILogger; - async list(): Promise<{ clangdUri: string; cliUri: string; lsUri: string; - fwuploaderUri: string; }> { - const [ls, clangd, cli, fwuploader] = await Promise.all([ - getExecPath('arduino-language-server', this.onError.bind(this)), - getExecPath('clangd', this.onError.bind(this), undefined), - getExecPath('arduino-cli', this.onError.bind(this)), - getExecPath('arduino-fwuploader', this.onError.bind(this)), - ]); return { - clangdUri: FileUri.create(clangd).toString(), - cliUri: FileUri.create(cli).toString(), - lsUri: FileUri.create(ls).toString(), - fwuploaderUri: FileUri.create(fwuploader).toString(), + clangdUri: FileUri.create(clangdPath).toString(), + cliUri: FileUri.create(arduinoCliPath).toString(), + lsUri: FileUri.create(arduinoLanguageServerPath).toString(), }; } - - protected onError(error: Error): void { - this.logger.error(error); - } } diff --git a/arduino-ide-extension/src/node/grpc-progressible.ts b/arduino-ide-extension/src/node/grpc-progressible.ts index c9b93183d..3a36bdf79 100644 --- a/arduino-ide-extension/src/node/grpc-progressible.ts +++ b/arduino-ide-extension/src/node/grpc-progressible.ts @@ -1,15 +1,24 @@ -import { v4 } from 'uuid'; +import { UUID } from '@theia/core/shared/@phosphor/coreutils'; +import type { + IndexType, + IndexUpdateDidCompleteParams, + IndexUpdateDidFailParams, + IndexUpdateSummary, + IndexUpdateWillStartParams, +} from '../common/protocol'; import { ProgressMessage, ResponseService, } from '../common/protocol/response-service'; import { - UpdateCoreLibrariesIndexResponse, UpdateIndexResponse, UpdateLibrariesIndexResponse, } from './cli-protocol/cc/arduino/cli/commands/v1/commands_pb'; import { DownloadProgress, + DownloadProgressEnd, + DownloadProgressStart, + DownloadProgressUpdate, TaskProgress, } from './cli-protocol/cc/arduino/cli/commands/v1/common_pb'; import { CompileResponse } from './cli-protocol/cc/arduino/cli/commands/v1/compile_pb'; @@ -68,20 +77,18 @@ namespace PlatformProgressResponse { }; } } -type IndexProgressResponse = - | UpdateIndexResponse - | UpdateLibrariesIndexResponse - | UpdateCoreLibrariesIndexResponse; +type IndexProgressResponse = UpdateIndexResponse | UpdateLibrariesIndexResponse; namespace IndexProgressResponse { export function is(response: unknown): response is IndexProgressResponse { return ( response instanceof UpdateIndexResponse || - response instanceof UpdateLibrariesIndexResponse || - response instanceof UpdateCoreLibrariesIndexResponse // not used by the IDE2 but available for full typings compatibility + response instanceof UpdateLibrariesIndexResponse ); } export function workUnit(response: IndexProgressResponse): UnitOfWork { - return { download: response.getDownloadProgress() }; + return { + download: response.getDownloadProgress(), + }; } } /** @@ -152,26 +159,33 @@ export namespace ExecuteWithProgress { */ readonly progressId?: string; readonly responseService: Partial<ResponseService>; + /** + * It's only relevant for index updates to build a summary of possible client (4xx) and server (5xx) errors when downloading the files during the index update. It's missing for lib/platform installations. + */ + readonly reportResult?: (result: DownloadResult) => void; } export function createDataCallback<R extends ProgressResponse>({ responseService, progressId, + reportResult, }: ExecuteWithProgress.Options): (response: R) => void { - const uuid = v4(); - let localFile = ''; - let localTotalSize = Number.NaN; + const uuid = UUID.uuid4(); + let message = ''; + let url = ''; return (response: R) => { if (DEBUG) { const json = toJson(response); if (json) { - console.log(`Progress response [${uuid}]: ${json}`); + console.debug(`[gRPC progress] Progress response [${uuid}]: ${json}`); } } const unitOfWork = resolve(response); const { task, download } = unitOfWork; if (!download && !task) { - // report a fake unknown progress. + // Report a fake unknown progress if progress ID is available. + // When a progress ID is available, a connected client is setting the progress ID. + // Hence, it's listening to progress updates. if (unitOfWork === UnitOfWork.Unknown && progressId) { if (progressId) { responseService.reportProgress?.({ @@ -187,7 +201,7 @@ export namespace ExecuteWithProgress { // Technically, it does not cause an error, but could mess up the progress reporting. // See an example of an empty object `{}` repose here: https://github.com/arduino/arduino-ide/issues/906#issuecomment-1171145630. console.warn( - "Implementation error. Neither 'download' nor 'task' is available." + `Implementation error. None of the following properties were available on the response: 'task', 'download'` ); } return; @@ -219,43 +233,32 @@ export namespace ExecuteWithProgress { } } } else if (download) { - if (download.getFile() && !localFile) { - localFile = download.getFile(); - } - if (download.getTotalSize() > 0 && Number.isNaN(localTotalSize)) { - localTotalSize = download.getTotalSize(); - } - - // This happens only once per file download. - if (download.getTotalSize() && localFile) { - responseService.appendToOutput?.({ chunk: `${localFile}\n` }); - } - - if (progressId && localFile) { - let work: ProgressMessage.Work | undefined = undefined; - if (download.getDownloaded() > 0 && !Number.isNaN(localTotalSize)) { - work = { - total: localTotalSize, - done: download.getDownloaded(), - }; - } - responseService.reportProgress?.({ - progressId, - message: `Downloading ${localFile}`, - work, - }); - } - if (download.getCompleted()) { - // Discard local state. - if (progressId && !Number.isNaN(localTotalSize)) { + const phase = phaseOf(download); + if (phase instanceof DownloadProgressStart) { + message = phase.getLabel(); + url = phase.getUrl(); + responseService.appendToOutput?.({ chunk: `${message}\n` }); + } else if (phase instanceof DownloadProgressUpdate) { + if (progressId && message) { responseService.reportProgress?.({ progressId, - message: '', - work: { done: Number.NaN, total: Number.NaN }, + message, + work: { + total: phase.getTotalSize(), + done: phase.getDownloaded(), + }, + }); + } + } else if (phase instanceof DownloadProgressEnd) { + if (url && reportResult) { + reportResult({ + url, + message: phase.getMessage(), + success: phase.getSuccess(), }); } - localFile = ''; - localTotalSize = Number.NaN; + message = ''; + url = ''; } } }; @@ -274,31 +277,40 @@ export namespace ExecuteWithProgress { return {}; } function toJson(response: ProgressResponse): string | undefined { - let object: Record<string, unknown> | undefined = undefined; - if (response instanceof LibraryInstallResponse) { - object = LibraryInstallResponse.toObject(false, response); - } else if (response instanceof LibraryUninstallResponse) { - object = LibraryUninstallResponse.toObject(false, response); - } else if (response instanceof ZipLibraryInstallResponse) { - object = ZipLibraryInstallResponse.toObject(false, response); - } else if (response instanceof PlatformInstallResponse) { - object = PlatformInstallResponse.toObject(false, response); - } else if (response instanceof PlatformUninstallResponse) { - object = PlatformUninstallResponse.toObject(false, response); - } else if (response instanceof UpdateIndexResponse) { - object = UpdateIndexResponse.toObject(false, response); - } else if (response instanceof UpdateLibrariesIndexResponse) { - object = UpdateLibrariesIndexResponse.toObject(false, response); - } else if (response instanceof UpdateCoreLibrariesIndexResponse) { - object = UpdateCoreLibrariesIndexResponse.toObject(false, response); - } else if (response instanceof CompileResponse) { - object = CompileResponse.toObject(false, response); + return JSON.stringify(response.toObject(false)); + } + function phaseOf( + download: DownloadProgress + ): DownloadProgressStart | DownloadProgressUpdate | DownloadProgressEnd { + let start: undefined | DownloadProgressStart = undefined; + let update: undefined | DownloadProgressUpdate = undefined; + let end: undefined | DownloadProgressEnd = undefined; + if (download.hasStart()) { + start = download.getStart(); + } else if (download.hasUpdate()) { + update = download.getUpdate(); + } else if (download.hasEnd()) { + end = download.getEnd(); + } else { + throw new Error( + `Download progress does not have a 'start', 'update', and 'end'. ${JSON.stringify( + download.toObject(false) + )}` + ); } - if (!object) { - console.warn('Unhandled gRPC response', response); - return undefined; + if (start) { + return start; + } else if (update) { + return update; + } else if (end) { + return end; + } else { + throw new Error( + `Download progress does not have a 'start', 'update', and 'end'. ${JSON.stringify( + download.toObject(false) + )}` + ); } - return JSON.stringify(object); } } @@ -306,33 +318,39 @@ export class IndexesUpdateProgressHandler { private done = 0; private readonly total: number; readonly progressId: string; + readonly results: DownloadResult[]; constructor( + private types: IndexType[], additionalUrlsCount: number, - private readonly onProgress: (progressMessage: ProgressMessage) => void, - private readonly onError?: ({ - progressId, - message, - }: { - progressId: string; - message: string; - }) => void, - private readonly onStart?: (progressId: string) => void, - private readonly onEnd?: (progressId: string) => void + private readonly options: { + onProgress: (progressMessage: ProgressMessage) => void; + onError?: (params: IndexUpdateDidFailParams) => void; + onStart?: (params: IndexUpdateWillStartParams) => void; + onComplete?: (params: IndexUpdateDidCompleteParams) => void; + } ) { - this.progressId = v4(); - this.total = IndexesUpdateProgressHandler.total(additionalUrlsCount); + this.progressId = UUID.uuid4(); + this.results = []; + this.total = IndexesUpdateProgressHandler.total(types, additionalUrlsCount); // Note: at this point, the IDE2 backend might not have any connected clients, so this notification is not delivered to anywhere - // Hence, clients must handle gracefully when no `willUpdate` is received before any `didProgress`. - this.onStart?.(this.progressId); + // Hence, clients must handle gracefully when no `willStart` event is received before any `didProgress`. + this.options.onStart?.({ progressId: this.progressId, types }); } reportEnd(): void { - this.onEnd?.(this.progressId); + const updatedAt = new Date().toISOString(); + this.options.onComplete?.({ + progressId: this.progressId, + summary: this.types.reduce((summary, type) => { + summary[type] = updatedAt; + return summary; + }, {} as IndexUpdateSummary), + }); } reportProgress(message: string): void { - this.onProgress({ + this.options.onProgress({ message, progressId: this.progressId, work: { total: this.total, done: ++this.done }, @@ -340,15 +358,44 @@ export class IndexesUpdateProgressHandler { } reportError(message: string): void { - this.onError?.({ progressId: this.progressId, message }); + this.options.onError?.({ + progressId: this.progressId, + message, + types: this.types, + }); } - private static total(additionalUrlsCount: number): number { - // +1 for the `package_index.tar.bz2` when updating the platform index. - const totalPlatformIndexCount = additionalUrlsCount + 1; - // The `library_index.json.gz` and `library_index.json.sig` when running the library index update. - const totalLibraryIndexCount = 2; + reportResult(result: DownloadResult): void { + this.results.push(result); + } + + private static total( + types: IndexType[], + additionalUrlsCount: number + ): number { + let total = 0; + if (types.includes('library')) { + // The `library_index.json.gz` and `library_index.json.sig` when running the library index update. + total += 2; + } + if (types.includes('platform')) { + // +1 for the `package_index.tar.bz2` when updating the platform index. + total += additionalUrlsCount + 1; + } // +1 for the `initInstance` call after the index update (`reportEnd`) - return totalPlatformIndexCount + totalLibraryIndexCount + 1; + return total + 1; + } +} + +export interface DownloadResult { + readonly url: string; + readonly success: boolean; + readonly message?: string; +} +export namespace DownloadResult { + export function isError( + arg: DownloadResult + ): arg is DownloadResult & { message: string } { + return !!arg.message && !arg.success; } } diff --git a/arduino-ide-extension/src/node/i18n/arduino-localization-contribution.ts b/arduino-ide-extension/src/node/i18n/arduino-localization-contribution.ts index 3465ab83d..a10842126 100644 --- a/arduino-ide-extension/src/node/i18n/arduino-localization-contribution.ts +++ b/arduino-ide-extension/src/node/i18n/arduino-localization-contribution.ts @@ -3,150 +3,56 @@ import { LocalizationRegistry, } from '@theia/core/lib/node/i18n/localization-contribution'; import { injectable } from '@theia/core/shared/inversify'; +import bgJson from '../resources/i18n/bg.json'; +import csJson from '../resources/i18n/cs.json'; +import deJson from '../resources/i18n/de.json'; +import esJson from '../resources/i18n/es.json'; +import frJson from '../resources/i18n/fr.json'; +import huJson from '../resources/i18n/hu.json'; +import itJson from '../resources/i18n/it.json'; +import jaJson from '../resources/i18n/ja.json'; +import koJson from '../resources/i18n/ko.json'; +import nlJson from '../resources/i18n/nl.json'; +import plJson from '../resources/i18n/pl.json'; +import ptJson from '../resources/i18n/pt.json'; +import ruJson from '../resources/i18n/ru.json'; +import trJson from '../resources/i18n/tr.json'; +import ukJson from '../resources/i18n/uk.json'; +import zhJson from '../resources/i18n/zh.json'; +import zh_HantJson from '../resources/i18n/zh-Hant.json'; @injectable() export class ArduinoLocalizationContribution implements LocalizationContribution { - async registerLocalizations(registry: LocalizationRegistry): Promise<void> { - registry.registerLocalizationFromRequire( - 'af', - require('../../../build/i18n/af.json') - ); - - registry.registerLocalizationFromRequire( - 'en', - require('../../../build/i18n/en.json') - ); - - registry.registerLocalizationFromRequire( - 'fr', - require('../../../build/i18n/fr.json') - ); - - registry.registerLocalizationFromRequire( - 'ko', - require('../../../build/i18n/ko.json') - ); - - registry.registerLocalizationFromRequire( - 'pt-br', - require('../../../build/i18n/pt.json') - ); - - registry.registerLocalizationFromRequire( - 'uk_UA', - require('../../../build/i18n/uk_UA.json') - ); - - registry.registerLocalizationFromRequire( - 'ar', - require('../../../build/i18n/ar.json') - ); - - registry.registerLocalizationFromRequire( - 'es', - require('../../../build/i18n/es.json') - ); - - registry.registerLocalizationFromRequire( - 'he', - require('../../../build/i18n/he.json') - ); - - registry.registerLocalizationFromRequire( - 'my_MM', - require('../../../build/i18n/my_MM.json') - ); - - registry.registerLocalizationFromRequire( - 'ro', - require('../../../build/i18n/ro.json') - ); - - registry.registerLocalizationFromRequire( - 'zh-cn', - require('../../../build/i18n/zh.json') - ); - - registry.registerLocalizationFromRequire( - 'bg', - require('../../../build/i18n/bg.json') - ); - - registry.registerLocalizationFromRequire( - 'eu', - require('../../../build/i18n/eu.json') - ); + // keys: locales + // values: the required JSON modules + // If you touch the locales, please keep the alphabetical order. Also in the `package.json` for the VS Code language packs. Thank you! ❤️ + // Note that IDE2 has more translations than available VS Code language packs. (https://github.com/arduino/arduino-ide/issues/1447) + private readonly locales: Readonly<Record<string, unknown>> = { + bg: bgJson, + cs: csJson, + de: deJson, + es: esJson, + fr: frJson, + hu: huJson, + // id: Does not have Transifex translations, but has a VS Code language pack available on Open VSX. + it: itJson, + ja: jaJson, + ko: koJson, + nl: nlJson, + pl: plJson, + 'pt-br': ptJson, + ru: ruJson, + tr: trJson, + uk: ukJson, + 'zh-cn': zhJson, + 'zh-tw': zh_HantJson, + }; - registry.registerLocalizationFromRequire( - 'hu', - require('../../../build/i18n/hu.json') - ); - - registry.registerLocalizationFromRequire( - 'ne', - require('../../../build/i18n/ne.json') - ); - - registry.registerLocalizationFromRequire( - 'ru', - require('../../../build/i18n/ru.json') - ); - - registry.registerLocalizationFromRequire( - 'zh_TW', - require('../../../build/i18n/zh_TW.json') - ); - - registry.registerLocalizationFromRequire( - 'de', - require('../../../build/i18n/de.json') - ); - - registry.registerLocalizationFromRequire( - 'fa', - require('../../../build/i18n/fa.json') - ); - - registry.registerLocalizationFromRequire( - 'it', - require('../../../build/i18n/it.json') - ); - - registry.registerLocalizationFromRequire( - 'nl', - require('../../../build/i18n/nl.json') - ); - - registry.registerLocalizationFromRequire( - 'sv_SE', - require('../../../build/i18n/sv_SE.json') - ); - - registry.registerLocalizationFromRequire( - 'el', - require('../../../build/i18n/el.json') - ); - - registry.registerLocalizationFromRequire( - 'fil', - require('../../../build/i18n/fil.json') - ); - - registry.registerLocalizationFromRequire( - 'ja', - require('../../../build/i18n/ja.json') - ); - - registry.registerLocalizationFromRequire( - 'pl', - require('../../../build/i18n/pl.json') - ); - - registry.registerLocalizationFromRequire( - 'tr', - require('../../../build/i18n/tr.json') - ); + async registerLocalizations(registry: LocalizationRegistry): Promise<void> { + for (const [locale, module] of Object.entries(this.locales)) { + registry.registerLocalizationFromRequire(locale, module); + } } } diff --git a/arduino-ide-extension/src/node/i18n/localization-backend-contribution.ts b/arduino-ide-extension/src/node/i18n/localization-backend-contribution.ts deleted file mode 100644 index e5bc11f03..000000000 --- a/arduino-ide-extension/src/node/i18n/localization-backend-contribution.ts +++ /dev/null @@ -1,45 +0,0 @@ -import * as express from 'express'; -import { inject, injectable } from '@theia/core/shared/inversify'; -import { LocalizationBackendContribution as TheiaLocalizationBackendContribution } from '@theia/core/lib/node/i18n/localization-backend-contribution'; -import { PluginDeployer } from '@theia/plugin-ext/lib/common/plugin-protocol'; -import { PluginDeployerImpl } from '@theia/plugin-ext/lib/main/node/plugin-deployer-impl'; -import { Deferred } from '@theia/core/lib/common/promise-util'; - -@injectable() -export class LocalizationBackendContribution extends TheiaLocalizationBackendContribution { - @inject(PluginDeployer) - private readonly pluginDeployer: PluginDeployerImpl; - - private readonly initialized = new Deferred<void>(); - - override async initialize(): Promise<void> { - this.pluginDeployer.onDidDeploy(() => { - this.initialized.resolve(); - }); - return super.initialize(); - } - - override configure(app: express.Application): void { - app.get('/i18n/:locale', async (req, res) => { - let locale = req.params.locale; - /* - Waiting for the deploy of the language plugins is neecessary to avoid checking the available - languages before they're finished to be loaded: https://github.com/eclipse-theia/theia/issues/11471 - */ - const start = performance.now(); - await this.initialized.promise; - console.info( - 'Waiting for the deploy of the language plugins took: ' + - (performance.now() - start) + - ' ms.' - ); - locale = this.localizationProvider - .getAvailableLanguages() - .some((e) => e.languageId === locale) - ? locale - : 'en'; - this.localizationProvider.setCurrentLanguage(locale); - res.send(this.localizationProvider.loadLocalization(locale)); - }); - } -} diff --git a/arduino-ide-extension/src/node/is-temp-sketch.ts b/arduino-ide-extension/src/node/is-temp-sketch.ts index 5c62716e9..dc65a2faf 100644 --- a/arduino-ide-extension/src/node/is-temp-sketch.ts +++ b/arduino-ide-extension/src/node/is-temp-sketch.ts @@ -1,19 +1,19 @@ -import * as fs from 'fs'; -import * as tempDir from 'temp-dir'; +import fs from 'node:fs'; +import tempDir from 'temp-dir'; import { isWindows, isOSX } from '@theia/core/lib/common/os'; import { injectable } from '@theia/core/shared/inversify'; import { firstToLowerCase } from '../common/utils'; -const Win32DriveRegex = /^[a-zA-Z]:\\/; +export const Win32DriveRegex = /^[a-zA-Z]:\\/; export const TempSketchPrefix = '.arduinoIDE-unsaved'; @injectable() export class IsTempSketch { // If on macOS, the `temp-dir` lib will make sure there is resolved realpath. - // If on Windows, the `C:\Users\KITTAA~1\AppData\Local\Temp` path will be resolved and normalized to `C:\Users\kittaakos\AppData\Local\Temp`. + // If on Windows, the `C:\Users\KITTAA~1\AppData\Local\Temp` path will be resolved and normalized to `c:\Users\kittaakos\AppData\Local\Temp`. // Note: VS Code URI normalizes the drive letter. `C:` will be converted into `c:`. // https://github.com/Microsoft/vscode/issues/68325#issuecomment-462239992 - private readonly tempDirRealpath = isOSX + readonly tempDirRealpath = isOSX ? tempDir : maybeNormalizeDrive(fs.realpathSync.native(tempDir)); diff --git a/arduino-ide-extension/src/node/library-service-impl.ts b/arduino-ide-extension/src/node/library-service-impl.ts index c7f1c28b4..1b447bb4c 100644 --- a/arduino-ide-extension/src/node/library-service-impl.ts +++ b/arduino-ide-extension/src/node/library-service-impl.ts @@ -1,4 +1,17 @@ -import { injectable, inject } from '@theia/core/shared/inversify'; +import { ILogger, notEmpty } from '@theia/core'; +import { FileUri } from '@theia/core/lib/node'; +import { inject, injectable } from '@theia/core/shared/inversify'; +import { duration } from '../common/decorators'; +import { + NotificationServiceServer, + ResponseService, + sortComponents, + SortGroup, +} from '../common/protocol'; +import { + Installable, + libraryInstallFailed, +} from '../common/protocol/installable'; import { LibraryDependency, LibraryLocation, @@ -6,29 +19,25 @@ import { LibrarySearch, LibraryService, } from '../common/protocol/library-service'; -import { CoreClientAware } from './core-client-provider'; import { BoardDiscovery } from './board-discovery'; import { InstalledLibrary, Library, + LibraryInstallLocation, LibraryInstallRequest, LibraryListRequest, LibraryListResponse, LibraryLocation as GrpcLibraryLocation, LibraryRelease, LibraryResolveDependenciesRequest, - LibraryUninstallRequest, - ZipLibraryInstallRequest, LibrarySearchRequest, LibrarySearchResponse, - LibraryInstallLocation, + LibraryUninstallRequest, + ZipLibraryInstallRequest, } from './cli-protocol/cc/arduino/cli/commands/v1/lib_pb'; -import { Installable } from '../common/protocol/installable'; -import { ILogger, notEmpty } from '@theia/core'; -import { FileUri } from '@theia/core/lib/node'; -import { ResponseService, NotificationServiceServer } from '../common/protocol'; +import { CoreClientAware } from './core-client-provider'; import { ExecuteWithProgress } from './grpc-progressible'; -import { duration } from '../common/decorators'; +import { ServiceError } from './service-error'; @injectable() export class LibraryServiceImpl @@ -66,14 +75,15 @@ export class LibraryServiceImpl if (installedLib.hasLibrary()) { const lib = installedLib.getLibrary(); if (lib) { - installedLibsIdx.set(lib.getRealName(), installedLib); + installedLibsIdx.set(lib.getName(), installedLib); } } } const req = new LibrarySearchRequest(); - req.setQuery(options.query || ''); + req.setSearchArgs(options.query || ''); req.setInstance(instance); + req.setOmitReleasesDetails(true); const resp = await new Promise<LibrarySearchResponse>((resolve, reject) => client.librarySearch(req, (err, resp) => !!err ? reject(err) : resolve(resp) @@ -83,11 +93,8 @@ export class LibraryServiceImpl .getLibrariesList() .filter((item) => !!item.getLatest()) .map((item) => { - // TODO: This seems to contain only the latest item instead of all of the items. const availableVersions = item - .getReleasesMap() - .getEntryList() - .map(([key, _]) => key) + .getAvailableVersionsList() .sort(Installable.Version.COMPARATOR) .reverse(); let installedVersion: string | undefined; @@ -98,7 +105,6 @@ export class LibraryServiceImpl return toLibrary( { name: item.getName(), - installable: true, installedVersion, }, item.getLatest()!, @@ -108,7 +114,10 @@ export class LibraryServiceImpl const typePredicate = this.typePredicate(options); const topicPredicate = this.topicPredicate(options); - return items.filter((item) => typePredicate(item) && topicPredicate(item)); + const libraries = items.filter( + (item) => typePredicate(item) && topicPredicate(item) + ); + return sortComponents(libraries, librarySortGroup); } private typePredicate( @@ -146,8 +155,10 @@ export class LibraryServiceImpl async list({ fqbn, + libraryName, }: { fqbn?: string | undefined; + libraryName?: string | undefined; }): Promise<LibraryPackage[]> { const coreClient = await this.coreClient; const { client, instance } = coreClient; @@ -158,6 +169,9 @@ export class LibraryServiceImpl req.setAll(true); // https://github.com/arduino/arduino-ide/pull/303#issuecomment-815556447 req.setFqbn(fqbn); } + if (libraryName) { + req.setName(libraryName); + } const resp = await new Promise<LibraryListResponse | undefined>( (resolve, reject) => { @@ -210,11 +224,9 @@ export class LibraryServiceImpl return toLibrary( { name: library.getName(), - label: library.getRealName(), installedVersion, - installable: true, - description: library.getSentence(), - summary: library.getParagraph(), + description: library.getParagraph(), + summary: library.getSentence(), moreInfoLink: library.getWebsite(), includes: library.getProvidesIncludesList(), location: this.mapLocation(library.getLocation()), @@ -264,7 +276,12 @@ export class LibraryServiceImpl (resolve, reject) => { client.libraryResolveDependencies(req, (error, resp) => { if (error) { - reject(error); + console.error('Failed to list library dependencies', error); + // If a gRPC service error, it removes the code and the number to provider more readable error message to the user. + const unwrappedError = ServiceError.is(error) + ? new Error(error.details) + : error; + reject(unwrappedError); return; } resolve( @@ -336,9 +353,7 @@ export class LibraryServiceImpl }); resp.on('error', (error) => { this.responseService.appendToOutput({ - chunk: `Failed to install library: ${item.name}${ - version ? `:${version}` : '' - }.\n`, + chunk: `${libraryInstallFailed(item.name, version)}\n`, }); this.responseService.appendToOutput({ chunk: `${error.toString()}\n`, @@ -374,22 +389,26 @@ export class LibraryServiceImpl // stop the board discovery await this.boardDiscovery.stop(); - - const resp = client.zipLibraryInstall(req); - resp.on( - 'data', - ExecuteWithProgress.createDataCallback({ - progressId, - responseService: this.responseService, - }) - ); - await new Promise<void>((resolve, reject) => { - resp.on('end', () => { - this.boardDiscovery.start(); // TODO: remove discovery dependency from boards service. See https://github.com/arduino/arduino-ide/pull/1107 why this is here. - resolve(); + try { + const resp = client.zipLibraryInstall(req); + resp.on( + 'data', + ExecuteWithProgress.createDataCallback({ + progressId, + responseService: this.responseService, + }) + ); + await new Promise<void>((resolve, reject) => { + resp.on('end', resolve); + resp.on('error', reject); }); - resp.on('error', reject); - }); + await this.refresh(); // let the CLI re-scan the libraries + this.notificationServer.notifyLibraryDidInstall({ + item: 'zip-install', + }); + } finally { + this.boardDiscovery.start(); // TODO: remove discovery dependency from boards service. See https://github.com/arduino/arduino-ide/pull/1107 why this is here. + } } async uninstall(options: { @@ -443,20 +462,28 @@ function toLibrary( ): LibraryPackage { return { name: '', - label: '', exampleUris: [], - installable: false, - deprecated: false, - location: 0, + location: LibraryLocation.BUILTIN, ...pkg, author: lib.getAuthor(), availableVersions, includes: lib.getProvidesIncludesList(), - description: lib.getSentence(), + description: lib.getParagraph(), moreInfoLink: lib.getWebsite(), - summary: lib.getParagraph(), + summary: lib.getSentence(), category: lib.getCategory(), types: lib.getTypesList(), }; } + +// Libraries do not have a deprecated property. The deprecated information is inferred if 'Retired' is in 'types' +function librarySortGroup(library: LibraryPackage): SortGroup { + const types: string[] = []; + for (const type of ['Arduino', 'Retired']) { + if (library.types.includes(type)) { + types.push(type); + } + } + return types.join('-') as SortGroup; +} diff --git a/arduino-ide-extension/src/node/monitor-manager-proxy-impl.ts b/arduino-ide-extension/src/node/monitor-manager-proxy-impl.ts index 7f284ac3f..2cce8b81b 100644 --- a/arduino-ide-extension/src/node/monitor-manager-proxy-impl.ts +++ b/arduino-ide-extension/src/node/monitor-manager-proxy-impl.ts @@ -2,14 +2,11 @@ import { inject, injectable } from '@theia/core/shared/inversify'; import { MonitorManagerProxy, MonitorManagerProxyClient, - Status, + MonitorSettings, + PluggableMonitorSettings, } from '../common/protocol'; import { Board, Port } from '../common/protocol'; import { MonitorManager } from './monitor-manager'; -import { - MonitorSettings, - PluggableMonitorSettings, -} from './monitor-settings/monitor-settings-provider'; @injectable() export class MonitorManagerProxyImpl implements MonitorManagerProxy { @@ -41,11 +38,16 @@ export class MonitorManagerProxyImpl implements MonitorManagerProxy { await this.changeMonitorSettings(board, port, settings); } - const connectToClient = (status: Status) => { - if (status === Status.ALREADY_CONNECTED || status === Status.OK) { - // Monitor started correctly, connect it with the frontend - this.client.connect(this.manager.getWebsocketAddressPort(board, port)); + const connectToClient = async () => { + const address = this.manager.getWebsocketAddressPort(board, port); + if (!this.client) { + throw new Error( + `No client was connected to this monitor manager. Board: ${ + board.fqbn ?? board.name + }, port: ${port.address}, address: ${address}` + ); } + await this.client.connect(address); }; return this.manager.startMonitor(board, port, connectToClient); } diff --git a/arduino-ide-extension/src/node/monitor-manager.ts b/arduino-ide-extension/src/node/monitor-manager.ts index 38360a39f..9931e3937 100644 --- a/arduino-ide-extension/src/node/monitor-manager.ts +++ b/arduino-ide-extension/src/node/monitor-manager.ts @@ -1,13 +1,18 @@ import { ILogger } from '@theia/core'; import { inject, injectable, named } from '@theia/core/shared/inversify'; -import { Board, BoardsService, Port, Status } from '../common/protocol'; -import { CoreClientAware } from './core-client-provider'; -import { MonitorService } from './monitor-service'; -import { MonitorServiceFactory } from './monitor-service-factory'; import { + AlreadyConnectedError, + Board, + BoardsService, MonitorSettings, PluggableMonitorSettings, -} from './monitor-settings/monitor-settings-provider'; + Port, + PortIdentifier, + portIdentifierEquals, +} from '../common/protocol'; +import { CoreClientAware } from './core-client-provider'; +import { MonitorService } from './monitor-service'; +import { MonitorServiceFactory } from './monitor-service-factory'; type MonitorID = string; @@ -36,7 +41,7 @@ export class MonitorManager extends CoreClientAware { private monitorServiceStartQueue: { monitorID: string; serviceStartParams: [Board, Port]; - connectToClient: (status: Status) => void; + connectToClient: () => Promise<void>; }[] = []; @inject(MonitorServiceFactory) @@ -104,7 +109,7 @@ export class MonitorManager extends CoreClientAware { async startMonitor( board: Board, port: Port, - connectToClient: (status: Status) => void + connectToClient: () => Promise<void> ): Promise<void> { const monitorID = this.monitorID(board.fqbn, port); @@ -127,8 +132,14 @@ export class MonitorManager extends CoreClientAware { return; } - const result = await monitor.start(); - connectToClient(result); + try { + await connectToClient(); + await monitor.start(); + } catch (err) { + if (!AlreadyConnectedError.is(err)) { + throw err; + } + } } /** @@ -171,13 +182,7 @@ export class MonitorManager extends CoreClientAware { * @param fqbn the FQBN of the board connected to port * @param port port to monitor */ - async notifyUploadStarted(fqbn?: string, port?: Port): Promise<void> { - if (!fqbn || !port) { - // We have no way of knowing which monitor - // to retrieve if we don't have this information. - return; - } - + async notifyUploadStarted(fqbn: string, port: PortIdentifier): Promise<void> { const monitorID = this.monitorID(fqbn, port); this.addToMonitorIDsByUploadState('uploadInProgress', monitorID); @@ -195,44 +200,45 @@ export class MonitorManager extends CoreClientAware { * Notifies the monitor service of that board/port combination * that an upload process started on that exact board/port combination. * @param fqbn the FQBN of the board connected to port - * @param port port to monitor + * @param beforePort port to monitor * @returns a Status object to know if the process has been * started or if there have been errors. */ async notifyUploadFinished( - fqbn?: string | undefined, - port?: Port - ): Promise<Status> { - let status: Status = Status.NOT_CONNECTED; + fqbn: string | undefined, + beforePort: PortIdentifier, + afterPort: PortIdentifier + ): Promise<void> { let portDidChangeOnUpload = false; + const beforeMonitorID = this.monitorID(fqbn, beforePort); + this.removeFromMonitorIDsByUploadState('uploadInProgress', beforeMonitorID); - // We have no way of knowing which monitor - // to retrieve if we don't have this information. - if (fqbn && port) { - const monitorID = this.monitorID(fqbn, port); - this.removeFromMonitorIDsByUploadState('uploadInProgress', monitorID); - - const monitor = this.monitorServices.get(monitorID); - if (monitor) { - status = await monitor.start(); + const monitor = this.monitorServices.get(beforeMonitorID); + if (monitor) { + if (portIdentifierEquals(beforePort, afterPort)) { + await monitor.start(); + } else { + await monitor.stop(); } + } - // this monitorID will only be present in "disposedForUpload" - // if the upload changed the board port - portDidChangeOnUpload = this.monitorIDIsInUploadState( + // this monitorID will only be present in "disposedForUpload" + // if the upload changed the board port + portDidChangeOnUpload = this.monitorIDIsInUploadState( + 'disposedForUpload', + beforeMonitorID + ); + if (portDidChangeOnUpload) { + this.removeFromMonitorIDsByUploadState( 'disposedForUpload', - monitorID + beforeMonitorID ); - if (portDidChangeOnUpload) { - this.removeFromMonitorIDsByUploadState('disposedForUpload', monitorID); - } - - // in case a service was paused but not disposed - this.removeFromMonitorIDsByUploadState('pausedForUpload', monitorID); } + // in case a service was paused but not disposed + this.removeFromMonitorIDsByUploadState('pausedForUpload', beforeMonitorID); + await this.startQueuedServices(portDidChangeOnUpload); - return status; } async startQueuedServices(portDidChangeOnUpload: boolean): Promise<void> { @@ -246,10 +252,10 @@ export class MonitorManager extends CoreClientAware { for (const { monitorID, - serviceStartParams: [_, port], + serviceStartParams: [, port], connectToClient, } of queued) { - const boardsState = await this.boardsService.getState(); + const boardsState = await this.boardsService.getDetectedPorts(); const boardIsStillOnPort = Object.keys(boardsState) .map((connection: string) => { const portAddress = connection.split('|')[0]; @@ -261,8 +267,8 @@ export class MonitorManager extends CoreClientAware { const monitorService = this.monitorServices.get(monitorID); if (monitorService) { - const result = await monitorService.start(); - connectToClient(result); + await connectToClient(); + await monitorService.start(); } } } @@ -348,7 +354,7 @@ export class MonitorManager extends CoreClientAware { * @param port * @returns a unique monitor ID */ - private monitorID(fqbn: string | undefined, port: Port): MonitorID { + private monitorID(fqbn: string | undefined, port: PortIdentifier): MonitorID { const splitFqbn = fqbn?.split(':') || []; const shortenedFqbn = splitFqbn.slice(0, 3).join(':') || ''; return `${shortenedFqbn}-${port.address}-${port.protocol}`; diff --git a/arduino-ide-extension/src/node/monitor-service.ts b/arduino-ide-extension/src/node/monitor-service.ts index 62d126f7f..99145fddc 100644 --- a/arduino-ide-extension/src/node/monitor-service.ts +++ b/arduino-ide-extension/src/node/monitor-service.ts @@ -1,25 +1,46 @@ -import { ClientDuplexStream } from '@grpc/grpc-js'; -import { Disposable, Emitter, ILogger } from '@theia/core'; +import { ClientDuplexStream, status } from '@grpc/grpc-js'; +import { + ApplicationError, + Disposable, + Emitter, + ILogger, + nls, +} from '@theia/core'; import { inject, named, postConstruct } from '@theia/core/shared/inversify'; -import { Board, Port, Status, Monitor } from '../common/protocol'; +import { + Board, + Port, + Monitor, + createAlreadyConnectedError, + createMissingConfigurationError, + createNotConnectedError, + createConnectionFailedError, + isMonitorConnected, + MonitorSettings, + PluggableMonitorSettings, +} from '../common/protocol'; import { EnumerateMonitorPortSettingsRequest, EnumerateMonitorPortSettingsResponse, - MonitorPortConfiguration, - MonitorPortSetting, + MonitorPortOpenRequest, MonitorRequest, MonitorResponse, } from './cli-protocol/cc/arduino/cli/commands/v1/monitor_pb'; import { CoreClientAware } from './core-client-provider'; import { WebSocketProvider } from './web-socket/web-socket-provider'; -import { Port as RpcPort } from 'arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/port_pb'; +import { Port as RpcPort } from './cli-protocol/cc/arduino/cli/commands/v1/port_pb'; +import { MonitorSettingsProvider } from './monitor-settings/monitor-settings-provider'; import { - MonitorSettings, - PluggableMonitorSettings, - MonitorSettingsProvider, -} from './monitor-settings/monitor-settings-provider'; -import { Deferred } from '@theia/core/lib/common/promise-util'; + Deferred, + retry, + timeoutReject, +} from '@theia/core/lib/common/promise-util'; import { MonitorServiceFactoryOptions } from './monitor-service-factory'; +import { ServiceError } from './service-error'; +import { + MonitorPortConfiguration, + MonitorPortSetting, +} from './cli-protocol/cc/arduino/cli/commands/v1/common_pb'; export const MonitorServiceName = 'monitor-service'; type DuplexHandlerKeys = @@ -75,10 +96,20 @@ export class MonitorService extends CoreClientAware implements Disposable { readonly onDispose = this.onDisposeEmitter.event; private _initialized = new Deferred<void>(); - private creating: Deferred<Status>; + private creating: Deferred<void>; private readonly board: Board; private readonly port: Port; private readonly monitorID: string; + private readonly streamingTextDecoder = new TextDecoder('utf8'); + + /** + * The lightweight representation of the port configuration currently in use for the running monitor. + * IDE2 stores this object after starting the monitor. On every monitor settings change request, IDE2 compares + * the current config with the new settings, and only sends the diff as the new config to overcome https://github.com/arduino/arduino-ide/issues/375. + */ + private currentPortConfigSnapshot: + | MonitorPortConfiguration.AsObject + | undefined; constructor( @inject(MonitorServiceFactoryOptions) options: MonitorServiceFactoryOptions @@ -103,7 +134,7 @@ export class MonitorService extends CoreClientAware implements Disposable { this.updateClientsSettings(this.settings); }); - this.portMonitorSettings(this.port.protocol, this.board.fqbn!).then( + this.portMonitorSettings(this.port.protocol, this.board.fqbn!, true).then( async (settings) => { this.settings = { ...this.settings, @@ -143,88 +174,128 @@ export class MonitorService extends CoreClientAware implements Disposable { /** * Start and connects a monitor using currently set board and port. - * If a monitor is already started or board fqbn, port address and/or protocol - * are missing nothing happens. - * @returns a status to verify connection has been established. + * If a monitor is already started, the promise will reject with an `AlreadyConnectedError`. + * If the board fqbn, port address and/or protocol are missing, the promise rejects with a `MissingConfigurationError`. */ - async start(): Promise<Status> { + async start(): Promise<void> { if (this.creating?.state === 'unresolved') return this.creating.promise; this.creating = new Deferred(); if (this.duplex) { this.updateClientsSettings({ - monitorUISettings: { connected: true, serialPort: this.port.address }, + monitorUISettings: { + connectionStatus: 'connected', + connected: true, // TODO: should be removed when plotter app understand the `connectionStatus` message + serialPort: this.port.address, + }, }); - this.creating.resolve(Status.ALREADY_CONNECTED); + this.creating.reject(createAlreadyConnectedError(this.port)); return this.creating.promise; } if (!this.board?.fqbn || !this.port?.address || !this.port?.protocol) { - this.updateClientsSettings({ monitorUISettings: { connected: false } }); + this.updateClientsSettings({ + monitorUISettings: { + connectionStatus: 'not-connected', + connected: false, // TODO: should be removed when plotter app understand the `connectionStatus` message + }, + }); - this.creating.resolve(Status.CONFIG_MISSING); + this.creating.reject(createMissingConfigurationError(this.port)); return this.creating.promise; } this.logger.info('starting monitor'); - // get default monitor settings from the CLI - const defaultSettings = await this.portMonitorSettings( - this.port.protocol, - this.board.fqbn - ); - // get actual settings from the settings provider - this.settings = { - ...this.settings, - pluggableMonitorSettings: { - ...this.settings.pluggableMonitorSettings, - ...(await this.monitorSettingsProvider.getSettings( - this.monitorID, - defaultSettings - )), - }, - }; + try { + // get default monitor settings from the CLI + const defaultSettings = await this.portMonitorSettings( + this.port.protocol, + this.board.fqbn + ); - const coreClient = await this.coreClient; + this.updateClientsSettings({ + monitorUISettings: { connectionStatus: 'connecting' }, + }); - const { instance } = coreClient; - const monitorRequest = new MonitorRequest(); - monitorRequest.setInstance(instance); - if (this.board?.fqbn) { - monitorRequest.setFqbn(this.board.fqbn); - } - if (this.port?.address && this.port?.protocol) { - const rpcPort = new RpcPort(); - rpcPort.setAddress(this.port.address); - rpcPort.setProtocol(this.port.protocol); - monitorRequest.setPort(rpcPort); - } - const config = new MonitorPortConfiguration(); - for (const id in this.settings.pluggableMonitorSettings) { - const s = new MonitorPortSetting(); - s.setSettingId(id); - s.setValue(this.settings.pluggableMonitorSettings[id].selectedValue); - config.addSettings(s); - } - monitorRequest.setPortConfiguration(config); + // get actual settings from the settings provider + this.settings = { + ...this.settings, + pluggableMonitorSettings: { + ...this.settings.pluggableMonitorSettings, + ...(await this.monitorSettingsProvider.getSettings( + this.monitorID, + defaultSettings + )), + }, + }; - const wroteToStreamSuccessfully = await this.pollWriteToStream( - monitorRequest - ); - if (wroteToStreamSuccessfully) { + const coreClient = await this.coreClient; + + const { instance } = coreClient; + const openPortRequest = new MonitorPortOpenRequest(); + openPortRequest.setInstance(instance); + if (this.board?.fqbn) { + openPortRequest.setFqbn(this.board.fqbn); + } + if (this.port?.address && this.port?.protocol) { + const rpcPort = new RpcPort(); + rpcPort.setAddress(this.port.address); + rpcPort.setProtocol(this.port.protocol); + openPortRequest.setPort(rpcPort); + } + const config = new MonitorPortConfiguration(); + for (const id in this.settings.pluggableMonitorSettings) { + const s = new MonitorPortSetting(); + s.setSettingId(id); + s.setValue(this.settings.pluggableMonitorSettings[id].selectedValue); + config.addSettings(s); + } + openPortRequest.setPortConfiguration(config); + + await this.pollWriteToStream(openPortRequest); + // Only store the config, if the monitor has successfully started. + this.currentPortConfigSnapshot = MonitorPortConfiguration.toObject( + false, + config + ); + this.logger.info( + `Using port configuration for ${this.port.protocol}:${ + this.port.address + }: ${JSON.stringify(this.currentPortConfigSnapshot)}` + ); this.startMessagesHandlers(); this.logger.info( `started monitor to ${this.port?.address} using ${this.port?.protocol}` ); this.updateClientsSettings({ - monitorUISettings: { connected: true, serialPort: this.port.address }, + monitorUISettings: { + connectionStatus: 'connected', + connected: true, // TODO: should be removed when plotter app understand the `connectionStatus` message + serialPort: this.port.address, + }, }); - this.creating.resolve(Status.OK); + this.creating.resolve(); return this.creating.promise; - } else { + } catch (err) { this.logger.warn( `failed starting monitor to ${this.port?.address} using ${this.port?.protocol}` ); - this.creating.resolve(Status.NOT_CONNECTED); + const appError = ApplicationError.is(err) + ? err + : createConnectionFailedError( + this.port, + ServiceError.is(err) + ? err.details + : err instanceof Error + ? err.message + : String(err) + ); + this.creating.reject(appError); + this.updateClientsSettings({ + monitorUISettings: { + connectionStatus: { errorMessage: appError.message }, + }, + }); return this.creating.promise; } } @@ -243,19 +314,29 @@ export class MonitorService extends CoreClientAware implements Disposable { // default handlers duplex .on('close', () => { - this.duplex = null; - this.updateClientsSettings({ - monitorUISettings: { connected: false }, - }); + if (duplex === this.duplex) { + this.duplex = null; + this.updateClientsSettings({ + monitorUISettings: { + connected: false, // TODO: should be removed when plotter app understand the `connectionStatus` message + connectionStatus: 'not-connected', + }, + }); + } this.logger.info( `monitor to ${this.port?.address} using ${this.port?.protocol} closed by client` ); }) .on('end', () => { - this.duplex = null; - this.updateClientsSettings({ - monitorUISettings: { connected: false }, - }); + if (duplex === this.duplex) { + this.duplex = null; + this.updateClientsSettings({ + monitorUISettings: { + connected: false, // TODO: should be removed when plotter app understand the `connectionStatus` message + connectionStatus: 'not-connected', + }, + }); + } this.logger.info( `monitor to ${this.port?.address} using ${this.port?.protocol} closed by server` ); @@ -266,21 +347,17 @@ export class MonitorService extends CoreClientAware implements Disposable { } } - pollWriteToStream(request: MonitorRequest): Promise<boolean> { - let attemptsRemaining = MAX_WRITE_TO_STREAM_TRIES; - const writeTimeoutMs = WRITE_TO_STREAM_TIMEOUT_MS; - + pollWriteToStream(request: MonitorPortOpenRequest): Promise<void> { const createWriteToStreamExecutor = (duplex: ClientDuplexStream<MonitorRequest, MonitorResponse>) => - (resolve: (value: boolean) => void, reject: () => void) => { + (resolve: () => void, reject: (reason?: unknown) => void) => { const resolvingDuplexHandlers: DuplexHandler[] = [ { key: 'error', callback: async (err: Error) => { this.logger.error(err); - resolve(false); - // TODO - // this.theiaFEClient?.notifyError() + const details = ServiceError.is(err) ? err.details : err.message; + reject(createConnectionFailedError(this.port, details)); }, }, { @@ -292,81 +369,51 @@ export class MonitorService extends CoreClientAware implements Disposable { return; } if (monitorResponse.getSuccess()) { - resolve(true); + resolve(); return; } const data = monitorResponse.getRxData(); const message = typeof data === 'string' ? data - : new TextDecoder('utf8').decode(data); + : this.streamingTextDecoder.decode(data, { stream: true }); this.messages.push(...splitLines(message)); }, }, ]; this.setDuplexHandlers(duplex, resolvingDuplexHandlers); - - setTimeout(() => { - reject(); - }, writeTimeoutMs); - duplex.write(request); + duplex.write(new MonitorRequest().setOpenRequest(request)); }; - const pollWriteToStream = new Promise<boolean>((resolve) => { - const startPolling = async () => { - // here we create a new duplex but we don't yet - // set "this.duplex", nor do we use "this.duplex" in our poll - // as duplex 'end' / 'close' events (which we do not "await") - // will set "this.duplex" to null - const createdDuplex = await this.createDuplex(); - - let pollingIsSuccessful; - // attempt a "writeToStream" and "await" CLI response: success (true) or error (false) - // if we get neither within WRITE_TO_STREAM_TIMEOUT_MS or an error we get undefined - try { - const writeToStream = createWriteToStreamExecutor(createdDuplex); - pollingIsSuccessful = await new Promise(writeToStream); - } catch (error) { - this.logger.error(error); - } - - // CLI confirmed port opened successfully - if (pollingIsSuccessful) { - this.duplex = createdDuplex; - resolve(true); - return; - } - - // if "pollingIsSuccessful" is false - // the CLI gave us an error, lets try again - // after waiting 2 seconds if we've not already - // reached MAX_WRITE_TO_STREAM_TRIES - if (pollingIsSuccessful === false) { - attemptsRemaining -= 1; - if (attemptsRemaining > 0) { - setTimeout(startPolling, 2000); - return; - } else { - resolve(false); - return; + return Promise.race([ + retry( + async () => { + let createdDuplex = undefined; + try { + createdDuplex = await this.createDuplex(); + await new Promise<void>(createWriteToStreamExecutor(createdDuplex)); + this.duplex = createdDuplex; + } catch (err) { + createdDuplex?.end(); + throw err; } - } - - // "pollingIsSuccessful" remains undefined: - // we got no response from the CLI within 30 seconds - // resolve to false and end the duplex connection - resolve(false); - createdDuplex.end(); - return; - }; - - startPolling(); - }); - - return pollWriteToStream; + }, + 2_000, + MAX_WRITE_TO_STREAM_TRIES + ), + timeoutReject( + WRITE_TO_STREAM_TIMEOUT_MS, + nls.localize( + 'arduino/monitor/connectionTimeout', + "Timeout. The IDE has not received the 'success' message from the monitor after successfully connecting to it" + ) + ), + ]) as Promise<unknown> as Promise<void>; } + private endingDuplex: Promise<void> | undefined; + /** * Pauses the currently running monitor, it still closes the gRPC connection * with the underlying monitor process but it doesn't stop the message handlers @@ -376,29 +423,43 @@ export class MonitorService extends CoreClientAware implements Disposable { * @returns */ async pause(): Promise<void> { - return new Promise(async (resolve) => { - if (!this.duplex) { - this.logger.warn( - `monitor to ${this.port?.address} using ${this.port?.protocol} already stopped` - ); - return resolve(); - } - // It's enough to close the connection with the client - // to stop the monitor process - this.duplex.end(); - this.logger.info( - `stopped monitor to ${this.port?.address} using ${this.port?.protocol}` + const duplex = this.duplex; + if (!duplex) { + this.logger.warn( + `monitor to ${this.port?.address} using ${this.port?.protocol} already stopped` ); + return; + } + if (this.endingDuplex) { + return this.endingDuplex; + } + const deferredEnd = new Deferred<void>(); + this.endingDuplex = deferredEnd.promise; - this.duplex.on('end', resolve); + // to terminate the monitor connection, send a close request, and wait for the end event + duplex.once('end', () => { + deferredEnd.resolve(); }); + try { + await new Promise((resolve) => + duplex.write(new MonitorRequest().setClose(true), resolve) + ); + await this.endingDuplex; + } finally { + this.endingDuplex = undefined; + } + // Sanity check + // Duplexes are allowed to be half open, check whether the monitor server (the readable) has ended + if (!duplex.readableEnded) { + throw new Error('Could not end the monitor connection'); + } } /** * Stop the monitor currently running */ async stop(): Promise<void> { - return this.pause().finally(this.stopMessagesHandlers.bind(this)); + return this.pause().finally(() => this.stopMessagesHandlers()); } /** @@ -408,24 +469,18 @@ export class MonitorService extends CoreClientAware implements Disposable { * @param message string sent to running monitor * @returns a status to verify message has been sent. */ - async send(message: string): Promise<Status> { + async send(message: string): Promise<void> { if (!this.duplex) { - return Status.NOT_CONNECTED; + throw createNotConnectedError(this.port); } - const coreClient = await this.coreClient; - const { instance } = coreClient; - const req = new MonitorRequest(); - req.setInstance(instance); req.setTxData(new TextEncoder().encode(message)); - return new Promise<Status>((resolve) => { + return new Promise<void>((resolve, reject) => { if (this.duplex) { - this.duplex?.write(req, () => { - resolve(Status.OK); - }); + this.duplex?.write(req, resolve); return; } - this.stop().then(() => resolve(Status.NOT_CONNECTED)); + this.stop().then(() => reject(createNotConnectedError(this.port))); }); } @@ -448,7 +503,8 @@ export class MonitorService extends CoreClientAware implements Disposable { */ private async portMonitorSettings( protocol: string, - fqbn: string + fqbn: string, + swallowsPlatformNotFoundError = false ): Promise<PluggableMonitorSettings> { const coreClient = await this.coreClient; const { client, instance } = coreClient; @@ -457,19 +513,33 @@ export class MonitorService extends CoreClientAware implements Disposable { req.setPortProtocol(protocol); req.setFqbn(fqbn); - const res = await new Promise<EnumerateMonitorPortSettingsResponse>( - (resolve, reject) => { - client.enumerateMonitorPortSettings(req, (err, resp) => { - if (!!err) { - reject(err); + const resp = await new Promise< + EnumerateMonitorPortSettingsResponse | undefined + >((resolve, reject) => { + client.enumerateMonitorPortSettings(req, async (err, resp) => { + if (err) { + // Check whether the platform is installed: https://github.com/arduino/arduino-ide/issues/1974. + // No error codes. Look for `Unknown FQBN: platform arduino:mbed_nano is not installed` message similarities: https://github.com/arduino/arduino-cli/issues/1762. + if ( + swallowsPlatformNotFoundError && + ServiceError.is(err) && + err.code === status.NOT_FOUND && + err.details.includes('FQBN') && + err.details.includes(fqbn.split(':', 2).join(':')) // create a platform ID from the FQBN + ) { + resolve(undefined); } - resolve(resp); - }); - } - ); + reject(err); + } + resolve(resp); + }); + }); const settings: PluggableMonitorSettings = {}; - for (const iterator of res.getSettingsList()) { + if (!resp) { + return settings; + } + for (const iterator of resp.getSettingsList()) { settings[iterator.getSettingId()] = { id: iterator.getSettingId(), label: iterator.getLabel(), @@ -489,7 +559,7 @@ export class MonitorService extends CoreClientAware implements Disposable { * @param settings map of monitor settings to change * @returns a status to verify settings have been sent. */ - async changeSettings(settings: MonitorSettings): Promise<Status> { + async changeSettings(settings: MonitorSettings): Promise<void> { const config = new MonitorPortConfiguration(); const { pluggableMonitorSettings } = settings; const reconciledSettings = await this.monitorSettingsProvider.setSettings( @@ -506,26 +576,132 @@ export class MonitorService extends CoreClientAware implements Disposable { } } + const connectionStatus = Boolean(this.duplex) + ? 'connected' + : 'not-connected'; this.updateClientsSettings({ monitorUISettings: { ...settings.monitorUISettings, - connected: !!this.duplex, + connectionStatus, serialPort: this.port.address, + connected: isMonitorConnected(connectionStatus), // TODO: should be removed when plotter app understand the `connectionStatus` message }, pluggableMonitorSettings: reconciledSettings, }); if (!this.duplex) { - return Status.NOT_CONNECTED; + // instead of throwing an error, return silently like the original logic + // https://github.com/arduino/arduino-ide/blob/9b49712669b06c97bda68a1e5f04eee4664c13f8/arduino-ide-extension/src/node/monitor-service.ts#L540 + return; + } + + const diffConfig = await this.maybeUpdatePortConfigSnapshot(config); + if (!diffConfig) { + this.logger.info( + `No port configuration changes have been detected. No need to send configure commands to the running monitor ${this.port.protocol}:${this.port.address}.` + ); + return; } - const coreClient = await this.coreClient; - const { instance } = coreClient; + this.logger.info( + `Sending monitor request with new port configuration: ${JSON.stringify( + MonitorPortConfiguration.toObject(false, diffConfig) + )}` + ); const req = new MonitorRequest(); - req.setInstance(instance); - req.setPortConfiguration(config); + req.setUpdatedConfiguration(diffConfig); this.duplex.write(req); - return Status.OK; + } + + /** + * Function to calculate a diff between the `otherPortConfig` argument and the `currentPortConfigSnapshot`. + * + * If the current config snapshot and the snapshot derived from `otherPortConfig` are the same, no snapshot update happens, + * and the function returns with undefined. Otherwise, the current snapshot config value will be updated from the snapshot + * derived from the `otherPortConfig` argument, and this function returns with a `MonitorPortConfiguration` instance + * representing only the difference between the two snapshot configs to avoid sending unnecessary monitor to configure commands to the CLI. + * See [#1703 (comment)](https://github.com/arduino/arduino-ide/pull/1703#issuecomment-1327913005) for more details. + */ + private async maybeUpdatePortConfigSnapshot( + otherPortConfig: MonitorPortConfiguration + ): Promise<MonitorPortConfiguration | undefined> { + const otherPortConfigSnapshot = MonitorPortConfiguration.toObject( + false, + otherPortConfig + ); + if (!this.currentPortConfigSnapshot) { + throw new Error( + `The current port configuration object was undefined when tried to merge in ${JSON.stringify( + otherPortConfigSnapshot + )}.` + ); + } + + const justDiff = await import('just-diff'); + const snapshotDiff = justDiff.diff( + this.currentPortConfigSnapshot, + otherPortConfigSnapshot + ); + if (!snapshotDiff.length) { + return undefined; + } + + const diffConfig = snapshotDiff.reduce((acc, curr) => { + if (!this.isValidMonitorPortSettingChange(curr)) { + throw new Error( + `Expected only 'replace' operation: a 'value' change in the 'settingsList'. Calculated diff a ${JSON.stringify( + snapshotDiff + )} between ${JSON.stringify( + this.currentPortConfigSnapshot + )} and ${JSON.stringify( + otherPortConfigSnapshot + )} snapshots. Current JSON-patch entry was ${JSON.stringify(curr)}.` + ); + } + const { path, value } = curr; + const [, index] = path; + if (!this.currentPortConfigSnapshot?.settingsList) { + throw new Error( + `'settingsList' is missing from current port config snapshot: ${JSON.stringify( + this.currentPortConfigSnapshot + )}` + ); + } + const changedSetting = this.currentPortConfigSnapshot.settingsList[index]; + const setting = new MonitorPortSetting(); + setting.setValue(value); + setting.setSettingId(changedSetting.settingId); + acc.addSettings(setting); + return acc; + }, new MonitorPortConfiguration()); + + this.currentPortConfigSnapshot = otherPortConfigSnapshot; + this.logger.info( + `Updated the port configuration for ${this.port.protocol}:${ + this.port.address + }: ${JSON.stringify(this.currentPortConfigSnapshot)}` + ); + return diffConfig; + } + + private isValidMonitorPortSettingChange(entry: { + op: string; + path: (string | number)[]; + value: unknown; + }): entry is { + op: 'replace'; + path: ['settingsList', number, string]; + value: string; + } { + const { op, path, value } = entry; + return ( + op === 'replace' && + path.length === 3 && + path[0] === 'settingsList' && + typeof path[1] === 'number' && + path[2] === 'value' && + typeof value === 'string' + ); } /** @@ -563,6 +739,26 @@ export class MonitorService extends CoreClientAware implements Disposable { updateClientsSettings(settings: MonitorSettings): void { this.settings = { ...this.settings, ...settings }; + if ( + settings.monitorUISettings?.connectionStatus && + !('connected' in settings.monitorUISettings) + ) { + // Make sure the deprecated `connected` prop is set. + settings.monitorUISettings.connected = isMonitorConnected( + settings.monitorUISettings.connectionStatus + ); + } + if ( + typeof settings.monitorUISettings?.connected === 'boolean' && + !('connectionStatus' in settings.monitorUISettings) + ) { + // Set the connectionStatus if the message was sent by the plotter which does not handle the new protocol. Assuming that the plotter can send anything. + // https://github.com/arduino/arduino-serial-plotter-webapp#monitor-settings + settings.monitorUISettings.connectionStatus = settings.monitorUISettings + .connected + ? 'connected' + : 'not-connected'; + } const command: Monitor.Message = { command: Monitor.MiddlewareCommand.ON_SETTINGS_DID_CHANGE, data: settings, diff --git a/arduino-ide-extension/src/node/monitor-settings/monitor-settings-provider-impl.ts b/arduino-ide-extension/src/node/monitor-settings/monitor-settings-provider-impl.ts index cde81cfd6..92d78ae47 100644 --- a/arduino-ide-extension/src/node/monitor-settings/monitor-settings-provider-impl.ts +++ b/arduino-ide-extension/src/node/monitor-settings/monitor-settings-provider-impl.ts @@ -1,19 +1,21 @@ -import * as fs from 'fs'; -import { join } from 'path'; -import { injectable, inject, postConstruct } from 'inversify'; +import fs from 'node:fs'; +import { join } from 'node:path'; +import { + injectable, + inject, + postConstruct, +} from '@theia/core/shared/inversify'; 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 { - PluggableMonitorSettings, - MonitorSettingsProvider, -} from './monitor-settings-provider'; +import { MonitorSettingsProvider } from './monitor-settings-provider'; import { Deferred } from '@theia/core/lib/common/promise-util'; import { longestPrefixMatch, reconcileSettings, } from './monitor-settings-utils'; import { ILogger } from '@theia/core'; +import { PluggableMonitorSettings } from '../../common/protocol'; const MONITOR_SETTINGS_FILE = 'pluggable-monitor-settings.json'; @@ -36,19 +38,21 @@ export class MonitorSettingsProviderImpl implements MonitorSettingsProvider { private pluggableMonitorSettingsPath: string; @postConstruct() - protected async init(): Promise<void> { - // get the monitor settings file path - const configDirUri = await this.envVariablesServer.getConfigDirUri(); - this.pluggableMonitorSettingsPath = join( - FileUri.fsPath(configDirUri), - MONITOR_SETTINGS_FILE - ); + protected init(): void { + (async () => { + // get the monitor settings file path + const configDirUri = await this.envVariablesServer.getConfigDirUri(); + this.pluggableMonitorSettingsPath = join( + FileUri.fsPath(configDirUri), + MONITOR_SETTINGS_FILE + ); - // read existing settings - await this.readSettingsFromFS(); + // read existing settings + await this.readSettingsFromFS(); - // init is done, resolve the deferred and unblock any call that was waiting for it - this.ready.resolve(); + // init is done, resolve the deferred and unblock any call that was waiting for it + this.ready.resolve(); + })(); } async getSettings( @@ -95,7 +99,7 @@ export class MonitorSettingsProviderImpl implements MonitorSettingsProvider { const rawJson = await promisify(fs.readFile)( this.pluggableMonitorSettingsPath, { - encoding: 'utf-8', + encoding: 'utf8', flag: 'a+', // a+ = append and read, creating the file if it doesn't exist } ); diff --git a/arduino-ide-extension/src/node/monitor-settings/monitor-settings-provider.ts b/arduino-ide-extension/src/node/monitor-settings/monitor-settings-provider.ts index e8949a60b..1f9d6eadf 100644 --- a/arduino-ide-extension/src/node/monitor-settings/monitor-settings-provider.ts +++ b/arduino-ide-extension/src/node/monitor-settings/monitor-settings-provider.ts @@ -1,11 +1,4 @@ -import { MonitorModel } from '../../browser/monitor-model'; -import { PluggableMonitorSetting } from '../../common/protocol'; - -export type PluggableMonitorSettings = Record<string, PluggableMonitorSetting>; -export interface MonitorSettings { - pluggableMonitorSettings?: PluggableMonitorSettings; - monitorUISettings?: Partial<MonitorModel.State>; -} +import { PluggableMonitorSettings } from '../../common/protocol'; export const MonitorSettingsProvider = Symbol('MonitorSettingsProvider'); export interface MonitorSettingsProvider { diff --git a/arduino-ide-extension/src/node/monitor-settings/monitor-settings-utils.ts b/arduino-ide-extension/src/node/monitor-settings/monitor-settings-utils.ts index 3bcfc5775..0e9fde8c1 100644 --- a/arduino-ide-extension/src/node/monitor-settings/monitor-settings-utils.ts +++ b/arduino-ide-extension/src/node/monitor-settings/monitor-settings-utils.ts @@ -1,4 +1,4 @@ -import { PluggableMonitorSettings } from './monitor-settings-provider'; +import { PluggableMonitorSettings } from '../../common/protocol'; export function longestPrefixMatch( id: string, diff --git a/arduino-ide-extension/src/node/node-filesystem-ext.ts b/arduino-ide-extension/src/node/node-filesystem-ext.ts index ee728b89e..732b40c5b 100644 --- a/arduino-ide-extension/src/node/node-filesystem-ext.ts +++ b/arduino-ide-extension/src/node/node-filesystem-ext.ts @@ -1,5 +1,5 @@ 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'; @injectable() diff --git a/arduino-ide-extension/src/node/notification-service-server.ts b/arduino-ide-extension/src/node/notification-service-server.ts index 733edb336..bcbdb99d8 100644 --- a/arduino-ide-extension/src/node/notification-service-server.ts +++ b/arduino-ide-extension/src/node/notification-service-server.ts @@ -2,12 +2,15 @@ import { injectable } from '@theia/core/shared/inversify'; import type { NotificationServiceServer, NotificationServiceClient, - AttachedBoardsChangeEvent, BoardsPackage, LibraryPackage, - Config, + ConfigState, Sketch, ProgressMessage, + IndexUpdateWillStartParams, + IndexUpdateDidCompleteParams, + IndexUpdateDidFailParams, + DetectedPorts, } from '../common/protocol'; @injectable() @@ -16,8 +19,12 @@ export class NotificationServiceServerImpl { private readonly clients: NotificationServiceClient[] = []; - notifyIndexWillUpdate(progressId: string): void { - this.clients.forEach((client) => client.notifyIndexWillUpdate(progressId)); + notifyDidReinitialize(): void { + this.clients.forEach((client) => client.notifyDidReinitialize()); + } + + notifyIndexUpdateWillStart(params: IndexUpdateWillStartParams): void { + this.clients.forEach((client) => client.notifyIndexUpdateWillStart(params)); } notifyIndexUpdateDidProgress(progressMessage: ProgressMessage): void { @@ -26,23 +33,17 @@ export class NotificationServiceServerImpl ); } - notifyIndexDidUpdate(progressId: string): void { - this.clients.forEach((client) => client.notifyIndexDidUpdate(progressId)); - } - - notifyIndexUpdateDidFail({ - progressId, - message, - }: { - progressId: string; - message: string; - }): void { + notifyIndexUpdateDidComplete(params: IndexUpdateDidCompleteParams): void { this.clients.forEach((client) => - client.notifyIndexUpdateDidFail({ progressId, message }) + client.notifyIndexUpdateDidComplete(params) ); } - notifyDaemonDidStart(port: string): void { + notifyIndexUpdateDidFail(params: IndexUpdateDidFailParams): void { + this.clients.forEach((client) => client.notifyIndexUpdateDidFail(params)); + } + + notifyDaemonDidStart(port: number): void { this.clients.forEach((client) => client.notifyDaemonDidStart(port)); } @@ -58,7 +59,9 @@ export class NotificationServiceServerImpl this.clients.forEach((client) => client.notifyPlatformDidUninstall(event)); } - notifyLibraryDidInstall(event: { item: LibraryPackage }): void { + notifyLibraryDidInstall(event: { + item: LibraryPackage | 'zip-install'; + }): void { this.clients.forEach((client) => client.notifyLibraryDidInstall(event)); } @@ -66,13 +69,13 @@ export class NotificationServiceServerImpl this.clients.forEach((client) => client.notifyLibraryDidUninstall(event)); } - notifyAttachedBoardsDidChange(event: AttachedBoardsChangeEvent): void { + notifyDetectedPortsDidChange(event: { detectedPorts: DetectedPorts }): void { this.clients.forEach((client) => - client.notifyAttachedBoardsDidChange(event) + client.notifyDetectedPortsDidChange(event) ); } - notifyConfigDidChange(event: { config: Config | undefined }): void { + notifyConfigDidChange(event: ConfigState): void { this.clients.forEach((client) => client.notifyConfigDidChange(event)); } diff --git a/arduino-ide-extension/src/node/plotter/plotter-backend-contribution.ts b/arduino-ide-extension/src/node/plotter/plotter-backend-contribution.ts index 6cbf13c59..5f0845a78 100644 --- a/arduino-ide-extension/src/node/plotter/plotter-backend-contribution.ts +++ b/arduino-ide-extension/src/node/plotter/plotter-backend-contribution.ts @@ -1,22 +1,20 @@ -import * as path from 'path'; -import * as express from 'express'; -import { injectable } from '@theia/core/shared/inversify'; import { BackendApplicationContribution } from '@theia/core/lib/node/backend-application'; +import express from '@theia/core/shared/express'; +import { injectable } from '@theia/core/shared/inversify'; +import path from 'node:path'; +import { arduinoPlotterWebAppPath } from '../resources'; @injectable() export class PlotterBackendContribution implements BackendApplicationContribution { configure(app: express.Application): void { - const index = require.resolve( - 'arduino-serial-plotter-webapp/build/index.html' - ); - app.use(express.static(path.join(index, '..'))); + app.use(express.static(arduinoPlotterWebAppPath)); app.get('/plotter', (req, res) => { console.log( `Serving serial plotter on http://${req.headers.host}${req.url}` ); - res.sendFile(index); + res.sendFile(path.join(arduinoPlotterWebAppPath, 'index.html')); }); } } diff --git a/arduino-ide-extension/src/node/resources.ts b/arduino-ide-extension/src/node/resources.ts new file mode 100644 index 000000000..2d0778fd6 --- /dev/null +++ b/arduino-ide-extension/src/node/resources.ts @@ -0,0 +1,32 @@ +import path from 'node:path'; + +// When running the tests, the JS files are not yet bundled by webpack. +// Hence, the `resources` folder lookup is different. +const testEnv = process.env.IDE2_TEST === 'true'; +const resourcesPath = path.join( + __dirname, + ...(testEnv ? ['..', '..', 'src', 'node', 'resources'] : ['resources']) +); +const exe = process.platform === 'win32' ? '.exe' : ''; + +// binaries +export const arduinoCliPath = path.join(resourcesPath, 'arduino-cli' + exe); +export const arduinoFirmwareUploaderPath = path.join( + resourcesPath, + 'arduino-fwuploader' + exe +); +export const arduinoLanguageServerPath = path.join( + resourcesPath, + 'arduino-language-server' + exe +); +export const clangdPath = path.join(resourcesPath, 'clangd' + exe); +export const clangFormatPath = path.join(resourcesPath, 'clang-format' + exe); + +// plotter +export const arduinoPlotterWebAppPath = path.join( + resourcesPath, + 'arduino-serial-plotter-webapp' +); + +// examples +export const examplesPath = path.join(resourcesPath, 'Examples'); diff --git a/arduino-ide-extension/src/node/service-error.ts b/arduino-ide-extension/src/node/service-error.ts index a56cf13ea..681896a03 100644 --- a/arduino-ide-extension/src/node/service-error.ts +++ b/arduino-ide-extension/src/node/service-error.ts @@ -1,14 +1,71 @@ import { Metadata, StatusObject } from '@grpc/grpc-js'; +import { Status } from './cli-protocol/google/rpc/status_pb'; +import { stringToUint8Array } from '../common/utils'; +import { Status as StatusCode } from '@grpc/grpc-js/build/src/constants'; +import { ProgrammerIsRequiredForUploadError } from './cli-protocol/cc/arduino/cli/commands/v1/upload_pb'; +import { InstanceNeedsReinitializationError } from './cli-protocol/cc/arduino/cli/commands/v1/compile_pb'; + +type ProtoError = typeof ProgrammerIsRequiredForUploadError; +const protoErrorsMap = new Map<string, ProtoError>([ + [ + 'cc.arduino.cli.commands.v1.ProgrammerIsRequiredForUploadError', + ProgrammerIsRequiredForUploadError, + ], + [ + 'cc.arduino.cli.commands.v1.InstanceNeedsReinitializationError', + InstanceNeedsReinitializationError, + ], + // handle other cli defined errors here +]); export type ServiceError = StatusObject & Error; export namespace ServiceError { - export function isCancel(arg: unknown): arg is ServiceError & { code: 1 } { + export function isCancel( + arg: unknown + ): arg is ServiceError & { code: StatusCode.CANCELLED } { return is(arg) && arg.code === 1; // https://grpc.github.io/grpc/core/md_doc_statuscodes.html } + + export function isInvalidArgument( + arg: unknown + ): arg is ServiceError & { code: StatusCode.INVALID_ARGUMENT } { + return is(arg) && arg.code === 3; // https://grpc.github.io/grpc/core/md_doc_statuscodes.html + } + export function is(arg: unknown): arg is ServiceError { - return arg instanceof Error && isStatusObjet(arg); + return arg instanceof Error && isStatusObject(arg); + } + + export function isInstanceOf<ProtoError>( + arg: unknown, + type: new (...args: unknown[]) => ProtoError + ): arg is ProtoError { + if (!isStatusObject(arg)) { + return false; + } + + try { + const bin = arg.metadata.get('grpc-status-details-bin')[0]; + const uint8Array = + typeof bin === 'string' + ? stringToUint8Array(bin) + : new Uint8Array(bin.buffer, bin.byteOffset, bin.byteLength); + + const errors = Status.deserializeBinary(uint8Array) + .getDetailsList() + .map((details) => { + const typeName = details.getTypeName(); + const ErrorType = protoErrorsMap.get(typeName); + return ErrorType?.deserializeBinary(details.getValue_asU8()); + }); + + return !!errors.find((error) => error && error instanceof type); + } catch { + return false; + } } - function isStatusObjet(arg: unknown): arg is StatusObject { + + function isStatusObject(arg: unknown): arg is StatusObject { if (typeof arg === 'object') { // eslint-disable-next-line @typescript-eslint/no-explicit-any const any = arg as any; diff --git a/arduino-ide-extension/src/node/settings-reader.ts b/arduino-ide-extension/src/node/settings-reader.ts new file mode 100644 index 000000000..61c3b335e --- /dev/null +++ b/arduino-ide-extension/src/node/settings-reader.ts @@ -0,0 +1,53 @@ +import { EnvVariablesServer } from '@theia/core/lib/common/env-variables'; +import { FileUri } from '@theia/core/lib/common/file-uri'; +import { inject, injectable } from '@theia/core/shared/inversify'; +import { promises as fs } from 'node:fs'; +import { + parse as parseJsonc, + ParseError, + printParseErrorCode, +} from 'jsonc-parser'; +import { join } from 'node:path'; +import { ErrnoException } from './utils/errors'; + +// Poor man's preferences on the backend. (https://github.com/arduino/arduino-ide/issues/1056#issuecomment-1153975064) +@injectable() +export class SettingsReader { + @inject(EnvVariablesServer) + private readonly envVariableServer: EnvVariablesServer; + + async read(): Promise<Record<string, unknown> | undefined> { + const configDirUri = await this.envVariableServer.getConfigDirUri(); + const configDirPath = FileUri.fsPath(configDirUri); + const settingsPath = join(configDirPath, 'settings.json'); + try { + const raw = await fs.readFile(settingsPath, { encoding: 'utf8' }); + return parse(raw); + } catch (err) { + if (ErrnoException.isENOENT(err)) { + return undefined; + } + } + } +} + +export function parse(raw: string): Record<string, unknown> | undefined { + const errors: ParseError[] = []; + const settings = + parseJsonc(raw, errors, { + allowEmptyContent: true, + allowTrailingComma: true, + disallowComments: false, + }) ?? {}; + if (errors.length) { + console.error('Detected JSONC parser errors:'); + console.error('----- CONTENT START -----'); + console.error(raw); + console.error('----- CONTENT END -----'); + errors.forEach(({ error, offset }) => + console.error(` - ${printParseErrorCode(error)} at ${offset}`) + ); + return undefined; + } + return typeof settings === 'object' ? settings : undefined; +} diff --git a/arduino-ide-extension/src/node/sketches-service-impl.ts b/arduino-ide-extension/src/node/sketches-service-impl.ts index bba68f941..85836ac53 100644 --- a/arduino-ide-extension/src/node/sketches-service-impl.ts +++ b/arduino-ide-extension/src/node/sketches-service-impl.ts @@ -1,38 +1,67 @@ -import { injectable, inject } from '@theia/core/shared/inversify'; -import * as fs from 'fs'; -import * as os from 'os'; -import * as temp from 'temp'; - -import * as path from 'path'; -import * as crypto from 'crypto'; -import { ncp } from 'ncp'; -import { promisify } from 'util'; +import { EnvVariablesServer } from '@theia/core/lib/common/env-variables'; +import { ILogger } from '@theia/core/lib/common/logger'; +import { nls } from '@theia/core/lib/common/nls'; +import { isWindows } from '@theia/core/lib/common/os'; +import { Deferred } from '@theia/core/lib/common/promise-util'; +import { escapeRegExpCharacters } from '@theia/core/lib/common/strings'; +import type { Mutable } from '@theia/core/lib/common/types'; import URI from '@theia/core/lib/common/uri'; -import { FileUri } from '@theia/core/lib/node'; -import { ConfigServiceImpl } from './config-service-impl'; +import { FileUri } from '@theia/core/lib/common/file-uri'; +import { inject, injectable, named } from '@theia/core/shared/inversify'; +import { glob } from 'glob'; +import crypto from 'node:crypto'; +import { + CopyOptions, + Stats, + constants, + promises as fs, + lstat, + realpath, +} from 'node:fs'; +import os from 'node:os'; +import path, { join } from 'node:path'; +import PQueue from 'p-queue'; +import temp from 'temp'; +import { NotificationServiceServer } from '../common/protocol'; import { - SketchesService, Sketch, - SketchRef, SketchContainer, + SketchRef, SketchesError, + SketchesService, } from '../common/protocol/sketches-service'; -import { NotificationServiceServerImpl } from './notification-service-server'; -import { EnvVariablesServer } from '@theia/core/lib/common/env-variables'; -import { CoreClientAware } from './core-client-provider'; +import { + firstToLowerCase, + firstToUpperCase, + startsWithUpperCase, +} from '../common/utils'; import { ArchiveSketchRequest, LoadSketchRequest, } from './cli-protocol/cc/arduino/cli/commands/v1/commands_pb'; -import { duration } from '../common/decorators'; -import * as glob from 'glob'; -import { Deferred } from '@theia/core/lib/common/promise-util'; -import { ServiceError } from './service-error'; +import { ConfigServiceImpl } from './config-service-impl'; +import { CoreClientAware } from './core-client-provider'; import { IsTempSketch, - maybeNormalizeDrive, TempSketchPrefix, + Win32DriveRegex, + maybeNormalizeDrive, } from './is-temp-sketch'; +import { ServiceError } from './service-error'; +import { SettingsReader } from './settings-reader'; +import { ErrnoException } from './utils/errors'; + +const RecentSketches = 'recent-sketches.json'; +const DefaultIno = `void setup() { + // put your setup code here, to run once: + +} + +void loop() { + // put your main code here, to run repeatedly: + +} +`; @injectable() export class SketchesServiceImpl @@ -41,186 +70,121 @@ export class SketchesServiceImpl { private sketchSuffixIndex = 1; private lastSketchBaseName: string; - + private recentSketches: SketchWithDetails[] | undefined; + private readonly markAsRecentSketchQueue = new PQueue({ + autoStart: true, + concurrency: 1, + }); + private inoContent: Deferred<string> | undefined; + + @inject(ILogger) + @named('sketches-service') + private readonly logger: ILogger; @inject(ConfigServiceImpl) private readonly configService: ConfigServiceImpl; - - @inject(NotificationServiceServerImpl) - private readonly notificationService: NotificationServiceServerImpl; - + @inject(NotificationServiceServer) + private readonly notificationService: NotificationServiceServer; @inject(EnvVariablesServer) private readonly envVariableServer: EnvVariablesServer; - @inject(IsTempSketch) private readonly isTempSketch: IsTempSketch; + @inject(SettingsReader) + private readonly settingsReader: SettingsReader; - async getSketches({ - uri, - exclude, - }: { - uri?: string; - exclude?: string[]; - }): Promise<SketchContainer> { - const [/*old,*/ _new] = await Promise.all([ - // this.getSketchesOld({ uri, exclude }), - this.getSketchesNew({ uri, exclude }), - ]); - return _new; - } - - @duration() - async getSketchesNew({ - uri, - exclude, - }: { - uri?: string; - exclude?: string[]; - }): Promise<SketchContainer> { + async getSketches({ uri }: { uri?: string }): Promise<SketchContainer> { const root = await this.root(uri); - const pathToAllSketchFiles = await new Promise<string[]>( - (resolve, reject) => { - glob( - '/!(libraries|hardware)/**/*.{ino,pde}', - { root }, - (error, results) => { - if (error) { - reject(error); - } else { - resolve(results); - } - } - ); - } - ); - // Sort by path length to filter out nested sketches, such as the `Nested_folder` inside the `Folder` sketch. - // - // `directories#user` - // | - // +--Folder - // | - // +--Folder.ino - // | - // +--Nested_folder - // | - // +--Nested_folder.ino - pathToAllSketchFiles.sort((left, right) => left.length - right.length); - const container = SketchContainer.create( - uri ? path.basename(root) : 'Sketchbook' - ); - const getOrCreateChildContainer = ( - parent: SketchContainer, - segments: string[] - ) => { - if (segments.length === 1) { - throw new Error( - `Expected at least two segments relative path: ['ExampleSketchName', 'ExampleSketchName.{ino,pde}]. Was: ${segments}` - ); - } - if (segments.length === 2) { - return parent; - } - const label = segments[0]; - const existingSketch = parent.sketches.find( - (sketch) => sketch.name === label - ); - if (existingSketch) { - // If the container has a sketch with the same label, it cannot have a child container. - // See above example about how to ignore nested sketches. - return undefined; - } - let child = parent.children.find((child) => child.label === label); - if (!child) { - child = SketchContainer.create(label); - parent.children.push(child); - } - return child; - }; - for (const pathToSketchFile of pathToAllSketchFiles) { - const relative = path.relative(root, pathToSketchFile); - if (!relative) { - console.warn( - `Could not determine relative sketch path from the root <${root}> to the sketch <${pathToSketchFile}>. Skipping. Relative path was: ${relative}` - ); - continue; - } - const segments = relative.split(path.sep); - if (segments.length < 2) { - // folder name, and sketch name. - console.warn( - `Expected at least one segment relative path from the root <${root}> to the sketch <${pathToSketchFile}>. Skipping. Segments were: ${segments}.` - ); - continue; - } - // the folder name and the sketch name must match. For example, `Foo/foo.ino` is invalid. - // drop the folder name from the sketch name, if `.ino` or `.pde` remains, it's valid - const sketchName = segments[segments.length - 2]; - const sketchFilename = segments[segments.length - 1]; - const sketchFileExtension = segments[segments.length - 1].replace( - new RegExp(sketchName), - '' - ); - if (sketchFileExtension !== '.ino' && sketchFileExtension !== '.pde') { - console.warn( - `Mismatching sketch file <${sketchFilename}> and sketch folder name <${sketchName}>. Skipping` - ); - continue; - } - const child = getOrCreateChildContainer(container, segments); - if (child) { - child.sketches.push({ - name: sketchName, - uri: FileUri.create(pathToSketchFile).toString(), - }); - } + if (!root) { + this.logger.warn(`Could not derive sketchbook root from ${uri}.`); + return SketchContainer.create(''); } - return container; + const rootExists = await exists(root); + if (!rootExists) { + this.logger.warn(`Sketchbook root ${root} does not exist.`); + return SketchContainer.create(''); + } + const container = <Mutable<SketchContainer>>( + SketchContainer.create(uri ? path.basename(root) : 'Sketchbook') + ); + return discoverSketches(root, container, this.logger); } - private async root(uri?: string | undefined): Promise<string> { - return FileUri.fsPath(uri ?? (await this.sketchbookUri())); + private async root(uri?: string | undefined): Promise<string | undefined> { + if (uri) { + return FileUri.fsPath(uri); + } + const sketchbookUri = await this.sketchbookUri(); + if (sketchbookUri) { + return FileUri.fsPath(sketchbookUri); + } + return undefined; } - private async sketchbookUri(): Promise<string> { - const { sketchDirUri } = await this.configService.getConfiguration(); - return sketchDirUri; + private async sketchbookUri(): Promise<string | undefined> { + const { config, messages } = await this.configService.getConfiguration(); + if (!config?.sketchDirUri || messages?.length) { + return undefined; + } + return config.sketchDirUri; } async loadSketch(uri: string): Promise<SketchWithDetails> { - const { client, instance } = await this.coreClient; + return this.doLoadSketch(uri); + } + + private async doLoadSketch( + uri: string, + detectInvalidSketchNameError = true + ): Promise<SketchWithDetails> { + const { client } = await this.coreClient; const req = new LoadSketchRequest(); const requestSketchPath = FileUri.fsPath(uri); req.setSketchPath(requestSketchPath); - req.setInstance(instance); - const stat = new Deferred<fs.Stats | Error>(); - fs.lstat(requestSketchPath, (err, result) => + // TODO: since the instance is not required on the request, can IDE2 do this faster or have a dedicated client for the sketch loading? + const stat = new Deferred<Stats | Error>(); + lstat(requestSketchPath, (err, result) => err ? stat.resolve(err) : stat.resolve(result) ); const sketch = await new Promise<SketchWithDetails>((resolve, reject) => { client.loadSketch(req, async (err, resp) => { if (err) { + let rejectWith: unknown = err; + if (isNotFoundError(err)) { + rejectWith = SketchesError.NotFound(err.details, uri); + // detecting the invalid sketch name error is not for free as it requires multiple filesystem access. + if (detectInvalidSketchNameError) { + const invalidMainSketchFilePath = await isInvalidSketchNameError( + err, + requestSketchPath + ); + if (invalidMainSketchFilePath) { + rejectWith = SketchesError.InvalidName( + err.details, + FileUri.create(invalidMainSketchFilePath).toString() + ); + } + } + } + reject(rejectWith); + return; + } + const sketch = resp.getSketch(); + if (!sketch) { reject( - isNotFoundError(err) - ? SketchesError.NotFound( - fixErrorMessage( - err, - requestSketchPath, - this.configService.cliConfiguration?.directories.user - ), - uri - ) - : err + new Error(`Incomplete LoadSketch response. Sketch is missing.`) ); return; } - const responseSketchPath = maybeNormalizeDrive(resp.getLocationPath()); + const responseSketchPath = maybeNormalizeDrive( + sketch.getLocationPath() + ); if (requestSketchPath !== responseSketchPath) { - console.warn( + this.logger.warn( `Warning! The request sketch path was different than the response sketch path from the CLI. This could be a potential bug. Request: <${requestSketchPath}>, response: <${responseSketchPath}>.` ); } const resolvedStat = await stat.promise; if (resolvedStat instanceof Error) { - console.error( + this.logger.error( `The CLI could load the sketch from ${requestSketchPath}, but stating the folder has failed.` ); reject(resolvedStat); @@ -230,14 +194,14 @@ export class SketchesServiceImpl resolve({ name: path.basename(responseSketchPath), uri: FileUri.create(responseSketchPath).toString(), - mainFileUri: FileUri.create(resp.getMainFile()).toString(), - otherSketchFileUris: resp + mainFileUri: FileUri.create(sketch.getMainFile()).toString(), + otherSketchFileUris: sketch .getOtherSketchFilesList() .map((p) => FileUri.create(p).toString()), - additionalFileUris: resp + additionalFileUris: sketch .getAdditionalFilesList() .map((p) => FileUri.create(p).toString()), - rootFolderFileUris: resp + rootFolderFileUris: sketch .getRootFolderFilesList() .map((p) => FileUri.create(p).toString()), mtimeMs, @@ -254,161 +218,234 @@ export class SketchesServiceImpl private get recentSketchesFsPath(): Promise<string> { return this.envVariableServer .getConfigDirUri() - .then((uri) => path.join(FileUri.fsPath(uri), 'recent-sketches.json')); + .then((uri) => path.join(FileUri.fsPath(uri), RecentSketches)); } - private async loadRecentSketches( - fsPath: string - ): Promise<Record<string, number>> { + private async loadRecentSketches(): Promise<Record<string, number>> { + this.logger.debug(`>>> Loading recently opened sketches data.`); + const fsPath = await this.recentSketchesFsPath; let data: Record<string, number> = {}; try { - const raw = await promisify(fs.readFile)(fsPath, { + const raw = await fs.readFile(fsPath, { encoding: 'utf8', }); - data = JSON.parse(raw); - } catch {} + try { + data = JSON.parse(raw); + } catch (err) { + this.logger.error( + `Could not parse recently opened sketches. Raw input was: ${raw}` + ); + } + } catch (err) { + if (ErrnoException.isENOENT(err)) { + this.logger.debug( + `<<< '${RecentSketches}' does not exist yet. This is normal behavior. Falling back to empty data.` + ); + return {}; + } + throw err; + } + this.logger.debug( + `<<< Successfully loaded recently opened sketches data: ${JSON.stringify( + data + )}` + ); return data; } + private async saveRecentSketches( + data: Record<string, number> + ): Promise<void> { + this.logger.debug( + `>>> Saving recently opened sketches data: ${JSON.stringify(data)}` + ); + const fsPath = await this.recentSketchesFsPath; + await fs.writeFile(fsPath, JSON.stringify(data, null, 2)); + this.logger.debug('<<< Successfully saved recently opened sketches data.'); + } + async markAsRecentlyOpened(uri: string): Promise<void> { - let sketch: Sketch | undefined = undefined; - try { - sketch = await this.loadSketch(uri); - } catch { - return; - } - if (await this.isTemp(sketch)) { - return; - } + return this.markAsRecentSketchQueue.add(async () => { + this.logger.debug(`Marking sketch at '${uri}' as recently opened.`); + if (this.isTempSketch.is(FileUri.fsPath(uri))) { + this.logger.debug( + `Sketch at '${uri}' is pointing to a temp location. Not marking as recently opened.` + ); + return; + } - const fsPath = await this.recentSketchesFsPath; - const data = await this.loadRecentSketches(fsPath); - const now = Date.now(); - data[sketch.uri] = now; - - let toDeleteUri: string | undefined = undefined; - if (Object.keys(data).length > 10) { - let min = Number.MAX_SAFE_INTEGER; - for (const uri of Object.keys(data)) { - if (min > data[uri]) { - min = data[uri]; - toDeleteUri = uri; + let sketch: Sketch | undefined = undefined; + try { + sketch = await this.doLoadSketch(uri, false); + this.logger.debug( + `Loaded sketch ${JSON.stringify( + sketch + )} before marking it as recently opened.` + ); + } catch (err) { + if ( + SketchesError.NotFound.is(err) || + SketchesError.InvalidName.is(err) + ) { + this.logger.debug( + `Could not load sketch from '${uri}'. Not marking as recently opened.` + ); + return; } + this.logger.error( + `Unexpected error occurred while loading sketch from '${uri}'.`, + err + ); + throw err; } - } - if (toDeleteUri) { - delete data[toDeleteUri]; - } + const data = await this.loadRecentSketches(); + const now = Date.now(); + this.logger.debug( + `Marking sketch '${uri}' as recently opened with timestamp: '${now}'.` + ); + data[sketch.uri] = now; + + let toDelete: [string, number] | undefined = undefined; + if (Object.keys(data).length > 10) { + let min = Number.MAX_SAFE_INTEGER; + for (const [uri, timestamp] of Object.entries(data)) { + if (min > timestamp) { + min = data[uri]; + toDelete = [uri, timestamp]; + } + } + } - await promisify(fs.writeFile)(fsPath, JSON.stringify(data, null, 2)); - this.recentlyOpenedSketches().then((sketches) => - this.notificationService.notifyRecentSketchesDidChange({ sketches }) - ); - } + if (toDelete) { + const [toDeleteUri] = toDelete; + delete data[toDeleteUri]; + this.logger.debug( + `Deleted sketch entry ${JSON.stringify( + toDelete + )} from recently opened.` + ); + } - async recentlyOpenedSketches(): Promise<Sketch[]> { - const configDirUri = await this.envVariableServer.getConfigDirUri(); - const fsPath = path.join( - FileUri.fsPath(configDirUri), - 'recent-sketches.json' - ); - let data: Record<string, number> = {}; - try { - const raw = await promisify(fs.readFile)(fsPath, { - encoding: 'utf8', - }); - data = JSON.parse(raw); - } catch {} + await this.saveRecentSketches(data); + this.logger.debug(`Marked sketch '${uri}' as recently opened.`); + const sketches = await this.recentlyOpenedSketches(data); + this.notificationService.notifyRecentSketchesDidChange({ sketches }); + }); + } - const sketches: SketchWithDetails[] = []; - for (const uri of Object.keys(data).sort( - (left, right) => data[right] - data[left] - )) { - try { - const sketch = await this.loadSketch(uri); - sketches.push(sketch); - } catch {} + async recentlyOpenedSketches( + forceUpdate?: Record<string, number> | boolean + ): Promise<Sketch[]> { + if (!this.recentSketches || forceUpdate) { + const data = + forceUpdate && typeof forceUpdate === 'object' + ? forceUpdate + : await this.loadRecentSketches(); + const sketches: SketchWithDetails[] = []; + let needsUpdate = false; + for (const uri of Object.keys(data).sort( + (left, right) => data[right] - data[left] + )) { + let sketch: SketchWithDetails | undefined = undefined; + try { + sketch = await this.doLoadSketch(uri, false); + } catch {} + if (!sketch) { + needsUpdate = true; + } else { + sketches.push(sketch); + } + } + if (needsUpdate) { + const data = sketches.reduce((acc, curr) => { + acc[curr.uri] = curr.mtimeMs; + return acc; + }, {} as Record<string, number>); + await this.saveRecentSketches(data); + this.notificationService.notifyRecentSketchesDidChange({ sketches }); + } + this.recentSketches = sketches; } - - return sketches; + return this.recentSketches; } async cloneExample(uri: string): Promise<Sketch> { - const sketch = await this.loadSketch(uri); - const parentPath = await this.createTempFolder(); + const [sketch, parentPath] = await Promise.all([ + this.doLoadSketch(uri, false), + this.createTempFolder(), + ]); const destinationUri = FileUri.create( path.join(parentPath, sketch.name) ).toString(); - const copiedSketchUri = await this.copy(sketch, { destinationUri }); - return this.loadSketch(copiedSketchUri); - } - - async createNewSketch(): Promise<Sketch> { - const monthNames = [ - 'jan', - 'feb', - 'mar', - 'apr', - 'may', - 'jun', - 'jul', - 'aug', - 'sep', - 'oct', - 'nov', - 'dec', - ]; - const today = new Date(); + const copiedSketch = await this.copy(sketch, { destinationUri }); + return this.doLoadSketch(copiedSketch.uri, false); + } + + async createNewSketch(name?: string, content?: string): Promise<Sketch> { + let sketchName: string | undefined = name; const parentPath = await this.createTempFolder(); - const sketchBaseName = `sketch_${ - monthNames[today.getMonth()] - }${today.getDate()}`; - const config = await this.configService.getConfiguration(); - const sketchbookPath = FileUri.fsPath(config.sketchDirUri); - let sketchName: string | undefined; - - // If it's another day, reset the count of sketches created today - if (this.lastSketchBaseName !== sketchBaseName) this.sketchSuffixIndex = 1; - - let nameFound = false; - while (!nameFound) { - const sketchNameCandidate = `${sketchBaseName}${sketchIndexToLetters( - this.sketchSuffixIndex++ - )}`; - // Note: we check the future destination folder (`directories.user`) for name collision and not the temp folder! - const sketchExists = await promisify(fs.exists)( - path.join(sketchbookPath, sketchNameCandidate) - ); - if (!sketchExists) { - nameFound = true; - sketchName = sketchNameCandidate; + if (!sketchName) { + const monthNames = [ + 'jan', + 'feb', + 'mar', + 'apr', + 'may', + 'jun', + 'jul', + 'aug', + 'sep', + 'oct', + 'nov', + 'dec', + ]; + const today = new Date(); + const sketchBaseName = `sketch_${ + monthNames[today.getMonth()] + }${today.getDate()}`; + const { config } = await this.configService.getConfiguration(); + const sketchbookPath = config?.sketchDirUri + ? FileUri.fsPath(config?.sketchDirUri) + : os.homedir(); + + // If it's another day, reset the count of sketches created today + if (this.lastSketchBaseName !== sketchBaseName) + this.sketchSuffixIndex = 1; + + let nameFound = false; + while (!nameFound) { + const sketchNameCandidate = `${sketchBaseName}${sketchIndexToLetters( + this.sketchSuffixIndex++ + )}`; + // Note: we check the future destination folder (`directories.user`) for name collision and not the temp folder! + const sketchExists = await exists( + path.join(sketchbookPath, sketchNameCandidate) + ); + if (!sketchExists) { + nameFound = true; + sketchName = sketchNameCandidate; + } } + this.lastSketchBaseName = sketchBaseName; } if (!sketchName) { throw new Error('Cannot create a unique sketch name'); } - this.lastSketchBaseName = sketchBaseName; const sketchDir = path.join(parentPath, sketchName); const sketchFile = path.join(sketchDir, `${sketchName}.ino`); - await promisify(fs.mkdir)(sketchDir, { recursive: true }); - await promisify(fs.writeFile)( - sketchFile, - `void setup() { - // put your setup code here, to run once: - -} - -void loop() { - // put your main code here, to run repeatedly: + const [inoContent] = await Promise.all([ + content ? content : this.loadInoContent(), + fs.mkdir(sketchDir, { recursive: true }), + ]); + await fs.writeFile(sketchFile, inoContent, { encoding: 'utf8' }); + return this.doLoadSketch(FileUri.create(sketchDir).toString(), false); + } -} -`, - { encoding: 'utf8' } - ); - return this.loadSketch(FileUri.create(sketchDir).toString()); + defaultInoContent(): Promise<string> { + return this.loadInoContent(); } /** @@ -424,7 +461,7 @@ void loop() { reject(createError); return; } - fs.realpath.native(dirPath, (resolveError, resolvedDirPath) => { + realpath.native(dirPath, (resolveError, resolvedDirPath) => { if (resolveError) { reject(resolveError); return; @@ -459,10 +496,10 @@ void loop() { uri: string ): Promise<SketchWithDetails | undefined> { try { - const sketch = await this.loadSketch(uri); + const sketch = await this.doLoadSketch(uri, false); return sketch; } catch (err) { - if (SketchesError.NotFound.is(err)) { + if (SketchesError.NotFound.is(err) || SketchesError.InvalidName.is(err)) { return undefined; } throw err; @@ -475,64 +512,131 @@ void loop() { async copy( sketch: Sketch, - { destinationUri }: { destinationUri: string } - ): Promise<string> { - const source = FileUri.fsPath(sketch.uri); - const exists = await promisify(fs.exists)(source); - if (!exists) { - throw new Error(`Sketch does not exist: ${sketch}`); - } - // Nothing to do when source and destination are the same. - if (sketch.uri === destinationUri) { - await this.loadSketch(sketch.uri); // Sanity check. - return sketch.uri; - } - - const copy = async (sourcePath: string, destinationPath: string) => { - return new Promise<void>((resolve, reject) => { - ncp.ncp(sourcePath, destinationPath, async (error) => { - if (error) { - reject(error); - return; - } - const newName = path.basename(destinationPath); - try { - const oldPath = path.join( - destinationPath, - new URI(sketch.mainFileUri).path.base - ); - const newPath = path.join(destinationPath, `${newName}.ino`); - if (oldPath !== newPath) { - await promisify(fs.rename)(oldPath, newPath); - } - await this.loadSketch(FileUri.create(destinationPath).toString()); // Sanity check. - resolve(); - } catch (e) { - reject(e); - } - }); - }); - }; - // https://github.com/arduino/arduino-ide/issues/65 - // When copying `/path/to/sketchbook/sketch_A` to `/path/to/sketchbook/sketch_A/anything` on a non-POSIX filesystem, - // `ncp` makes a recursion and copies the folders over and over again. In such cases, we copy the source into a temp folder, - // then move it to the desired destination. + { + destinationUri, + onlySketchFiles, + }: { destinationUri: string; onlySketchFiles?: boolean } + ): Promise<Sketch> { + const sourceUri = sketch.uri; + const source = FileUri.fsPath(sourceUri); const destination = FileUri.fsPath(destinationUri); - let tempDestination = await this.createTempFolder(); - tempDestination = path.join(tempDestination, sketch.name); - await fs.promises.mkdir(tempDestination, { recursive: true }); - await copy(source, tempDestination); - await copy(tempDestination, destination); - return FileUri.create(destination).toString(); + if (source === destination) { + const reloadedSketch = await this.doLoadSketch(sourceUri, false); + return reloadedSketch; + } + const sourceFolderBasename = path.basename(source); + const destinationFolderBasename = path.basename(destination); + + const errorMessage = Sketch.validateSketchFolderName( + destinationFolderBasename + ); + if (errorMessage) { + const message = `${nls.localize( + 'arduino/sketch/invalidSketchFolderNameMessage', + "Invalid sketch folder name: '{0}'", + destinationFolderBasename + )} ${errorMessage}`; + throw SketchesError.InvalidFolderName(message, destinationFolderBasename); + } + + // verify a possible name collision with existing ino files + if (sourceFolderBasename !== destinationFolderBasename) { + try { + const otherInoBasename = `${destinationFolderBasename}.ino`; + const otherInoPath = join(source, otherInoBasename); + const stat = await fs.stat(otherInoPath); + if (stat.isFile()) { + const message = nls.localize( + 'arduino/sketch/sketchAlreadyContainsThisFileError', + "The sketch already contains a file named '{0}'", + otherInoBasename + ); + // if can read the file, it will be a collision + throw SketchesError.SketchAlreadyContainsThisFile( + message, + sourceFolderBasename, + destinationFolderBasename, + otherInoBasename + ); + } + // Otherwise, it's OK, if it is an existing directory + } catch (err) { + // It's OK if the file is missing. + if (!ErrnoException.isENOENT(err)) { + throw err; + } + } + } + + let filter: CopyOptions['filter']; + if (onlySketchFiles) { + // The Windows paths, can be a trash (see below). Hence, it must be resolved with Node.js. + // After resolving the path, the drive letter is still a gamble (can be upper or lower case) and could result in a false negative match. + // Here, all sketch file paths must be resolved by Node.js, to provide the same drive letter casing. + const sketchFilePaths = await Promise.all( + Sketch.uris(sketch) + .map(FileUri.fsPath) + .map((path) => fs.realpath(path)) + ); + filter = async (s) => { + // On Windows, the source path could start with a complete trash. For example, \\\\?\\c:\\Users\\kittaakos\\AppData\\Local\\Temp\\.arduinoIDE-unsaved20231024-9300-1hp64fi.g8yh\\sketch_nov24d. + // The path must be resolved. + const resolvedSource = await fs.realpath(s); + if (sketchFilePaths.includes(resolvedSource)) { + return true; + } + const stat = await fs.stat(resolvedSource); + if (stat.isFile()) { + return false; + } + // Copy the folder if any of the sketch file path starts with this folder + return sketchFilePaths.some((sketchFilePath) => + sketchFilePath.startsWith(resolvedSource) + ); + }; + } else { + filter = () => true; + } + + const tempRoot = await this.createTempFolder(); + const temp = join(tempRoot, destinationFolderBasename); + await fs.mkdir(temp, { recursive: true }); + + // copy to temp folder + await fs.cp(source, temp, { + filter, + recursive: true, + force: true, + }); + + const sourceMainSketchFilePath = FileUri.fsPath(sketch.mainFileUri); + // Can copy sketch with pde main sketch file: https://github.com/arduino/arduino-ide/issues/2377 + const ext = path.extname(sourceMainSketchFilePath); + + // rename the main sketch file + await fs.rename( + join(temp, `${sourceFolderBasename}${ext}`), + join(temp, `${destinationFolderBasename}.ino`) + ); + + // copy to destination + try { + await fs.cp(temp, destination, { recursive: true, force: true }); + const copiedSketch = await this.doLoadSketch(destinationUri, false); + return copiedSketch; + } finally { + // remove temp + fs.rm(tempRoot, { recursive: true, force: true, maxRetries: 5 }); // no await + } } async archive(sketch: Sketch, destinationUri: string): Promise<string> { - await this.loadSketch(sketch.uri); // sanity check + await this.doLoadSketch(sketch.uri, false); // sanity check const { client } = await this.coreClient; const archivePath = FileUri.fsPath(destinationUri); // The CLI cannot override existing archives, so we have to wipe it manually: https://github.com/arduino/arduino-cli/issues/1160 - if (await promisify(fs.exists)(archivePath)) { - await promisify(fs.unlink)(archivePath); + if (await exists(archivePath)) { + await fs.unlink(archivePath); } const req = new ArchiveSketchRequest(); req.setSketchPath(FileUri.fsPath(sketch.uri)); @@ -549,27 +653,87 @@ void loop() { return destinationUri; } - async getIdeTempFolderUri(sketch: Sketch): Promise<string> { + async getIdeTempFolderUri(sketch: SketchRef): Promise<string> { const genBuildPath = await this.getIdeTempFolderPath(sketch); return FileUri.create(genBuildPath).toString(); } - async getIdeTempFolderPath(sketch: Sketch): Promise<string> { + private async getIdeTempFolderPath(sketch: SketchRef): Promise<string> { const sketchPath = FileUri.fsPath(sketch.uri); - await fs.promises.readdir(sketchPath); // Validates the sketch folder and rejects if not accessible. + await fs.readdir(sketchPath); // Validates the sketch folder and rejects if not accessible. const suffix = crypto.createHash('md5').update(sketchPath).digest('hex'); - return path.join(os.tmpdir(), `arduino-ide2-${suffix}`); + return path.join( + this.isTempSketch.tempDirRealpath, + `arduino-ide2-${suffix}` + ); } - notifyDeleteSketch(sketch: Sketch): void { + async getBuildPath(sketch: Sketch): Promise<string[]> { const sketchPath = FileUri.fsPath(sketch.uri); - fs.rm(sketchPath, { recursive: true, maxRetries: 5 }, (error) => { - if (error) { - console.error(`Failed to delete sketch at ${sketchPath}.`, error); - } else { - console.error(`Successfully delete sketch at ${sketchPath}.`); + + let basePath: string; + try { + basePath = userCacheDir(); + } catch { + // Fallback to /tmp + const { tempDirRealpath } = this.isTempSketch; + basePath = tempDirRealpath; + } + const buildPaths = [this.buildPathMD5Hash(basePath, sketchPath)]; + + // If on Windows, provide both the upper and the lowercase drive letter MD5 hashes. All together four paths are expected: + // One of them should match if the sketch is not yet compiled. + // https://github.com/arduino/arduino-ide/pull/1809#discussion_r1071031040 + if (isWindows && Win32DriveRegex.test(basePath)) { + const toggleFirstCharCasing = (s: string) => + startsWithUpperCase(s) ? firstToLowerCase(s) : firstToUpperCase(s); + const otherCaseDirRealPath = toggleFirstCharCasing(basePath); + buildPaths.push(this.buildPathMD5Hash(otherCaseDirRealPath, sketchPath)); + if (Win32DriveRegex.test(sketchPath)) { + const otherCaseSketchPath = toggleFirstCharCasing(sketchPath); + buildPaths.push( + this.buildPathMD5Hash(basePath, otherCaseSketchPath), + this.buildPathMD5Hash(otherCaseDirRealPath, otherCaseSketchPath) + ); } - }); + } + return buildPaths; + } + + private buildPathMD5Hash(basePath: string, path: string): string { + return join(basePath, 'arduino', 'sketches', this.buildFolderMD5Hash(path)); + } + + private buildFolderMD5Hash(path: string): string { + return crypto.createHash('md5').update(path).digest('hex').toUpperCase(); + } + + // Returns the default.ino from the settings or from default folder. + private async loadInoContent(): Promise<string> { + if (!this.inoContent) { + this.inoContent = new Deferred<string>(); + const settings = await this.settingsReader.read(); + if (settings) { + const inoBlueprintPath = settings['arduino.sketch.inoBlueprint']; + if (inoBlueprintPath && typeof inoBlueprintPath === 'string') { + try { + const inoContent = await fs.readFile(inoBlueprintPath, { + encoding: 'utf8', + }); + this.inoContent.resolve(inoContent); + } catch (err) { + if (ErrnoException.isENOENT(err)) { + // Ignored. The custom `.ino` blueprint file is optional. + } else { + throw err; + } + } + } + } + this.inoContent.resolve(DefaultIno); + } + + return this.inoContent.promise; } } @@ -577,40 +741,76 @@ interface SketchWithDetails extends Sketch { readonly mtimeMs: number; } -// https://github.com/arduino/arduino-cli/issues/1797 -function fixErrorMessage( - err: ServiceError, - sketchPath: string, - sketchbookPath: string | undefined -): string { - if (!sketchbookPath) { - return err.details; // No way to repair the error message. The current sketchbook path is not available. - } - // Original: `Can't open sketch: no valid sketch found in /Users/a.kitta/Documents/Arduino: missing /Users/a.kitta/Documents/Arduino/Arduino.ino` - // Fixed: `Can't open sketch: no valid sketch found in /Users/a.kitta/Documents/Arduino: missing $sketchPath` - const message = err.details; - const incorrectMessageSuffix = path.join(sketchbookPath, 'Arduino.ino'); - if ( - message.startsWith("Can't open sketch: no valid sketch found in") && - message.endsWith(`${incorrectMessageSuffix}`) - ) { - const sketchName = path.basename(sketchPath); - const correctMessagePrefix = message.substring( - 0, - message.length - incorrectMessageSuffix.length - ); - return `${correctMessagePrefix}${path.join( - sketchPath, - `${sketchName}.ino` - )}`; - } - return err.details; -} - function isNotFoundError(err: unknown): err is ServiceError { return ServiceError.is(err) && err.code === 5; // `NOT_FOUND` https://grpc.github.io/grpc/core/md_doc_statuscodes.html } +/** + * Tries to detect whether the error was caused by an invalid main sketch file name. + * IDE2 should handle gracefully when there is an invalid sketch folder name. + * See the [spec](https://arduino.github.io/arduino-cli/latest/sketch-specification/#sketch-root-folder) for details. + * The CLI does not have error codes (https://github.com/arduino/arduino-cli/issues/1762), + * IDE2 cannot parse the error message (https://github.com/arduino/arduino-cli/issues/1968#issuecomment-1306936142) + * so it checks if a sketch even if it's invalid can be discovered from the requested path. + * Nothing guarantees that the invalid existing main sketch file still exits by the time client performs the sketch move. + */ +async function isInvalidSketchNameError( + cliErr: unknown, + requestSketchPath: string +): Promise<string | undefined> { + return isNotFoundError(cliErr) + ? isAccessibleSketchPath(requestSketchPath) + : undefined; +} + +/** + * The `path` argument is valid, if accessible and either pointing to a `.ino` file, + * or it's a directory, and one of the files in the directory is an `.ino` file. + * + * `undefined` if `path` was pointing to neither an accessible sketch file nor a sketch folder. + * + * The sketch folder name and sketch file name can be different. This method is not sketch folder name compliant. + * The `path` must be an absolute, resolved path. This method does not handle EACCES (Permission denied) errors. + * This method handles `UNKNOWN` errors ([nodejs/node#19965](https://github.com/nodejs/node/issues/19965#issuecomment-380750573)). + * + * When `fallbackToInvalidFolderPath` is `true`, and the `path` is an accessible folder without any sketch files, + * this method returns with the `path` argument instead of `undefined`. + */ +export async function isAccessibleSketchPath( + path: string, + fallbackToInvalidFolderPath = false +): Promise<string | undefined> { + let stats: Stats | undefined = undefined; + try { + stats = await fs.stat(path); + } catch (err) { + if (ErrnoException.isENOENT(err) || ErrnoException.isUNKNOWN(err)) { + return undefined; + } + throw err; + } + if (!stats) { + return undefined; + } + if (stats.isFile()) { + return path.endsWith('.ino') ? path : undefined; + } + const entries = await fs.readdir(path, { withFileTypes: true }); + const sketchFilename = entries + .filter((entry) => entry.isFile() && entry.name.endsWith('.ino')) + .map(({ name }) => name) + // A folder might contain multiple sketches. It's OK to pick the first one as IDE2 cannot do much, + // but ensure a deterministic behavior as `readdir(3)` does not guarantee an order. Sort them. + .sort((left, right) => left.localeCompare(right))[0]; + if (sketchFilename) { + return join(path, sketchFilename); + } + // If no sketches found in the folder, but the folder exists, + // return with the path of the empty folder and let IDE2's frontend + // figure out the workspace root. + return fallbackToInvalidFolderPath ? path : undefined; +} + /* * When a new sketch is created, add a suffix to distinguish it * from other new sketches I created today. @@ -630,3 +830,186 @@ function sketchIndexToLetters(num: number): string { } while (pow > 0); return out; } + +async function exists(pathLike: string): Promise<boolean> { + try { + await fs.access(pathLike, constants.R_OK); + return true; + } catch { + return false; + } +} + +/** + * Recursively discovers sketches in the `root` folder give by the filesystem path. + * Missing `root` must be handled by callers. This function expects an accessible `root` directory. + */ +export async function discoverSketches( + root: string, + container: Mutable<SketchContainer>, + logger?: ILogger +): Promise<SketchContainer> { + const pathToAllSketchFiles = await glob( + '/!(libraries|hardware)/**/*.{ino,pde}', + { root } + ); + // if no match try to glob the sketchbook as a sketch folder + if (!pathToAllSketchFiles.length) { + pathToAllSketchFiles.push(...(await glob('/*.{ino,pde}', { root }))); + } + + // Sort by path length to filter out nested sketches, such as the `Nested_folder` inside the `Folder` sketch. + // + // `directories#user` + // | + // +--Folder + // | + // +--Folder.ino + // | + // +--Nested_folder + // | + // +--Nested_folder.ino + pathToAllSketchFiles.sort((left, right) => { + if (left.length === right.length) { + // Sort alphabetically for tests consistency + return left.localeCompare(right); + } + return left.length - right.length; + }); + + const getOrCreateChildContainer = ( + container: SketchContainer, + segments: string[] + ): SketchContainer => { + // the sketchbook is a sketch folder + if (segments.length === 1) { + return container; + } + const segmentsCopy = segments.slice(); + let currentContainer = container; + while (segmentsCopy.length > 2) { + const currentSegment = segmentsCopy.shift(); + if (!currentSegment) { + throw new Error( + `'currentSegment' was not set when processing sketch container: ${JSON.stringify( + container + )}, original segments: ${JSON.stringify( + segments + )}, current container: ${JSON.stringify( + currentContainer + )}, current working segments: ${JSON.stringify(segmentsCopy)}` + ); + } + let childContainer = currentContainer.children.find( + (childContainer) => childContainer.label === currentSegment + ); + if (!childContainer) { + childContainer = SketchContainer.create(currentSegment); + currentContainer.children.push(childContainer); + } + currentContainer = childContainer; + } + if (segmentsCopy.length !== 2) { + throw new Error( + `Expected exactly two segments. A sketch folder name and the main sketch file name. For example, ['ExampleSketchName', 'ExampleSketchName.{ino,pde}]. Was: ${segmentsCopy}` + ); + } + return currentContainer; + }; + + // If the container has a sketch with the same name, it cannot have a child container. + // See above example about how to ignore nested sketches. + const prune = ( + container: Mutable<SketchContainer> + ): Mutable<SketchContainer> => { + for (const sketch of container.sketches) { + const childContainerIndex = container.children.findIndex( + (childContainer) => childContainer.label === sketch.name + ); + if (childContainerIndex >= 0) { + container.children.splice(childContainerIndex, 1); + } + } + container.children.forEach(prune); + return container; + }; + + for (const pathToSketchFile of pathToAllSketchFiles) { + const relative = path.relative(root, pathToSketchFile); + if (!relative) { + logger?.warn( + `Could not determine relative sketch path from the root <${root}> to the sketch <${pathToSketchFile}>. Skipping. Relative path was: ${relative}` + ); + continue; + } + const segments = relative.split(path.sep); + let sketchName: string; + let sketchFilename: string; + if (!segments.length) { + // no segments. + logger?.warn( + `Expected at least one segment relative path ${relative} from the root <${root}> to the sketch <${pathToSketchFile}>. Skipping.` + ); + continue; + } else if (segments.length === 1) { + // The sketchbook root is a sketch folder + sketchName = path.basename(root); + sketchFilename = segments[0]; + } else { + // the folder name and the sketch name must match. For example, `Foo/foo.ino` is invalid. + // drop the folder name from the sketch name, if `.ino` or `.pde` remains, it's valid + sketchName = segments[segments.length - 2]; + sketchFilename = segments[segments.length - 1]; + } + const sketchFileExtension = segments[segments.length - 1].replace( + new RegExp(escapeRegExpCharacters(sketchName)), + '' + ); + if (sketchFileExtension !== '.ino' && sketchFileExtension !== '.pde') { + logger?.warn( + `Mismatching sketch file <${sketchFilename}> and sketch folder name <${sketchName}>. Skipping` + ); + continue; + } + const child = getOrCreateChildContainer(container, segments); + child.sketches.push({ + name: sketchName, + uri: FileUri.create(path.dirname(pathToSketchFile)).toString(), + }); + } + + return prune(container); +} + +/** + * Replica of Go `os.UserCacheDir()`. + * https://github.com/golang/go/blob/777f43ab27bde4c662cd0a663f807f74f3fbab0f/src/os/file.go#L477 + */ +export function userCacheDir(): string { + let dir: string | undefined; + const platform = os.platform(); + + switch (platform) { + case 'darwin': { + dir = path.join(os.homedir(), '/Library/Caches'); + break; + } + case 'win32': { + dir = process.env.LocalAppData || undefined; + if (!dir) { + throw new Error('%LocalAppData% is not defined'); + } + break; + } + default: { + dir = process.env.XDG_CACHE_HOME || undefined; + if (!dir) { + dir = path.join(os.homedir() + '/.cache'); + } else if (!path.isAbsolute(dir)) { + throw new Error('path in $XDG_CACHE_HOME is relative'); + } + } + } + + return dir; +} diff --git a/arduino-ide-extension/src/node/survey-service-impl.ts b/arduino-ide-extension/src/node/survey-service-impl.ts deleted file mode 100644 index aea8c0472..000000000 --- a/arduino-ide-extension/src/node/survey-service-impl.ts +++ /dev/null @@ -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; - } -} diff --git a/arduino-ide-extension/src/node/theia/core/websocket-endpoint.ts b/arduino-ide-extension/src/node/theia/core/websocket-endpoint.ts new file mode 100644 index 000000000..c70ec23dc --- /dev/null +++ b/arduino-ide-extension/src/node/theia/core/websocket-endpoint.ts @@ -0,0 +1,12 @@ +import { WebsocketEndpoint as TheiaWebsocketEndpoint } from '@theia/core/lib/node/messaging/websocket-endpoint'; +import { injectable } from '@theia/core/shared/inversify'; + +@injectable() +export class WebsocketEndpoint extends TheiaWebsocketEndpoint { + // https://github.com/eclipse-theia/theia/discussions/11543 + protected override checkAliveTimeout = process.argv.includes( + '--no-ping-timeout' + ) + ? 24 * 60 * 60 * 1_000 // one day + : 30_000; +} diff --git a/arduino-ide-extension/src/node/theia/env-variables/env-variables-server.ts b/arduino-ide-extension/src/node/theia/env-variables/env-variables-server.ts index 7380cb71e..30a849308 100644 --- a/arduino-ide-extension/src/node/theia/env-variables/env-variables-server.ts +++ b/arduino-ide-extension/src/node/theia/env-variables/env-variables-server.ts @@ -1,15 +1,112 @@ -import { join } from 'path'; -import { homedir } from 'os'; -import { injectable } from '@theia/core/shared/inversify'; -import { FileUri } from '@theia/core/lib/node/file-uri'; +import { + EnvVariable, + EnvVariablesServer as TheiaEnvVariablesServer, +} from '@theia/core/lib/common/env-variables/env-variables-protocol'; +import { isWindows } from '@theia/core/lib/common/os'; +import URI from '@theia/core/lib/common/uri'; import { BackendApplicationConfigProvider } from '@theia/core/lib/node/backend-application-config-provider'; -import { EnvVariablesServerImpl as TheiaEnvVariablesServerImpl } from '@theia/core/lib/node/env-variables/env-variables-server'; +import { FileUri } from '@theia/core/lib/common/file-uri'; +import { + inject, + injectable, + postConstruct, +} from '@theia/core/shared/inversify'; +import { list as listDrives } from 'drivelist'; +import { homedir } from 'node:os'; +import { join } from 'node:path'; @injectable() -export class EnvVariablesServer extends TheiaEnvVariablesServerImpl { - protected override readonly configDirUri = Promise.resolve( - FileUri.create( - join(homedir(), BackendApplicationConfigProvider.get().configDirName) - ).toString() - ); +export class ConfigDirUriProvider { + private uri: URI | undefined; + + configDirUri(): URI { + if (!this.uri) { + this.uri = FileUri.create( + join(homedir(), BackendApplicationConfigProvider.get().configDirName) + ); + } + return this.uri; + } +} + +// Copy-pasted from https://github.com/eclipse-theia/theia/blob/v1.31.1/packages/core/src/node/env-variables/env-variables-server.ts +// to simplify the binding of the config directory location for tests. +@injectable() +export class EnvVariablesServer implements TheiaEnvVariablesServer { + @inject(ConfigDirUriProvider) + private readonly configDirUriProvider: ConfigDirUriProvider; + + private readonly envs: { [key: string]: EnvVariable } = {}; + private readonly homeDirUri = FileUri.create(homedir()).toString(); + + constructor() { + const prEnv = process.env; + Object.keys(prEnv).forEach((key: string) => { + let keyName = key; + if (isWindows) { + keyName = key.toLowerCase(); + } + this.envs[keyName] = { name: keyName, value: prEnv[key] }; + }); + } + + @postConstruct() + protected init(): void { + console.log( + `Configuration directory URI: '${this.configDirUriProvider + .configDirUri() + .toString()}'` + ); + } + + async getExecPath(): Promise<string> { + return process.execPath; + } + + async getVariables(): Promise<EnvVariable[]> { + return Object.keys(this.envs).map((key) => this.envs[key]); + } + + async getValue(key: string): Promise<EnvVariable | undefined> { + if (isWindows) { + key = key.toLowerCase(); + } + return this.envs[key]; + } + + async getConfigDirUri(): Promise<string> { + return this.configDirUriProvider.configDirUri().toString(); + } + + async getHomeDirUri(): Promise<string> { + return this.homeDirUri; + } + + async getDrives(): Promise<string[]> { + const uris: string[] = []; + const drives = await listDrives(); + for (const drive of drives) { + for (const mountpoint of drive.mountpoints) { + if (this.filterHiddenPartitions(mountpoint.path)) { + uris.push(FileUri.create(mountpoint.path).toString()); + } + } + } + return uris; + } + + /** + * Filters hidden and system partitions. + */ + private filterHiddenPartitions(path: string): boolean { + // OS X: This is your sleep-image. When your Mac goes to sleep it writes the contents of its memory to the hard disk. (https://bit.ly/2R6cztl) + if (path === '/private/var/vm') { + return false; + } + // Ubuntu: This system partition is simply the boot partition created when the computers mother board runs UEFI rather than BIOS. (https://bit.ly/2N5duHr) + if (path === '/boot/efi') { + return false; + } + return true; + } } diff --git a/arduino-ide-extension/src/node/theia/filesystem/parcel-bindings.ts b/arduino-ide-extension/src/node/theia/filesystem/parcel-bindings.ts new file mode 100644 index 000000000..ed969263a --- /dev/null +++ b/arduino-ide-extension/src/node/theia/filesystem/parcel-bindings.ts @@ -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; +} diff --git a/arduino-ide-extension/src/node/theia/filesystem/parcel-watcher/index.ts b/arduino-ide-extension/src/node/theia/filesystem/parcel-watcher/index.ts new file mode 100644 index 000000000..49342eb64 --- /dev/null +++ b/arduino-ide-extension/src/node/theia/filesystem/parcel-watcher/index.ts @@ -0,0 +1,31 @@ +import * as yargs from '@theia/core/shared/yargs'; +import { JsonRpcProxyFactory } from '@theia/core/lib/common/messaging/proxy-factory'; +import { NoDelayDisposalTimeoutParcelFileSystemWatcherService } from './parcel-filesystem-service'; +import type { IPCEntryPoint } from '@theia/core/lib/node/messaging/ipc-protocol'; +import type { FileSystemWatcherServiceClient } from '@theia/filesystem/lib/common/filesystem-watcher-protocol'; + +const options: { + verbose: boolean; +} = yargs + .option('verbose', { + default: false, + alias: 'v', + type: 'boolean', + }) + .option('nsfwOptions', { + alias: 'o', + type: 'string', + coerce: JSON.parse, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + }).argv as any; + +export default <IPCEntryPoint>((connection) => { + const server = new NoDelayDisposalTimeoutParcelFileSystemWatcherService( + options + ); + const factory = new JsonRpcProxyFactory<FileSystemWatcherServiceClient>( + server + ); + server.setClient(factory.createProxy()); + factory.listen(connection); +}); diff --git a/arduino-ide-extension/src/node/theia/filesystem/parcel-watcher/parcel-filesystem-service.ts b/arduino-ide-extension/src/node/theia/filesystem/parcel-watcher/parcel-filesystem-service.ts new file mode 100644 index 000000000..2282391f9 --- /dev/null +++ b/arduino-ide-extension/src/node/theia/filesystem/parcel-watcher/parcel-filesystem-service.ts @@ -0,0 +1,32 @@ +import { Minimatch } from 'minimatch'; +import type { WatchOptions } from '@theia/filesystem/lib/common/filesystem-watcher-protocol'; +import { + ParcelFileSystemWatcherService, + ParcelWatcher, +} 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. +// https://github.com/eclipse-theia/theia/issues/11639#issuecomment-1238980708 +const NoDelay = 0; + +export class NoDelayDisposalTimeoutParcelFileSystemWatcherService extends ParcelFileSystemWatcherService { + protected override createWatcher( + clientId: number, + fsPath: string, + options: WatchOptions + ): ParcelWatcher { + const watcherOptions = { + ignored: options.ignored.map( + (pattern) => new Minimatch(pattern, { dot: true }) + ), + }; + return new ParcelWatcher( + clientId, + fsPath, + watcherOptions, + this.options, + this.maybeClient, + NoDelay + ); + } +} diff --git a/arduino-ide-extension/src/node/theia/plugin-ext-vscode/scanner-vscode.ts b/arduino-ide-extension/src/node/theia/plugin-ext-vscode/scanner-vscode.ts new file mode 100644 index 000000000..0fd68c9b4 --- /dev/null +++ b/arduino-ide-extension/src/node/theia/plugin-ext-vscode/scanner-vscode.ts @@ -0,0 +1,44 @@ +import { injectable, postConstruct } from '@theia/core/shared/inversify'; +import { VsCodePluginScanner as TheiaVsCodePluginScanner } from '@theia/plugin-ext-vscode/lib/node/scanner-vscode'; +import { + PluginPackageViewWelcome, + ViewWelcome, +} from '@theia/plugin-ext/lib/common/plugin-protocol'; + +@injectable() +export class VsCodePluginScanner extends TheiaVsCodePluginScanner { + @postConstruct() + protected init(): void { + this['readViewWelcome'] = ( + rawViewWelcome: PluginPackageViewWelcome, + pluginViewsIds: string[] + ) => { + const result = { + view: rawViewWelcome.view, + content: rawViewWelcome.contents, + when: rawViewWelcome.when, + // if the plugin contributes Welcome view to its own view - it will be ordered first + order: + pluginViewsIds.findIndex((v) => v === rawViewWelcome.view) > -1 + ? 0 + : 1, + }; + return maybeSetEnablement(rawViewWelcome, result); + }; + } +} + +// This is not yet supported by Theia but available in Code (https://github.com/microsoft/vscode/issues/114304) +function maybeSetEnablement( + rawViewWelcome: PluginPackageViewWelcome, + result: ViewWelcome +) { + const enablement = + 'enablement' in rawViewWelcome && + typeof rawViewWelcome['enablement'] === 'string' && + rawViewWelcome['enablement']; + if (enablement) { + Object.assign(result, { enablement }); + } + return result; +} diff --git a/arduino-ide-extension/src/node/theia/plugin-ext/hosted-plugin-localization-service.ts b/arduino-ide-extension/src/node/theia/plugin-ext/hosted-plugin-localization-service.ts new file mode 100644 index 000000000..2a3a5b6a3 --- /dev/null +++ b/arduino-ide-extension/src/node/theia/plugin-ext/hosted-plugin-localization-service.ts @@ -0,0 +1,13 @@ +import * as fs from '@theia/core/shared/fs-extra'; +import { injectable } from '@theia/core/shared/inversify'; +import { HostedPluginLocalizationService as TheiaHostedPluginLocalizationService } from '@theia/plugin-ext/lib/hosted/node/hosted-plugin-localization-service'; + +@injectable() +export class HostedPluginLocalizationService extends TheiaHostedPluginLocalizationService { + // Remove when https://github.com/eclipse-theia/theia/pull/11853 is available from Theia. + override async initialize(): Promise<void> { + this.getLocalizationCacheDir() + .then((cacheDir) => fs.emptyDir(cacheDir)) + .then(() => this._ready.resolve()); + } +} diff --git a/arduino-ide-extension/src/node/theia/plugin-ext/plugin-deployer.ts b/arduino-ide-extension/src/node/theia/plugin-ext/plugin-deployer.ts new file mode 100644 index 000000000..32694d606 --- /dev/null +++ b/arduino-ide-extension/src/node/theia/plugin-ext/plugin-deployer.ts @@ -0,0 +1,100 @@ +import { URI } from '@theia/core/lib/common/uri'; +import { + inject, + injectable, + postConstruct, +} from '@theia/core/shared/inversify'; +import { + PluginDeployerResolver, + PluginDeployerResolverContext, +} from '@theia/plugin-ext/lib/common/plugin-protocol'; +import { PluginDeployerImpl } from '@theia/plugin-ext/lib/main/node/plugin-deployer-impl'; +import { LocalDirectoryPluginDeployerResolver } from '@theia/plugin-ext/lib/main/node/resolvers/local-directory-plugin-deployer-resolver'; +import { constants, promises as fs } from 'node:fs'; +import { isAbsolute, resolve } from 'node:path'; + +@injectable() +export class LocalDirectoryPluginDeployerResolverWithFallback extends LocalDirectoryPluginDeployerResolver { + override async resolve( + pluginResolverContext: PluginDeployerResolverContext + ): Promise<void> { + const origin = pluginResolverContext.getOriginId(); + // The original implementation must not run when there is a hash in the path. Otherwise, it can resolve an undesired directory. + // Consider app under c:\Users\username\Desktop\# here is my app\ + // Then the flawed logic will incorrectly find c:\Users\username\Desktop location after stripping the rest of the path after the hash. + // The implementation which provides a workaround for the hash in the path assumes that the original Theia logic is correct, when no hash present in the URI path. + let localPath: string | null; + if (origin.includes('#')) { + localPath = await resolveLocalPluginPathFallback( + pluginResolverContext, + this.supportedScheme + ); + } else { + localPath = await this.originalResolveLocalPluginPath( + pluginResolverContext, + this.supportedScheme + ); + } + if (localPath) { + await this.resolveFromLocalPath(pluginResolverContext, localPath); + } + } + + private async originalResolveLocalPluginPath( + context: PluginDeployerResolverContext, + scheme: string + ): Promise<string | null> { + const object = <Record<string, unknown>>this; + if ( + 'resolveLocalPluginPath' in object && + typeof object['resolveLocalPluginPath'] === 'function' + ) { + return object['resolveLocalPluginPath'](context, scheme); + } + return null; + } +} + +async function resolveLocalPluginPathFallback( + context: PluginDeployerResolverContext, + scheme: string +): Promise<string | null> { + const uri = new URI(context.getOriginId()); + if (uri.scheme === scheme) { + const unencodedRawUri = uri.toString(true); + let fsPath = unencodedRawUri.substring(`${scheme}:`.length); + if (!isAbsolute(fsPath)) { + fsPath = resolve(process.cwd(), fsPath); + } + try { + await fs.access(fsPath, constants.R_OK); + return fsPath; + } catch { + console.warn( + `The local plugin referenced by ${context.getOriginId()} does not exist.` + ); + } + } + return null; +} + +@injectable() +export class PluginDeployer_GH_12064 extends PluginDeployerImpl { + @inject(LocalDirectoryPluginDeployerResolverWithFallback) + private readonly pluginResolver: LocalDirectoryPluginDeployerResolverWithFallback; + + @postConstruct() + protected adjustPluginResolvers(): void { + const pluginResolvers = <PluginDeployerResolver[]>( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (this as any).pluginResolvers + ); + const index = pluginResolvers.findIndex( + (pluginResolver) => + pluginResolver instanceof LocalDirectoryPluginDeployerResolver + ); + if (index >= 0) { + pluginResolvers.splice(index, 1, this.pluginResolver); + } + } +} diff --git a/arduino-ide-extension/src/node/theia/plugin-ext/plugin-reader.ts b/arduino-ide-extension/src/node/theia/plugin-ext/plugin-reader.ts new file mode 100644 index 000000000..a5e60ced2 --- /dev/null +++ b/arduino-ide-extension/src/node/theia/plugin-ext/plugin-reader.ts @@ -0,0 +1,106 @@ +import { injectable } from '@theia/core/shared/inversify'; +import type { + PluginContribution, + PluginPackage, +} from '@theia/plugin-ext/lib/common/plugin-protocol'; +import { HostedPluginReader as TheiaHostedPluginReader } from '@theia/plugin-ext/lib/hosted/node/plugin-reader'; + +@injectable() +export class HostedPluginReader extends TheiaHostedPluginReader { + override async readContribution( + plugin: PluginPackage + ): Promise<PluginContribution | undefined> { + const scanner = this.scanner.getScanner(plugin); + const contributions = await scanner.getContribution(plugin); + return this.mapContribution(plugin.name, contributions); + } + + private mapContribution( + pluginName: string, + contributions: PluginContribution | undefined + ): PluginContribution | undefined { + if (!contributions) { + return contributions; + } + const mapper = pluginMappers.get(pluginName); + return mapper ? mapper(contributions) : contributions; + } +} + +type PluginContributionMapper = ( + contribution: PluginContribution +) => PluginContribution | undefined; +const cortexDebugMapper: PluginContributionMapper = ( + contribution: PluginContribution +) => { + if (contribution.viewsContainers) { + for (const location of Object.keys(contribution.viewsContainers)) { + const viewContainers = contribution.viewsContainers[location]; + for (let i = 0; i < viewContainers.length; i++) { + const viewContainer = viewContainers[i]; + if ( + viewContainer.id === 'cortex-debug' && + viewContainer.title === 'RTOS' + ) { + viewContainers.splice(i, 1); + } + } + } + } + if (contribution.views) { + for (const location of Object.keys(contribution.views)) { + if (location === 'cortex-debug') { + const views = contribution.views[location]; + for (let i = 0; i < views.length; i++) { + const view = views[i]; + if (view.id === 'cortex-debug.rtos') { + views.splice(i, 1); + } + } + } + } + } + if (contribution.menus) { + for (const location of Object.keys(contribution.menus)) { + if (location === 'commandPalette') { + const menus = contribution.menus[location]; + for (let i = 0; i < menus.length; i++) { + const menu = menus[i]; + if (menu.command === 'cortex-debug.rtos.toggleRTOSPanel') { + menu.when = 'false'; + } + } + } + } + } + if (contribution.commands) { + for (const command of contribution.commands) { + if (command.command === 'cortex-debug.resetDevice') { + // TODO: fix loading of original SVG icon in Theia + delete command.iconUrl; + } + } + } + for (const _debugger of contribution.debuggers ?? []) { + if (_debugger.type === 'cortex-debug') { + for (const attributes of Object.values( + _debugger.configurationAttributes ?? {} + )) { + if (attributes.properties) { + // Patch the cortex-debug debug config schema to allow the in-house `configId`. + attributes.properties['configId'] = { + type: 'string', + description: + 'Arduino debug configuration identifier consisting of the Fully Qualified Board Name (FQBN) and the programmer identifier (for example, `esptool`)', + }; + } + } + } + } + + return contribution; +}; + +const pluginMappers = new Map<string, PluginContributionMapper>([ + ['cortex-debug', cortexDebugMapper], +]); diff --git a/arduino-ide-extension/src/node/theia/workspace/default-workspace-server.ts b/arduino-ide-extension/src/node/theia/workspace/default-workspace-server.ts index 89a5e0698..6b3dc459c 100644 --- a/arduino-ide-extension/src/node/theia/workspace/default-workspace-server.ts +++ b/arduino-ide-extension/src/node/theia/workspace/default-workspace-server.ts @@ -1,8 +1,7 @@ -import { promises as fs, constants } from 'fs'; -import { injectable, inject } from '@theia/core/shared/inversify'; +import { FileUri } from '@theia/core/lib/node'; +import { inject, injectable } from '@theia/core/shared/inversify'; import { DefaultWorkspaceServer as TheiaDefaultWorkspaceServer } from '@theia/workspace/lib/node/default-workspace-server'; import { SketchesService } from '../../../common/protocol'; -import { FileUri } from '@theia/core/lib/node'; import { IsTempSketch } from '../../is-temp-sketch'; @injectable() @@ -21,26 +20,6 @@ export class DefaultWorkspaceServer extends TheiaDefaultWorkspaceServer { return uri; } - /** - * This is the async re-implementation of the default Theia behavior. - */ - override async getRecentWorkspaces(): Promise<string[]> { - const listUri: string[] = []; - const data = await this.readRecentWorkspacePathsFromUserHome(); - if (data && data.recentRoots) { - await Promise.all( - data.recentRoots - .filter((element) => Boolean(element)) - .map(async (element) => { - if (await this.exists(element)) { - listUri.push(element); - } - }) - ); - } - return listUri; - } - protected override async writeToUserHome( data: RecentWorkspacePathsData ): Promise<void> { @@ -69,15 +48,6 @@ export class DefaultWorkspaceServer extends TheiaDefaultWorkspaceServer { recentRoots, }; } - - private async exists(uri: string): Promise<boolean> { - try { - await fs.access(FileUri.fsPath(uri), constants.R_OK | constants.W_OK); - return true; - } catch { - return false; - } - } } // Remove after https://github.com/eclipse-theia/theia/pull/11603 diff --git a/arduino-ide-extension/src/node/utils/buffers.ts b/arduino-ide-extension/src/node/utils/buffers.ts index 63ed1a97c..5c17686c3 100644 --- a/arduino-ide-extension/src/node/utils/buffers.ts +++ b/arduino-ide-extension/src/node/utils/buffers.ts @@ -71,7 +71,7 @@ namespace Chunks { if (current && current.buffers) { result.push([ current.severity, - Buffer.concat(current.buffers).toString('utf-8'), + Buffer.concat(current.buffers).toString('utf8'), ]); } }; diff --git a/arduino-ide-extension/src/node/utils/errors.ts b/arduino-ide-extension/src/node/utils/errors.ts new file mode 100644 index 000000000..83ad84f5e --- /dev/null +++ b/arduino-ide-extension/src/node/utils/errors.ts @@ -0,0 +1,54 @@ +export type ErrnoException = Error & { code: string; errno: number }; +export namespace ErrnoException { + export function is(arg: unknown): arg is ErrnoException { + if (arg instanceof Error) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const error = arg as any; + return ( + 'code' in error && + 'errno' in error && + typeof error['code'] === 'string' && + typeof error['errno'] === 'number' + ); + } + return false; + } + + /** + * _(Permission denied):_ An attempt was made to access a file in a way forbidden by its file access permissions. + */ + export function isEACCES( + arg: unknown + ): arg is ErrnoException & { code: 'EACCES' } { + return is(arg) && arg.code === 'EACCES'; + } + + /** + * _(No such file or directory):_ Commonly raised by `fs` operations to indicate that a component of the specified pathname does not exist — no entity (file or directory) could be found by the given path. + */ + export function isENOENT( + arg: unknown + ): arg is ErrnoException & { code: 'ENOENT' } { + return is(arg) && arg.code === 'ENOENT'; + } + + /** + * _(Not a directory):_ A component of the given pathname existed, but was not a directory as expected. Commonly raised by `fs.readdir`. + */ + export function isENOTDIR( + arg: unknown + ): arg is ErrnoException & { code: 'ENOTDIR' } { + return is(arg) && arg.code === 'ENOTDIR'; + } + + /** + * _"That 4094 error code is a generic network-or-configuration error, Node.js just passes it on from the operating system."_ + * + * See [nodejs/node#19965](https://github.com/nodejs/node/issues/19965#issuecomment-380750573) for more details. + */ + export function isUNKNOWN( + arg: unknown + ): arg is ErrnoException & { code: 'UNKNOWN' } { + return is(arg) && arg.code === 'UNKNOWN'; + } +} diff --git a/arduino-ide-extension/src/node/web-socket/web-socket-provider-impl.ts b/arduino-ide-extension/src/node/web-socket/web-socket-provider-impl.ts index 463dadcf7..e78e39ac3 100644 --- a/arduino-ide-extension/src/node/web-socket/web-socket-provider-impl.ts +++ b/arduino-ide-extension/src/node/web-socket/web-socket-provider-impl.ts @@ -1,6 +1,6 @@ import { Emitter } from '@theia/core'; import { injectable } from '@theia/core/shared/inversify'; -import * as WebSocket from 'ws'; +import WebSocket from '@theia/core/shared/ws'; import { WebSocketProvider } from './web-socket-provider'; @injectable() diff --git a/arduino-ide-extension/src/node/web-socket/web-socket-provider.ts b/arduino-ide-extension/src/node/web-socket/web-socket-provider.ts index 6aa102040..cd22e2fd3 100644 --- a/arduino-ide-extension/src/node/web-socket/web-socket-provider.ts +++ b/arduino-ide-extension/src/node/web-socket/web-socket-provider.ts @@ -1,9 +1,9 @@ import { Event } from '@theia/core/lib/common/event'; -import * as WebSocket from 'ws'; +import type { AddressInfo } from '@theia/core/shared/ws'; export const WebSocketProvider = Symbol('WebSocketProvider'); export interface WebSocketProvider { - getAddress(): WebSocket.AddressInfo; + getAddress(): AddressInfo; sendMessage(message: string): void; onMessageReceived: Event<string>; onClientsNumberChanged: Event<number>; diff --git a/arduino-ide-extension/src/test/browser/auto-select-programmer.test.ts b/arduino-ide-extension/src/test/browser/auto-select-programmer.test.ts new file mode 100644 index 000000000..04d464106 --- /dev/null +++ b/arduino-ide-extension/src/test/browser/auto-select-programmer.test.ts @@ -0,0 +1,176 @@ +import { enableJSDOM } from '@theia/core/lib/browser/test/jsdom'; +const disableJSDOM = enableJSDOM(); + +import { FrontendApplicationConfigProvider } from '@theia/core/lib/browser/frontend-application-config-provider'; +FrontendApplicationConfigProvider.set({}); + +import { + Disposable, + DisposableCollection, +} from '@theia/core/lib/common/disposable'; +import { expect } from 'chai'; +import { BoardsDataStore } from '../../browser/boards/boards-data-store'; +import { ensureProgrammerIsSelected } from '../../browser/contributions/auto-select-programmer'; +import { Programmer } from '../../common/protocol'; + +disableJSDOM(); + +describe('auto-select-programmer', () => { + describe('ensureProgrammerIsSelected', () => { + let debugMessages: string[]; + const toDispose = new DisposableCollection(); + const fqbn = 'a:b:c'; + const programmer: Programmer = { + id: 'p1', + name: 'P1', + platform: 'a:b', + }; + const anotherProgrammer: Programmer = { + id: 'p2', + name: 'P2', + platform: 'a:b', + }; + + before(() => { + const debug = console.debug; + console.debug = (message: string) => debugMessages.push(message); + toDispose.push(Disposable.create(() => (console.debug = debug))); + }); + + beforeEach(() => (debugMessages = [])); + + after(() => toDispose.dispose()); + + it('should not set when the fqbn is missing', async () => { + const ok = await ensureProgrammerIsSelected({ + fqbn: undefined, + getData: () => BoardsDataStore.Data.EMPTY, + loadBoardDetails: () => undefined, + selectProgrammer: () => false, + }); + expect(ok).to.be.false; + expect(debugMessages).to.be.empty; + }); + + it('should not set when no board details found (missing core)', async () => { + const ok = await ensureProgrammerIsSelected({ + fqbn, + getData: () => BoardsDataStore.Data.EMPTY, + loadBoardDetails: () => undefined, + selectProgrammer: () => false, + }); + expect(ok).to.be.false; + expect(debugMessages).to.be.deep.equal([ + 'Ensuring a programmer is selected for a:b:c...', + 'Skipping. No boards data is available for a:b:c.', + ]); + }); + + it('should be noop when the programmer is already selected', async () => { + const ok = await ensureProgrammerIsSelected({ + fqbn, + getData: () => ({ + configOptions: [], + programmers: [programmer], + selectedProgrammer: programmer, + defaultProgrammerId: undefined, + }), + loadBoardDetails: () => undefined, + selectProgrammer: () => false, + }); + expect(ok).to.be.true; + expect(debugMessages).to.be.deep.equal([ + 'Ensuring a programmer is selected for a:b:c...', + "A programmer is already selected for a:b:c: 'p1'.", + ]); + }); + + it('should automatically select the default one if not selected', async () => { + const selectedProgrammers: Record<string, Programmer | undefined> = {}; + const ok = await ensureProgrammerIsSelected({ + fqbn, + getData: () => ({ + configOptions: [], + programmers: [anotherProgrammer, programmer], + selectedProgrammer: undefined, + defaultProgrammerId: programmer.id, + }), + loadBoardDetails: () => undefined, + selectProgrammer: (arg) => { + selectedProgrammers[arg.fqbn] = arg.selectedProgrammer; + return true; + }, + }); + expect(ok).to.be.true; + expect(debugMessages).to.be.deep.equal([ + 'Ensuring a programmer is selected for a:b:c...', + "Selected 'p1' programmer for a:b:c.", + ]); + expect(selectedProgrammers).to.be.deep.equal({ + [fqbn]: programmer, + }); + }); + + it('should not select the programmer when loading the board details fails', async () => { + const ok = await ensureProgrammerIsSelected({ + fqbn, + getData: () => ({ + configOptions: [], + programmers: [], + selectedProgrammer: undefined, + defaultProgrammerId: undefined, + }), + loadBoardDetails: () => undefined, + selectProgrammer: () => false, + }); + expect(ok).to.be.false; + expect(debugMessages).to.be.deep.equal([ + 'Ensuring a programmer is selected for a:b:c...', + 'Skipping. No boards data is available for a:b:c.', + ]); + }); + + it('should select the programmer after reloading the data', async () => { + const selectedProgrammers: Record<string, Programmer | undefined> = {}; + const ok = await ensureProgrammerIsSelected({ + fqbn, + getData: () => ({ + configOptions: [ + { + label: 'config', + option: 'opt1', + values: [{ label: 'Opt1', selected: true, value: 'Value' }], + }, + ], + programmers: [], + selectedProgrammer: undefined, + defaultProgrammerId: undefined, + }), + loadBoardDetails: () => ({ + fqbn, + requiredTools: [], + configOptions: [], + programmers: [programmer, anotherProgrammer], + debuggingSupported: false, + VID: 'VID', + PID: 'PID', + buildProperties: [], + defaultProgrammerId: programmer.id, + }), + selectProgrammer: (arg) => { + selectedProgrammers[arg.fqbn] = arg.selectedProgrammer; + return true; + }, + }); + expect(ok).to.be.true; + expect(debugMessages).to.be.deep.equal([ + 'Ensuring a programmer is selected for a:b:c...', + 'Reloading board details for a:b:c...', + "Selected 'p1' programmer for a:b:c.", + ]); + expect(selectedProgrammers).to.be.deep.equal({ + [fqbn]: programmer, + }); + }); + }); +}); diff --git a/arduino-ide-extension/src/test/browser/board-service-provider.test.ts b/arduino-ide-extension/src/test/browser/board-service-provider.test.ts new file mode 100644 index 000000000..dd733a2c6 --- /dev/null +++ b/arduino-ide-extension/src/test/browser/board-service-provider.test.ts @@ -0,0 +1,450 @@ +import { enableJSDOM } from '@theia/core/lib/browser/test/jsdom'; +const disableJSDOM = enableJSDOM(); + +import { FrontendApplicationConfigProvider } from '@theia/core/lib/browser/frontend-application-config-provider'; +FrontendApplicationConfigProvider.set({}); + +import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state'; +import { + LocalStorageService, + StorageService, +} from '@theia/core/lib/browser/storage-service'; +import { WindowService } from '@theia/core/lib/browser/window/window-service'; +import { + Disposable, + DisposableCollection, +} from '@theia/core/lib/common/disposable'; +import { MessageService } from '@theia/core/lib/common/message-service'; +import { Container, ContainerModule } from '@theia/core/shared/inversify'; +import { expect } from 'chai'; +import { BoardsDataStore } from '../../browser/boards/boards-data-store'; +import { BoardsServiceProvider } from '../../browser/boards/boards-service-provider'; +import { NotificationCenter } from '../../browser/notification-center'; +import { + BoardIdentifierChangeEvent, + BoardsConfig, + BoardsConfigChangeEvent, + BoardsService, + DetectedPorts, + Port, + PortIdentifierChangeEvent, +} from '../../common/protocol/boards-service'; +import { NotificationServiceServer } from '../../common/protocol/notification-service'; +import { + detectedPort, + esp32S3DevModule, + mkr1000, + mkr1000SerialPort, + undiscoveredSerialPort, + uno, + unoSerialPort, +} from '../common/fixtures'; +import { bindBrowser } from './browser-test-bindings'; + +disableJSDOM(); + +describe('board-service-provider', () => { + let toDisposeAfterEach: DisposableCollection; + let boardsServiceProvider: BoardsServiceProvider; + let notificationCenter: NotificationCenter; + + beforeEach(async () => { + const container = createContainer(); + container.get<FrontendApplicationStateService>( + FrontendApplicationStateService + ).state = 'ready'; + boardsServiceProvider = container.get<BoardsServiceProvider>( + BoardsServiceProvider + ); + notificationCenter = container.get<NotificationCenter>(NotificationCenter); + toDisposeAfterEach = new DisposableCollection( + Disposable.create(() => boardsServiceProvider.onStop()) + ); + boardsServiceProvider.onStart(); + await boardsServiceProvider.ready; + }); + + afterEach(() => { + toDisposeAfterEach.dispose(); + }); + + it('should update the port (port identifier)', () => { + boardsServiceProvider['_boardsConfig'] = { + selectedBoard: uno, + selectedPort: unoSerialPort, + }; + const events: BoardsConfigChangeEvent[] = []; + toDisposeAfterEach.push( + boardsServiceProvider.onBoardsConfigDidChange((event) => + events.push(event) + ) + ); + const didUpdate = boardsServiceProvider.updateConfig(mkr1000SerialPort); + expect(didUpdate).to.be.true; + const expectedEvent: PortIdentifierChangeEvent = { + previousSelectedPort: unoSerialPort, + selectedPort: mkr1000SerialPort, + }; + expect(events).deep.equals([expectedEvent]); + }); + + it('should update the port (boards config)', () => { + boardsServiceProvider['_boardsConfig'] = { + selectedBoard: uno, + selectedPort: unoSerialPort, + }; + const events: BoardsConfigChangeEvent[] = []; + toDisposeAfterEach.push( + boardsServiceProvider.onBoardsConfigDidChange((event) => + events.push(event) + ) + ); + const didUpdate = boardsServiceProvider.updateConfig({ + selectedPort: mkr1000SerialPort, + selectedBoard: uno, + }); + expect(didUpdate).to.be.true; + const expectedEvent: PortIdentifierChangeEvent = { + previousSelectedPort: unoSerialPort, + selectedPort: mkr1000SerialPort, + }; + expect(events).deep.equals([expectedEvent]); + }); + + it('should not update the port if did not change (port identifier)', () => { + boardsServiceProvider['_boardsConfig'] = { + selectedBoard: uno, + selectedPort: unoSerialPort, + }; + const events: BoardsConfigChangeEvent[] = []; + toDisposeAfterEach.push( + boardsServiceProvider.onBoardsConfigDidChange((event) => + events.push(event) + ) + ); + const didUpdate = boardsServiceProvider.updateConfig(unoSerialPort); + expect(didUpdate).to.be.false; + expect(events).to.be.empty; + }); + + it('should update the board (board identifier)', () => { + boardsServiceProvider['_boardsConfig'] = { + selectedBoard: uno, + selectedPort: unoSerialPort, + }; + const events: BoardsConfigChangeEvent[] = []; + toDisposeAfterEach.push( + boardsServiceProvider.onBoardsConfigDidChange((event) => + events.push(event) + ) + ); + const didUpdate = boardsServiceProvider.updateConfig(mkr1000); + expect(didUpdate).to.be.true; + const expectedEvent: BoardIdentifierChangeEvent = { + previousSelectedBoard: uno, + selectedBoard: mkr1000, + }; + expect(events).deep.equals([expectedEvent]); + }); + + it('should update the board (boards config)', () => { + boardsServiceProvider['_boardsConfig'] = { + selectedBoard: uno, + selectedPort: unoSerialPort, + }; + const events: BoardsConfigChangeEvent[] = []; + toDisposeAfterEach.push( + boardsServiceProvider.onBoardsConfigDidChange((event) => + events.push(event) + ) + ); + const didUpdate = boardsServiceProvider.updateConfig({ + selectedBoard: mkr1000, + selectedPort: unoSerialPort, + }); + expect(didUpdate).to.be.true; + const expectedEvent: BoardIdentifierChangeEvent = { + previousSelectedBoard: uno, + selectedBoard: mkr1000, + }; + expect(events).deep.equals([expectedEvent]); + }); + + it('should ignore custom board configs from the FQBN', () => { + boardsServiceProvider['_boardsConfig'] = { + selectedBoard: uno, + selectedPort: unoSerialPort, + }; + const events: BoardsConfigChangeEvent[] = []; + toDisposeAfterEach.push( + boardsServiceProvider.onBoardsConfigDidChange((event) => + events.push(event) + ) + ); + const mkr1000WithCustomOptions = { + ...mkr1000, + fqbn: `${mkr1000.fqbn}:c1=v1`, + }; + const didUpdate = boardsServiceProvider.updateConfig( + mkr1000WithCustomOptions + ); + expect(didUpdate).to.be.true; + const expectedEvent: BoardIdentifierChangeEvent = { + previousSelectedBoard: uno, + selectedBoard: mkr1000WithCustomOptions, // the even has the custom board options + }; + expect(events).deep.equals([expectedEvent]); + // the persisted state does not have the config options property + expect(boardsServiceProvider.boardsConfig.selectedBoard?.fqbn).to.equal( + mkr1000.fqbn + ); + }); + + it('should not update the board if did not change (board identifier)', () => { + boardsServiceProvider['_boardsConfig'] = { + selectedBoard: uno, + selectedPort: unoSerialPort, + }; + const events: BoardsConfigChangeEvent[] = []; + toDisposeAfterEach.push( + boardsServiceProvider.onBoardsConfigDidChange((event) => + events.push(event) + ) + ); + const didUpdate = boardsServiceProvider.updateConfig(uno); + expect(didUpdate).to.be.false; + expect(events).to.be.empty; + }); + + it('should update both the board and port', () => { + boardsServiceProvider['_boardsConfig'] = { + selectedBoard: uno, + selectedPort: unoSerialPort, + }; + const events: BoardsConfigChangeEvent[] = []; + toDisposeAfterEach.push( + boardsServiceProvider.onBoardsConfigDidChange((event) => + events.push(event) + ) + ); + const didUpdate = boardsServiceProvider.updateConfig({ + selectedBoard: mkr1000, + selectedPort: mkr1000SerialPort, + }); + expect(didUpdate).to.be.true; + const expectedEvent: BoardIdentifierChangeEvent & + PortIdentifierChangeEvent = { + previousSelectedBoard: uno, + selectedBoard: mkr1000, + previousSelectedPort: unoSerialPort, + selectedPort: mkr1000SerialPort, + }; + expect(events).deep.equals([expectedEvent]); + }); + + it('should update neither the board nor the port if did not change', () => { + boardsServiceProvider['_boardsConfig'] = { + selectedBoard: uno, + selectedPort: unoSerialPort, + }; + const events: BoardsConfigChangeEvent[] = []; + toDisposeAfterEach.push( + boardsServiceProvider.onBoardsConfigDidChange((event) => + events.push(event) + ) + ); + const didUpdate = boardsServiceProvider.updateConfig({ + selectedBoard: uno, + selectedPort: unoSerialPort, + }); + expect(didUpdate).to.be.false; + expect(events).to.be.empty; + }); + + it('should detect a port change and find selection index', () => { + let boardList = boardsServiceProvider.boardList; + const didUpdate = boardsServiceProvider.updateConfig({ + selectedBoard: uno, + selectedPort: unoSerialPort, + }); + expect(didUpdate).to.be.true; + expect(boardList.selectedIndex).to.be.equal(-1); + let selectedItem = boardList.items[boardList.selectedIndex]; + expect(selectedItem).to.be.undefined; + + // attach board + notificationCenter.notifyDetectedPortsDidChange({ + detectedPorts: { + ...detectedPort(unoSerialPort, uno), + }, + }); + boardList = boardsServiceProvider.boardList; + expect(boardsServiceProvider.boardList.selectedIndex).to.be.equal(0); + selectedItem = boardList.items[boardList.selectedIndex]; + expect(selectedItem.board).to.be.deep.equal(uno); + expect(selectedItem.port).to.be.deep.equal(unoSerialPort); + + // detach board + notificationCenter.notifyDetectedPortsDidChange({ + detectedPorts: {}, + }); + boardList = boardsServiceProvider.boardList; + expect(boardsServiceProvider.boardList.selectedIndex).to.be.equal(-1); + selectedItem = boardList.items[boardList.selectedIndex]; + expect(selectedItem).to.be.undefined; + }); + + it('should update the board selection history for the port', () => { + notificationCenter.notifyDetectedPortsDidChange({ + detectedPorts: { + ...detectedPort(undiscoveredSerialPort), + ...detectedPort(unoSerialPort, uno), + ...detectedPort(mkr1000SerialPort, mkr1000), + }, + }); + + boardsServiceProvider.updateConfig({ + selectedBoard: esp32S3DevModule, + selectedPort: undiscoveredSerialPort, + }); + + expect(boardsServiceProvider['_boardListHistory']).to.be.deep.equal({ + [Port.keyOf(undiscoveredSerialPort)]: esp32S3DevModule, + }); + + boardsServiceProvider.updateConfig({ + selectedBoard: esp32S3DevModule, + selectedPort: unoSerialPort, + }); + + expect(boardsServiceProvider['_boardListHistory']).to.be.deep.equal({ + [Port.keyOf(undiscoveredSerialPort)]: esp32S3DevModule, + [Port.keyOf(unoSerialPort)]: esp32S3DevModule, + }); + + boardsServiceProvider.updateConfig({ + selectedBoard: uno, + selectedPort: unoSerialPort, + }); + + expect(boardsServiceProvider['_boardListHistory']).to.be.deep.equal({ + [Port.keyOf(undiscoveredSerialPort)]: esp32S3DevModule, + }); + }); + + type UpdateBoardListHistoryParams = Parameters< + BoardsServiceProvider['maybeUpdateBoardListHistory'] + >[0]; + type BoardListHistoryUpdateResult = ReturnType< + BoardsServiceProvider['maybeUpdateBoardListHistory'] + >; + interface BoardListHistoryTestSuite { + readonly init: BoardsConfig; + readonly detectedPorts?: DetectedPorts; + readonly params: UpdateBoardListHistoryParams; + readonly expected: BoardListHistoryUpdateResult; + /** + * Optional test title extension. + */ + readonly description?: string; + /** + * Optional test assertions. + */ + readonly assert?: ( + actual: BoardListHistoryUpdateResult, + service: BoardsServiceProvider + ) => void; + } + + const boardListHistoryTestSuites: BoardListHistoryTestSuite[] = [ + { + description: "'portToSelect' is undefined", + init: { selectedBoard: uno, selectedPort: unoSerialPort }, + params: { boardToSelect: mkr1000, portToSelect: undefined }, + expected: undefined, + }, + { + description: "'boardToSelect' is undefined", + init: { selectedBoard: uno, selectedPort: unoSerialPort }, + params: { boardToSelect: undefined, portToSelect: mkr1000SerialPort }, + expected: undefined, + }, + { + description: "'selectedBoard' fallback when 'ignore-board'", + init: { selectedBoard: uno, selectedPort: unoSerialPort }, + params: { + boardToSelect: 'ignore-board', + portToSelect: mkr1000SerialPort, + }, + expected: { [Port.keyOf(mkr1000SerialPort)]: uno }, + }, + { + description: "'selectedPort' fallback when 'ignore-port'", + init: { selectedBoard: uno, selectedPort: unoSerialPort }, + params: { + boardToSelect: mkr1000, + portToSelect: 'ignore-port', + }, + expected: { [Port.keyOf(unoSerialPort)]: mkr1000 }, + }, + { + description: + 'unsets history when board+port is from a detected port from a discovered board', + init: { selectedBoard: undefined, selectedPort: undefined }, + params: { + boardToSelect: uno, + portToSelect: unoSerialPort, + }, + detectedPorts: { + ...detectedPort(unoSerialPort, uno), + }, + expected: { [Port.keyOf(unoSerialPort)]: undefined }, + }, + ]; + boardListHistoryTestSuites.forEach((suite, index) => + it(`should handle board list history updates (${ + suite.description ? suite.description : `#${index + 1}` + })`, () => { + const { init, params, expected, assert, detectedPorts } = suite; + boardsServiceProvider['_boardsConfig'] = init; + if (detectedPorts) { + notificationCenter.notifyDetectedPortsDidChange({ detectedPorts }); + } + const actual = + boardsServiceProvider['maybeUpdateBoardListHistory'](params); + expect(actual).to.be.deep.equal(expected); + assert?.(actual, boardsServiceProvider); + }) + ); + + function createContainer(): Container { + const container = new Container({ defaultScope: 'Singleton' }); + container.load( + new ContainerModule((bind, unbind, isBound, rebind) => { + bindBrowser(bind, unbind, isBound, rebind); + bind(MessageService).toConstantValue(<MessageService>{}); + bind(BoardsService).toConstantValue(<BoardsService>{ + getDetectedPorts() { + return {}; + }, + }); + bind(NotificationCenter).toSelf().inSingletonScope(); + bind(NotificationServiceServer).toConstantValue(< + NotificationServiceServer + >{ + // eslint-disable-next-line @typescript-eslint/no-unused-vars + setClient(_) { + // nothing + }, + }); + bind(FrontendApplicationStateService).toSelf().inSingletonScope(); + bind(BoardsDataStore).toConstantValue(<BoardsDataStore>{}); + bind(LocalStorageService).toSelf().inSingletonScope(); + bind(WindowService).toConstantValue(<WindowService>{}); + bind(StorageService).toService(LocalStorageService); + bind(BoardsServiceProvider).toSelf().inSingletonScope(); + }) + ); + return container; + } +}); diff --git a/arduino-ide-extension/src/test/browser/boards-auto-installer.test.ts b/arduino-ide-extension/src/test/browser/boards-auto-installer.test.ts deleted file mode 100644 index 00570fff6..000000000 --- a/arduino-ide-extension/src/test/browser/boards-auto-installer.test.ts +++ /dev/null @@ -1,247 +0,0 @@ -// import { enableJSDOM } from '@theia/core/lib/browser/test/jsdom'; -// const disableJSDOM = enableJSDOM(); - -// import { FrontendApplicationConfigProvider } from '@theia/core/lib/browser/frontend-application-config-provider'; -// import { ApplicationProps } from '@theia/application-package/lib/application-props'; -// FrontendApplicationConfigProvider.set({ -// ...ApplicationProps.DEFAULT.frontend.config, -// }); - -// import { MessageService } from '@theia/core'; -// import { BoardsServiceProvider } from '../../browser/boards/boards-service-provider'; -// import { BoardsListWidgetFrontendContribution } from '../../browser/boards/boards-widget-frontend-contribution'; -// import { -// Board, -// BoardsPackage, -// BoardsService, -// Port, -// ResponseServiceArduino, -// } from '../../common/protocol'; -// import { IMock, It, Mock, Times } from 'typemoq'; -// import { Container, ContainerModule } from '@theia/core/shared/inversify'; -// import { BoardsAutoInstaller } from '../../browser/boards/boards-auto-installer'; -// import { BoardsConfig } from '../../browser/boards/boards-config'; -// import { tick } from '../utils'; -// import { ListWidget } from '../../browser/widgets/component-list/list-widget'; - -// disableJSDOM(); - -// const aBoard: Board = { -// fqbn: 'some:board:fqbn', -// name: 'Some Arduino Board', -// port: { address: '/lol/port1234', protocol: 'serial' }, -// }; -// const aPort: Port = { -// address: aBoard.port!.address, -// protocol: aBoard.port!.protocol, -// }; -// const aBoardConfig: BoardsConfig.Config = { -// selectedBoard: aBoard, -// selectedPort: aPort, -// }; -// const aPackage: BoardsPackage = { -// author: 'someAuthor', -// availableVersions: ['some.ver.sion', 'some.other.version'], -// boards: [aBoard], -// deprecated: false, -// description: 'Some Arduino Board, Some Other Arduino Board', -// id: 'some:arduinoCoreId', -// installable: true, -// moreInfoLink: 'http://www.some-url.lol/', -// name: 'Some Arduino Package', -// summary: 'Boards included in this package:', -// }; - -// const anInstalledPackage: BoardsPackage = { -// ...aPackage, -// installedVersion: 'some.ver.sion', -// }; - -// describe('BoardsAutoInstaller', () => { -// let subject: BoardsAutoInstaller; -// let messageService: IMock<MessageService>; -// let boardsService: IMock<BoardsService>; -// let boardsServiceClient: IMock<BoardsServiceProvider>; -// let responseService: IMock<ResponseServiceArduino>; -// let boardsManagerFrontendContribution: IMock<BoardsListWidgetFrontendContribution>; -// let boardsManagerWidget: IMock<ListWidget<BoardsPackage>>; - -// let testContainer: Container; - -// beforeEach(() => { -// testContainer = new Container(); -// messageService = Mock.ofType<MessageService>(); -// boardsService = Mock.ofType<BoardsService>(); -// boardsServiceClient = Mock.ofType<BoardsServiceProvider>(); -// responseService = Mock.ofType<ResponseServiceArduino>(); -// boardsManagerFrontendContribution = -// Mock.ofType<BoardsListWidgetFrontendContribution>(); -// boardsManagerWidget = Mock.ofType<ListWidget<BoardsPackage>>(); - -// boardsManagerWidget.setup((b) => -// b.refresh(aPackage.name.toLocaleLowerCase()) -// ); - -// boardsManagerFrontendContribution -// .setup((b) => b.openView({ reveal: true })) -// .returns(async () => boardsManagerWidget.object); - -// messageService -// .setup((m) => m.showProgress(It.isAny(), It.isAny())) -// .returns(async () => ({ -// cancel: () => null, -// id: '', -// report: () => null, -// result: Promise.resolve(''), -// })); - -// responseService -// .setup((r) => r.onProgressDidChange(It.isAny())) -// .returns(() => ({ dispose: () => null })); - -// const module = new ContainerModule((bind) => { -// bind(BoardsAutoInstaller).toSelf(); -// bind(MessageService).toConstantValue(messageService.object); -// bind(BoardsService).toConstantValue(boardsService.object); -// bind(BoardsServiceProvider).toConstantValue(boardsServiceClient.object); -// bind(ResponseServiceArduino).toConstantValue(responseService.object); -// bind(BoardsListWidgetFrontendContribution).toConstantValue( -// boardsManagerFrontendContribution.object -// ); -// }); - -// testContainer.load(module); -// subject = testContainer.get(BoardsAutoInstaller); -// }); - -// context('when it starts', () => { -// it('should register to the BoardsServiceClient in order to check the packages every a new board is plugged in', () => { -// subject.onStart(); -// boardsServiceClient.verify( -// (b) => b.onBoardsConfigChanged(It.isAny()), -// Times.once() -// ); -// }); - -// context('and it checks the installable packages', () => { -// context(`and a port and a board a selected`, () => { -// beforeEach(() => { -// boardsServiceClient -// .setup((b) => b.boardsConfig) -// .returns(() => aBoardConfig); -// }); -// context('if no package for the board is already installed', () => { -// context('if a candidate package for the board is found', () => { -// beforeEach(() => { -// boardsService -// .setup((b) => b.search(It.isValue({}))) -// .returns(async () => [aPackage]); -// }); -// it('should show a notification suggesting to install that package', async () => { -// messageService -// .setup((m) => -// m.info(It.isAnyString(), It.isAnyString(), It.isAnyString()) -// ) -// .returns(() => Promise.resolve('Install Manually')); -// subject.onStart(); -// await tick(); -// messageService.verify( -// (m) => -// m.info(It.isAnyString(), It.isAnyString(), It.isAnyString()), -// Times.once() -// ); -// }); -// context(`if the answer to the message is 'Yes'`, () => { -// beforeEach(() => { -// messageService -// .setup((m) => -// m.info(It.isAnyString(), It.isAnyString(), It.isAnyString()) -// ) -// .returns(() => Promise.resolve('Yes')); -// }); -// it('should install the package', async () => { -// subject.onStart(); - -// await tick(); - -// messageService.verify( -// (m) => m.showProgress(It.isAny(), It.isAny()), -// Times.once() -// ); -// }); -// }); -// context( -// `if the answer to the message is 'Install Manually'`, -// () => { -// beforeEach(() => { -// messageService -// .setup((m) => -// m.info( -// It.isAnyString(), -// It.isAnyString(), -// It.isAnyString() -// ) -// ) -// .returns(() => Promise.resolve('Install Manually')); -// }); -// it('should open the boards manager widget', () => { -// subject.onStart(); -// }); -// } -// ); -// }); -// context('if a candidate package for the board is not found', () => { -// beforeEach(() => { -// boardsService -// .setup((b) => b.search(It.isValue({}))) -// .returns(async () => []); -// }); -// it('should do nothing', async () => { -// subject.onStart(); -// await tick(); -// messageService.verify( -// (m) => -// m.info(It.isAnyString(), It.isAnyString(), It.isAnyString()), -// Times.never() -// ); -// }); -// }); -// }); -// context( -// 'if one of the packages for the board is already installed', -// () => { -// beforeEach(() => { -// boardsService -// .setup((b) => b.search(It.isValue({}))) -// .returns(async () => [aPackage, anInstalledPackage]); -// messageService -// .setup((m) => -// m.info(It.isAnyString(), It.isAnyString(), It.isAnyString()) -// ) -// .returns(() => Promise.resolve('Yes')); -// }); -// it('should do nothing', async () => { -// subject.onStart(); -// await tick(); -// messageService.verify( -// (m) => -// m.info(It.isAnyString(), It.isAnyString(), It.isAnyString()), -// Times.never() -// ); -// }); -// } -// ); -// }); -// context('and there is no selected board or port', () => { -// it('should do nothing', async () => { -// subject.onStart(); -// await tick(); -// messageService.verify( -// (m) => m.info(It.isAnyString(), It.isAnyString(), It.isAnyString()), -// Times.never() -// ); -// }); -// }); -// }); -// }); -// }); diff --git a/arduino-ide-extension/src/test/browser/boards-data-store.test.ts b/arduino-ide-extension/src/test/browser/boards-data-store.test.ts new file mode 100644 index 000000000..2ed808ad1 --- /dev/null +++ b/arduino-ide-extension/src/test/browser/boards-data-store.test.ts @@ -0,0 +1,909 @@ +import { enableJSDOM } from '@theia/core/lib/browser/test/jsdom'; +const disableJSDOM = enableJSDOM(); + +import { FrontendApplicationConfigProvider } from '@theia/core/lib/browser/frontend-application-config-provider'; +FrontendApplicationConfigProvider.set({}); + +import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state'; +import { + LocalStorageService, + StorageService, +} from '@theia/core/lib/browser/storage-service'; +import { WindowService } from '@theia/core/lib/browser/window/window-service'; +import { + Disposable, + DisposableCollection, +} from '@theia/core/lib/common/disposable'; +import { MessageService } from '@theia/core/lib/common/message-service'; +import { wait, waitForEvent } from '@theia/core/lib/common/promise-util'; +import { Container, ContainerModule } from '@theia/core/shared/inversify'; +import { expect } from 'chai'; +import { BoardsDataStore } from '../../browser/boards/boards-data-store'; +import { + BoardsServiceProvider, + UpdateBoardsConfigParams, +} from '../../browser/boards/boards-service-provider'; +import { NotificationCenter } from '../../browser/notification-center'; +import { + BoardDetails, + BoardsPackage, + BoardsService, + ConfigOption, + Programmer, +} from '../../common/protocol/boards-service'; +import { NotificationServiceServer } from '../../common/protocol/notification-service'; +import { bindBrowser } from './browser-test-bindings'; +import { unoSerialPort } from '../common/fixtures'; + +disableJSDOM(); + +describe('boards-data-store', function () { + this.slow(250); + + let toDisposeAfterEach: DisposableCollection; + let boardsServiceProvider: BoardsServiceProvider; + let boardsDataStore: BoardsDataStore; + let notificationCenter: NotificationCenter; + + beforeEach(async () => { + const container = createContainer(); + container.get<FrontendApplicationStateService>( + FrontendApplicationStateService + ).state = 'ready'; + notificationCenter = container.get<NotificationCenter>(NotificationCenter); + boardsServiceProvider = container.get<BoardsServiceProvider>( + BoardsServiceProvider + ); + toDisposeAfterEach = new DisposableCollection( + Disposable.create(() => boardsServiceProvider.onStop()) + ); + boardsServiceProvider.onStart(); + await boardsServiceProvider.ready; + boardsDataStore = container.get<BoardsDataStore>(BoardsDataStore); + boardsDataStore.onStart(); + }); + + afterEach(() => toDisposeAfterEach.dispose()); + + it('should load the board details when absent in local storage', async () => { + const storedData = await getStoredData(fqbn); + expect(storedData).to.be.undefined; + const data = await boardsDataStore.getData(fqbn); + expect(data).to.be.deep.equal({ + configOptions: [configOption1], + programmers: [edbg, jlink], + }); + }); + + it('should load from local storage if present', async () => { + const storedData: BoardsDataStore.Data = { + configOptions: [], + programmers: [edbg], + }; + await setStorageData(fqbn, storedData); + const data = await boardsDataStore.getData(fqbn); + expect(data).to.be.deep.equal(storedData); + }); + + it('should update board details of selected board (selected with FQBN)', async () => { + const updated = boardsServiceProvider.updateConfig(board); + expect(updated).to.be.ok; + await wait(1); + + const selectedBoardData = boardsDataStore['_selectedBoardData']; + expect(selectedBoardData).to.be.deep.equal({ + fqbn, + data: { + configOptions: [configOption1], + programmers: [edbg, jlink], + }, + }); + }); + + it('should not update the board details of selected board when FQBN is missing', async () => { + const fqbn = undefined; + const name = 'ABC'; + const board = { name, fqbn }; + const updated = boardsServiceProvider.updateConfig(board); + expect(updated).to.ok; + await wait(1); + + const selectedBoardData = boardsDataStore['_selectedBoardData']; + expect(selectedBoardData).to.be.undefined; + }); + + it('should unset the the board details of selected board when no board was selected', async () => { + let updated = boardsServiceProvider.updateConfig(board); + expect(updated).to.ok; + await wait(1); + + let selectedBoardData = boardsDataStore['_selectedBoardData']; + expect(selectedBoardData).to.be.deep.equal({ + fqbn, + data: { + configOptions: [configOption1], + programmers: [edbg, jlink], + }, + }); + + updated = boardsServiceProvider.updateConfig('unset-board'); + expect(updated).to.be.true; + await wait(1); + + selectedBoardData = boardsDataStore['_selectedBoardData']; + expect(selectedBoardData).to.be.undefined; + }); + + it('should provide startup tasks when the data is available for the selected board', async () => { + let updated = boardsServiceProvider.updateConfig(board); + expect(updated).to.be.true; + await wait(1); + + let tasks = boardsDataStore.tasks(); + expect(tasks).to.be.deep.equal([ + { + command: 'arduino-use-inherited-boards-data', + args: [ + { + fqbn, + data: { + configOptions: [configOption1], + programmers: [edbg, jlink], + }, + }, + ], + }, + ]); + + updated = boardsServiceProvider.updateConfig('unset-board'); + expect(updated).to.be.true; + await wait(1); + + tasks = boardsDataStore.tasks(); + expect(tasks).to.be.empty; + }); + + it('should not provide any startup tasks when no data is available for the selected board', async () => { + const tasks = boardsDataStore.tasks(); + expect(tasks).to.be.empty; + }); + + it('should update the startup task arg when the selected programmer changes', async () => { + let tasks = boardsDataStore.tasks(); + expect(tasks).to.be.empty; + + let data = await boardsDataStore.getData(fqbn); + expect(data).to.be.deep.equal({ + configOptions: [configOption1], + programmers: [edbg, jlink], + }); + + const updated = boardsServiceProvider.updateConfig(board); + expect(updated).to.be.ok; + await wait(1); + + tasks = boardsDataStore.tasks(); + expect(tasks).to.be.deep.equal([ + { + command: 'arduino-use-inherited-boards-data', + args: [ + { + fqbn, + data: { + configOptions: [configOption1], + programmers: [edbg, jlink], + }, + }, + ], + }, + ]); + + const result = await boardsDataStore.selectProgrammer({ + fqbn, + selectedProgrammer: edbg, + }); + expect(result).to.be.ok; + + data = await boardsDataStore.getData(fqbn); + expect(data).to.be.deep.equal({ + configOptions: [configOption1], + programmers: [edbg, jlink], + selectedProgrammer: edbg, + }); + tasks = boardsDataStore.tasks(); + expect(tasks).to.be.deep.equal([ + { + command: 'arduino-use-inherited-boards-data', + args: [ + { + fqbn, + data: { + configOptions: [configOption1], + programmers: [edbg, jlink], + selectedProgrammer: edbg, + }, + }, + ], + }, + ]); + }); + + it('should update the startup task arg when the config options change', async () => { + let tasks = boardsDataStore.tasks(); + expect(tasks).to.be.empty; + + let data = await boardsDataStore.getData(fqbn); + expect(data).to.be.deep.equal({ + configOptions: [configOption1], + programmers: [edbg, jlink], + }); + + const updated = boardsServiceProvider.updateConfig(board); + expect(updated).to.be.ok; + await wait(1); + + tasks = boardsDataStore.tasks(); + expect(tasks).to.be.deep.equal([ + { + command: 'arduino-use-inherited-boards-data', + args: [ + { + fqbn, + data: { + configOptions: [configOption1], + programmers: [edbg, jlink], + }, + }, + ], + }, + ]); + + const result = await boardsDataStore.selectConfigOption({ + fqbn, + optionsToUpdate: [ + { + option: configOption1.option, + selectedValue: configOption1.values[1].value, + }, + ], + }); + expect(result).to.be.ok; + + data = await boardsDataStore.getData(fqbn); + expect(data).to.be.deep.equal({ + configOptions: [ + { + ...configOption1, + values: [ + { label: 'C1V1', selected: false, value: 'v1' }, + { label: 'C1V2', selected: true, value: 'v2' }, + ], + }, + ], + programmers: [edbg, jlink], + }); + + tasks = boardsDataStore.tasks(); + expect(tasks).to.be.deep.equal([ + { + command: 'arduino-use-inherited-boards-data', + args: [ + { + fqbn, + data: { + configOptions: [ + { + ...configOption1, + values: [ + { label: 'C1V1', selected: false, value: 'v1' }, + { label: 'C1V2', selected: true, value: 'v2' }, + ], + }, + ], + programmers: [edbg, jlink], + }, + }, + ], + }, + ]); + }); + + it('should select the default programmer', async () => { + const storedData = await getStoredData(fqbn); + expect(storedData).to.be.undefined; + + toDisposeAfterEach.push( + mockBoardDetails([ + { + fqbn, + ...baseDetails, + defaultProgrammerId: edbg.id, + }, + ]) + ); + + const data = await boardsDataStore.getData(fqbn); + expect(data).to.be.deep.equal({ + configOptions: [configOption1], + programmers: [edbg, jlink], + defaultProgrammerId: edbg.id, + selectedProgrammer: edbg, + }); + }); + + it('should not select the default programmer when no match', async () => { + const storedData = await getStoredData(fqbn); + expect(storedData).to.be.undefined; + + toDisposeAfterEach.push( + mockBoardDetails([ + { + fqbn, + ...baseDetails, + defaultProgrammerId: 'missing', + }, + ]) + ); + + const data = await boardsDataStore.getData(fqbn); + expect(data).to.be.deep.equal({ + configOptions: [configOption1], + programmers: [edbg, jlink], + defaultProgrammerId: 'missing', + }); + }); + + it('should select a programmer', async () => { + let data = await boardsDataStore.getData(fqbn); + expect(data).to.be.deep.equal({ + configOptions: [configOption1], + programmers: [edbg, jlink], + }); + + let didChangeCounter = 0; + toDisposeAfterEach.push( + boardsDataStore.onDidChange(() => didChangeCounter++) + ); + const result = await boardsDataStore.selectProgrammer({ + fqbn, + selectedProgrammer: edbg, + }); + expect(result).to.be.ok; + expect(didChangeCounter).to.be.equal(1); + + data = await boardsDataStore.getData(fqbn); + expect(data).to.be.deep.equal({ + configOptions: [configOption1], + programmers: [edbg, jlink], + selectedProgrammer: edbg, + }); + }); + + it('should not select a programmer if it is absent', async () => { + let data = await boardsDataStore.getData(fqbn); + expect(data).to.be.deep.equal({ + configOptions: [configOption1], + programmers: [edbg, jlink], + }); + + let didChangeCounter = 0; + toDisposeAfterEach.push( + boardsDataStore.onDidChange(() => didChangeCounter++) + ); + const result = await boardsDataStore.selectProgrammer({ + fqbn, + selectedProgrammer: { id: 'p1', name: 'P1', platform: 'missing' }, + }); + expect(result).to.be.not.ok; + expect(didChangeCounter).to.be.equal(0); + + data = await boardsDataStore.getData(fqbn); + expect(data).to.be.deep.equal({ + configOptions: [configOption1], + programmers: [edbg, jlink], + }); + }); + + it('should select a config option', async () => { + let data = await boardsDataStore.getData(fqbn); + expect(data).to.be.deep.equal({ + configOptions: [configOption1], + programmers: [edbg, jlink], + }); + + let didChangeCounter = 0; + toDisposeAfterEach.push( + boardsDataStore.onDidChange(() => didChangeCounter++) + ); + const result = await boardsDataStore.selectConfigOption({ + fqbn, + optionsToUpdate: [ + { + option: configOption1.option, + selectedValue: configOption1.values[1].value, + }, + ], + }); + expect(result).to.be.ok; + expect(didChangeCounter).to.be.equal(1); + + data = await boardsDataStore.getData(fqbn); + expect(data).to.be.deep.equal({ + configOptions: [ + { + ...configOption1, + values: [ + { label: 'C1V1', selected: false, value: 'v1' }, + { label: 'C1V2', selected: true, value: 'v2' }, + ], + }, + ], + programmers: [edbg, jlink], + }); + }); + + it('should select multiple config options', async () => { + // reconfigure the board details mock for this test case to have multiple config options + toDisposeAfterEach.push( + mockBoardDetails([ + { + fqbn, + ...baseDetails, + configOptions: [configOption1, configOption2], + }, + ]) + ); + + let data = await boardsDataStore.getData(fqbn); + expect(data).to.be.deep.equal({ + configOptions: [configOption1, configOption2], + programmers: [edbg, jlink], + }); + + let didChangeCounter = 0; + toDisposeAfterEach.push( + boardsDataStore.onDidChange(() => didChangeCounter++) + ); + const result = await boardsDataStore.selectConfigOption({ + fqbn, + optionsToUpdate: [ + { + option: configOption1.option, + selectedValue: configOption1.values[1].value, + }, + { + option: configOption2.option, + selectedValue: configOption2.values[1].value, + }, + ], + }); + expect(result).to.be.ok; + expect(didChangeCounter).to.be.equal(1); + + data = await boardsDataStore.getData(fqbn); + expect(data).to.be.deep.equal({ + configOptions: [ + { + ...configOption1, + values: [ + { label: 'C1V1', selected: false, value: 'v1' }, + { label: 'C1V2', selected: true, value: 'v2' }, + ], + }, + { + ...configOption2, + values: [ + { label: 'C2V1', selected: false, value: 'v1' }, + { label: 'C2V2', selected: true, value: 'v2' }, + ], + }, + ], + programmers: [edbg, jlink], + }); + }); + + it('should emit a did change event when updating with multiple config options and at least one of them is known (valid option + valid value)', async () => { + // reconfigure the board details mock for this test case to have multiple config options + toDisposeAfterEach.push( + mockBoardDetails([ + { + fqbn, + ...baseDetails, + configOptions: [configOption1, configOption2], + }, + ]) + ); + + let data = await boardsDataStore.getData(fqbn); + expect(data).to.be.deep.equal({ + configOptions: [configOption1, configOption2], + programmers: [edbg, jlink], + }); + + let didChangeCounter = 0; + toDisposeAfterEach.push( + boardsDataStore.onDidChange(() => didChangeCounter++) + ); + const result = await boardsDataStore.selectConfigOption({ + fqbn, + optionsToUpdate: [ + { + option: 'an unknown option', + selectedValue: configOption1.values[1].value, + }, + { + option: configOption1.option, + selectedValue: configOption1.values[1].value, + }, + { + option: configOption2.option, + selectedValue: 'an unknown value', + }, + ], + }); + expect(result).to.be.ok; + expect(didChangeCounter).to.be.equal(1); + + data = await boardsDataStore.getData(fqbn); + expect(data).to.be.deep.equal({ + configOptions: [ + { + ...configOption1, + values: [ + { label: 'C1V1', selected: false, value: 'v1' }, + { label: 'C1V2', selected: true, value: 'v2' }, + ], + }, + configOption2, + ], + programmers: [edbg, jlink], + }); + }); + + it('should not emit a did change event when updating with multiple config options and all of the are unknown', async () => { + let data = await boardsDataStore.getData(fqbn); + expect(data).to.be.deep.equal({ + configOptions: [configOption1], + programmers: [edbg, jlink], + }); + + let didChangeCounter = 0; + toDisposeAfterEach.push( + boardsDataStore.onDidChange(() => didChangeCounter++) + ); + const result = await boardsDataStore.selectConfigOption({ + fqbn, + optionsToUpdate: [ + { + option: 'an unknown option', + selectedValue: configOption1.values[1].value, + }, + { + option: configOption1.option, + selectedValue: 'an unknown value', + }, + ], + }); + expect(result).to.be.not.ok; + expect(didChangeCounter).to.be.equal(0); + + data = await boardsDataStore.getData(fqbn); + expect(data).to.be.deep.equal({ + configOptions: [configOption1], + programmers: [edbg, jlink], + }); + }); + + it("should automatically update the selected config options if the boards config change 'reason' is the 'toolbar' and the (CLI) detected FQBN has config options", async () => { + // reconfigure the board details mock for this test case to have multiple config options + toDisposeAfterEach.push( + mockBoardDetails([ + { + fqbn, + ...baseDetails, + configOptions: [configOption1, configOption2], + }, + ]) + ); + + let data = await boardsDataStore.getData(fqbn); + expect(data).to.be.deep.equal({ + configOptions: [configOption1, configOption2], + programmers: [edbg, jlink], + }); + + let didChangeCounter = 0; + toDisposeAfterEach.push( + boardsDataStore.onDidChange(() => didChangeCounter++) + ); + + const boardsConfig = { + selectedPort: unoSerialPort, // the port value does not matter here, but the change must come from a toolbar as a boards config: with port+board, + selectedBoard: { + fqbn: `${board.fqbn}:${configOption1.option}=${configOption1.values[1].value},${configOption2.option}=${configOption2.values[1].value}`, + name: board.name, + }, + }; + const params: UpdateBoardsConfigParams = { + ...boardsConfig, + reason: 'toolbar', + }; + const updated = boardsServiceProvider.updateConfig(params); + expect(updated).to.be.ok; + + await waitForEvent(boardsDataStore.onDidChange, 100); + + expect(didChangeCounter).to.be.equal(1); + data = await boardsDataStore.getData(fqbn); + expect(data).to.be.deep.equal({ + configOptions: [ + { + ...configOption1, + values: [ + { label: 'C1V1', selected: false, value: 'v1' }, + { label: 'C1V2', selected: true, value: 'v2' }, + ], + }, + { + ...configOption2, + values: [ + { label: 'C2V1', selected: false, value: 'v1' }, + { label: 'C2V2', selected: true, value: 'v2' }, + ], + }, + ], + programmers: [edbg, jlink], + }); + }); + + it('should not select a config option if the option is absent', async () => { + const fqbn = 'a:b:c'; + let data = await boardsDataStore.getData(fqbn); + expect(data).to.be.deep.equal({ + configOptions: [configOption1], + programmers: [edbg, jlink], + }); + + let didChangeCounter = 0; + toDisposeAfterEach.push( + boardsDataStore.onDidChange(() => didChangeCounter++) + ); + const result = await boardsDataStore.selectConfigOption({ + fqbn, + optionsToUpdate: [ + { option: 'missing', selectedValue: configOption1.values[1].value }, + ], + }); + expect(result).to.be.not.ok; + expect(didChangeCounter).to.be.equal(0); + + data = await boardsDataStore.getData(fqbn); + expect(data).to.be.deep.equal({ + configOptions: [configOption1], + programmers: [edbg, jlink], + }); + }); + + it('should not select a config option if the selected value is absent', async () => { + let data = await boardsDataStore.getData(fqbn); + expect(data).to.be.deep.equal({ + configOptions: [configOption1], + programmers: [edbg, jlink], + }); + + let didChangeCounter = 0; + toDisposeAfterEach.push( + boardsDataStore.onDidChange(() => didChangeCounter++) + ); + const result = await boardsDataStore.selectConfigOption({ + fqbn, + optionsToUpdate: [ + { option: configOption1.option, selectedValue: 'missing' }, + ], + }); + expect(result).to.be.not.ok; + expect(didChangeCounter).to.be.equal(0); + + data = await boardsDataStore.getData(fqbn); + expect(data).to.be.deep.equal({ + configOptions: [configOption1], + programmers: [edbg, jlink], + }); + }); + + it('should not update the board data on platform install if it was not cached', async () => { + let storedData = await getStoredData(fqbn); + expect(storedData).to.be.undefined; + + let didChangeCounter = 0; + toDisposeAfterEach.push( + boardsDataStore.onDidChange(() => didChangeCounter++) + ); + notificationCenter.notifyPlatformDidInstall({ item: boardsPackage }); + await wait(1); + expect(didChangeCounter).to.be.equal(0); + + storedData = await getStoredData(fqbn); + expect(storedData).to.be.undefined; + }); + + it('should update the board data on platform install if the default empty value was cached', async () => { + let storedData = await getStoredData(fqbn); + expect(storedData).to.be.undefined; + + await setStorageData(fqbn, BoardsDataStore.Data.EMPTY); + storedData = await getStoredData(fqbn); + expect(storedData).to.be.deep.equal(BoardsDataStore.Data.EMPTY); + + let didChangeCounter = 0; + toDisposeAfterEach.push( + boardsDataStore.onDidChange(() => didChangeCounter++) + ); + notificationCenter.notifyPlatformDidInstall({ item: boardsPackage }); + await wait(1); + expect(didChangeCounter).to.be.equal(1); + + storedData = await getStoredData(fqbn); + expect(storedData).to.be.deep.equal({ + configOptions: [configOption1], + programmers: [edbg, jlink], + }); + }); + + it('should update the cached board data on platform install', async () => { + let storedData = await boardsDataStore.getData(fqbn); // caches the value + expect(storedData).to.be.deep.equal({ + configOptions: [configOption1], + programmers: [edbg, jlink], + }); + + // before the platform install event mock a different CLI `board details` output + toDisposeAfterEach.push( + mockBoardDetails([ + { + fqbn, + ...baseDetails, + configOptions: [configOption2], + }, + ]) + ); + + let didChangeCounter = 0; + toDisposeAfterEach.push( + boardsDataStore.onDidChange(() => didChangeCounter++) + ); + notificationCenter.notifyPlatformDidInstall({ item: boardsPackage }); + await wait(1); + expect(didChangeCounter).to.be.equal(1); + + storedData = await boardsDataStore.getData(fqbn); + expect(storedData).to.be.deep.equal({ + configOptions: [configOption2], + programmers: [edbg, jlink], + }); + }); + + function storageKey(fqbn: string): string { + return boardsDataStore['getStorageKey'](fqbn); + } + + function getStoredData(fqbn: string): Promise<unknown> { + const key = storageKey(fqbn); + return boardsDataStore['storageService'].getData(key); + } + + function setStorageData( + fqbn: string, + data: BoardsDataStore.Data + ): Promise<void> { + const key = storageKey(fqbn); + return boardsDataStore['storageService'].setData(key, data); + } + + function createContainer(): Container { + const container = new Container({ defaultScope: 'Singleton' }); + container.load( + new ContainerModule((bind, unbind, isBound, rebind) => { + bindBrowser(bind, unbind, isBound, rebind); + bind(MessageService).toConstantValue(<MessageService>{}); + bind(BoardsService).toConstantValue(<BoardsService>{ + getDetectedPorts() { + return {}; + }, + async getBoardDetails({ fqbn }) { + return boardDetailsMock().find((mock) => mock.fqbn === fqbn); + }, + }); + bind(NotificationCenter).toSelf().inSingletonScope(); + bind(NotificationServiceServer).toConstantValue(< + NotificationServiceServer + >{ + // eslint-disable-next-line @typescript-eslint/no-unused-vars + setClient(_) { + // nothing + }, + }); + bind(FrontendApplicationStateService).toSelf().inSingletonScope(); + bind(BoardsDataStore).toSelf().inSingletonScope(); + bind(LocalStorageService).toSelf().inSingletonScope(); + bind(WindowService).toConstantValue(<WindowService>{}); + bind(StorageService).toService(LocalStorageService); + bind(BoardsServiceProvider).toSelf().inSingletonScope(); + }) + ); + return container; + } + + // Mocks the CLI's `board details` response + const jlink: Programmer = { + platform: 'Arduino SAMD (32-bits ARM Cortex-M0+) Boards', + id: 'jlink', + name: 'Segger J-Link', + }; + const edbg: Programmer = { + platform: 'Arduino SAMD (32-bits ARM Cortex-M0+) Boards', + id: 'edbg', + name: 'Atmel EDBG', + }; + + const configOption1: ConfigOption = { + label: 'C1', + option: 'c1', + values: [ + { label: 'C1V1', selected: true, value: 'v1' }, + { label: 'C1V2', selected: false, value: 'v2' }, + ], + }; + + const configOption2: ConfigOption = { + label: 'C2', + option: 'c2', + values: [ + { label: 'C2V1', selected: true, value: 'v1' }, + { label: 'C2V2', selected: false, value: 'v2' }, + ], + }; + + const baseDetails: Omit<BoardDetails, 'fqbn'> = { + VID: '1', + PID: '1', + buildProperties: [], + configOptions: [configOption1], + programmers: [edbg, jlink], + requiredTools: [], + }; + + const fqbn = 'a:b:c'; + const name = 'ABC'; + const board = { fqbn, name }; + + const boardsPackage: BoardsPackage = { + id: 'a:b', + name: 'AB', + availableVersions: ['1.0.0'], + boards: [board], + description: 'boy', + summary: ':heart:', + author: 'mano', + types: [], + }; + + const defaultDetailsMocks: readonly BoardDetails[] = [ + { + fqbn, + ...baseDetails, + }, + ]; + let _currentDetailsMock = defaultDetailsMocks; + + function boardDetailsMock(): readonly BoardDetails[] { + return _currentDetailsMock; + } + function mockBoardDetails(newDetails: BoardDetails[]): Disposable { + _currentDetailsMock = newDetails; + return Disposable.create(resetDetailsMock); + } + function resetDetailsMock(): void { + _currentDetailsMock = defaultDetailsMocks; + } +}); diff --git a/arduino-ide-extension/src/test/browser/browser-test-bindings.ts b/arduino-ide-extension/src/test/browser/browser-test-bindings.ts new file mode 100644 index 000000000..7afb44e8f --- /dev/null +++ b/arduino-ide-extension/src/test/browser/browser-test-bindings.ts @@ -0,0 +1,112 @@ +import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state'; +import { LabelProvider } from '@theia/core/lib/browser/label-provider'; +import { OpenerService } from '@theia/core/lib/browser/opener-service'; +import { + LocalStorageService, + StorageService, +} from '@theia/core/lib/browser/storage-service'; +import { WindowService } from '@theia/core/lib/browser/window/window-service'; +import { EnvVariablesServer } from '@theia/core/lib/common/env-variables'; +import { MessageService } from '@theia/core/lib/common/message-service'; +import { MockLogger } from '@theia/core/lib/common/test/mock-logger'; +import { + Container, + ContainerModule, + injectable, +} from '@theia/core/shared/inversify'; +import { EditorManager } from '@theia/editor/lib/browser/editor-manager'; +import { FileService } from '@theia/filesystem/lib/browser/file-service'; +import { ArduinoPreferences } from '../../browser/arduino-preferences'; +import { BoardsDataStore } from '../../browser/boards/boards-data-store'; +import { BoardsServiceProvider } from '../../browser/boards/boards-service-provider'; +import { ConfigServiceClient } from '../../browser/config/config-service-client'; +import { DialogService } from '../../browser/dialog-service'; +import { SettingsService } from '../../browser/dialogs/settings/settings'; +import { HostedPluginSupport } from '../../browser/hosted/hosted-plugin-support'; +import { NotificationCenter } from '../../browser/notification-center'; +import { SketchesServiceClientImpl } from '../../browser/sketches-service-client-impl'; +import { ApplicationConnectionStatusContribution } from '../../browser/theia/core/connection-status-service'; +import { OutputChannelManager } from '../../browser/theia/output/output-channel'; +import { WorkspaceService } from '../../browser/theia/workspace/workspace-service'; +import { MainMenuManager } from '../../common/main-menu-manager'; +import { FileSystemExt, SketchesService } from '../../common/protocol'; +import { BoardsService } from '../../common/protocol/boards-service'; +import { NotificationServiceServer } from '../../common/protocol/notification-service'; +import { + Bind, + ConsoleLogger, + bindCommon, +} from '../common/common-test-bindings'; +import { never } from '../utils'; + +export function createBaseContainer(bind: Bind = bindBrowser): Container { + const container = new Container({ defaultScope: 'Singleton' }); + container.load(new ContainerModule(bind)); + return container; +} + +export const bindBrowser: Bind = function ( + ...args: Parameters<Bind> +): ReturnType<Bind> { + bindCommon(...args); + const [bind, , , rebind] = args; + // IDE2's test console logger does not support `Loggable` arg. + // Rebind logger to suppress `[Function (anonymous)]` messages in tests when the storage service is initialized without `window.localStorage`. + // https://github.com/eclipse-theia/theia/blob/04c8cf07843ea67402131132e033cdd54900c010/packages/core/src/browser/storage-service.ts#L60 + bind(MockLogger).toSelf().inSingletonScope(); + rebind(ConsoleLogger).toService(MockLogger); +}; + +/** + * Binds all required services as a mock to test a `SketchesContribution` instance. + */ +export const bindSketchesContribution: Bind = function ( + ...args: Parameters<Bind> +): ReturnType<Bind> { + const [bind] = args; + bindBrowser(...args); + bind(MessageService).toConstantValue(<MessageService>{}); + bind(BoardsService).toConstantValue(<BoardsService>{}); + bind(NotificationCenter).toSelf().inSingletonScope(); + bind(NotificationServiceServer).toConstantValue(<NotificationServiceServer>{ + // eslint-disable-next-line @typescript-eslint/no-unused-vars + setClient(_) { + // nothing + }, + }); + bind(FrontendApplicationStateService).toSelf().inSingletonScope(); + bind(BoardsDataStore).toConstantValue(<BoardsDataStore>{}); + bind(LocalStorageService).toSelf().inSingletonScope(); + bind(WindowService).toConstantValue(<WindowService>{}); + bind(StorageService).toService(LocalStorageService); + bind(BoardsServiceProvider).toSelf().inSingletonScope(); + bind(NoopHostedPluginSupport).toSelf().inSingletonScope(); + bind(HostedPluginSupport).toService(NoopHostedPluginSupport); + bind(FileService).toConstantValue(<FileService>{}); + bind(FileSystemExt).toConstantValue(<FileSystemExt>{}); + bind(ConfigServiceClient).toConstantValue(<ConfigServiceClient>{}); + bind(SketchesService).toConstantValue(<SketchesService>{}); + bind(OpenerService).toConstantValue(<OpenerService>{}); + bind(SketchesServiceClientImpl).toConstantValue( + <SketchesServiceClientImpl>{} + ); + bind(EditorManager).toConstantValue(<EditorManager>{}); + bind(OutputChannelManager).toConstantValue(<OutputChannelManager>{}); + bind(EnvVariablesServer).toConstantValue(<EnvVariablesServer>{}); + bind(ApplicationConnectionStatusContribution).toConstantValue( + <ApplicationConnectionStatusContribution>{} + ); + bind(WorkspaceService).toConstantValue(<WorkspaceService>{}); + bind(LabelProvider).toConstantValue(<LabelProvider>{}); + bind(SettingsService).toConstantValue(<SettingsService>{}); + bind(ArduinoPreferences).toConstantValue(<ArduinoPreferences>{}); + bind(DialogService).toConstantValue(<DialogService>{}); + bind(MainMenuManager).toConstantValue(<MainMenuManager>{}); +}; + +@injectable() +export class NoopHostedPluginSupport implements HostedPluginSupport { + readonly didStart = Promise.resolve(); + readonly onDidCloseConnection = never(); + readonly onDidLoad = never(); +} diff --git a/arduino-ide-extension/src/test/browser/connection-status-service.test.ts b/arduino-ide-extension/src/test/browser/connection-status-service.test.ts new file mode 100644 index 000000000..c84eade55 --- /dev/null +++ b/arduino-ide-extension/src/test/browser/connection-status-service.test.ts @@ -0,0 +1,62 @@ +import { enableJSDOM } from '@theia/core/lib/browser/test/jsdom'; +const disableJSDOM = enableJSDOM(); + +import { FrontendApplicationConfigProvider } from '@theia/core/lib/browser/frontend-application-config-provider'; +FrontendApplicationConfigProvider.set({}); + +import { expect } from 'chai'; +import { + backendOfflineText, + backendOfflineTooltip, + daemonOfflineText, + daemonOfflineTooltip, + offlineText, + offlineTooltip, + offlineMessage, +} from '../../browser/theia/core/connection-status-service'; + +disableJSDOM(); + +describe('connection-status-service', () => { + describe('offlineMessage', () => { + it('should warn about the offline backend if connected to both CLI daemon and Internet but offline', () => { + const actual = offlineMessage({ + port: '50051', + online: true, + backendConnected: false, + }); + expect(actual.text).to.be.equal(backendOfflineText); + expect(actual.tooltip).to.be.equal(backendOfflineTooltip); + }); + + it('should warn about the offline CLI daemon if the CLI daemon port is missing but has Internet connection', () => { + const actual = offlineMessage({ + port: undefined, + online: true, + backendConnected: true, + }); + expect(actual.text.endsWith(daemonOfflineText)).to.be.true; + expect(actual.tooltip).to.be.equal(daemonOfflineTooltip); + }); + + it('should warn about the offline CLI daemon if the CLI daemon port is missing and has no Internet connection', () => { + const actual = offlineMessage({ + port: undefined, + online: false, + backendConnected: true, + }); + expect(actual.text.endsWith(daemonOfflineText)).to.be.true; + expect(actual.tooltip).to.be.equal(daemonOfflineTooltip); + }); + + it('should warn about no Internet connection if CLI daemon port is available but the Internet connection is offline', () => { + const actual = offlineMessage({ + port: '50051', + online: false, + backendConnected: true, + }); + expect(actual.text.endsWith(offlineText)).to.be.true; + expect(actual.tooltip).to.be.equal(offlineTooltip); + }); + }); +}); diff --git a/arduino-ide-extension/src/test/browser/create-api.slow-test.ts b/arduino-ide-extension/src/test/browser/create-api.slow-test.ts new file mode 100644 index 000000000..f14b0ade5 --- /dev/null +++ b/arduino-ide-extension/src/test/browser/create-api.slow-test.ts @@ -0,0 +1,484 @@ +import { UUID } from '@theia/core/shared/@phosphor/coreutils'; +import { + Container, + ContainerModule, + injectable, +} from '@theia/core/shared/inversify'; +import { assert, expect } from 'chai'; +import fetch from 'cross-fetch'; +import { rejects } from 'node:assert'; +import { posix } from 'node:path'; +import PQueue from 'p-queue'; +import queryString from 'query-string'; +import { ArduinoPreferences } from '../../browser/arduino-preferences'; +import { AuthenticationClientService } from '../../browser/auth/authentication-client-service'; +import { CreateApi } from '../../browser/create/create-api'; +import { splitSketchPath } from '../../browser/create/create-paths'; +import { + Create, + CreateError, + isNotFound, + isUnprocessableContent, +} from '../../browser/create/typings'; +import { SketchCache } from '../../browser/widgets/cloud-sketchbook/cloud-sketch-cache'; +import { SketchesService } from '../../common/protocol'; +import { AuthenticationSession } from '../../node/auth/types'; + +/* eslint-disable @typescript-eslint/no-non-null-asserted-optional-chain */ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ + +const timeout = 60 * 1_000; + +describe('create-api', () => { + let createApi: TestCreateApi; + + before(async function () { + this.timeout(timeout); + try { + const accessToken = await login(); + createApi = + createContainer(accessToken).get<TestCreateApi>(TestCreateApi); + } catch (err) { + if (err instanceof LoginFailed) { + return this.skip(); + } + throw err; + } + }); + + beforeEach(async function () { + this.timeout(timeout); + await cleanAllSketches(); + }); + + afterEach(async function () { + this.timeout(timeout); + await cleanAllSketches(); + }); + + function createContainer(accessToken: string): Container { + const container = new Container({ defaultScope: 'Singleton' }); + container.load( + new ContainerModule((bind) => { + bind(TestCreateApi).toSelf().inSingletonScope(); + bind(SketchCache).toSelf().inSingletonScope(); + bind(AuthenticationClientService).toConstantValue(< + AuthenticationClientService + >{ + get session(): AuthenticationSession | undefined { + return <AuthenticationSession>{ + accessToken, + }; + }, + }); + bind(ArduinoPreferences).toConstantValue(<ArduinoPreferences>{ + 'arduino.cloud.sketchSyncEndpoint': + 'https://api-dev.arduino.cc/create', + }); + bind(SketchesService).toConstantValue(<SketchesService>{}); + }) + ); + return container; + } + + async function login( + credentials: Credentials | undefined = moduleCredentials() ?? + envCredentials() + ): Promise<string> { + if (!credentials) { + throw new LoginFailed('The credentials are not available to log in.'); + } + const { username, password, clientSecret: client_secret } = credentials; + const response = await fetch('https://login.oniudra.cc/oauth/token', { + method: 'POST', + headers: { + 'Content-type': 'application/x-www-form-urlencoded', + }, + body: queryString.stringify({ + grant_type: 'password', + username, + password, + audience: 'https://api.arduino.cc', + client_id: 'a4Nge0BdTyFsNnsU0HcZI4hfKN5y9c5A', + client_secret, + }), + }); + const body = await response.json(); + if ('access_token' in body) { + const { access_token } = body; + return access_token; + } + throw new LoginFailed( + body.error ?? + `'access_token' was not part of the response object: ${JSON.stringify( + body + )}` + ); + } + + function toPosix(segment: string): string { + return `/${segment}`; + } + + /** + * Does not handle folders. A sketch with `MySketch` name can be under `/MySketch` and `/MyFolder/MySketch`. + */ + function findByName( + name: string, + sketches: Create.Sketch[] + ): Create.Sketch | undefined { + return sketches.find((sketch) => sketch.name === name); + } + + async function cleanAllSketches(): Promise<void> { + let sketches = await createApi.sketches(); + const deleteExecutionQueue = new PQueue({ + concurrency: 5, + autoStart: true, + }); + sketches.forEach(({ path }) => + deleteExecutionQueue.add(() => createApi.deleteSketch(path)) + ); + await deleteExecutionQueue.onIdle(); + sketches = await createApi.sketches(); + expect(sketches).to.be.empty; + } + + it('should delete sketch', async () => { + const name = UUID.uuid4(); + const content = 'alma\nkorte'; + const posixPath = toPosix(name); + + let sketches = await createApi.sketches(); + let sketch = findByName(name, sketches); + expect(sketch).to.be.undefined; + + sketch = await createApi.createSketch(posixPath, content); + + sketches = await createApi.sketches(); + sketch = findByName(name, sketches); + expect(sketch).to.be.not.empty; + expect(sketch?.path).to.be.not.empty; + const [, path] = splitSketchPath(sketch?.path!); + expect(path).to.be.equal(posixPath); + + const sketchContent = await createApi.readFile( + posixPath + posixPath + '.ino' + ); + expect(sketchContent).to.be.equal(content); + + await createApi.deleteSketch(sketch?.path!); + + sketches = await createApi.sketches(); + sketch = findByName(name, sketches); + expect(sketch).to.be.undefined; + }); + + it('should error with HTTP 404 (Not Found) if deleting a non-existing sketch', async () => { + try { + await createApi.deleteSketch('/does-not-exist'); + assert.fail('Expected HTTP 404'); + } catch (err) { + expect(err).to.be.an.instanceOf(CreateError); + expect((<CreateError>err).status).to.be.equal(404); + } + }); + + it('should rename a sketch folder with all its content', async () => { + const name = UUID.uuid4(); + const newName = UUID.uuid4(); + const content = 'void setup(){} void loop(){}'; + const posixPath = toPosix(name); + const newPosixPath = toPosix(newName); + + await createApi.createSketch(posixPath, content); + + let sketches = await createApi.sketches(); + expect(sketches.length).to.be.equal(1); + expect(sketches[0].name).to.be.equal(name); + + let sketchContent = await createApi.readFile( + posixPath + posixPath + '.ino' + ); + expect(sketchContent).to.be.equal(content); + + await createApi.rename(posixPath, newPosixPath); + sketches = await createApi.sketches(); + expect(sketches.length).to.be.equal(1); + expect(sketches[0].name).to.be.equal(newName); + + sketchContent = await createApi.readFile( + newPosixPath + newPosixPath + '.ino' + ); + expect(sketchContent).to.be.equal(content); + }); + + it('should error with HTTP 409 (Conflict) when renaming a sketch and the target already exists', async () => { + const name = UUID.uuid4(); + const otherName = UUID.uuid4(); + const content = 'void setup(){} void loop(){}'; + const posixPath = toPosix(name); + const otherPosixPath = toPosix(otherName); + + await createApi.createSketch(posixPath, content); + await createApi.createSketch(otherPosixPath, content); + + let sketches = await createApi.sketches(); + expect(sketches.length).to.be.equal(2); + expect(findByName(name, sketches)).to.be.not.undefined; + expect(findByName(otherName, sketches)).to.be.not.undefined; + + try { + await createApi.rename(posixPath, otherPosixPath); + assert.fail('Expected HTTP 409'); + } catch (err) { + expect(err).to.be.an.instanceOf(CreateError); + expect((<CreateError>err).status).to.be.equal(409); + } + + sketches = await createApi.sketches(); + expect(sketches.length).to.be.equal(2); + expect(findByName(name, sketches)).to.be.not.undefined; + expect(findByName(otherName, sketches)).to.be.not.undefined; + }); + + it('should error with HTTP 422 when reading a file but is a directory', async () => { + const name = UUID.uuid4(); + const content = 'void setup(){} void loop(){}'; + const posixPath = toPosix(name); + + await createApi.createSketch(posixPath, content); + const resources = await createApi.readDirectory(posixPath); + expect(resources).to.be.not.empty; + + await rejects(createApi.readFile(posixPath), (thrown) => + isUnprocessableContent(thrown) + ); + }); + + it('should error with HTTP 422 when listing a directory but is a file', async () => { + const name = UUID.uuid4(); + const content = 'void setup(){} void loop(){}'; + const posixPath = toPosix(name); + + await createApi.createSketch(posixPath, content); + const mainSketchFilePath = posixPath + posixPath + '.ino'; + const sketchContent = await createApi.readFile(mainSketchFilePath); + expect(sketchContent).to.be.equal(content); + + await rejects(createApi.readDirectory(mainSketchFilePath), (thrown) => + isUnprocessableContent(thrown) + ); + }); + + it("should error with HTTP 404 when deleting a non-existing directory via the '/files/d' endpoint", async () => { + const name = UUID.uuid4(); + const posixPath = toPosix(name); + + const sketches = await createApi.sketches(); + const sketch = findByName(name, sketches); + expect(sketch).to.be.undefined; + + await rejects(createApi.deleteDirectory(posixPath), (thrown) => + isNotFound(thrown) + ); + }); + + ['.', '-', '_'].map((char) => { + it(`should create a new sketch with '${char}' (character code: ${char.charCodeAt( + 0 + )}) in the sketch folder name although it's disallowed from the Create Editor`, async () => { + const name = `sketch${char}`; + const posixPath = toPosix(name); + const newSketch = await createApi.createSketch( + posixPath, + 'void setup(){} void loop(){}' + ); + + expect(newSketch).to.be.not.undefined; + expect(newSketch.name).to.be.equal(name); + + let sketches = await createApi.sketches(); + let sketch = findByName(name, sketches); + expect(sketch).to.be.not.undefined; + // TODO: Cannot do deep equals because the Create API responses with different objects on POST and GET + // `"libraries": [null]` vs `"libraries": []` + // `"created_at": "2023-02-08T09:39:32.16994555Z"` vs `"created_at": "2023-02-08T09:39:32.169946Z"` + // expect(newSketch).to.be.deep.equal(sketch); + expect(newSketch.path).to.be.equal(sketch?.path); + expect(newSketch.name).to.be.equal(sketch?.name); + + await createApi.deleteSketch(sketch?.path!); + sketches = await createApi.sketches(); + sketch = findByName(name, sketches); + expect(sketch).to.be.undefined; + }); + }); + + it("should fetch the sketch when transforming the 'secrets' into '#include' and the sketch is not in the cache", async () => { + const name = UUID.uuid4(); + const posixPath = toPosix(name); + const newSketch = await createApi.createSketch( + posixPath, + 'void setup(){} void loop(){}', + { + secrets: { + data: [ + { + name: 'SECRET_THING', + value: '❤︎', + }, + ], + }, + } + ); + expect(newSketch).to.be.not.undefined; + expect(newSketch.secrets).to.be.not.undefined; + expect(Array.isArray(newSketch.secrets)).to.be.true; + expect(newSketch.secrets?.length).to.be.equal(1); + expect(newSketch.secrets?.[0]).to.be.deep.equal({ + name: 'SECRET_THING', + value: '❤︎', + }); + createApi.sketchCache.init(); // invalidate the cache + const content = await createApi.readFile( + posix.join(posixPath, `${name}.ino`) + ); + expect(content.includes(`#include "${Create.arduino_secrets_file}"`)).to.be + .true; + }); + + [ + [-1, 1], + [0, 2], + [1, 2], + ].forEach(([diff, expected]) => + it(`should not run unnecessary fetches when retrieving all sketches (sketch count ${ + diff < 0 ? '<' : diff > 0 ? '>' : '=' + } limit)`, async () => { + const content = 'void setup(){} void loop(){}'; + const maxLimit = 10; + const sketchCount = maxLimit + diff; + const sketchNames = [...Array(sketchCount).keys()].map(() => + UUID.uuid4() + ); + + const createExecutionQueue = new PQueue({ + concurrency: 5, + autoStart: true, + }); + sketchNames.forEach((name) => + createExecutionQueue.add(() => + createApi.createSketch(toPosix(name), content) + ) + ); + await createExecutionQueue.onIdle(); + + createApi.resetRequestRecording(); + const sketches = await createApi.sketches(maxLimit); + const allRequests = createApi.requestRecording.slice(); + + expect(sketches.length).to.be.equal(sketchCount); + sketchNames.forEach( + (name) => expect(findByName(name, sketches)).to.be.not.undefined + ); + + expect(allRequests.length).to.be.equal(expected); + const getSketchesRequests = allRequests.filter( + (description) => + description.method === 'GET' && + description.pathname === '/create/v2/sketches' && + description.query && + description.query.includes(`limit=${maxLimit}`) + ); + expect(getSketchesRequests.length).to.be.equal(expected); + }) + ); +}); + +// Using environment variables is recommended for testing but you can modify the module too. +// Put your credential here for local testing. Otherwise, they will be picked up from the environment. +const username = ''; +const password = ''; +const clientSecret = ''; + +interface Credentials { + readonly username: string; + readonly password: string; + readonly clientSecret: string; +} + +function moduleCredentials(): Credentials | undefined { + if (!!username && !!password && !!clientSecret) { + console.log('Using credentials from the module variables.'); + return { + username, + password, + clientSecret, + }; + } + return undefined; +} + +function envCredentials(): Credentials | undefined { + const username = process.env.CREATE_USERNAME; + const password = process.env.CREATE_PASSWORD; + const clientSecret = process.env.CREATE_CLIENT_SECRET; + if (!!username && !!password && !!clientSecret) { + console.log('Using credentials from the environment variables.'); + return { + username, + password, + clientSecret, + }; + } + return undefined; +} + +class LoginFailed extends Error { + constructor(message: string) { + super(message); + Object.setPrototypeOf(this, LoginFailed.prototype); + } +} + +@injectable() +class TestCreateApi extends CreateApi { + private _recording: RequestDescription[] = []; + + constructor() { + super(); + const originalRun = this['run']; + this['run'] = (url, init, resultProvider) => { + this._recording.push(createRequestDescription(url, init)); + return originalRun.bind(this)(url, init, resultProvider); + }; + } + + resetRequestRecording(): void { + this._recording = []; + } + + get requestRecording(): RequestDescription[] { + return this._recording; + } +} + +interface RequestDescription { + readonly origin: string; + readonly pathname: string; + readonly query?: string; + + readonly method?: string | undefined; + readonly serializedBody?: string | undefined; +} + +function createRequestDescription( + url: URL, + init?: RequestInit | undefined +): RequestDescription { + const { origin, pathname, search: query } = url; + const method = init?.method; + const serializedBody = init?.body?.toString(); + return { origin, pathname, query, method, serializedBody }; +} diff --git a/arduino-ide-extension/src/test/browser/debug.test.ts b/arduino-ide-extension/src/test/browser/debug.test.ts new file mode 100644 index 000000000..e66cd65a0 --- /dev/null +++ b/arduino-ide-extension/src/test/browser/debug.test.ts @@ -0,0 +1,378 @@ +import { enableJSDOM } from '@theia/core/lib/browser/test/jsdom'; +const disableJSDOM = enableJSDOM(); + +import { FrontendApplicationConfigProvider } from '@theia/core/lib/browser/frontend-application-config-provider'; +FrontendApplicationConfigProvider.set({}); + +import { DisposableCollection } from '@theia/core/lib/common/disposable'; + +import { CommandEvent, CommandRegistry } from '@theia/core/lib/common/command'; +import { Emitter } from '@theia/core/lib/common/event'; +import { deepClone } from '@theia/core/lib/common/objects'; +import { wait } from '@theia/core/lib/common/promise-util'; +import { Mutable } from '@theia/core/lib/common/types'; +import { + Container, + ContainerModule, + injectable, +} from '@theia/core/shared/inversify'; +import { expect } from 'chai'; +import { doesNotReject, rejects } from 'node:assert/strict'; +import { + BoardsDataStore, + BoardsDataStoreChangeEvent, +} from '../../browser/boards/boards-data-store'; +import { BoardsServiceProvider } from '../../browser/boards/boards-service-provider'; +import { + Debug, + debuggingNotSupported, + isDebugEnabled, + noPlatformInstalledFor, +} from '../../browser/contributions/debug'; +import { NotificationCenter } from '../../browser/notification-center'; +import { noBoardSelected } from '../../common/nls'; +import { + BoardsConfigChangeEvent, + BoardsPackage, + CompileSummary, + ExecutableService, + type BoardDetails, + type Programmer, +} from '../../common/protocol'; +import { + BoardsConfig, + emptyBoardsConfig, +} from '../../common/protocol/boards-service'; +import { bindSketchesContribution } from './browser-test-bindings'; +import { aPackage } from './fixtures/boards'; + +disableJSDOM(); + +describe('debug', () => { + describe('isDebugEnabled', () => { + const fqbn = 'a:b:c'; + const name = 'ABC'; + const board = { fqbn, name }; + const p1: Programmer = { id: 'p1', name: 'P1', platform: 'The platform' }; + const p2: Programmer = { id: 'p2', name: 'P2', platform: 'The platform' }; + const data: BoardsDataStore.Data = { + configOptions: [], + defaultProgrammerId: 'p1', + programmers: [p1, p2], + selectedProgrammer: p1, + }; + const boardDetails: BoardDetails = { + buildProperties: [], + configOptions: [], + defaultProgrammerId: 'p1', + programmers: [p1, p2], + fqbn, + PID: '0', + VID: '0', + requiredTools: [], + }; + + it('should error when no board selected', async () => { + await rejects( + isDebugEnabled( + undefined, + unexpectedCall(), + unexpectedCall(), + unexpectedCall(), + unexpectedCall() + ), + (reason) => + reason instanceof Error && reason.message === noBoardSelected + ); + }); + + it('should error when platform is not installed (FQBN is undefined)', async () => { + await rejects( + isDebugEnabled( + { name, fqbn: undefined }, + unexpectedCall(), + unexpectedCall(), + unexpectedCall(), + unexpectedCall() + ), + (reason) => + reason instanceof Error && + reason.message === noPlatformInstalledFor(board.name) + ); + }); + + it('should error when platform is not installed (board details not available)', async () => { + await rejects( + isDebugEnabled( + board, + () => undefined, + () => data, + (fqbn) => fqbn, + unexpectedCall() + ), + (reason) => + reason instanceof Error && + reason.message === noPlatformInstalledFor(board.name) + ); + }); + + it('should resolve when no programmer is selected (arduino/arduino-cli#2540)', async () => { + const copyData: Mutable<BoardsDataStore.Data> = deepClone(data); + delete copyData.selectedProgrammer; + await doesNotReject( + isDebugEnabled( + board, + () => boardDetails, + () => copyData, + (fqbn) => fqbn, + async (params) => { + expect(params.programmer).to.be.undefined; + return params.fqbn; + } + ) + ); + }); + + it('should error when it fails to get the debug info from the CLI', async () => { + await rejects( + isDebugEnabled( + board, + () => boardDetails, + () => data, + (fqbn) => fqbn, + () => { + throw new Error('unhandled error'); + } + ), + (reason) => + reason instanceof Error && + reason.message === debuggingNotSupported(board.name) + ); + }); + + it('should resolve when debugging is supported', async () => { + await doesNotReject( + isDebugEnabled( + board, + () => boardDetails, + () => data, + (fqbn) => fqbn, + () => Promise.resolve(`${fqbn}:USBMode=hwcdc`) + ) + ); + }); + + describe('onDidChangeMessage', () => { + let debug: MockDebug; + let onDidChangeMessageEvents: (string | undefined)[]; + + let toDisposeAfterEach: DisposableCollection; + let mockBoardsConfig: BoardsConfig; + let mockBoardsConfigDidChangeEmitter: Emitter<BoardsConfigChangeEvent>; + let mockPlatformDidInstallEmitter: Emitter<{ item: BoardsPackage }>; + let mockPlatformDidUninstallEmitter: Emitter<{ item: BoardsPackage }>; + let mockBoardsDataStoreDidChangeEmitter: Emitter<BoardsDataStoreChangeEvent>; + let mockDidExecuteCommandEmitter: Emitter<CommandEvent>; + + beforeEach(() => { + mockBoardsConfig = emptyBoardsConfig(); + mockBoardsConfigDidChangeEmitter = new Emitter(); + mockPlatformDidInstallEmitter = new Emitter(); + mockPlatformDidUninstallEmitter = new Emitter(); + mockBoardsDataStoreDidChangeEmitter = new Emitter(); + mockDidExecuteCommandEmitter = new Emitter(); + toDisposeAfterEach = new DisposableCollection( + mockBoardsConfigDidChangeEmitter, + mockPlatformDidInstallEmitter, + mockPlatformDidUninstallEmitter, + mockBoardsDataStoreDidChangeEmitter, + mockDidExecuteCommandEmitter + ); + + const container = createContainer(); + const d = container.get<Debug>(Debug); + expect(d).to.be.an.instanceOf(MockDebug); + debug = d as MockDebug; + + onDidChangeMessageEvents = []; + toDisposeAfterEach.push( + debug['onDidChangeMessage']((event) => { + onDidChangeMessageEvents.push(event); + }) + ); + + const commandRegistry: Mutable<CommandRegistry> = + container.get<CommandRegistry>(CommandRegistry); + commandRegistry['onDidExecuteCommand'] = + mockDidExecuteCommandEmitter.event; + debug.onStart(); + }); + + it('should update on board identifier change', async () => { + mockBoardsConfigDidChangeEmitter.fire({ + previousSelectedBoard: undefined, + selectedBoard: { fqbn: 'a:b:c', name: 'ABC' }, + }); + await wait(1); + + expect(onDidChangeMessageEvents).deep.equal([undefined]); + }); + + it('should not update on port identifier change', async () => { + mockBoardsConfigDidChangeEmitter.fire({ + previousSelectedPort: undefined, + selectedPort: { protocol: 'serial', address: 'COM1' }, + }); + await wait(1); + + expect(onDidChangeMessageEvents).to.be.empty; + }); + + it('should update on platform install', async () => { + mockPlatformDidInstallEmitter.fire({ + item: aPackage, + }); + await wait(1); + + expect(onDidChangeMessageEvents).deep.equal([undefined]); + }); + + it('should update on platform uninstall', async () => { + mockPlatformDidUninstallEmitter.fire({ + item: aPackage, + }); + await wait(1); + + expect(onDidChangeMessageEvents).deep.equal([undefined]); + }); + + it('should update on boards data store change when affects the selected board', async () => { + mockBoardsConfig = { + selectedBoard: { fqbn: 'a:b:c', name: '' }, + selectedPort: undefined, + }; + mockBoardsDataStoreDidChangeEmitter.fire({ + changes: [ + { + fqbn: 'a:b:c', + data: BoardsDataStore.Data.EMPTY, // it does not matter + }, + ], + }); + await wait(1); + + expect(onDidChangeMessageEvents).deep.equal([undefined]); + }); + + it('should not update on boards data store change when does not affect the selected board', async () => { + mockBoardsConfig = { + selectedBoard: { fqbn: 'a:b:c', name: '' }, + selectedPort: undefined, + }; + mockBoardsDataStoreDidChangeEmitter.fire({ + changes: [ + { + fqbn: 'x:y:z', + data: BoardsDataStore.Data.EMPTY, // it does not matter + }, + ], + }); + await wait(1); + + expect(onDidChangeMessageEvents).to.be.empty; + }); + + it('should update after verify', async () => { + const summary: CompileSummary = { + buildPath: '', + buildProperties: [], + executableSectionsSize: [], + usedLibraries: [], + boardPlatform: undefined, + buildPlatform: undefined, + buildOutputUri: '', + }; + mockDidExecuteCommandEmitter.fire({ + commandId: 'arduino.languageserver.notifyBuildDidComplete', + args: [summary], + }); + await wait(1); + + expect(onDidChangeMessageEvents).deep.equal([undefined]); + }); + + it('should not update when unrelated command executes', async () => { + mockDidExecuteCommandEmitter.fire({ + commandId: 'other.command', + args: [], + }); + await wait(1); + + expect(onDidChangeMessageEvents).to.be.empty; + }); + + it('should update the error message', async () => { + debug.isDebugEnabledMock = Promise.reject(new Error('my error')); + mockBoardsConfigDidChangeEmitter.fire({ + previousSelectedBoard: undefined, + selectedBoard: { fqbn: 'a:b:c', name: 'ABC' }, + }); + await wait(1); + + expect(onDidChangeMessageEvents).deep.equal(['my error']); + }); + + afterEach(() => toDisposeAfterEach.dispose()); + + function createContainer(): Container { + const container = new Container({ defaultScope: 'Singleton' }); + container.load( + new ContainerModule((bind, unbind, isBound, rebind) => { + bind(MockDebug).toSelf().inSingletonScope(); + bind(Debug).toService(MockDebug); + bindSketchesContribution(bind, unbind, isBound, rebind); + bind(ExecutableService).toConstantValue(<ExecutableService>{}); + rebind(NotificationCenter).toConstantValue(<NotificationCenter>{ + get onPlatformDidInstall() { + return mockPlatformDidInstallEmitter.event; + }, + get onPlatformDidUninstall() { + return mockPlatformDidUninstallEmitter.event; + }, + }); + rebind(BoardsServiceProvider).toConstantValue(< + BoardsServiceProvider + >{ + get onBoardsConfigDidChange() { + return mockBoardsConfigDidChangeEmitter.event; + }, + get boardsConfig() { + return mockBoardsConfig; + }, + }); + rebind(BoardsDataStore).toConstantValue(<BoardsDataStore>{ + get onDidChange() { + return mockBoardsDataStoreDidChangeEmitter.event; + }, + }); + }) + ); + return container; + } + }); + + function unexpectedCall(): () => never { + return () => expect.fail('unexpected call'); + } + }); +}); + +@injectable() +class MockDebug extends Debug { + isDebugEnabledMock: Promise<string> = Promise.resolve('a:b:c:USBMode:hwcdc'); + + constructor() { + super(); + this['isDebugEnabled'] = () => this.isDebugEnabledMock; + } +} diff --git a/arduino-ide-extension/src/test/browser/dom.test.ts b/arduino-ide-extension/src/test/browser/dom.test.ts new file mode 100644 index 000000000..5106024cc --- /dev/null +++ b/arduino-ide-extension/src/test/browser/dom.test.ts @@ -0,0 +1,52 @@ +import { splitByBoldTag } from '../../browser/utils/dom'; +import { expect } from 'chai'; + +describe('dom', () => { + describe('splitByBoldTag', () => { + it('should split by bold tags', () => { + const actual = splitByBoldTag('one<b>matchOne</b>two'); + const expected = ['one', { textContent: 'matchOne', bold: true }, 'two']; + expect(actual).to.be.deep.equal(expected); + }); + + it('should handle starting bold tags', () => { + const actual = splitByBoldTag( + '<b>matchOne</b>one<b>matchTwo</b> two <b>matchThree</b> three' + ); + const expected = [ + { textContent: 'matchOne', bold: true }, + 'one', + { textContent: 'matchTwo', bold: true }, + ' two ', + { textContent: 'matchThree', bold: true }, + ' three', + ]; + expect(actual).to.be.deep.equal(expected); + }); + + it('should handle unclosed bold tags', () => { + const actual = splitByBoldTag( + '<b>matchOne</b>one<b>matchTwo</b> two <b>matchThree</b> three <b> ' + ); + const expected = [ + { textContent: 'matchOne', bold: true }, + 'one', + { textContent: 'matchTwo', bold: true }, + ' two ', + { textContent: 'matchThree', bold: true }, + ' three <b> ', + ]; + expect(actual).to.be.deep.equal(expected); + }); + + it('should handle no matches', () => { + const actual = splitByBoldTag('<b>alma'); + expect(actual).to.be.undefined; + }); + + it('should handle empty strings', () => { + const actual = splitByBoldTag(''); + expect(actual).to.be.undefined; + }); + }); +}); diff --git a/arduino-ide-extension/src/test/browser/fixtures/boards.ts b/arduino-ide-extension/src/test/browser/fixtures/boards.ts index 0cedb5b77..f42f9a757 100644 --- a/arduino-ide-extension/src/test/browser/fixtures/boards.ts +++ b/arduino-ide-extension/src/test/browser/fixtures/boards.ts @@ -1,44 +1,36 @@ -import { BoardsConfig } from '../../../browser/boards/boards-config'; -import { Board, BoardsPackage, Port } from '../../../common/protocol'; +import type { + Board, + BoardsConfig, + BoardsPackage, + Port, +} from '../../../common/protocol'; export const aBoard: Board = { fqbn: 'some:board:fqbn', name: 'Some Arduino Board', - port: { - address: '/lol/port1234', - addressLabel: '/lol/port1234', - protocol: 'serial', - protocolLabel: 'Serial Port (USB)', - }, -}; -export const aPort: Port = { - address: aBoard.port!.address, - addressLabel: aBoard.port!.addressLabel, - protocol: aBoard.port!.protocol, - protocolLabel: aBoard.port!.protocolLabel, -}; -export const aBoardConfig: BoardsConfig.Config = { - selectedBoard: aBoard, +}; +const aPort: Port = { + address: '/lol/port1234', + addressLabel: '/lol/port1234', + protocol: 'serial', + protocolLabel: 'Serial Port (USB)', +}; +export const aBoardsConfig: BoardsConfig = { + selectedBoard: { name: aBoard.name, fqbn: aBoard.fqbn }, selectedPort: aPort, }; export const anotherBoard: Board = { fqbn: 'another:board:fqbn', name: 'Another Arduino Board', - port: { - address: '/kek/port5678', - addressLabel: '/kek/port5678', - protocol: 'serial', - protocolLabel: 'Serial Port (USB)', - }, }; export const anotherPort: Port = { - address: anotherBoard.port!.address, - addressLabel: anotherBoard.port!.addressLabel, - protocol: anotherBoard.port!.protocol, - protocolLabel: anotherBoard.port!.protocolLabel, + address: '/kek/port5678', + addressLabel: '/kek/port5678', + protocol: 'serial', + protocolLabel: 'Serial Port (USB)', }; -export const anotherBoardConfig: BoardsConfig.Config = { - selectedBoard: anotherBoard, +export const anotherBoardsConfig: BoardsConfig = { + selectedBoard: { name: anotherBoard.name, fqbn: anotherBoard.fqbn }, selectedPort: anotherPort, }; @@ -49,7 +41,6 @@ export const aPackage: BoardsPackage = { deprecated: false, description: 'Some Arduino Board, Some Other Arduino Board', id: 'some:arduinoCoreId', - installable: true, moreInfoLink: 'http://www.some-url.lol/', name: 'Some Arduino Package', summary: 'Boards included in this package:', diff --git a/arduino-ide-extension/src/test/browser/theming.test.ts b/arduino-ide-extension/src/test/browser/theming.test.ts new file mode 100644 index 000000000..418176de5 --- /dev/null +++ b/arduino-ide-extension/src/test/browser/theming.test.ts @@ -0,0 +1,189 @@ +import { enableJSDOM } from '@theia/core/lib/browser/test/jsdom'; +const disableJSDOM = enableJSDOM(); + +import { BuiltinThemeProvider } from '@theia/core/lib/browser/theming'; +import { Theme } from '@theia/core/lib/common/theme'; +import { expect } from 'chai'; +import { + ArduinoThemeType, + ArduinoThemes, + arduinoThemeTypeOf, + darkThemeLabel, + deprecatedThemeLabel, + hcLightThemeLabel, + hcThemeLabel, + lightThemeLabel, + themeLabelForSettings, + userConfigurableThemes, + userThemeLabel, +} from '../../browser/theia/core/theming'; + +disableJSDOM(); + +const testTheme: Theme = { + id: 'testTheme', + label: 'Test Theme', + type: 'light', +}; +const anotherTestTheme: Theme = { + id: 'anotherTestTheme', + label: 'Another Test Theme', + type: 'light', +}; +const darkTestTheme: Theme = { + id: 'darkTestTheme', + label: 'Dark Test Theme', + type: 'dark', +}; +const anotherDarkTestTheme: Theme = { + id: 'anotherTestTheme', + label: 'AAAnother Dark Test Theme', + type: 'dark', +}; + +describe('theming', () => { + describe('userConfigurableThemes', () => { + it('should show only built-in and user installed themes but not deprecated (Theia) ones if current theme is a built-in', () => { + const actual = userConfigurableThemes({ + themes: () => [ + BuiltinThemeProvider.darkTheme, + BuiltinThemeProvider.lightTheme, + ArduinoThemes.dark, + ArduinoThemes.light, + testTheme, + BuiltinThemeProvider.hcTheme, + anotherTestTheme, + BuiltinThemeProvider.hcLightTheme, + ], + currentTheme: () => BuiltinThemeProvider.hcTheme, + }).reduce((acc, curr) => acc.concat(curr), []); + expect(actual.length).to.be.equal(6); + expect(actual[0].id).to.be.equal(ArduinoThemes.light.id); + expect(actual[1].id).to.be.equal(ArduinoThemes.dark.id); + expect(actual[2].id).to.be.equal(BuiltinThemeProvider.hcLightTheme.id); + expect(actual[3].id).to.be.equal(BuiltinThemeProvider.hcTheme.id); + expect(actual[4].id).to.be.equal(anotherTestTheme.id); + expect(actual[5].id).to.be.equal(testTheme.id); + }); + + it('should show only built-in and user installed themes but not deprecated (Theia) ones if current theme is a user', () => { + const actual = userConfigurableThemes({ + themes: () => [ + BuiltinThemeProvider.hcTheme, + BuiltinThemeProvider.lightTheme, + BuiltinThemeProvider.darkTheme, + BuiltinThemeProvider.hcLightTheme, + ArduinoThemes.dark, + testTheme, + anotherTestTheme, + ArduinoThemes.light, + ], + currentTheme: () => testTheme, + }).reduce((acc, curr) => acc.concat(curr), []); + expect(actual.length).to.be.equal(6); + expect(actual[0].id).to.be.equal(ArduinoThemes.light.id); + expect(actual[1].id).to.be.equal(ArduinoThemes.dark.id); + expect(actual[2].id).to.be.equal(BuiltinThemeProvider.hcLightTheme.id); + expect(actual[3].id).to.be.equal(BuiltinThemeProvider.hcTheme.id); + expect(actual[4].id).to.be.equal(anotherTestTheme.id); + expect(actual[5].id).to.be.equal(testTheme.id); + }); + + it('should show built-in, user installed, and deprecated (Theia) themes if current theme is a deprecated (Theia)', () => { + const actual = userConfigurableThemes({ + themes: () => [ + ArduinoThemes.dark, + BuiltinThemeProvider.hcLightTheme, + ArduinoThemes.light, + testTheme, + BuiltinThemeProvider.hcTheme, + anotherTestTheme, + darkTestTheme, + anotherDarkTestTheme, + BuiltinThemeProvider.lightTheme, + BuiltinThemeProvider.darkTheme, + ], + currentTheme: () => BuiltinThemeProvider.lightTheme, + }).reduce((acc, curr) => acc.concat(curr), []); + expect(actual.length).to.be.equal(9); + expect(actual[0].id).to.be.equal(ArduinoThemes.light.id); + expect(actual[1].id).to.be.equal(ArduinoThemes.dark.id); + expect(actual[2].id).to.be.equal(BuiltinThemeProvider.hcLightTheme.id); + expect(actual[3].id).to.be.equal(BuiltinThemeProvider.hcTheme.id); + expect(actual[4].id).to.be.equal(anotherTestTheme.id); + expect(actual[5].id).to.be.equal(testTheme.id); + expect(actual[6].id).to.be.equal(anotherDarkTestTheme.id); + expect(actual[7].id).to.be.equal(darkTestTheme.id); + expect(actual[8].id).to.be.equal(BuiltinThemeProvider.lightTheme.id); + }); + + it('should group the themes by arduino theme types', () => { + const actual = userConfigurableThemes({ + themes: () => [ + ArduinoThemes.dark, + ArduinoThemes.light, + BuiltinThemeProvider.hcLightTheme, + testTheme, + BuiltinThemeProvider.hcTheme, + anotherTestTheme, + darkTestTheme, + anotherDarkTestTheme, + BuiltinThemeProvider.lightTheme, + BuiltinThemeProvider.darkTheme, + ], + currentTheme: () => BuiltinThemeProvider.lightTheme, + }); + expect(actual.length).to.be.equal(3); + expect(actual[0].length).to.be.equal(4); + expect(actual[1].length).to.be.equal(4); + expect(actual[2].length).to.be.equal(1); + }); + }); + + describe('arduinoThemeTypeOf', () => { + ( + [ + [BuiltinThemeProvider.lightTheme, 'deprecated'], + [BuiltinThemeProvider.darkTheme, 'deprecated'], + [BuiltinThemeProvider.hcLightTheme, 'built-in'], + [BuiltinThemeProvider.hcTheme, 'built-in'], + [ArduinoThemes.light, 'built-in'], + [ArduinoThemes.dark, 'built-in'], + [testTheme, 'user'], + [anotherTestTheme, 'user'], + [darkTestTheme, 'user'], + [anotherDarkTestTheme, 'user'], + ] as [Theme, ArduinoThemeType][] + ).map(([theme, expected]) => + it(`should detect the '${theme.label}' theme as a '${expected}' theme`, () => + expect(arduinoThemeTypeOf(theme)).to.be.equal(expected)) + ); + }); + + describe('themeLabelForSettings', () => { + ( + [ + [ + BuiltinThemeProvider.lightTheme, + deprecatedThemeLabel(BuiltinThemeProvider.lightTheme), + ], + [ + BuiltinThemeProvider.darkTheme, + deprecatedThemeLabel(BuiltinThemeProvider.darkTheme), + ], + [BuiltinThemeProvider.hcTheme, hcThemeLabel], + [BuiltinThemeProvider.hcLightTheme, hcLightThemeLabel], + [ArduinoThemes.light, lightThemeLabel], + [ArduinoThemes.dark, darkThemeLabel], + [testTheme, userThemeLabel(testTheme)], + [anotherTestTheme, userThemeLabel(anotherTestTheme)], + [darkTestTheme, userThemeLabel(darkTestTheme)], + [anotherDarkTestTheme, userThemeLabel(anotherDarkTestTheme)], + ] as [Theme, string][] + ).map(([theme, expected]) => { + it(`should map the theme with ID '${theme.id}' to ${expected} in the settings UI`, () => { + expect(themeLabelForSettings(theme)).to.be.equal(expected); + }); + }); + }); +}); diff --git a/arduino-ide-extension/src/test/browser/update-arduino-state.test.ts b/arduino-ide-extension/src/test/browser/update-arduino-state.test.ts new file mode 100644 index 000000000..fbbf17510 --- /dev/null +++ b/arduino-ide-extension/src/test/browser/update-arduino-state.test.ts @@ -0,0 +1,644 @@ +import { enableJSDOM } from '@theia/core/lib/browser/test/jsdom'; +const disableJSDOM = enableJSDOM(); + +import { FrontendApplicationConfigProvider } from '@theia/core/lib/browser/frontend-application-config-provider'; +FrontendApplicationConfigProvider.set({}); + +import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state'; +import { + Disposable, + DisposableCollection, +} from '@theia/core/lib/common/disposable'; +import { Emitter } from '@theia/core/lib/common/event'; +import { wait } from '@theia/core/lib/common/promise-util'; +import URI from '@theia/core/lib/common/uri'; +import { Container, ContainerModule } from '@theia/core/shared/inversify'; +import { expect } from 'chai'; +import type { + BoardDetails as ApiBoardDetails, + CompileSummary as ApiCompileSummary, + Port as ApiPort, +} from 'vscode-arduino-api'; +import { URI as CodeURI } from 'vscode-uri'; +import { + BoardsDataStore, + BoardsDataStoreChangeEvent, +} from '../../browser/boards/boards-data-store'; +import { BoardsServiceProvider } from '../../browser/boards/boards-service-provider'; +import { ConfigServiceClient } from '../../browser/config/config-service-client'; +import { CommandRegistry } from '../../browser/contributions/contribution'; +import { + UpdateArduinoState, + UpdateStateParams, +} from '../../browser/contributions/update-arduino-state'; +import { CompileSummaryProvider } from '../../browser/contributions/verify-sketch'; +import { NotificationCenter } from '../../browser/notification-center'; +import { + CurrentSketch, + SketchesServiceClientImpl, +} from '../../browser/sketches-service-client-impl'; +import { CompileSummary } from '../../common/protocol'; +import { + BoardDetails, + BoardsService, + Port, +} from '../../common/protocol/boards-service'; +import { bindSketchesContribution } from './browser-test-bindings'; + +disableJSDOM(); + +describe('update-arduino-state', function () { + this.slow(250); + + let toDisposeAfterEach: DisposableCollection; + let boardsServiceProvider: BoardsServiceProvider; + let notificationCenter: NotificationCenter; + let commandRegistry: CommandRegistry; + let updateArduinoState: UpdateArduinoState; + let stateUpdateParams: UpdateStateParams[]; + + let boardDetailsMocks: Record<string, BoardDetails>; + let dataStoreMocks: Record<string, BoardsDataStore.Data>; + let currentSketchMock: CurrentSketch | undefined; + let sketchDirUriMock: URI | undefined; + let dataDirUriMock: URI | undefined; + let compileSummaryMock: CompileSummary | undefined; + let onCurrentSketchDidChangeEmitter: Emitter<CurrentSketch>; + let onDataDirDidChangeEmitter: Emitter<URI | undefined>; + let onSketchDirDidChangeEmitter: Emitter<URI | undefined>; + let onDataStoreDidChangeEmitter: Emitter<BoardsDataStoreChangeEvent>; + let compileSummaryDidChangeEmitter: Emitter<CompileSummary | undefined>; + + beforeEach(async () => { + toDisposeAfterEach = new DisposableCollection(); + stateUpdateParams = []; + + // reset mocks + boardDetailsMocks = {}; + dataStoreMocks = {}; + currentSketchMock = undefined; + sketchDirUriMock = undefined; + dataDirUriMock = undefined; + compileSummaryMock = undefined; + onCurrentSketchDidChangeEmitter = new Emitter(); + onDataDirDidChangeEmitter = new Emitter(); + onSketchDirDidChangeEmitter = new Emitter(); + onDataStoreDidChangeEmitter = new Emitter(); + compileSummaryDidChangeEmitter = new Emitter(); + toDisposeAfterEach.pushAll([ + onCurrentSketchDidChangeEmitter, + onDataDirDidChangeEmitter, + onSketchDirDidChangeEmitter, + onDataStoreDidChangeEmitter, + compileSummaryDidChangeEmitter, + ]); + + const container = createContainer(); + commandRegistry = container.get<CommandRegistry>(CommandRegistry); + // This command is registered by vscode-arduino-api + commandRegistry.registerCommand( + { id: 'arduinoAPI.updateState' }, + { + execute: (params: UpdateStateParams) => stateUpdateParams.push(params), + } + ); + // This command is contributed by the vscode-arduino-tools VSIX + commandRegistry.registerCommand( + { id: 'arduino.languageserver.notifyBuildDidComplete' }, + { + execute: () => { + /* NOOP */ + }, + } + ); + container.get<FrontendApplicationStateService>( + FrontendApplicationStateService + ).state = 'ready'; + boardsServiceProvider = container.get<BoardsServiceProvider>( + BoardsServiceProvider + ); + notificationCenter = container.get<NotificationCenter>(NotificationCenter); + updateArduinoState = container.get<UpdateArduinoState>(UpdateArduinoState); + toDisposeAfterEach.push( + Disposable.create(() => boardsServiceProvider.onStop()) + ); + boardsServiceProvider.onStart(); + await boardsServiceProvider.ready; + updateArduinoState.onStart(); + + await wait(50); + stateUpdateParams = []; + }); + + afterEach(() => { + toDisposeAfterEach.dispose(); + }); + + it('should automatically update the boards config (board+port) on ready', async () => { + const fqbn = 'a:b:c'; + const board = { fqbn, name: 'ABC' }; + const boardDetails: BoardDetails = { + buildProperties: [], + configOptions: [], + defaultProgrammerId: undefined, + fqbn, + PID: '0', + VID: '0', + programmers: [], + requiredTools: [], + }; + boardDetailsMocks = { + 'a:b:c': boardDetails, + }; + const port = { address: 'COM1', protocol: 'serial' }; + boardsServiceProvider['_boardsConfig'] = { + selectedBoard: board, + selectedPort: port, + }; + boardsServiceProvider['_detectedPorts'] = { + [Port.keyOf(port)]: { + port: { + address: 'COM1', + addressLabel: 'COM1 Port', + protocol: 'serial', + protocolLabel: 'Serial', + }, + boards: [], + }, + }; + + updateArduinoState.onReady(); + await wait(50); + + const params = stateUpdateParams.filter( + (param) => + param.key === 'fqbn' || + param.key === 'boardDetails' || + param.key === 'port' + ); + expect(params).to.be.deep.equal([ + { key: 'fqbn', value: 'a:b:c' }, + { + key: 'boardDetails', + value: { + buildProperties: {}, + configOptions: [], + fqbn: 'a:b:c', + programmers: [], + toolsDependencies: [], + } as ApiBoardDetails, + }, + { + key: 'port', + value: { + address: 'COM1', + protocol: 'serial', + protocolLabel: 'Serial', + hardwareId: '', + label: 'COM1 Port', + properties: {}, + } as ApiPort, + }, + ]); + }); + + it('should automatically update the sketch path on ready', async () => { + const uri = 'file:///path/to/my_sketch'; + currentSketchMock = { + name: 'my_sketch', + uri, + mainFileUri: 'file:///path/to/my_sketch/my_sketch.ino', + additionalFileUris: [], + otherSketchFileUris: [], + rootFolderFileUris: [], + }; + + updateArduinoState.onReady(); + await wait(50); + + const params = stateUpdateParams.filter( + (param) => param.key === 'sketchPath' + ); + expect(params).to.be.deep.equal([ + { + key: 'sketchPath', + value: CodeURI.parse(uri).fsPath, + }, + ]); + }); + + it("should automatically update the 'directories.data' path on ready", async () => { + const uri = 'file:///path/to/data/dir'; + dataDirUriMock = new URI(uri); + + stateUpdateParams = []; + updateArduinoState.onReady(); + await wait(50); + + const params = stateUpdateParams.filter( + (param) => param.key === 'dataDirPath' + ); + expect(params).to.be.deep.equal([ + { + key: 'dataDirPath', + value: CodeURI.parse(uri).fsPath, + }, + ]); + }); + + it("should automatically update the 'directories.user' path on ready", async () => { + const uri = 'file:///path/to/sketchbook'; + sketchDirUriMock = new URI(uri); + + updateArduinoState.onReady(); + await wait(50); + + const params = stateUpdateParams.filter( + (param) => param.key === 'userDirPath' + ); + expect(params).to.be.deep.equal([ + { + key: 'userDirPath', + value: CodeURI.parse(uri).fsPath, + }, + ]); + }); + + it('should update the boards config (board only) when did change', async () => { + const fqbn = 'a:b:c'; + const board = { fqbn, name: 'ABC' }; + const boardDetails = { + buildProperties: [], + configOptions: [], + defaultProgrammerId: undefined, + fqbn, + PID: '0', + VID: '0', + programmers: [], + requiredTools: [], + }; + boardDetailsMocks = { + 'a:b:c': boardDetails, + }; + boardsServiceProvider.updateConfig(board); + await wait(50); + + const params = stateUpdateParams.filter( + (param) => + param.key === 'fqbn' || + param.key === 'boardDetails' || + param.key === 'port' + ); + expect(params).to.be.deep.equal([ + { key: 'fqbn', value: 'a:b:c' }, + { + key: 'boardDetails', + value: { + buildProperties: {}, + configOptions: [], + fqbn: 'a:b:c', + programmers: [], + toolsDependencies: [], + } as ApiBoardDetails, + }, + { key: 'port', value: undefined }, + ]); + }); + + it('should update the boards config (port only) when did change', async () => { + const port = { address: 'COM1', protocol: 'serial' }; + notificationCenter.notifyDetectedPortsDidChange({ + detectedPorts: { + [Port.keyOf(port)]: { + port: { + address: 'COM1', + addressLabel: 'COM1 Port', + protocol: 'serial', + protocolLabel: 'Serial', + }, + boards: [], + }, + }, + }); + boardsServiceProvider.updateConfig(port); + await wait(50); + + const params = stateUpdateParams.filter( + (param) => + param.key === 'fqbn' || + param.key === 'boardDetails' || + param.key === 'port' + ); + expect(params).to.be.deep.equal([ + { key: 'fqbn', value: undefined }, + { key: 'boardDetails', value: undefined }, + { + key: 'port', + value: { + address: 'COM1', + protocol: 'serial', + protocolLabel: 'Serial', + hardwareId: '', + label: 'COM1 Port', + properties: {}, + } as ApiPort, + }, + ]); + }); + + it('should update the boards config (board+port) when did change', async () => { + const fqbn = 'a:b:c'; + const board = { fqbn, name: 'ABC' }; + const boardDetails = { + buildProperties: [], + configOptions: [], + defaultProgrammerId: undefined, + fqbn, + PID: '0', + VID: '0', + programmers: [], + requiredTools: [], + }; + boardDetailsMocks = { + 'a:b:c': boardDetails, + }; + const port = { address: 'COM1', protocol: 'serial' }; + boardsServiceProvider.updateConfig({ + selectedBoard: board, + selectedPort: port, + }); + notificationCenter.notifyDetectedPortsDidChange({ + detectedPorts: { + [Port.keyOf(port)]: { + port: { + address: 'COM1', + addressLabel: 'COM1 Port', + protocol: 'serial', + protocolLabel: 'Serial', + }, + boards: [], + }, + }, + }); + await wait(50); + + const params = stateUpdateParams.filter( + (param) => + param.key === 'fqbn' || + param.key === 'boardDetails' || + param.key === 'port' + ); + expect(params).to.be.deep.equal([ + { key: 'fqbn', value: 'a:b:c' }, + { + key: 'boardDetails', + value: { + buildProperties: {}, + configOptions: [], + fqbn: 'a:b:c', + programmers: [], + toolsDependencies: [], + } as ApiBoardDetails, + }, + { + key: 'port', + value: { + address: 'COM1', + protocol: 'serial', + protocolLabel: 'Serial', + hardwareId: '', + label: 'COM1 Port', + properties: {}, + } as ApiPort, + }, + ]); + }); + + it('should update the compile summary after a verify', async () => { + const summary: CompileSummary = { + buildPath: '/path/to/build', + buildProperties: [], + executableSectionsSize: [], + usedLibraries: [], + boardPlatform: undefined, + buildPlatform: undefined, + buildOutputUri: 'file:///path/to/build', + }; + compileSummaryMock = summary; + compileSummaryDidChangeEmitter.fire(compileSummaryMock); + await wait(50); + + const params = stateUpdateParams.filter( + (param) => param.key === 'compileSummary' + ); + expect(params).to.be.deep.equal([ + { + key: 'compileSummary', + value: { + buildPath: '/path/to/build', + buildProperties: {}, + executableSectionsSize: [], + usedLibraries: [], + boardPlatform: undefined, + buildPlatform: undefined, + } as ApiCompileSummary, + }, + ]); + }); + + it('should update the current sketch when did change', async () => { + const uri = 'file:///path/to/my_sketch'; + const sketch = { + name: 'my_sketch', + uri, + mainFileUri: 'file:///path/to/my_sketch/my_sketch.ino', + additionalFileUris: [], + otherSketchFileUris: [], + rootFolderFileUris: [], + }; + onCurrentSketchDidChangeEmitter.fire(sketch); + await wait(50); + + const params = stateUpdateParams.filter( + (param) => param.key === 'sketchPath' + ); + expect(params).to.be.deep.equal([ + { + key: 'sketchPath', + value: CodeURI.parse(uri).fsPath, + }, + ]); + }); + + it("should update the 'directories.data' when did change", async () => { + const uri = new URI('file:///path/to/data/dir'); + onDataDirDidChangeEmitter.fire(uri); + await wait(50); + + const params = stateUpdateParams.filter( + (param) => param.key === 'dataDirPath' + ); + expect(params).to.be.deep.equal([ + { + key: 'dataDirPath', + value: CodeURI.parse(uri.toString()).fsPath, + }, + ]); + }); + + it("should update the 'directories.user' when did change", async () => { + const uri = new URI('file:///path/to/sketchbook'); + onSketchDirDidChangeEmitter.fire(uri); + await wait(50); + + const params = stateUpdateParams.filter( + (param) => param.key === 'userDirPath' + ); + expect(params).to.be.deep.equal([ + { + key: 'userDirPath', + value: CodeURI.parse(uri.toString()).fsPath, + }, + ]); + }); + + it('should not update the board details when data store did change but the selected board does not match', async () => { + onDataStoreDidChangeEmitter.fire({ + changes: [ + { + fqbn: 'a:b:c', + // the data does not matter + data: { + configOptions: [ + { + label: 'C1', + option: 'c1', + values: [{ label: 'C1V1', selected: true, value: 'c1v1' }], + }, + ], + programmers: [], + defaultProgrammerId: undefined, + }, + }, + ], + }); + await wait(50); + + expect(stateUpdateParams).to.be.empty; + }); + + it('should update the board details when the data store did change and the selected board matches', async () => { + const fqbn = 'a:b:c'; + const board = { fqbn, name: 'ABC' }; + const boardDetails = { + buildProperties: [], + configOptions: [], + defaultProgrammerId: undefined, + fqbn, + PID: '0', + VID: '0', + programmers: [], + requiredTools: [], + }; + boardDetailsMocks = { + 'a:b:c': boardDetails, + }; + boardsServiceProvider['_boardsConfig'] = { + selectedBoard: board, + selectedPort: undefined, + }; + + onDataStoreDidChangeEmitter.fire({ + changes: [ + { + fqbn: 'a:b:c', + // the data does not matter + data: { + configOptions: [], + programmers: [{ id: 'p1', name: 'P1', platform: 'The platform' }], + defaultProgrammerId: 'p1', + }, + }, + ], + }); + await wait(50); + + const params = stateUpdateParams.filter( + (param) => + param.key === 'fqbn' || + param.key === 'boardDetails' || + param.key === 'port' + ); + expect(params).to.be.deep.equal([ + { + key: 'boardDetails', + value: { + buildProperties: {}, + configOptions: [], + fqbn: 'a:b:c', + programmers: [], + toolsDependencies: [], + } as ApiBoardDetails, + }, + ]); + }); + + function createContainer(): Container { + const container = new Container({ defaultScope: 'Singleton' }); + container.load( + new ContainerModule((bind, unbind, isBound, rebind) => { + bindSketchesContribution(bind, unbind, isBound, rebind); + bind(UpdateArduinoState).toSelf().inSingletonScope(); + bind(CompileSummaryProvider).toConstantValue(<CompileSummaryProvider>{ + get compileSummary(): CompileSummary | undefined { + return compileSummaryMock; + }, + onDidChangeCompileSummary: compileSummaryDidChangeEmitter.event, + }); + rebind(BoardsService).toConstantValue(<BoardsService>{ + getDetectedPorts() { + return {}; + }, + async getBoardDetails({ fqbn }) { + return boardDetailsMocks[fqbn]; + }, + }); + rebind(BoardsDataStore).toConstantValue(<BoardsDataStore>{ + async getData(fqbn) { + if (!fqbn) { + return BoardsDataStore.Data.EMPTY; + } + const data = dataStoreMocks[fqbn] ?? BoardsDataStore.Data.EMPTY; + return data; + }, + get onDidChange() { + return onDataStoreDidChangeEmitter.event; + }, + }); + rebind(ConfigServiceClient).toConstantValue(<ConfigServiceClient>{ + tryGetSketchDirUri() { + return sketchDirUriMock; + }, + tryGetDataDirUri() { + return dataDirUriMock; + }, + get onDidChangeSketchDirUri() { + return onSketchDirDidChangeEmitter.event; + }, + get onDidChangeDataDirUri() { + return onDataDirDidChangeEmitter.event; + }, + }); + rebind(SketchesServiceClientImpl).toConstantValue(< + SketchesServiceClientImpl + >{ + tryGetCurrentSketch() { + return currentSketchMock; + }, + onCurrentSketchDidChange: onCurrentSketchDidChangeEmitter.event, + }); + }) + ); + return container; + } +}); diff --git a/arduino-ide-extension/src/test/browser/widgets.test.ts b/arduino-ide-extension/src/test/browser/widgets.test.ts new file mode 100644 index 000000000..542cbac97 --- /dev/null +++ b/arduino-ide-extension/src/test/browser/widgets.test.ts @@ -0,0 +1,121 @@ +import { + Disposable, + DisposableCollection, +} from '@theia/core/lib/common/disposable'; +import type { PanelLayout, Widget } from '@theia/core/shared/@phosphor/widgets'; +import { expect } from 'chai'; +import type { + removeWidgetIfPresent, + unshiftWidgetIfNotPresent, +} from '../../browser/theia/dialogs/widgets'; + +describe('widgets', () => { + let toDispose: DisposableCollection; + + beforeEach(() => { + const disableJSDOM = + require('@theia/core/lib/browser/test/jsdom').enableJSDOM(); + toDispose = new DisposableCollection( + Disposable.create(() => disableJSDOM()) + ); + }); + + afterEach(() => toDispose.dispose()); + + describe('removeWidgetIfPresent', () => { + let testMe: typeof removeWidgetIfPresent; + + beforeEach( + () => + (testMe = + require('../../browser/theia/dialogs/widgets').removeWidgetIfPresent) + ); + + it('should remove the widget if present', () => { + const layout = newPanelLayout(); + const widget = newWidget(); + layout.addWidget(widget); + const toRemoveWidget = newWidget(); + layout.addWidget(toRemoveWidget); + + expect(layout.widgets).to.be.deep.equal([widget, toRemoveWidget]); + + testMe(layout, toRemoveWidget); + + expect(layout.widgets).to.be.deep.equal([widget]); + }); + + it('should be noop if the widget is not part of the layout', () => { + const layout = newPanelLayout(); + const widget = newWidget(); + layout.addWidget(widget); + + expect(layout.widgets).to.be.deep.equal([widget]); + + testMe(layout, newWidget()); + + expect(layout.widgets).to.be.deep.equal([widget]); + }); + }); + + describe('unshiftWidgetIfNotPresent', () => { + let testMe: typeof unshiftWidgetIfNotPresent; + + beforeEach( + () => + (testMe = + require('../../browser/theia/dialogs/widgets').unshiftWidgetIfNotPresent) + ); + + it('should unshift the widget if not present', () => { + const layout = newPanelLayout(); + const widget = newWidget(); + layout.addWidget(widget); + + expect(layout.widgets).to.be.deep.equal([widget]); + + const toAdd = newWidget(); + testMe(layout, toAdd); + + expect(layout.widgets).to.be.deep.equal([toAdd, widget]); + }); + + it('should be NOOP if widget is already part of the layout (at 0 index)', () => { + const layout = newPanelLayout(); + const toAdd = newWidget(); + layout.addWidget(toAdd); + const widget = newWidget(); + layout.addWidget(widget); + + expect(layout.widgets).to.be.deep.equal([toAdd, widget]); + + testMe(layout, toAdd); + + expect(layout.widgets).to.be.deep.equal([toAdd, widget]); + }); + + it('should be NOOP if widget is already part of the layout (at >0 index)', () => { + const layout = newPanelLayout(); + const widget = newWidget(); + layout.addWidget(widget); + const toAdd = newWidget(); + layout.addWidget(toAdd); + + expect(layout.widgets).to.be.deep.equal([widget, toAdd]); + + testMe(layout, toAdd); + + expect(layout.widgets).to.be.deep.equal([widget, toAdd]); + }); + }); + + function newWidget(): Widget { + const { Widget } = require('@theia/core/shared/@phosphor/widgets'); + return new Widget(); + } + + function newPanelLayout(): PanelLayout { + const { PanelLayout } = require('@theia/core/shared/@phosphor/widgets'); + return new PanelLayout(); + } +}); diff --git a/arduino-ide-extension/src/test/browser/workspace-commands.test.ts b/arduino-ide-extension/src/test/browser/workspace-commands.test.ts new file mode 100644 index 000000000..cc661e0c9 --- /dev/null +++ b/arduino-ide-extension/src/test/browser/workspace-commands.test.ts @@ -0,0 +1,221 @@ +import { enableJSDOM } from '@theia/core/lib/browser/test/jsdom'; +const disableJSDOM = enableJSDOM(); + +import { FrontendApplicationConfigProvider } from '@theia/core/lib/browser/frontend-application-config-provider'; +FrontendApplicationConfigProvider.set({}); + +import { + ApplicationShell, + FrontendApplication, + LabelProvider, + OpenerService, +} from '@theia/core/lib/browser'; +import { ClipboardService } from '@theia/core/lib/browser/clipboard-service'; +import { ApplicationServer } from '@theia/core/lib/common/application-protocol'; +import { CommandService } from '@theia/core/lib/common/command'; +import { MessageService } from '@theia/core/lib/common/message-service'; +import { nls } from '@theia/core/lib/common/nls'; +import { OS } from '@theia/core/lib/common/os'; +import { SelectionService } from '@theia/core/lib/common/selection-service'; +import URI from '@theia/core/lib/common/uri'; +import { Container } from '@theia/core/shared/inversify'; +import { FileDialogService } from '@theia/filesystem/lib/browser'; +import { FileService } from '@theia/filesystem/lib/browser/file-service'; +import { FileStat } from '@theia/filesystem/lib/common/files'; +import { WorkspaceCompareHandler } from '@theia/workspace/lib/browser/workspace-compare-handler'; +import { WorkspaceDeleteHandler } from '@theia/workspace/lib/browser/workspace-delete-handler'; +import { WorkspaceDuplicateHandler } from '@theia/workspace/lib/browser/workspace-duplicate-handler'; +import { WorkspacePreferences } from '@theia/workspace/lib/browser/workspace-preferences'; +import { WorkspaceService } from '@theia/workspace/lib/browser/workspace-service'; +import { expect } from 'chai'; +import { ConfigServiceClient } from '../../browser/config/config-service-client'; +import { CreateFeatures } from '../../browser/create/create-features'; +import { SketchesServiceClientImpl } from '../../browser/sketches-service-client-impl'; +import { + fileAlreadyExists, + invalidExtension as invalidExtensionMessage, + parseFileInput, + WorkspaceCommandContribution, +} from '../../browser/theia/workspace/workspace-commands'; +import { Sketch, SketchesService } from '../../common/protocol'; + +disableJSDOM(); + +describe('workspace-commands', () => { + describe('parseFileInput', () => { + it("should parse input without extension as '.ino'", () => { + const actual = parseFileInput('foo'); + expect(actual).to.be.deep.equal({ + raw: 'foo', + name: 'foo', + extension: '.ino', + }); + }); + it("should parse input with a trailing dot as '.ino'", () => { + const actual = parseFileInput('foo.'); + expect(actual).to.be.deep.equal({ + raw: 'foo.', + name: 'foo', + extension: '.ino', + }); + }); + it('should parse input with a valid extension', () => { + const actual = parseFileInput('lib.cpp'); + expect(actual).to.be.deep.equal({ + raw: 'lib.cpp', + name: 'lib', + extension: '.cpp', + }); + }); + it('should calculate the file extension based on the last dot index', () => { + const actual = parseFileInput('lib.ino.x'); + expect(actual).to.be.deep.equal({ + raw: 'lib.ino.x', + name: 'lib.ino', + extension: '.x', + }); + }); + it('should ignore trailing spaces after the last dot', () => { + const actual = parseFileInput(' foo. '); + expect(actual).to.be.deep.equal({ + raw: ' foo. ', + name: ' foo', + extension: '.ino', + }); + }); + }); + + describe('validateFileName', () => { + const child: FileStat = { + isFile: true, + isDirectory: false, + isReadonly: false, + isSymbolicLink: false, + resource: new URI('sketch/sketch.ino'), + name: 'sketch.ino', + }; + const parent: FileStat = { + isFile: false, + isDirectory: true, + isReadonly: false, + isSymbolicLink: false, + resource: new URI('sketch'), + name: 'sketch', + children: [child], + }; + + let workspaceCommands: WorkspaceCommandContribution; + + async function testMe(userInput: string): Promise<string> { + return workspaceCommands['validateFileName'](userInput, parent); + } + + function createContainer(): Container { + const container = new Container(); + container.bind(FileDialogService).toConstantValue(<FileDialogService>{}); + container.bind(FileService).toConstantValue(<FileService>{ + async exists(resource: URI): Promise<boolean> { + return ( + resource.path.base.includes('_sketch') || + resource.path.base.includes('sketch') + ); + }, + }); + container + .bind(FrontendApplication) + .toConstantValue(<FrontendApplication>{}); + container.bind(LabelProvider).toConstantValue(<LabelProvider>{}); + container.bind(MessageService).toConstantValue(<MessageService>{}); + container.bind(OpenerService).toConstantValue(<OpenerService>{}); + container.bind(SelectionService).toConstantValue(<SelectionService>{}); + container.bind(WorkspaceCommandContribution).toSelf().inSingletonScope(); + container + .bind(WorkspaceCompareHandler) + .toConstantValue(<WorkspaceCompareHandler>{}); + container + .bind(WorkspaceDeleteHandler) + .toConstantValue(<WorkspaceDeleteHandler>{}); + container + .bind(WorkspaceDuplicateHandler) + .toConstantValue(<WorkspaceDuplicateHandler>{}); + container + .bind(WorkspacePreferences) + .toConstantValue(<WorkspacePreferences>{}); + container.bind(WorkspaceService).toConstantValue(<WorkspaceService>{}); + container.bind(ClipboardService).toConstantValue(<ClipboardService>{}); + container.bind(ApplicationServer).toConstantValue(<ApplicationServer>{ + async getBackendOS(): Promise<OS.Type> { + return OS.type(); + }, + }); + container.bind(CommandService).toConstantValue(<CommandService>{}); + container.bind(SketchesService).toConstantValue(<SketchesService>{}); + container + .bind(SketchesServiceClientImpl) + .toConstantValue(<SketchesServiceClientImpl>{}); + container.bind(CreateFeatures).toConstantValue(<CreateFeatures>{}); + container.bind(ApplicationShell).toConstantValue(<ApplicationShell>{}); + container + .bind(ConfigServiceClient) + .toConstantValue(<ConfigServiceClient>{}); + return container; + } + + beforeEach(() => { + workspaceCommands = createContainer().get<WorkspaceCommandContribution>( + WorkspaceCommandContribution + ); + }); + + it("should validate input string without an extension as an '.ino' file", async () => { + const actual = await testMe('valid'); + expect(actual).to.be.empty; + }); + + it('code files cannot start with number (no extension)', async () => { + const actual = await testMe('-invalid'); + expect(actual).to.be.equal(Sketch.invalidSketchFolderNameMessage); + }); + + it('code files cannot start with number (trailing dot)', async () => { + const actual = await testMe('-invalid.'); + expect(actual).to.be.equal(Sketch.invalidSketchFolderNameMessage); + }); + + it('code files cannot start with number (trailing dot)', async () => { + const actual = await testMe('-invalid.cpp'); + expect(actual).to.be.equal(Sketch.invalidSketchFolderNameMessage); + }); + + it('should warn about invalid extension first', async () => { + const actual = await testMe('-invalid.xxx'); + expect(actual).to.be.equal(invalidExtensionMessage('.xxx')); + }); + + it('should not warn about invalid file extension for empty input', async () => { + const actual = await testMe(''); + expect(actual).to.be.equal(Sketch.invalidSketchFolderNameMessage); + }); + + it('should ignore non-code filename validation from the spec', async () => { + const actual = await testMe('-invalid.json'); + expect(actual).to.be.empty; + }); + + it('non-code files should be validated against default new file validation rules', async () => { + const name = ' invalid.json'; + const actual = await testMe(name); + const expected = nls.localizeByDefault( + 'Leading or trailing whitespace detected in file or folder name.' + ); + expect(actual).to.be.equal(expected); + }); + + it('should warn about existing resource', async () => { + const name = 'sketch.ino'; + const actual = await testMe(name); + const expected = fileAlreadyExists(name); + expect(actual).to.be.equal(expected); + }); + }); +}); diff --git a/arduino-ide-extension/src/test/common/arduino-context-mapper.test.ts b/arduino-ide-extension/src/test/common/arduino-context-mapper.test.ts new file mode 100644 index 000000000..23727bffc --- /dev/null +++ b/arduino-ide-extension/src/test/common/arduino-context-mapper.test.ts @@ -0,0 +1,43 @@ +import { expect } from 'chai'; +import { toApiBuildProperties } from '../../common/protocol/arduino-context-mapper'; + +describe('arduino-context-mapper', () => { + describe('toApiBuildProperties', () => { + it('should parse an array of build properties string into a record', () => { + const expected = { + foo: 'alma', + bar: '36', + baz: 'false', + }; + const actual = toApiBuildProperties(['foo=alma', 'bar=36', 'baz=false']); + expect(actual).to.be.deep.equal(expected); + }); + + it('should not skip build property key with empty value', () => { + const expected = { + foo: '', + }; + const actual = toApiBuildProperties(['foo=']); + expect(actual).to.be.deep.equal(expected); + }); + + it('should skip invalid entries', () => { + const expected = { + foo: 'alma', + bar: '36', + baz: '-DARDUINO_USB_CDC_ON_BOOT=0', + }; + const actual = toApiBuildProperties([ + 'foo=alma', + 'invalid', + '=invalid2', + '=invalid3=', + '=', + '==', + 'bar=36', + 'baz=-DARDUINO_USB_CDC_ON_BOOT=0', + ]); + expect(actual).to.be.deep.equal(expected); + }); + }); +}); diff --git a/arduino-ide-extension/src/test/common/board-list.test.ts b/arduino-ide-extension/src/test/common/board-list.test.ts new file mode 100644 index 000000000..fe02fa4a1 --- /dev/null +++ b/arduino-ide-extension/src/test/common/board-list.test.ts @@ -0,0 +1,718 @@ +import { expect } from 'chai'; +import { Unknown } from '../../common/nls'; +import { + BoardListLabels, + createBoardList, + EditBoardsConfigActionParams, + isInferredBoardListItem, + isMultiBoardsBoardListItem, + SelectBoardsConfigActionParams, +} from '../../common/protocol/board-list'; +import { + emptyBoardsConfig, + notConnected, + selectBoard, + unconfirmedBoard, +} from '../../common/protocol/boards-service'; +import { + arduinoNanoEsp32, + bluetoothSerialPort, + builtinSerialPort, + createPort, + detectedPort, + detectedPorts, + esp32NanoEsp32, + esp32S3Box, + esp32S3DevModule, + history, + mkr1000, + mkr1000NetworkPort, + mkr1000SerialPort, + nanoEsp32DetectsMultipleEsp32BoardsSerialPort, + nanoEsp32SerialPort, + undiscoveredSerialPort, + undiscoveredUsbToUARTSerialPort, + uno, + unoSerialPort, +} from './fixtures'; + +describe('board-list', () => { + describe('boardList#labels', () => { + it('should handle no selected board+port', () => { + const { labels } = createBoardList({}); + const expected: BoardListLabels = { + boardLabel: selectBoard, + portProtocol: undefined, + selected: false, + tooltip: selectBoard, + }; + expect(labels).to.be.deep.equal(expected); + }); + + it('should handle port selected (port detected)', () => { + const { labels } = createBoardList( + { + ...detectedPort(unoSerialPort, uno), + }, + { selectedBoard: undefined, selectedPort: unoSerialPort } + ); + const expected: BoardListLabels = { + boardLabel: selectBoard, + portProtocol: undefined, + selected: false, + tooltip: unoSerialPort.address, + }; + expect(labels).to.be.deep.equal(expected); + }); + + it('should handle port selected (port not detected)', () => { + const { labels } = createBoardList( + { + ...detectedPort(mkr1000SerialPort, mkr1000), + }, + { selectedBoard: undefined, selectedPort: unoSerialPort } + ); + const expected: BoardListLabels = { + boardLabel: selectBoard, + portProtocol: undefined, + selected: false, + tooltip: `${unoSerialPort.address} ${notConnected}`, + }; + expect(labels).to.be.deep.equal(expected); + }); + + it('should handle board selected (with FQBN)', () => { + const { labels } = createBoardList( + {}, + { selectedBoard: uno, selectedPort: undefined } + ); + const expected: BoardListLabels = { + boardLabel: uno.name, + portProtocol: undefined, + selected: false, + tooltip: `${uno.name} (${uno.fqbn})`, + }; + expect(labels).to.be.deep.equal(expected); + }); + + it('should handle board selected (no FQBN)', () => { + const { labels } = createBoardList( + {}, + { + selectedBoard: { name: 'my board', fqbn: undefined }, + selectedPort: undefined, + } + ); + const expected: BoardListLabels = { + boardLabel: 'my board', + portProtocol: undefined, + selected: false, + tooltip: 'my board', + }; + expect(labels).to.be.deep.equal(expected); + }); + + it('should handle both selected (port not detected)', () => { + const { labels } = createBoardList( + { + ...detectedPort(mkr1000SerialPort, mkr1000), + }, + { selectedBoard: mkr1000, selectedPort: unoSerialPort } + ); + const expected: BoardListLabels = { + boardLabel: mkr1000.name, + portProtocol: 'serial', + selected: false, + tooltip: `${mkr1000.name} (${mkr1000.fqbn})\n${unoSerialPort.address} ${notConnected}`, + }; + expect(labels).to.be.deep.equal(expected); + }); + + it('should handle both selected (board not discovered)', () => { + const { labels } = createBoardList( + { + ...detectedPort(unoSerialPort, uno), + }, + { selectedBoard: mkr1000, selectedPort: unoSerialPort } + ); + const expected: BoardListLabels = { + boardLabel: mkr1000.name, + portProtocol: 'serial', + selected: false, + tooltip: `${mkr1000.name} (${mkr1000.fqbn})\n${unoSerialPort.address}`, + }; + expect(labels).to.be.deep.equal(expected); + }); + + it('should handle both selected (no FQBN)', () => { + const { labels } = createBoardList( + { + ...detectedPort(unoSerialPort, { name: 'my board', fqbn: undefined }), + }, + { + selectedBoard: { name: 'my board', fqbn: undefined }, + selectedPort: unoSerialPort, + } + ); + const expected: BoardListLabels = { + boardLabel: 'my board', + portProtocol: 'serial', + selected: true, + tooltip: `my board\n${unoSerialPort.address}`, + }; + expect(labels).to.be.deep.equal(expected); + }); + + it('should handle both selected', () => { + const { labels } = createBoardList( + { + ...detectedPort(mkr1000NetworkPort, mkr1000), + }, + { selectedBoard: mkr1000, selectedPort: mkr1000NetworkPort } + ); + const expected: BoardListLabels = { + boardLabel: mkr1000.name, + portProtocol: 'network', + selected: true, + tooltip: `${mkr1000.name} (${mkr1000.fqbn})\n${mkr1000NetworkPort.address}`, + }; + expect(labels).to.be.deep.equal(expected); + }); + }); + + describe('createBoardList', () => { + it('should sort the items deterministically', () => { + const { items } = createBoardList(detectedPorts); + + expect(items.length).to.be.equal(Object.keys(detectedPorts).length); + expect(items[0].board).deep.equal(mkr1000); + expect(items[1].board).deep.equal(uno); + expect(items[2].board).is.undefined; + expect(isMultiBoardsBoardListItem(items[2])).to.be.true; + const boards2 = isMultiBoardsBoardListItem(items[2]) + ? items[2].boards + : undefined; + expect(boards2).deep.equal([arduinoNanoEsp32, esp32NanoEsp32]); + expect(items[3].board).is.undefined; + expect(isMultiBoardsBoardListItem(items[3])).to.be.true; + const boards3 = isMultiBoardsBoardListItem(items[3]) + ? items[3].boards + : undefined; + expect(boards3).deep.equal([esp32S3Box, esp32S3DevModule]); + expect(items[4].port).deep.equal(builtinSerialPort); + expect(items[5].port).deep.equal(bluetoothSerialPort); + expect(items[6].port).deep.equal(undiscoveredSerialPort); + expect(items[7].port).deep.equal(undiscoveredUsbToUARTSerialPort); + expect(items[8].port.protocol).equal('network'); + expect(items[8].board).deep.equal(mkr1000); + }); + + it('should sort Arduino items before others', () => { + const detectedPorts = { + ...detectedPort(createPort('a'), { name: 'aa', fqbn: 'arduino:a:a' }), + ...detectedPort(createPort('b'), { name: 'ab', fqbn: 'other:a:b' }), + ...detectedPort(createPort('c'), { name: 'ac', fqbn: 'arduino:a:c' }), + }; + const { items } = createBoardList(detectedPorts); + + expect(items.length).to.be.equal(3); + expect(items[0].board?.name).to.be.equal('aa'); + expect(items[1].board?.name).to.be.equal('ac'); + expect(items[2].board?.name).to.be.equal('ab'); + }); + + it('should sort items by inferred board if any', () => { + const portA = createPort('portA'); + const portB = createPort('portB'); + const detectedPorts = { + ...detectedPort(portA), + ...detectedPort(portB), + }; + const boardListHistory = { + ...history(portA, { name: 'bbb', fqbn: undefined }), + ...history(portB, { name: 'aaa', fqbn: undefined }), + }; + const { items } = createBoardList( + detectedPorts, + emptyBoardsConfig(), + boardListHistory + ); + + expect(items.length).to.be.equal(2); + expect(items[0].port.address).to.be.equal('portB'); + expect(items[0].board).to.be.undefined; + const inferredBoardA = isInferredBoardListItem(items[0]) + ? items[0].inferredBoard + : undefined; + expect(inferredBoardA).to.be.not.undefined; + expect(inferredBoardA?.name).to.be.equal('aaa'); + + expect(items[1].port.address).to.be.equal('portA'); + expect(items[1].board).to.be.undefined; + expect(isInferredBoardListItem(items[1])).to.be.true; + const inferredBoardB = isInferredBoardListItem(items[1]) + ? items[1].inferredBoard + : undefined; + expect(inferredBoardB).to.be.not.undefined; + expect(inferredBoardB?.name).to.be.equal('bbb'); + }); + + it('should sort ambiguous boards with unique board name before other ambiguous boards', () => { + const portA = createPort('portA'); + const portB = createPort('portB'); + const unique_ArduinoZZZ = { fqbn: 'arduino:e:f', name: 'zzz' }; + const unique_OtherZZZ = { fqbn: 'a:b:c', name: 'zzz' }; + const nonUnique_AAA = { fqbn: 'g:h:i', name: 'aaa' }; + const nonUnique_BBB = { fqbn: 'j:k:l', name: 'bbb' }; + const detectedPorts = { + ...detectedPort(portA, nonUnique_AAA, nonUnique_BBB), + ...detectedPort(portB, unique_OtherZZZ, unique_ArduinoZZZ), + }; + const { items } = createBoardList(detectedPorts); + + expect(items.length).to.be.equal(2); + expect(isMultiBoardsBoardListItem(items[0])).to.be.true; + const ambiguousBoardWithUniqueName = isMultiBoardsBoardListItem(items[0]) + ? items[0] + : undefined; + expect(ambiguousBoardWithUniqueName).to.be.not.undefined; + expect(ambiguousBoardWithUniqueName?.labels.boardLabel).to.be.equal( + unique_ArduinoZZZ.name + ); + expect(ambiguousBoardWithUniqueName?.port).to.be.deep.equal(portB); + expect(ambiguousBoardWithUniqueName?.boards).to.be.deep.equal([ + unique_ArduinoZZZ, + unique_OtherZZZ, + ]); + + expect(isMultiBoardsBoardListItem(items[1])).to.be.true; + const ambiguousBoardWithoutName = isMultiBoardsBoardListItem(items[1]) + ? items[1] + : undefined; + expect(ambiguousBoardWithoutName).to.be.not.undefined; + expect(ambiguousBoardWithoutName?.labels.boardLabel).to.be.equal( + unconfirmedBoard + ); + expect(ambiguousBoardWithoutName?.port).to.be.deep.equal(portA); + expect(ambiguousBoardWithoutName?.boards).to.be.deep.equal([ + nonUnique_AAA, + nonUnique_BBB, + ]); + }); + + it('should detect when a discovered board is overridden by a historical selection', () => { + const otherBoard = { name: 'other', fqbn: 'a:b:c' }; + const detectedPorts = { + ...detectedPort(unoSerialPort, uno), + }; + const boardListHistory = { + ...history(unoSerialPort, otherBoard), + }; + const { items } = createBoardList( + detectedPorts, + emptyBoardsConfig(), + boardListHistory + ); + + expect(items.length).to.be.equal(1); + const inferredBoard = isInferredBoardListItem(items[0]) + ? items[0] + : undefined; + expect(inferredBoard).is.not.undefined; + expect(inferredBoard?.inferredBoard).to.be.deep.equal(otherBoard); + expect(inferredBoard?.board).to.be.deep.equal(uno); + }); + + it(`should use the '${Unknown}' as the board label when no boards were discovered on a detected port`, () => { + const { items } = createBoardList({ ...detectedPort(unoSerialPort) }); + expect(items[0].labels.boardLabel).to.be.equal(Unknown); + }); + + describe('boards', () => { + it('should include discovered boards on detected ports', () => { + const { boards } = createBoardList({ + ...detectedPort(unoSerialPort, uno), + ...detectedPort(mkr1000SerialPort, mkr1000), + ...detectedPort(undiscoveredSerialPort), + }); + expect(boards).to.deep.equal([ + { + port: mkr1000SerialPort, + board: mkr1000, + }, + { + port: unoSerialPort, + board: uno, + }, + ]); + }); + + it('should include manually selected boards on detected ports', () => { + const { boards } = createBoardList({ + ...detectedPort(unoSerialPort, uno), + ...detectedPort(undiscoveredSerialPort, uno), + ...detectedPort(undiscoveredUsbToUARTSerialPort), + }); + expect(boards).to.deep.equal([ + { + port: unoSerialPort, + board: uno, + }, + { + port: undiscoveredSerialPort, + board: uno, + }, + ]); + }); + + it('should include manually overridden boards on detected ports', () => { + const { boards } = createBoardList( + { + ...detectedPort(unoSerialPort, uno), + ...detectedPort(mkr1000SerialPort, mkr1000), + }, + emptyBoardsConfig(), + { + ...history(unoSerialPort, mkr1000), + } + ); + expect(boards).to.deep.equal([ + { + port: mkr1000SerialPort, + board: mkr1000, + }, + { + port: unoSerialPort, + board: mkr1000, + }, + ]); + }); + + it('should include all boards discovered on a port', () => { + const { boards } = createBoardList({ + ...detectedPort( + nanoEsp32SerialPort, + arduinoNanoEsp32, + esp32NanoEsp32 + ), + ...detectedPort( + nanoEsp32DetectsMultipleEsp32BoardsSerialPort, + esp32S3DevModule, + esp32S3Box + ), + }); + expect(boards).to.deep.equal([ + { + port: nanoEsp32SerialPort, + board: arduinoNanoEsp32, + }, + { + port: nanoEsp32SerialPort, + board: esp32NanoEsp32, + }, + { + port: nanoEsp32DetectsMultipleEsp32BoardsSerialPort, + board: esp32S3Box, + }, + { + port: nanoEsp32DetectsMultipleEsp32BoardsSerialPort, + board: esp32S3DevModule, + }, + ]); + }); + + it('should include all boards discovered on a port (handle manual select)', () => { + const { boards } = createBoardList( + { + ...detectedPort( + nanoEsp32SerialPort, + arduinoNanoEsp32, + esp32NanoEsp32 + ), + }, + emptyBoardsConfig(), + { + ...history(nanoEsp32SerialPort, esp32S3DevModule), + } + ); + expect(boards).to.deep.equal([ + { + port: nanoEsp32SerialPort, + board: arduinoNanoEsp32, + }, + { + port: nanoEsp32SerialPort, + board: esp32NanoEsp32, + }, + { + port: nanoEsp32SerialPort, + board: esp32S3DevModule, + }, + ]); + }); + }); + + describe('defaultAction', () => { + it("'select' should be the default action for identifier boards", () => { + const { items } = createBoardList({ + ...detectedPort(mkr1000SerialPort, mkr1000), + }); + const item = items[0]; + expect(item.defaultAction.type).to.be.equal('select-boards-config'); + expect(item.defaultAction.params).to.be.deep.equal({ + selectedPort: mkr1000SerialPort, + selectedBoard: mkr1000, + }); + }); + + it("'select' should be the default action for manually selected items (no discovered boards)", () => { + const { items } = createBoardList( + { + ...detectedPort(undiscoveredSerialPort), + }, + emptyBoardsConfig(), + { + ...history(undiscoveredSerialPort, uno), + } + ); + const item = items[0]; + expect(item.defaultAction.type).to.be.equal('select-boards-config'); + expect(item.defaultAction.params).to.be.deep.equal({ + selectedPort: undiscoveredSerialPort, + selectedBoard: uno, + }); + }); + + it("'select' should be the default action for manually selected items (ambiguous boards)", () => { + const { items } = createBoardList( + { + ...detectedPort( + nanoEsp32SerialPort, + arduinoNanoEsp32, + esp32NanoEsp32 + ), + }, + emptyBoardsConfig(), + { + ...history(nanoEsp32SerialPort, mkr1000), + } + ); + const item = items[0]; + expect(item.defaultAction.type).to.be.equal('select-boards-config'); + expect(item.defaultAction.params).to.be.deep.equal({ + selectedBoard: mkr1000, + selectedPort: nanoEsp32SerialPort, + }); + }); + + it("'edit' should be the default action for ports with no boards", () => { + const { items } = createBoardList({ + ...detectedPort(undiscoveredSerialPort), + }); + const item = items[0]; + expect(item).to.be.not.undefined; + expect(item.defaultAction.type).to.be.equal('edit-boards-config'); + const params = <EditBoardsConfigActionParams>item.defaultAction.params; + const expectedParams: EditBoardsConfigActionParams = { + query: '', + portToSelect: undiscoveredSerialPort, + }; + expect(params).to.be.deep.equal(expectedParams); + }); + + it("'edit' should be the default action for ports with multiple boards (unique board name)", () => { + const { items } = createBoardList({ + ...detectedPort( + nanoEsp32SerialPort, + arduinoNanoEsp32, + esp32NanoEsp32 + ), + }); + const item = items[0]; + expect(item).to.be.not.undefined; + expect(item.defaultAction.type).to.be.equal('edit-boards-config'); + const params = <EditBoardsConfigActionParams>item.defaultAction.params; + const expectedParams: EditBoardsConfigActionParams = { + query: arduinoNanoEsp32.name, + portToSelect: nanoEsp32SerialPort, + searchSet: [arduinoNanoEsp32, esp32NanoEsp32], + }; + expect(params).to.be.deep.equal(expectedParams); + }); + + it("'edit' should be the default action for ports with multiple boards (no unique board name)", () => { + const { items } = createBoardList({ + ...detectedPort( + nanoEsp32DetectsMultipleEsp32BoardsSerialPort, + esp32S3DevModule, + esp32S3Box + ), + }); + const item = items[0]; + expect(item).to.be.not.undefined; + expect(item.defaultAction.type).to.be.equal('edit-boards-config'); + const params = <EditBoardsConfigActionParams>item.defaultAction.params; + const expectedParams: EditBoardsConfigActionParams = { + query: '', + portToSelect: nanoEsp32DetectsMultipleEsp32BoardsSerialPort, + searchSet: [esp32S3Box, esp32S3DevModule], + }; + expect(params).to.be.deep.equal(expectedParams); + }); + }); + + describe('otherActions', () => { + it('should provide no other actions for identified board', () => { + const { items } = createBoardList({ + ...detectedPort(mkr1000SerialPort, mkr1000), + }); + const item = items[0]; + expect(item.otherActions).to.be.empty; + }); + + it('should provide no other actions for identified board (when historical revision is self)', () => { + const { items } = createBoardList( + { + ...detectedPort(mkr1000SerialPort, mkr1000), + }, + emptyBoardsConfig(), + { + ...history(mkr1000SerialPort, mkr1000), + } + ); + const item = items[0]; + expect(item.otherActions).to.be.empty; + }); + + it('should provide no other actions for unknown boards', () => { + const { items } = createBoardList({ + ...detectedPort(undiscoveredSerialPort), + }); + const item = items[0]; + expect(item.otherActions).to.be.empty; + }); + + it('should provide no other actions for ambiguous boards', () => { + const { items } = createBoardList({ + ...detectedPort( + nanoEsp32SerialPort, + arduinoNanoEsp32, + esp32NanoEsp32 + ), + }); + const item = items[0]; + expect(item.otherActions).to.be.empty; + }); + + it("should provide 'edit' action for unidentified items with manually selected board", () => { + const { items } = createBoardList( + { + ...detectedPort(undiscoveredSerialPort), + }, + emptyBoardsConfig(), + { + ...history(undiscoveredSerialPort, uno), + } + ); + const item = items[0]; + const expectedParams: EditBoardsConfigActionParams = { + query: uno.name, + portToSelect: undiscoveredSerialPort, + }; + expect(item.otherActions).to.be.deep.equal({ + edit: { + params: expectedParams, + type: 'edit-boards-config', + }, + }); + }); + + it("should provide 'edit' action for ambiguous items with manually selected board (unique board name)", () => { + const { items } = createBoardList( + { + ...detectedPort( + nanoEsp32SerialPort, + esp32NanoEsp32, + arduinoNanoEsp32 + ), + }, + emptyBoardsConfig(), + { + ...history(nanoEsp32SerialPort, arduinoNanoEsp32), + } + ); + const item = items[0]; + const expectedParams: EditBoardsConfigActionParams = { + query: arduinoNanoEsp32.name, + portToSelect: nanoEsp32SerialPort, + searchSet: [arduinoNanoEsp32, esp32NanoEsp32], + }; + expect(item.otherActions).to.be.deep.equal({ + edit: { + params: expectedParams, + type: 'edit-boards-config', + }, + }); + }); + + it("should provide 'edit' action for ambiguous items with manually selected board (no unique board name)", () => { + const { items } = createBoardList( + { + ...detectedPort( + nanoEsp32DetectsMultipleEsp32BoardsSerialPort, + esp32S3Box, + esp32S3DevModule + ), + }, + emptyBoardsConfig(), + { + ...history(nanoEsp32DetectsMultipleEsp32BoardsSerialPort, uno), + } + ); + const item = items[0]; + const expectedParams: EditBoardsConfigActionParams = { + query: '', + portToSelect: nanoEsp32DetectsMultipleEsp32BoardsSerialPort, + searchSet: [esp32S3Box, esp32S3DevModule], + }; + expect(item.otherActions).to.be.deep.equal({ + edit: { + params: expectedParams, + type: 'edit-boards-config', + }, + }); + }); + + it("should provide 'edit' and 'revert' actions for identified items with a manually overridden board", () => { + const { items } = createBoardList( + { + ...detectedPort(mkr1000SerialPort, mkr1000), + }, + emptyBoardsConfig(), + { + ...history(mkr1000SerialPort, uno), + } + ); + const item = items[0]; + const expectedEditParams: EditBoardsConfigActionParams = { + query: uno.name, + portToSelect: mkr1000SerialPort, + }; + const expectedRevertParams: SelectBoardsConfigActionParams = { + selectedBoard: mkr1000, + selectedPort: item.port, + }; + expect(item.otherActions).to.be.deep.equal({ + edit: { + params: expectedEditParams, + type: 'edit-boards-config', + }, + revert: { + params: expectedRevertParams, + type: 'select-boards-config', + }, + }); + }); + }); + }); +}); diff --git a/arduino-ide-extension/src/test/common/boards-service.test.ts b/arduino-ide-extension/src/test/common/boards-service.test.ts index 85ffa3be9..f70bd2a7d 100644 --- a/arduino-ide-extension/src/test/common/boards-service.test.ts +++ b/arduino-ide-extension/src/test/common/boards-service.test.ts @@ -1,83 +1,237 @@ +import type { Mutable } from '@theia/core/lib/common/types'; import { expect } from 'chai'; -import { AttachedBoardsChangeEvent } from '../../common/protocol'; +import { + boardIdentifierEquals, + boardIdentifierComparator, + BoardInfo, + getBoardInfo, + noNativeSerialPort, + nonSerialPort, + Port, + selectPortForInfo, + unknownBoard, +} from '../../common/protocol'; +import { createBoardList } from '../../common/protocol/board-list'; +import { firstToUpperCase } from '../../common/utils'; describe('boards-service', () => { - describe('AttachedBoardsChangeEvent', () => { - it('should detect one attached port', () => { - const event = <AttachedBoardsChangeEvent & any>{ - oldState: { - boards: [ - { - name: 'Arduino MKR1000', - fqbn: 'arduino:samd:mkr1000', - port: '/dev/cu.usbmodem14601', - }, - { - name: 'Arduino Uno', - fqbn: 'arduino:avr:uno', - port: '/dev/cu.usbmodem14501', - }, - ], - ports: [ - { - protocol: 'serial', - address: '/dev/cu.usbmodem14501', - }, - { - protocol: 'serial', - address: '/dev/cu.usbmodem14601', - }, - { - protocol: 'serial', - address: '/dev/cu.Bluetooth-Incoming-Port', - }, - { protocol: 'serial', address: '/dev/cu.MALS' }, - { protocol: 'serial', address: '/dev/cu.SOC' }, - ], + describe('boardIdentifierEquals', () => { + it('should not be equal when the names equal but the FQBNs are different', () => { + const actual = boardIdentifierEquals( + { name: 'a', fqbn: 'a:b:c' }, + { name: 'a', fqbn: 'x:y:z' } + ); + expect(actual).to.be.false; + }); + + it('should not be equal when the names equal but the FQBNs are different (undefined)', () => { + const actual = boardIdentifierEquals( + { name: 'a', fqbn: 'a:b:c' }, + { name: 'a', fqbn: undefined } + ); + expect(actual).to.be.false; + }); + + it("should be equal when the names do not match but the FQBNs are the same (it's something IDE2 assumes to be handled by the platform or CLI)", () => { + const actual = boardIdentifierEquals( + { name: 'a', fqbn: 'a:b:c' }, + { name: 'b', fqbn: 'a:b:c' } + ); + expect(actual).to.be.true; + }); + + it('should be equal when the names equal and the FQBNs are missing', () => { + const actual = boardIdentifierEquals( + { name: 'a', fqbn: undefined }, + { name: 'a', fqbn: undefined } + ); + expect(actual).to.be.true; + }); + + it('should be equal when both the name and FQBN are the same, but one of the FQBN has board config options', () => { + const actual = boardIdentifierEquals( + { name: 'a', fqbn: 'a:b:c:menu_1=value' }, + { name: 'a', fqbn: 'a:b:c' } + ); + expect(actual).to.be.true; + }); + + it('should not be equal when both the name and FQBN are the same, but one of the FQBN has board config options (looseFqbn: false)', () => { + const actual = boardIdentifierEquals( + { name: 'a', fqbn: 'a:b:c:menu_1=value' }, + { name: 'a', fqbn: 'a:b:c' }, + { looseFqbn: false } + ); + expect(actual).to.be.false; + }); + }); + + describe('boardIdentifierComparator', () => { + it('should sort items before falsy', () => + expect( + boardIdentifierComparator({ name: 'a', fqbn: 'a:b:c' }, undefined) + ).to.be.equal(-1)); + + it("should sort 'arduino' boards before others", () => + expect( + boardIdentifierComparator( + { name: 'b', fqbn: 'arduino:b:c' }, + { name: 'a', fqbn: 'x:y:z' } + ) + ).to.be.equal(-1)); + + it("should sort 'arduino' boards before others (other is falsy)", () => + expect( + boardIdentifierComparator( + { name: 'b', fqbn: 'arduino:b:c' }, + { name: 'a', fqbn: undefined } + ) + ).to.be.equal(-1)); + + it("should sort boards by 'name' (with FQBNs)", () => + expect( + boardIdentifierComparator( + { name: 'b', fqbn: 'a:b:c' }, + { name: 'a', fqbn: 'x:y:z' } + ) + ).to.be.equal(1)); + + it("should sort boards by 'name' (no FQBNs)", () => + expect( + boardIdentifierComparator( + { name: 'b', fqbn: undefined }, + { name: 'a', fqbn: undefined } + ) + ).to.be.equal(1)); + + it("should sort boards by 'name' (one FQBN)", () => + expect( + boardIdentifierComparator( + { name: 'b', fqbn: 'a:b:c' }, + { name: 'a', fqbn: undefined } + ) + ).to.be.equal(1)); + + it("should sort boards by 'name' (both 'arduino' vendor)", () => + expect( + boardIdentifierComparator( + { name: 'b', fqbn: 'arduino:b:c' }, + { name: 'a', fqbn: 'arduino:y:z' } + ) + ).to.be.equal(1)); + }); + + describe('getBoardInfo', () => { + const vid = '0x0'; + const pid = '0x1'; + const serialNumber = '1730323'; + const name = 'The Board'; + const fqbn = 'alma:korte:szolo'; + const selectedBoard = { name, fqbn }; + const selectedPort = ( + properties: Record<string, string> = {}, + protocol = 'serial' + ): Mutable<Port> => ({ + address: 'address', + addressLabel: 'addressLabel', + protocol, + protocolLabel: firstToUpperCase(protocol), + properties, + }); + + it('should handle when no port is selected', async () => { + const info = await getBoardInfo(createBoardList({})); + expect(info).to.be.equal(selectPortForInfo); + }); + + it("should handle when port protocol is not 'serial'", async () => { + await Promise.allSettled( + ['network', 'teensy'].map(async (protocol) => { + const selectedPort: Port = { + address: 'address', + addressLabel: 'addressLabel', + protocolLabel: firstToUpperCase(protocol), + protocol, + }; + const boardList = createBoardList( + { [Port.keyOf(selectedPort)]: { port: selectedPort } }, + { selectedPort, selectedBoard: undefined } + ); + const info = await getBoardInfo(boardList); + expect(info).to.be.equal(nonSerialPort); + }) + ); + }); + + it("should not detect a port as non-native serial, if protocol is 'serial' but VID or PID is missing", async () => { + const insufficientProperties: Record<string, string>[] = [ + {}, + { vid }, + { pid }, + { VID: vid, pid: pid }, // case sensitive + ]; + for (const properties of insufficientProperties) { + const port = selectedPort(properties); + const boardList = createBoardList( + { + [Port.keyOf(port)]: { port }, + }, + { selectedPort: port, selectedBoard: undefined } + ); + const info = await getBoardInfo(boardList); + expect(info).to.be.equal(noNativeSerialPort); + } + }); + + it("should detect a port as non-native serial, if protocol is 'serial' and VID/PID are available", async () => { + const port = selectedPort({ vid, pid }); + const boardList = createBoardList( + { + [Port.keyOf(port)]: { port }, + }, + { selectedPort: port, selectedBoard: undefined } + ); + const info = await getBoardInfo(boardList); + expect(typeof info).to.be.equal('object'); + const boardInfo = <BoardInfo>info; + expect(boardInfo.VID).to.be.equal(vid); + expect(boardInfo.PID).to.be.equal(pid); + expect(boardInfo.SN).to.be.equal('(null)'); + expect(boardInfo.BN).to.be.equal(unknownBoard); + }); + + it("should show the 'SN' even if no matching board was detected for the port", async () => { + const port = selectedPort({ vid, pid, serialNumber }); + const boardList = createBoardList( + { + [Port.keyOf(port)]: { port }, }, - newState: { - boards: [ - { - name: 'Arduino MKR1000', - fqbn: 'arduino:samd:mkr1000', - port: '/dev/cu.usbmodem1460', - }, - { - name: 'Arduino Uno', - fqbn: 'arduino:avr:uno', - port: '/dev/cu.usbmodem14501', - }, - ], - ports: [ - { - protocol: 'serial', - address: '/dev/cu.SLAB_USBtoUART', - }, - { - protocol: 'serial', - address: '/dev/cu.usbmodem14501', - }, - { - protocol: 'serial', - address: '/dev/cu.usbmodem14601', - }, - { - protocol: 'serial', - address: '/dev/cu.Bluetooth-Incoming-Port', - }, - { protocol: 'serial', address: '/dev/cu.MALS' }, - { protocol: 'serial', address: '/dev/cu.SOC' }, - ], + { selectedPort: port, selectedBoard: undefined } + ); + const info = await getBoardInfo(boardList); + expect(typeof info).to.be.equal('object'); + const boardInfo = <BoardInfo>info; + expect(boardInfo.VID).to.be.equal(vid); + expect(boardInfo.PID).to.be.equal(pid); + expect(boardInfo.SN).to.be.equal(serialNumber); + expect(boardInfo.BN).to.be.equal(unknownBoard); + }); + + it("should use the name of the matching board as 'BN' if available", async () => { + const port = selectedPort({ vid, pid }); + const boardList = createBoardList( + { + [Port.keyOf(port)]: { port, boards: [selectedBoard] }, }, - }; - const diff = AttachedBoardsChangeEvent.diff(event); - expect(diff.attached.boards).to.be.empty; // tslint:disable-line:no-unused-expression - expect(diff.detached.boards).to.be.empty; // tslint:disable-line:no-unused-expression - expect(diff.detached.ports).to.be.empty; // tslint:disable-line:no-unused-expression - expect(diff.attached.ports.length).to.be.equal(1); - expect(diff.attached.ports[0].address).to.be.equal( - '/dev/cu.SLAB_USBtoUART' + { selectedPort: port, selectedBoard: undefined } ); + const info = await getBoardInfo(boardList); + expect(typeof info).to.be.equal('object'); + const boardInfo = <BoardInfo>info; + expect(boardInfo.VID).to.be.equal(vid); + expect(boardInfo.PID).to.be.equal(pid); + expect(boardInfo.SN).to.be.equal('(null)'); + expect(boardInfo.BN).to.be.equal(selectedBoard.name); }); }); }); diff --git a/arduino-ide-extension/src/test/common/common-test-bindings.ts b/arduino-ide-extension/src/test/common/common-test-bindings.ts new file mode 100644 index 000000000..f3e3f4373 --- /dev/null +++ b/arduino-ide-extension/src/test/common/common-test-bindings.ts @@ -0,0 +1,108 @@ +import { + CommandContribution, + CommandRegistry, + CommandService, +} from '@theia/core/lib/common/command'; +import { bindContributionProvider } from '@theia/core/lib/common/contribution-provider'; +import { ILogger, Loggable } from '@theia/core/lib/common/logger'; +import { LogLevel } from '@theia/core/lib/common/logger-protocol'; +import { MockLogger } from '@theia/core/lib/common/test/mock-logger'; +import { injectable, interfaces } from '@theia/core/shared/inversify'; + +export interface Bind { + ( + bind: interfaces.Bind, + unbind: interfaces.Unbind, + isBound: interfaces.IsBound, + rebind: interfaces.Rebind + ): void; +} + +export const bindCommon: Bind = function ( + ...args: Parameters<Bind> +): ReturnType<Bind> { + const [bind] = args; + bind(ConsoleLogger).toSelf().inSingletonScope(); + bind(ILogger).toService(ConsoleLogger); + bind(CommandRegistry).toSelf().inSingletonScope(); + bind(CommandService).toService(CommandRegistry); + bindContributionProvider(bind, CommandContribution); +}; + +@injectable() +export class ConsoleLogger extends MockLogger { + override log( + logLevel: number, + arg2: string | Loggable | Error, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + ...params: any[] + ): Promise<void> { + if (arg2 instanceof Error) { + return this.error(String(arg2), params); + } + switch (logLevel) { + case LogLevel.INFO: + return this.info(arg2, params); + case LogLevel.WARN: + return this.warn(arg2, params); + case LogLevel.TRACE: + return this.trace(arg2, params); + case LogLevel.ERROR: + return this.error(arg2, params); + case LogLevel.FATAL: + return this.fatal(arg2, params); + default: + return this.info(arg2, params); + } + } + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + override async info(arg: string | Loggable, ...params: any[]): Promise<void> { + if (params.length) { + console.info(arg, ...params); + } else { + console.info(arg); + } + } + + override async trace( + arg: string | Loggable, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + ...params: any[] + ): Promise<void> { + if (params.length) { + console.trace(arg, ...params); + } else { + console.trace(arg); + } + } + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + override async warn(arg: string | Loggable, ...params: any[]): Promise<void> { + if (params.length) { + console.warn(arg, ...params); + } else { + console.warn(arg); + } + } + + override async error( + arg: string | Loggable, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + ...params: any[] + ): Promise<void> { + if (params.length) { + console.error(arg, ...params); + } else { + console.error(arg); + } + } + + override async fatal( + arg: string | Loggable, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + ...params: any[] + ): Promise<void> { + return this.error(arg, params); + } +} diff --git a/arduino-ide-extension/src/test/common/fixtures.ts b/arduino-ide-extension/src/test/common/fixtures.ts new file mode 100644 index 000000000..294984524 --- /dev/null +++ b/arduino-ide-extension/src/test/common/fixtures.ts @@ -0,0 +1,176 @@ +import { + BoardIdentifier, + DetectedPort, + DetectedPorts, + Port, +} from '../../common/protocol/boards-service'; + +export const mkr1000: BoardIdentifier = { + name: 'Arduino MKR1000', + fqbn: 'arduino:samd:mkr1000', +}; +export const uno: BoardIdentifier = { + name: 'Arduino Uno', + fqbn: 'arduino:avr:uno', +}; +export const arduinoNanoEsp32: BoardIdentifier = { + fqbn: 'arduino:esp32:nano_nora', + name: 'Arduino Nano ESP32', +}; +export const esp32NanoEsp32: BoardIdentifier = { + fqbn: 'esp32:esp32:nano_nora', + name: 'Arduino Nano ESP32', +}; +export const esp32S3DevModule: BoardIdentifier = { + name: 'ESP32S3 Dev Module', + fqbn: 'esp32:esp32:esp32s3', +}; +export const esp32S3Box: BoardIdentifier = { + name: 'ESP32-S3-Box', + fqbn: 'esp32:esp32:esp32s3box', +}; + +export const bluetoothSerialPort: Port = { + address: '/dev/cu.Bluetooth-Incoming-Port', + addressLabel: '/dev/cu.Bluetooth-Incoming-Port', + protocol: 'serial', + protocolLabel: 'Serial Port', + properties: {}, + hardwareId: '', +}; +export const builtinSerialPort: Port = { + address: '/dev/cu.BLTH', + addressLabel: '/dev/cu.BLTH', + protocol: 'serial', + protocolLabel: 'Serial Port', + properties: {}, + hardwareId: '', +}; +export const undiscoveredSerialPort: Port = { + address: '/dev/cu.usbserial-0001', + addressLabel: '/dev/cu.usbserial-0001', + protocol: 'serial', + protocolLabel: 'Serial Port (USB)', + properties: { + pid: '0xEA60', + serialNumber: '0001', + vid: '0x10C4', + }, + hardwareId: '0001', +}; +export const mkr1000NetworkPort: Port = { + address: '192.168.0.104', + addressLabel: 'Arduino at 192.168.0.104', + protocol: 'network', + protocolLabel: 'Network Port', + properties: { + '.': 'mkr1000', + auth_upload: 'yes', + board: 'mkr1000', + hostname: 'Arduino.local.', + port: '65280', + ssh_upload: 'no', + tcp_check: 'no', + }, + hardwareId: '', +}; +export const undiscoveredUsbToUARTSerialPort: Port = { + address: '/dev/cu.SLAB_USBtoUART', + addressLabel: '/dev/cu.SLAB_USBtoUART', + protocol: 'serial', + protocolLabel: 'Serial Port (USB)', + properties: { + pid: '0xEA60', + serialNumber: '0001', + vid: '0x10C4', + }, + hardwareId: '0001', +}; +export const mkr1000SerialPort: Port = { + address: '/dev/cu.usbmodem14301', + addressLabel: '/dev/cu.usbmodem14301', + protocol: 'serial', + protocolLabel: 'Serial Port (USB)', + properties: { + pid: '0x804E', + serialNumber: '94A3397C5150435437202020FF150838', + vid: '0x2341', + }, + hardwareId: '94A3397C5150435437202020FF150838', +}; +export const unoSerialPort: Port = { + address: '/dev/cu.usbmodem14201', + addressLabel: '/dev/cu.usbmodem14201', + protocol: 'serial', + protocolLabel: 'Serial Port (USB)', + properties: { + pid: '0x0043', + serialNumber: '75830303934351618212', + vid: '0x2341', + }, + hardwareId: '75830303934351618212', +}; +export const nanoEsp32SerialPort: Port = { + address: '/dev/cu.usbmodem3485187BD9882', + addressLabel: '/dev/cu.usbmodem3485187BD9882', + protocol: 'serial', + protocolLabel: 'Serial Port (USB)', + properties: { + pid: '0x0070', + serialNumber: '3485187BD988', + vid: '0x2341', + }, + hardwareId: '3485187BD988', +}; +export const nanoEsp32DetectsMultipleEsp32BoardsSerialPort: Port = { + address: 'COM41', + addressLabel: 'COM41', + protocol: 'serial', + protocolLabel: 'Serial Port (USB)', + properties: { + pid: '0x1001', + serialNumber: '', + vid: '0x303A', + }, +}; + +export function createPort(address: string, protocol = 'serial'): Port { + return { + address, + addressLabel: `Address label: ${address}`, + protocol, + protocolLabel: `Protocol label: ${protocol}`, + }; +} + +export function detectedPort( + port: Port, + ...boards: BoardIdentifier[] +): { [portKey: string]: DetectedPort } { + return { [Port.keyOf(port)]: boards.length ? { port, boards } : { port } }; +} + +export function history( + port: Port, + board: BoardIdentifier +): { [portKey: string]: BoardIdentifier } { + return { [Port.keyOf(port)]: board }; +} + +export const detectedPorts: DetectedPorts = { + ...detectedPort(builtinSerialPort), + ...detectedPort(bluetoothSerialPort), + ...detectedPort(unoSerialPort, uno), + ...detectedPort(mkr1000SerialPort, mkr1000), + ...detectedPort(mkr1000NetworkPort, mkr1000), + ...detectedPort(undiscoveredSerialPort), + ...detectedPort(undiscoveredUsbToUARTSerialPort), + // multiple discovered on the same port with different board names + ...detectedPort( + nanoEsp32DetectsMultipleEsp32BoardsSerialPort, + esp32S3DevModule, + esp32S3Box + ), + // multiple discovered on the same port with the same board name + ...detectedPort(nanoEsp32SerialPort, arduinoNanoEsp32, esp32NanoEsp32), +}; diff --git a/arduino-ide-extension/src/test/common/installable.test.ts b/arduino-ide-extension/src/test/common/installable.test.ts index 4047f37f1..ed89e799a 100644 --- a/arduino-ide-extension/src/test/common/installable.test.ts +++ b/arduino-ide-extension/src/test/common/installable.test.ts @@ -2,6 +2,16 @@ import { expect } from 'chai'; import { Installable } from '../../common/protocol/installable'; describe('installable', () => { + const latest = '2.0.0'; + // shuffled versions + const available: Installable.Version[] = [ + '1.4.1', + '1.0.0', + latest, + '2.0.0-beta.1', + '1.5', + ]; + describe('compare', () => { const testMe = Installable.Version.COMPARATOR; @@ -39,4 +49,93 @@ describe('installable', () => { }); }); }); + + describe('latest', () => { + it('should get the latest version from a shuffled array', () => { + const copy = available.slice(); + expect(Installable.latest(copy)).to.be.equal(latest); + expect(available).to.be.deep.equal(copy); + }); + }); + + describe('action', () => { + const installLatest: Installable.Action = 'installLatest'; + const installSelected: Installable.Action = 'installSelected'; + const update: Installable.Action = 'update'; + const remove: Installable.Action = 'remove'; + const unknown: Installable.Action = 'unknown'; + const notAvailable = '0.0.0'; + + it("should result 'unknown' if available is empty", () => { + expect(Installable.action({ available: [] })).to.be.equal(unknown); + }); + it("should result 'unknown' if installed is not in available", () => { + expect( + Installable.action({ available, installed: notAvailable }) + ).to.be.equal(unknown); + }); + + it("should result 'installLatest' if not installed and not selected", () => { + expect(Installable.action({ available })).to.be.equal(installLatest); + }); + it("should result 'installLatest' if not installed and latest is selected", () => { + expect(Installable.action({ available, selected: latest })).to.be.equal( + installLatest + ); + }); + + it("should result 'installSelected' if not installed and not latest is selected", () => { + available + .filter((version) => version !== latest) + .forEach((selected) => + expect( + Installable.action({ + available, + selected, + }) + ).to.be.equal(installSelected) + ); + }); + it("should result 'installSelected' if installed and the selected is neither the latest nor the installed", () => { + available.forEach((installed) => + available + .filter((selected) => selected !== latest && selected !== installed) + .forEach((selected) => + expect( + Installable.action({ + installed, + available, + selected, + }) + ).to.be.equal(installSelected) + ) + ); + }); + + it("should result 'update' if the installed version is not the latest and the latest is selected", () => { + available + .filter((installed) => installed !== latest) + .forEach((installed) => + expect( + Installable.action({ + installed, + available, + selected: latest, + }) + ).to.be.equal(update) + ); + }); + + it("should result 'remove' if the selected version equals the installed version", () => { + available.forEach((version) => + expect( + Installable.action({ + installed: version, + available, + selected: version, + }) + ).to.be.equal(remove) + ); + }); + }); }); diff --git a/arduino-ide-extension/src/test/common/searchable.test.ts b/arduino-ide-extension/src/test/common/searchable.test.ts new file mode 100644 index 000000000..e302d574d --- /dev/null +++ b/arduino-ide-extension/src/test/common/searchable.test.ts @@ -0,0 +1,136 @@ +import URI from '@theia/core/lib/common/uri'; +import { expect } from 'chai'; +import { BoardSearch, LibrarySearch, Searchable } from '../../common/protocol'; + +interface Expectation<S extends Searchable.Options> { + readonly uri: string; + readonly expected: S | undefined | string; +} + +describe('searchable', () => { + describe('parse', () => { + describe(BoardSearch.UriParser.authority, () => { + ( + [ + { + uri: 'http://boardsmanager#SAMD', + expected: { query: 'SAMD', type: 'All' }, + }, + { + uri: 'http://boardsmanager/Arduino%40Heart#littleBits', + expected: { query: 'littleBits', type: 'Arduino@Heart' }, + }, + { + uri: 'http://boardsmanager/too/many/segments#invalidPath', + expected: undefined, + }, + { + uri: 'http://boardsmanager/random#invalidPath', + expected: undefined, + }, + { + uri: 'https://boardsmanager/#invalidScheme', + expected: `Invalid 'scheme'. Expected 'http'. URI was: https://boardsmanager/#invalidScheme.`, + }, + { + uri: 'http://librarymanager/#invalidAuthority', + expected: `Invalid 'authority'. Expected: 'boardsmanager'. URI was: http://librarymanager/#invalidAuthority.`, + }, + ] as Expectation<BoardSearch>[] + ).map((expectation) => toIt(expectation, BoardSearch.UriParser.parse)); + }); + describe(LibrarySearch.UriParser.authority, () => { + ( + [ + { + uri: 'http://librarymanager#WiFiNINA', + expected: { query: 'WiFiNINA', type: 'All', topic: 'All' }, + }, + { + uri: 'http://librarymanager/All/Device%20Control#Servo', + expected: { + query: 'Servo', + type: 'All', + topic: 'Device Control', + }, + }, + { + uri: 'http://librarymanager/All/Display#SparkFun', + expected: { + query: 'SparkFun', + type: 'All', + topic: 'Display', + }, + }, + { + uri: 'http://librarymanager/Updatable/Display#SparkFun', + expected: { + query: 'SparkFun', + type: 'Updatable', + topic: 'Display', + }, + }, + { + uri: 'http://librarymanager/All/Signal%20Input%2FOutput#debouncer', + expected: { + query: 'debouncer', + type: 'All', + topic: 'Signal Input/Output', + }, + }, + { + uri: 'http://librarymanager/too/many/segments#invalidPath', + expected: undefined, + }, + { + uri: 'http://librarymanager/absent/invalid#invalidPath', + expected: undefined, + }, + { + uri: 'https://librarymanager/#invalidScheme', + expected: `Invalid 'scheme'. Expected 'http'. URI was: https://librarymanager/#invalidScheme.`, + }, + { + uri: 'http://boardsmanager/#invalidAuthority', + expected: `Invalid 'authority'. Expected: 'librarymanager'. URI was: http://boardsmanager/#invalidAuthority.`, + }, + ] as Expectation<LibrarySearch>[] + ).map((expectation) => toIt(expectation, LibrarySearch.UriParser.parse)); + }); + }); +}); + +function toIt<S extends Searchable.Options>( + { uri, expected }: Expectation<S>, + run: (uri: URI) => Searchable.Options | undefined +): Mocha.Test { + return it(`should ${ + typeof expected === 'string' + ? `fail to parse '${uri}'` + : !expected + ? `not parse '${uri}'` + : `parse '${uri}' to ${JSON.stringify(expected)}` + }`, () => { + if (typeof expected === 'string') { + try { + run(new URI(uri)); + expect.fail( + `Expected an error with message '${expected}' when parsing URI: ${uri}.` + ); + } catch (err) { + expect(err).to.be.instanceOf(Error); + expect(err.message).to.be.equal(expected); + } + } else { + const actual = run(new URI(uri)); + if (!expected) { + expect(actual).to.be.undefined; + } else { + expect(actual).to.be.deep.equal( + expected, + `Was: ${JSON.stringify(actual)}` + ); + } + } + }); +} diff --git a/arduino-ide-extension/src/test/common/sketches-service.test.ts b/arduino-ide-extension/src/test/common/sketches-service.test.ts new file mode 100644 index 000000000..ae9f2481c --- /dev/null +++ b/arduino-ide-extension/src/test/common/sketches-service.test.ts @@ -0,0 +1,205 @@ +import { expect } from 'chai'; +import { Sketch } from '../../common/protocol'; + +const windowsReservedFileNames = [ + 'CON', + 'PRN', + 'AUX', + 'NUL', + 'COM1', + 'COM2', + 'COM3', + 'COM4', + 'COM5', + 'COM6', + 'COM7', + 'COM8', + 'COM9', + 'LPT1', + 'LPT2', + 'LPT3', + 'LPT4', + 'LPT5', + 'LPT6', + 'LPT7', + 'LPT8', + 'LPT9', +]; +const windowsInvalidFilenames = ['trailingPeriod.', 'trailingSpace ']; +const invalidFilenames = [ + ...windowsInvalidFilenames, + ...windowsReservedFileNames, +].map((name) => <[string, boolean]>[name, false]); + +describe('sketch', () => { + describe('validateSketchFolderName', () => { + ( + [ + ...invalidFilenames, + ['com1', false], // Do not assume case sensitivity. (https://learn.microsoft.com/en-us/windows/win32/fileio/naming-a-file#naming-conventions) + ['sketch', true], + ['can-contain-slash-and-dot.ino', true], + ['regex++', false], + ['trailing.dots...', false], + ['no.trailing.dots.._', true], + ['No Spaces', false], + ['_validToStartWithUnderscore', true], + ['Invalid+Char.ino', false], + ['', false], + ['/', false], + ['//trash/', false], + [ + '63Length_012345678901234567890123456789012345678901234567890123', + true, + ], + [ + 'TooLong__0123456789012345678901234567890123456789012345678901234', + false, + ], + ] as [string, boolean][] + ).map(([input, expected]) => { + it(`'${input}' should ${ + !expected ? 'not ' : '' + }be a valid sketch folder name`, () => { + const actual = Sketch.validateSketchFolderName(input); + if (expected) { + expect(actual).to.be.undefined; + } else { + expect(actual).to.be.not.undefined; + expect(actual?.length).to.be.greaterThan(0); + } + }); + }); + }); + + describe('validateCloudSketchFolderName', () => { + ( + [ + ...invalidFilenames, + ['sketch', true], + ['can-contain-dashes', true], + ['can.contain.dots', true], + ['-cannot-start-with-dash', false], + ['.cannot.start.with.dash', false], + ['_can_start_with_underscore', true], + ['No Spaces', false], + ['Invalid+Char.ino', false], + ['', false], + ['/', false], + ['//trash/', false], + ['36Length_012345678901234567890123456', true], + ['TooLong__0123456789012345678901234567', false], + ] as [string, boolean][] + ).map(([input, expected]) => { + it(`'${input}' should ${ + !expected ? 'not ' : '' + }be a valid cloud sketch folder name`, () => { + const actual = Sketch.validateCloudSketchFolderName(input); + if (expected) { + expect(actual).to.be.undefined; + } else { + expect(actual).to.be.not.undefined; + expect(actual?.length).to.be.greaterThan(0); + } + }); + }); + }); + + describe('toValidSketchFolderName', () => { + [ + ['', Sketch.defaultSketchFolderName], + [' ', Sketch.defaultFallbackChar], + [' ', Sketch.defaultFallbackChar + Sketch.defaultFallbackChar], + [ + '0123456789012345678901234567890123456789012345678901234567890123', + '012345678901234567890123456789012345678901234567890123456789012', + ], + ['foo bar', 'foo_bar'], + ['-foobar', '_foobar'], + ['vAlid', 'vAlid'], + ['COM1', Sketch.defaultSketchFolderName], + ['COM1.', 'COM1_'], + ['period.', 'period_'], + ].map(([input, expected]) => + toMapIt(input, expected, Sketch.toValidSketchFolderName) + ); + }); + + describe('toValidSketchFolderName with timestamp suffix', () => { + const epoch = new Date(0); + const epochSuffix = Sketch.timestampSuffix(epoch); + [ + ['', Sketch.defaultSketchFolderName + epochSuffix], + [' ', Sketch.defaultFallbackChar + epochSuffix], + [ + ' ', + Sketch.defaultFallbackChar + Sketch.defaultFallbackChar + epochSuffix, + ], + [ + '0123456789012345678901234567890123456789012345678901234567890123', + '0123456789012345678901234567890123456789012' + epochSuffix, + ], + ['foo bar', 'foo_bar' + epochSuffix], + ['.foobar', '_foobar' + epochSuffix], + ['-fooBar', '_fooBar' + epochSuffix], + ['foobar.', 'foobar_' + epochSuffix], + ['fooBar-', 'fooBar_' + epochSuffix], + ['fooBar+', 'fooBar_' + epochSuffix], + ['vAlid', 'vAlid' + epochSuffix], + ['COM1', 'COM1' + epochSuffix], + ['COM1.', 'COM1_' + epochSuffix], + ['period.', 'period_' + epochSuffix], + ].map(([input, expected]) => + toMapIt(input, expected, (input: string) => + Sketch.toValidSketchFolderName(input, epoch) + ) + ); + }); + + describe('toValidCloudSketchFolderName', () => { + [ + ['sketch', 'sketch'], + ['only_underscore-is+ok.ino', 'only_underscore_is_ok_ino'], + ['regex++', 'regex__'], + ['dots...', 'dots___'], + ['.dots...', '_dots___'], + ['-dashes---', '_dashes___'], + ['No Spaces', 'No_Spaces'], + ['Invalid+Char.ino', 'Invalid_Char_ino'], + ['', 'sketch'], + ['/', '_'], + [ + '/-1////////////////////+//////////////-/', + '__1_________________________________', + ], + ['//trash/', '__trash_'], + [ + '63Length_012345678901234567890123456789012345678901234567890123', + '63Length_012345678901234567890123456', + ], + ].map(([input, expected]) => + toMapIt(input, expected, Sketch.toValidCloudSketchFolderName, true) + ); + }); +}); + +function toMapIt( + input: string, + expected: string, + testMe: (input: string) => string, + cloud = false +): Mocha.Test { + return it(`should map the '${input}' ${ + cloud ? 'cloud ' : '' + }sketch folder name to '${expected}'`, () => { + const actual = testMe(input); + expect(actual).to.be.equal(expected); + const errorMessage = Sketch.validateSketchFolderName(actual); + try { + expect(errorMessage).to.be.undefined; + } catch (err) { + console.log('HELLO', actual, errorMessage); + throw err; + } + }); +} diff --git a/arduino-ide-extension/src/test/node/__test_sketchbook__/a_sketch/a_sketch.ino b/arduino-ide-extension/src/test/node/__test_sketchbook__/a_sketch/a_sketch.ino new file mode 100644 index 000000000..e69de29bb diff --git a/arduino-ide-extension/src/test/node/__test_sketchbook__/bar++ 2/bar++ 2.ino b/arduino-ide-extension/src/test/node/__test_sketchbook__/bar++ 2/bar++ 2.ino new file mode 100644 index 000000000..e69de29bb diff --git a/arduino-ide-extension/src/test/node/__test_sketchbook__/bar++/bar++.ino b/arduino-ide-extension/src/test/node/__test_sketchbook__/bar++/bar++.ino new file mode 100644 index 000000000..e69de29bb diff --git a/arduino-ide-extension/src/test/node/__test_sketchbook__/bar++/foo++/foo++.ino b/arduino-ide-extension/src/test/node/__test_sketchbook__/bar++/foo++/foo++.ino new file mode 100644 index 000000000..e69de29bb diff --git a/arduino-ide-extension/src/test/node/__test_sketchbook__/defaultIno.ino b/arduino-ide-extension/src/test/node/__test_sketchbook__/defaultIno.ino new file mode 100644 index 000000000..e69de29bb diff --git a/arduino-ide-extension/src/test/node/__test_sketchbook__/empty/.gitkeep b/arduino-ide-extension/src/test/node/__test_sketchbook__/empty/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/arduino-ide-extension/src/test/node/__test_sketchbook__/libraries/my_library/examples/Ethernet/Example_1/Example_1.ino b/arduino-ide-extension/src/test/node/__test_sketchbook__/libraries/my_library/examples/Ethernet/Example_1/Example_1.ino new file mode 100644 index 000000000..e69de29bb diff --git a/arduino-ide-extension/src/test/node/__test_sketchbook__/libraries/my_library/examples/WiFi/Example_2/Example_2.ino b/arduino-ide-extension/src/test/node/__test_sketchbook__/libraries/my_library/examples/WiFi/Example_2/Example_2.ino new file mode 100644 index 000000000..e69de29bb diff --git a/arduino-ide-extension/src/test/node/__test_sketchbook__/mismatchingName/MismatchingName.ino b/arduino-ide-extension/src/test/node/__test_sketchbook__/mismatchingName/MismatchingName.ino new file mode 100644 index 000000000..e69de29bb diff --git a/arduino-ide-extension/src/test/node/__test_sketchbook__/nested_4/nested_3/nested_2/nested_1/nested_1.ino b/arduino-ide-extension/src/test/node/__test_sketchbook__/nested_4/nested_3/nested_2/nested_1/nested_1.ino new file mode 100644 index 000000000..e69de29bb diff --git a/arduino-ide-extension/src/test/node/__test_sketchbook__/nested_4/nested_3/nested_2/nested_2.ino b/arduino-ide-extension/src/test/node/__test_sketchbook__/nested_4/nested_3/nested_2/nested_2.ino new file mode 100644 index 000000000..e69de29bb diff --git a/arduino-ide-extension/src/test/node/__test_sketchbook__/project1/CodeA/version1A/version1A.ino b/arduino-ide-extension/src/test/node/__test_sketchbook__/project1/CodeA/version1A/version1A.ino new file mode 100644 index 000000000..e69de29bb diff --git a/arduino-ide-extension/src/test/node/__test_sketchbook__/project1/CodeA/version2A/version2A.ino b/arduino-ide-extension/src/test/node/__test_sketchbook__/project1/CodeA/version2A/version2A.ino new file mode 100644 index 000000000..e69de29bb diff --git a/arduino-ide-extension/src/test/node/__test_sketchbook__/project1/CodeB/version1B/version1B.ino b/arduino-ide-extension/src/test/node/__test_sketchbook__/project1/CodeB/version1B/version1B.ino new file mode 100644 index 000000000..e69de29bb diff --git a/arduino-ide-extension/src/test/node/__test_sketchbook__/project1/CodeB/version2B/version2B.pde b/arduino-ide-extension/src/test/node/__test_sketchbook__/project1/CodeB/version2B/version2B.pde new file mode 100644 index 000000000..e69de29bb diff --git a/arduino-ide-extension/src/test/node/arduino-daemon-impl.test.ts b/arduino-ide-extension/src/test/node/arduino-daemon-impl.test.ts index af9f66eea..ed5149102 100644 --- a/arduino-ide-extension/src/test/node/arduino-daemon-impl.test.ts +++ b/arduino-ide-extension/src/test/node/arduino-daemon-impl.test.ts @@ -1,9 +1,8 @@ -import * as fs from 'fs'; -// import * as net from 'net'; -import * as path from 'path'; -import * as temp from 'temp'; +import fs from 'node:fs'; +import path from 'node:path'; +import temp from 'temp'; import { expect } from 'chai'; -import { ChildProcess } from 'child_process'; +import { ChildProcess } from 'node:child_process'; import { safeLoad, safeDump } from 'js-yaml'; import { ArduinoDaemonImpl } from '../../node/arduino-daemon-impl'; import { spawnCommand } from '../../node/exec-util'; @@ -20,7 +19,10 @@ class SilentArduinoDaemonImpl extends ArduinoDaemonImpl { // NOOP } - override async spawnDaemonProcess(): Promise<{ daemon: ChildProcess; port: string }> { + override async spawnDaemonProcess(): Promise<{ + daemon: ChildProcess; + port: number; + }> { return super.spawnDaemonProcess(); } @@ -41,19 +43,13 @@ class SilentArduinoDaemonImpl extends ArduinoDaemonImpl { } private async initCliConfig(): Promise<string> { - const cliPath = await this.getExecPath(); + const cliPath = this.getExecPath(); const destDir = track.mkdirSync(); - await spawnCommand(`"${cliPath}"`, [ - 'config', - 'init', - '--dest-dir', - destDir, - ]); + await spawnCommand(cliPath, ['config', 'init', '--dest-dir', destDir]); const content = fs.readFileSync(path.join(destDir, CLI_CONFIG), { encoding: 'utf8', }); - const cliConfig = safeLoad(content) as any; - // cliConfig.daemon.port = String(this.port); + const cliConfig = safeLoad(content); const modifiedContent = safeDump(cliConfig); fs.writeFileSync(path.join(destDir, CLI_CONFIG), modifiedContent, { encoding: 'utf8', diff --git a/arduino-ide-extension/src/test/node/boards-service-impl.slow-test.ts b/arduino-ide-extension/src/test/node/boards-service-impl.slow-test.ts new file mode 100644 index 000000000..f5b29a5bf --- /dev/null +++ b/arduino-ide-extension/src/test/node/boards-service-impl.slow-test.ts @@ -0,0 +1,174 @@ +import { + Disposable, + DisposableCollection, +} from '@theia/core/lib/common/disposable'; +import { Container } from '@theia/core/shared/inversify'; +import { expect } from 'chai'; +import { promises as fs } from 'node:fs'; +import path from 'node:path'; +import temp from 'temp'; +import { + BoardSearch, + BoardsPackage, + BoardsService, + Installable, +} from '../../common/protocol'; +import { createBaseContainer, startDaemon } from './node-test-bindings'; + +describe('boards-service-impl', () => { + let boardService: BoardsService; + let toDispose: DisposableCollection; + + before(async function () { + this.timeout(20_000); + const tracked = temp.track(); + toDispose = new DisposableCollection( + Disposable.create(() => tracked.cleanupSync()) + ); + const testDirPath = tracked.mkdirSync(); + const container = await createContainer(testDirPath); + await start(container, toDispose); + boardService = container.get<BoardsService>(BoardsService); + }); + + after(() => toDispose.dispose()); + + describe('search', () => { + it('should run search', async function () { + const result = await boardService.search({}); + expect(result).is.not.empty; + }); + + it('should order the available platform release versions in descending order', async function () { + const result = await boardService.search({}); + result.forEach((platform) => + platform.availableVersions.forEach( + (currentVersion, index, versions) => { + if (index < versions.length - 2) { + const nextArrayElement = versions[index + 1]; + const actual = Installable.Version.COMPARATOR( + currentVersion, + nextArrayElement + ); + expect(actual).to.be.greaterThan( + 0, + `Expected '${currentVersion}' to be gt '${nextArrayElement}'. All versions: ${JSON.stringify( + versions + )}` + ); + } + } + ) + ); + }); + + it("should boost a result when 'types' includes 'arduino', and lower the score if deprecated", async () => { + const result = await boardService.search({}); + const arduinoIndexes: number[] = []; + const otherIndexes: number[] = []; + const deprecatedArduinoIndexes: number[] = []; + const deprecatedOtherIndexes: number[] = []; + const arduino: BoardSearch.Type = 'Arduino'; + result.forEach((platform, index) => { + if (platform.types.includes(arduino)) { + if (platform.deprecated) { + deprecatedArduinoIndexes.push(index); + } else { + arduinoIndexes.push(index); + } + } else { + if (platform.deprecated) { + deprecatedOtherIndexes.push(index); + } else { + otherIndexes.push(index); + } + } + }); + arduinoIndexes.forEach( + (index) => + expect(otherIndexes.every((otherIndex) => otherIndex > index)).to.be + .true + ); + otherIndexes.forEach( + (index) => + expect( + deprecatedArduinoIndexes.every( + (deprecatedArduinoIndex) => deprecatedArduinoIndex > index + ) + ).to.be.true + ); + deprecatedArduinoIndexes.forEach( + (index) => + expect( + deprecatedOtherIndexes.every( + (deprecatedOtherIndex) => deprecatedOtherIndex > index + ) + ).to.be.true + ); + }); + + it("should boost 'arduino' and deprecated to the end of the results", async function () { + const query = 'OS'; + const result = await boardService.search({ query }); + expect(result.length).greaterThan(1); + const lastIndex = result.length - 1; + const last = result[lastIndex]; + expect(last.id).to.be.equal('Microsoft:win10'); + expect(last.deprecated).to.be.true; + const arduinoMbedCoreIndex = result.findIndex( + (platform) => platform.id === 'arduino:mbed' + ); + expect(arduinoMbedCoreIndex).to.be.greaterThanOrEqual(0); + expect(arduinoMbedCoreIndex).to.be.lessThan(lastIndex); + const first = result[0]; + expect(typeof first.deprecated).to.be.equal('boolean'); + expect(first.deprecated).to.be.false; + }); + }); + + it('should have the installed version set', async function () { + const timeout = 5 * 60 * 1_000; // five minutes to install/uninstall the core + this.timeout(timeout); + + // ensure installed + let result = await boardService.search({ query: 'arduino:avr' }); + let avr = result.find( + (boardsPackage) => boardsPackage.id === 'arduino:avr' + ); + expect(avr).to.be.not.undefined; + await boardService.install({ + item: <BoardsPackage>avr, + skipPostInstall: true, + }); + + // when installed the version is set + result = await boardService.search({ query: 'arduino:avr' }); + avr = result.find((boardsPackage) => boardsPackage.id === 'arduino:avr'); + expect(avr).to.be.not.undefined; + expect(avr?.installedVersion).to.be.not.undefined; + + // uninstall the core + await boardService.uninstall({ item: <BoardsPackage>avr }); + result = await boardService.search({ query: 'arduino:avr' }); + avr = result.find((boardsPackage) => boardsPackage.id === 'arduino:avr'); + expect(avr).to.be.not.undefined; + expect(avr?.installedVersion).to.be.undefined; + }); +}); + +async function createContainer(testDirPath: string): Promise<Container> { + const data = path.join(testDirPath, 'data'); + const user = path.join(testDirPath, 'user'); + await Promise.all([ + fs.mkdir(data, { recursive: true }), + fs.mkdir(user, { recursive: true }), + ]); + return createBaseContainer({ cliConfig: { directories: { data, user } } }); +} + +async function start( + container: Container, + toDispose: DisposableCollection +): Promise<void> { + return startDaemon(container, toDispose); +} diff --git a/arduino-ide-extension/src/test/node/clang-formatter.test.ts b/arduino-ide-extension/src/test/node/clang-formatter.test.ts new file mode 100644 index 000000000..92a38f326 --- /dev/null +++ b/arduino-ide-extension/src/test/node/clang-formatter.test.ts @@ -0,0 +1,162 @@ +import { + Disposable, + DisposableCollection, +} from '@theia/core/lib/common/disposable'; +import { FileUri } from '@theia/core/lib/common/file-uri'; +import { expect } from 'chai'; +import { promises as fs } from 'node:fs'; +import path from 'node:path'; +import temp from 'temp'; +import { + clangFormatFilename, + ClangFormatter, +} from '../../node/clang-formatter'; +import { spawnCommand } from '../../node/exec-util'; +import { createBaseContainer, startDaemon } from './node-test-bindings'; + +const unformattedContent = `void setup ( ) { pinMode(LED_BUILTIN, OUTPUT); +} + +void loop() { + digitalWrite( LED_BUILTIN , HIGH ); + delay( 1000 ) ; + digitalWrite( LED_BUILTIN , LOW); +delay ( 1000 ) ; + } +`; +const formattedContent = `void setup() { + pinMode(LED_BUILTIN, OUTPUT); +} + +void loop() { + digitalWrite(LED_BUILTIN, HIGH); + delay(1000); + digitalWrite(LED_BUILTIN, LOW); + delay(1000); +} +`; + +type ClangStyleValue = + | string + | number + | boolean + | ClangStyleValue[] + | { [key: string]: ClangStyleValue }; +type ClangConfiguration = Record<string, ClangStyleValue>; + +export interface ClangStyle { + readonly key: string; + readonly value: ClangStyleValue; +} + +const singleClangStyles: ClangStyle[] = [ + { + key: 'SpacesBeforeTrailingComments', + value: 0, + }, + { + key: 'SortIncludes', + value: 'Never', + }, + { + key: 'AlignTrailingComments', + value: true, + }, + { + key: 'IfMacros', + value: ['KJ_IF_MAYBE'], + }, + { + key: 'SpacesInLineCommentPrefix', + value: { + Minimum: 0, + Maximum: -1, + }, + }, +]; + +async function expectNoChanges( + formatter: ClangFormatter, + styleArg: string +): Promise<void> { + const minimalContent = ` +void setup() {} +void loop() {} +`.trim(); + const execPath = formatter['execPath'](); + const actual = await spawnCommand( + execPath, + ['-style', styleArg], + console.error, + minimalContent + ); + expect(actual).to.be.equal(minimalContent); +} + +describe('clang-formatter', () => { + let tracked: typeof temp; + let formatter: ClangFormatter; + let toDispose: DisposableCollection; + + before(async () => { + tracked = temp.track(); + toDispose = new DisposableCollection( + Disposable.create(() => tracked.cleanupSync()) + ); + const container = await createBaseContainer({ + additionalBindings: (bind) => + bind(ClangFormatter).toSelf().inSingletonScope(), + }); + await startDaemon(container, toDispose); + formatter = container.get<ClangFormatter>(ClangFormatter); + }); + + after(() => toDispose.dispose()); + + singleClangStyles + .map((style) => ({ + ...style, + styleArg: JSON.stringify({ [style.key]: style.value }), + })) + .map(({ value, styleArg }) => + it(`should execute the formatter with a single ${ + Array.isArray(value) ? 'array' : typeof value + } type style configuration value: ${styleArg}`, async () => { + await expectNoChanges(formatter, styleArg); + }) + ); + + it('should execute the formatter with a multiple clang formatter styles', async () => { + const styleArg = JSON.stringify( + singleClangStyles.reduce((config, curr) => { + config[curr.key] = curr.value; + return config; + }, {} as ClangConfiguration) + ); + await expectNoChanges(formatter, styleArg); + }); + + it('should format with the default styles', async () => { + const actual = await formatter.format({ + content: unformattedContent, + formatterConfigFolderUris: [], + }); + expect(actual).to.be.equal(formattedContent); + }); + + it('should format with custom formatter configuration file', async () => { + const tempPath = tracked.mkdirSync(); + await fs.writeFile( + path.join(tempPath, clangFormatFilename), + 'SpaceInEmptyParentheses: true', + { + encoding: 'utf8', + } + ); + const actual = await formatter.format({ + content: 'void foo() {}', + formatterConfigFolderUris: [FileUri.create(tempPath).toString()], + }); + expect(actual).to.be.equal('void foo( ) {}'); + }); +}); diff --git a/arduino-ide-extension/src/test/node/config-service-impl.slow-test.ts b/arduino-ide-extension/src/test/node/config-service-impl.slow-test.ts new file mode 100644 index 000000000..fe585bb7d --- /dev/null +++ b/arduino-ide-extension/src/test/node/config-service-impl.slow-test.ts @@ -0,0 +1,178 @@ +import { + Disposable, + DisposableCollection, +} from '@theia/core/lib/common/disposable'; +import { deepClone } from '@theia/core/lib/common/objects'; +import type { MaybePromise, Mutable } from '@theia/core/lib/common/types'; +import type { Container } from '@theia/core/shared/inversify'; +import { expect } from 'chai'; +import { load as parseYaml } from 'js-yaml'; +import { promises as fs } from 'node:fs'; +import { join } from 'node:path'; +import temp from 'temp'; +import { + Config, + Network, + ProxySettings, +} from '../../common/protocol/config-service'; +import { CLI_CONFIG, DefaultCliConfig } from '../../node/cli-config'; +import { ConfigServiceImpl } from '../../node/config-service-impl'; +import { ConfigDirUriProvider } from '../../node/theia/env-variables/env-variables-server'; +import { + createBaseContainer, + createCliConfig, + startDaemon, +} from './node-test-bindings'; + +describe('config-service-impl', () => { + const noProxy = 'none'; + const manualProxy: ProxySettings = { + protocol: 'http', + hostname: 'hostname', + password: 'secret', + username: 'username', + port: '1234', + }; + + describe('setConfiguration', () => { + let configService: ConfigServiceImpl; + let toDispose: DisposableCollection; + let cliConfigPath: string; + + beforeEach(async () => { + const container = await createBaseContainer(); + toDispose = new DisposableCollection(); + await startDaemon(container, toDispose); + configService = container.get<ConfigServiceImpl>(ConfigServiceImpl); + cliConfigPath = getCliConfigPath(container); + }); + + afterEach(() => toDispose.dispose()); + + it("should detect 'none' proxy with th default config", async () => { + const state = await configService.getConfiguration(); + expect(state.config).to.be.not.undefined; + const config = <Config>state.config; + expect(config.network).to.be.equal(noProxy); + expect(Network.stringify(config.network)).is.undefined; + await assertRawConfigModel(cliConfigPath, (actualModel) => { + expect(actualModel.network).to.be.undefined; + }); + }); + + it('should ignore noop changes', async () => { + const beforeState = await configService.getConfiguration(); + const config = <Mutable<Config>>deepClone(beforeState).config; + let eventCounter = 0; + toDispose.push(configService.onConfigChange(() => eventCounter++)); + await configService.setConfiguration(config); + const afterState = await configService.getConfiguration(); + expect(beforeState.config).to.be.deep.equal(afterState.config); + expect(eventCounter).to.be.equal(0); + }); + + it('should set the manual proxy', async () => { + const beforeState = await configService.getConfiguration(); + const config = <Mutable<Config>>deepClone(beforeState).config; + config.network = manualProxy; + let eventCounter = 0; + toDispose.push(configService.onConfigChange(() => eventCounter++)); + await configService.setConfiguration(config); + const afterState = await configService.getConfiguration(); + expect(beforeState.config).to.be.not.deep.equal(afterState.config); + expect(afterState.config?.network).to.be.deep.equal(manualProxy); + expect(eventCounter).to.be.equal(1); + await assertRawConfigModel(cliConfigPath, (actualModel) => { + expect(actualModel.network?.proxy).to.be.equal( + Network.stringify(manualProxy) + ); + }); + }); + + it('should unset the manual proxy', async () => { + const initialState = await configService.getConfiguration(); + const config = <Mutable<Config>>deepClone(initialState).config; + config.network = manualProxy; + let eventCounter = 0; + toDispose.push(configService.onConfigChange(() => eventCounter++)); + await configService.setConfiguration(config); + const beforeState = await configService.getConfiguration(); + const config2 = <Mutable<Config>>deepClone(config); + config2.network = noProxy; + await configService.setConfiguration(config2); + const afterState = await configService.getConfiguration(); + expect(beforeState.config).to.be.not.deep.equal(afterState.config); + expect(afterState.config?.network).to.be.deep.equal(noProxy); + expect(eventCounter).to.be.equal(2); + await assertRawConfigModel(cliConfigPath, (actualModel) => { + expect(actualModel.network?.proxy).to.be.undefined; + }); + }); + }); + + describe('setConfiguration (multiple CLI daemon sessions)', () => { + let tracked: typeof temp; + let toDispose: DisposableCollection; + + before(() => { + tracked = temp.track(); + toDispose = new DisposableCollection( + Disposable.create(() => tracked.cleanupSync()) + ); + }); + + after(() => toDispose.dispose()); + + it("should unset the 'network#proxy' config value between daemon sessions", async () => { + const configDirPath = tracked.mkdirSync(); + const cliConfigPath = join(configDirPath, CLI_CONFIG); + const cliConfig = await createCliConfig(configDirPath); + const setupContainer = await createBaseContainer({ + cliConfig, + configDirPath, + }); + const toDisposeAfterFirstStart = new DisposableCollection(); + toDispose.push(toDisposeAfterFirstStart); + await startDaemon(setupContainer, toDisposeAfterFirstStart); + toDisposeAfterFirstStart.dispose(); + + // second startup when the indexes are all downloaded and the daemon is initialized with the network#proxy + cliConfig.network = { proxy: Network.stringify(manualProxy) }; + const container = await createBaseContainer({ cliConfig, configDirPath }); + await startDaemon(container, toDispose); + const configService = container.get<ConfigServiceImpl>(ConfigServiceImpl); + let eventCounter = 0; + toDispose.push(configService.onConfigChange(() => eventCounter++)); + + const beforeState = await configService.getConfiguration(); + const config = <Mutable<Config>>deepClone(beforeState.config); + config.network = noProxy; + await configService.setConfiguration(config); + const afterState = await configService.getConfiguration(); + expect(beforeState.config).to.be.not.deep.equal(afterState.config); + expect(afterState.config?.network).to.be.deep.equal(noProxy); + expect(eventCounter).to.be.equal(1); + await assertRawConfigModel(cliConfigPath, (actualModel) => { + expect(actualModel.network?.proxy).to.be.undefined; // currently fails due to arduino/arduino-cli#2275 + }); + }); + }); + + async function assertRawConfigModel( + cliConfigPath: string, + assert: (actual: DefaultCliConfig) => MaybePromise<void> + ): Promise<void> { + const raw = await fs.readFile(cliConfigPath, { encoding: 'utf8' }); + const model = parseYaml(raw); + await assert(model); + } + + function getCliConfigPath(container: Container): string { + const configDirUriProvider = + container.get<ConfigDirUriProvider>(ConfigDirUriProvider); + return configDirUriProvider + .configDirUri() + .resolve(CLI_CONFIG) + .path.fsPath(); + } +}); diff --git a/arduino-ide-extension/src/test/node/core-client-provider.slow-test.ts b/arduino-ide-extension/src/test/node/core-client-provider.slow-test.ts new file mode 100644 index 000000000..b24b98b69 --- /dev/null +++ b/arduino-ide-extension/src/test/node/core-client-provider.slow-test.ts @@ -0,0 +1,341 @@ +import { DisposableCollection } from '@theia/core/lib/common/disposable'; +import type { MaybePromise } from '@theia/core/lib/common/types'; +import { FileUri } from '@theia/core/lib/common/file-uri'; +import { Container } from '@theia/core/shared/inversify'; +import { expect } from 'chai'; +import { dump, load } from 'js-yaml'; +import { promises as fs } from 'node:fs'; +import { join } from 'node:path'; +import { rimrafSync } from 'rimraf'; +import { + BoardsService, + CoreService, + LibraryService, +} from '../../common/protocol'; +import { ArduinoDaemonImpl } from '../../node/arduino-daemon-impl'; +import { CLI_CONFIG, DefaultCliConfig } from '../../node/cli-config'; +import { BoardListRequest } from '../../node/cli-protocol/cc/arduino/cli/commands/v1/board_pb'; +import { CoreClientProvider } from '../../node/core-client-provider'; +import { spawnCommand } from '../../node/exec-util'; +import { ConfigDirUriProvider } from '../../node/theia/env-variables/env-variables-server'; +import { ErrnoException } from '../../node/utils/errors'; +import { + createBaseContainer, + createCliConfig, + newTempConfigDirPath, + startDaemon, +} from './node-test-bindings'; + +const timeout = 5 * 60 * 1_000; // five minutes + +describe('core-client-provider', () => { + let toDispose: DisposableCollection; + + beforeEach(() => (toDispose = new DisposableCollection())); + afterEach(() => toDispose.dispose()); + + it("should update no indexes when the 'directories.data' exists", async function () { + this.timeout(timeout); + const configDirPath = await prepareTestConfigDir(); + + const container = await startCli(configDirPath, toDispose); + await assertFunctionalCli(container, ({ coreClientProvider }) => { + const { indexUpdateSummaryBeforeInit } = coreClientProvider; + expect(indexUpdateSummaryBeforeInit).to.be.not.undefined; + expect(indexUpdateSummaryBeforeInit).to.be.empty; + }); + }); + + // The better translation the CLI has, the more likely IDE2 won't be able to detect primary package and library index errors. + // Instead of running the test against all supported locales, IDE2 runs the tests with locales that result in a bug. + ['it', 'de'].map(([locale]) => + it(`should recover when the 'directories.data' folder is missing independently from the CLI's locale ('${locale}')`, async function () { + this.timeout(timeout); + const configDirPath = await prepareTestConfigDir({ locale }); + + const container = await startCli(configDirPath, toDispose); + await assertFunctionalCli(container, ({ coreClientProvider }) => { + const { indexUpdateSummaryBeforeInit } = coreClientProvider; + expect(indexUpdateSummaryBeforeInit).to.be.not.undefined; + expect(indexUpdateSummaryBeforeInit).to.be.empty; + }); + }) + ); + + it("should recover when the 'directories.data' folder is missing", async function () { + this.timeout(timeout); + const configDirPath = await prepareTestConfigDir(); + rimrafSync(join(configDirPath, 'data')); + + const container = await startCli(configDirPath, toDispose); + await assertFunctionalCli(container, ({ coreClientProvider }) => { + const { indexUpdateSummaryBeforeInit } = coreClientProvider; + expect(indexUpdateSummaryBeforeInit).to.be.not.undefined; + expect(indexUpdateSummaryBeforeInit).to.be.empty; + }); + }); + + it("should recover when the primary package index file ('package_index.json') is missing", async function () { + this.timeout(timeout); + const configDirPath = await prepareTestConfigDir(); + const primaryPackageIndexPath = join( + configDirPath, + 'data', + 'Arduino15', + 'package_index.json' + ); + rimrafSync(primaryPackageIndexPath); + + const container = await startCli(configDirPath, toDispose); + await assertFunctionalCli(container, ({ coreClientProvider }) => { + const { indexUpdateSummaryBeforeInit } = coreClientProvider; + expect(indexUpdateSummaryBeforeInit).to.be.not.undefined; + expect(indexUpdateSummaryBeforeInit).to.be.empty; + }); + const rawJson = await fs.readFile(primaryPackageIndexPath, { + encoding: 'utf8', + }); + expect(rawJson).to.be.not.empty; + const object = JSON.parse(rawJson); + expect(object).to.be.not.empty; + }); + + ['serial-discovery', 'mdns-discovery'].map((tool) => + it(`should recover when the '${join( + 'packages', + 'builtin', + 'tools', + tool + )}' folder is missing`, async function () { + this.timeout(timeout); + const configDirPath = await prepareTestConfigDir(); + const builtinToolsPath = join( + configDirPath, + 'data', + 'Arduino15', + 'packages', + 'builtin', + 'tools', + tool + ); + rimrafSync(builtinToolsPath); + + const container = await startCli(configDirPath, toDispose); + await assertFunctionalCli(container, ({ coreClientProvider }) => { + const { indexUpdateSummaryBeforeInit } = coreClientProvider; + expect(indexUpdateSummaryBeforeInit).to.be.not.undefined; + expect(indexUpdateSummaryBeforeInit).to.be.empty; + }); + const toolVersions = await fs.readdir(builtinToolsPath); + expect(toolVersions.length).to.be.greaterThanOrEqual(1); + }) + ); + + it("should recover when the library index file ('library_index.json') is missing", async function () { + this.timeout(timeout); + const configDirPath = await prepareTestConfigDir(); + const libraryPackageIndexPath = join( + configDirPath, + 'data', + 'Arduino15', + 'library_index.json' + ); + rimrafSync(libraryPackageIndexPath); + + const container = await startCli(configDirPath, toDispose); + await assertFunctionalCli(container, ({ coreClientProvider }) => { + const { indexUpdateSummaryBeforeInit } = coreClientProvider; + expect(indexUpdateSummaryBeforeInit).to.be.not.undefined; + expect(indexUpdateSummaryBeforeInit).to.be.empty; + }); + const rawJson = await fs.readFile(libraryPackageIndexPath, { + encoding: 'utf8', + }); + expect(rawJson).to.be.not.empty; + const object = JSON.parse(rawJson); + expect(object).to.be.not.empty; + }); + + it('should recover when a 3rd party package index file is missing but the platform is not installed', async function () { + this.timeout(timeout); + const additionalUrls = [ + 'https://www.pjrc.com/teensy/package_teensy_index.json', + ]; + const assertTeensyAvailable = async (boardsService: BoardsService) => { + const boardsPackages = await boardsService.search({}); + expect( + boardsPackages.filter(({ id }) => id === 'teensy:avr').length + ).to.be.equal(1); + }; + const configDirPath = await prepareTestConfigDir({ + board_manager: { additional_urls: additionalUrls }, + }); + const thirdPartyPackageIndexPath = join( + configDirPath, + 'data', + 'Arduino15', + 'package_teensy_index.json' + ); + rimrafSync(thirdPartyPackageIndexPath); + + const container = await startCli(configDirPath, toDispose); + await assertFunctionalCli( + container, + async ({ coreClientProvider, boardsService }) => { + const { indexUpdateSummaryBeforeInit } = coreClientProvider; + expect(indexUpdateSummaryBeforeInit).to.be.not.undefined; + expect(indexUpdateSummaryBeforeInit).to.be.empty; + await assertTeensyAvailable(boardsService); + } + ); + }); + + 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); + const configDirPath = await prepareTestConfigDir(); + rimrafSync(join(configDirPath, 'data')); + + // set an invalid URL so the CLI will try to download it + const cliConfigPath = join(configDirPath, 'arduino-cli.yaml'); + const rawYaml = await fs.readFile(cliConfigPath, { encoding: 'utf8' }); + const config: DefaultCliConfig = load(rawYaml); + expect(config.board_manager).to.be.undefined; + config.board_manager = { additional_urls: ['https://invalidUrl'] }; + expect(config.board_manager?.additional_urls?.[0]).to.be.equal( + 'https://invalidUrl' + ); + await fs.writeFile(cliConfigPath, dump(config)); + + const container = await startCli(configDirPath, toDispose); + await assertFunctionalCli(container, ({ coreClientProvider }) => { + const { indexUpdateSummaryBeforeInit } = coreClientProvider; + expect(indexUpdateSummaryBeforeInit).to.be.not.undefined; + expect(indexUpdateSummaryBeforeInit).to.be.empty; + }); + }); +}); + +interface Services { + coreClientProvider: CoreClientProvider; + coreService: CoreService; + libraryService: LibraryService; + boardsService: BoardsService; +} + +async function assertFunctionalCli( + container: Container, + otherAsserts?: (services: Services) => MaybePromise<void> +): Promise<void> { + const coreClientProvider = + container.get<CoreClientProvider>(CoreClientProvider); + const coreService = container.get<CoreService>(CoreService); + const libraryService = container.get<LibraryService>(LibraryService); + const boardsService = container.get<BoardsService>(BoardsService); + expect(coreClientProvider).to.be.not.undefined; + expect(coreService).to.be.not.undefined; + expect(libraryService).to.be.not.undefined; + expect(boardsService).to.be.not.undefined; + + const coreClient = coreClientProvider.tryGetClient; + expect(coreClient).to.be.not.undefined; + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const { client, instance } = coreClient!; + + const installedBoards = await boardsService.getInstalledBoards(); + expect(installedBoards.length).to.be.equal(0); + + const libraries = await libraryService.search({ + query: 'cmaglie', + type: 'Contributed', + }); + expect(libraries.length).to.be.greaterThanOrEqual(1); + expect( + libraries.filter(({ name }) => name === 'KonnektingFlashStorage').length + ).to.be.greaterThanOrEqual(1); + + // IDE2 runs `board list -w` equivalent, but running a single `board list` + // is sufficient for the tests to check if the serial discover tool is OK. + await new Promise<void>((resolve, reject) => + client.boardList(new BoardListRequest().setInstance(instance), (err) => { + if (err) { + reject(err); + } + resolve(); // The response does not matter. Tests must be relaxed. Maybe there are environments without a serial port? + }) + ); + + return otherAsserts?.({ + coreClientProvider, + coreService, + libraryService, + boardsService, + }); +} + +/** + * Initializes the CLI by creating a temporary config folder including the correctly initialized + * `directories.data` folder so that tests can corrupt it and test it the CLI initialization can recover. + * The resolved path is pointing the temporary config folder. By the time the promise resolves, the CLI + * daemon is stopped. This function should be used to initialize a correct `directories.data` folder and + * the config folder. + */ +async function prepareTestConfigDir( + configOverrides: Partial<DefaultCliConfig> = {} +): Promise<string> { + const params = { configDirPath: newTempConfigDirPath(), configOverrides }; + const container = await createContainer(params); + const daemon = container.get<ArduinoDaemonImpl>(ArduinoDaemonImpl); + const cliPath = daemon.getExecPath(); + const configDirUriProvider = + container.get<ConfigDirUriProvider>(ConfigDirUriProvider); + const configDirPath = FileUri.fsPath(configDirUriProvider.configDirUri()); + await coreUpdateIndex(cliPath, configDirPath); + return configDirPath; +} + +async function coreUpdateIndex( + cliPath: string, + configDirPath: string +): Promise<void> { + const cliConfigPath = join(configDirPath, 'arduino-cli.yaml'); + await fs.access(cliConfigPath); + const stdout = await spawnCommand( + cliPath, + ['core', 'update-index', '--config-file', cliConfigPath], + (error) => console.error(error) + ); + console.log(stdout); +} + +async function startCli( + configDirPath: string, + toDispose: DisposableCollection +): Promise<Container> { + const cliConfigPath = join(configDirPath, CLI_CONFIG); + try { + await fs.readFile(cliConfigPath); + } catch (err) { + if (ErrnoException.isENOENT(err)) { + throw new Error( + `The CLI configuration was not found at ${cliConfigPath} when starting the tests.` + ); + } + throw err; + } + const container = await createContainer(configDirPath); + await startDaemon(container, toDispose); + return container; +} + +async function createContainer( + params: + | { configDirPath: string; configOverrides: Partial<DefaultCliConfig> } + | string = newTempConfigDirPath() +): Promise<Container> { + if (typeof params === 'string') { + return createBaseContainer({ configDirPath: params }); + } + const { configDirPath, configOverrides } = params; + const cliConfig = await createCliConfig(configDirPath, configOverrides); + return createBaseContainer({ configDirPath, cliConfig }); +} diff --git a/arduino-ide-extension/src/test/node/core-service-impl.slow-test.ts b/arduino-ide-extension/src/test/node/core-service-impl.slow-test.ts new file mode 100644 index 000000000..0b6ce3956 --- /dev/null +++ b/arduino-ide-extension/src/test/node/core-service-impl.slow-test.ts @@ -0,0 +1,83 @@ +import { DisposableCollection } from '@theia/core/lib/common/disposable'; +import { isWindows } from '@theia/core/lib/common/os'; +import { FileUri } from '@theia/core/lib/common/file-uri'; +import { Container } from '@theia/core/shared/inversify'; +import { expect } from 'chai'; +import { + BoardsService, + CompileSummary, + CoreService, + SketchesService, + isCompileSummary, +} from '../../common/protocol'; +import { createBaseContainer, startDaemon } from './node-test-bindings'; + +const testTimeout = 30_000; +const setupTimeout = 5 * 60 * 1_000; // five minutes +const avr = 'arduino:avr'; +const uno = 'arduino:avr:uno'; + +describe('core-service-impl', () => { + let container: Container; + let toDispose: DisposableCollection; + + beforeEach(async function () { + this.timeout(setupTimeout); + toDispose = new DisposableCollection(); + container = await createContainer(); + await start(container, toDispose); + }); + + afterEach(() => toDispose.dispose()); + + describe('compile', () => { + it('should execute a command with the compile summary, including the build path', async function () { + this.timeout(testTimeout); + const coreService = container.get<CoreService>(CoreService); + const sketchesService = container.get<SketchesService>(SketchesService); + const sketch = await sketchesService.createNewSketch(); + + const compileSummary = await coreService.compile({ + fqbn: uno, + sketch, + optimizeForDebug: false, + sourceOverride: {}, + verbose: true, + }); + + expect(isCompileSummary(compileSummary)).to.be.true; + expect((<CompileSummary>compileSummary).buildOutputUri).to.be.not + .undefined; + + const tempBuildPaths = await sketchesService.getBuildPath(sketch); + if (isWindows) { + expect(tempBuildPaths.length).to.be.greaterThan(1); + } else { + expect(tempBuildPaths.length).to.be.equal(1); + } + + const { buildOutputUri } = <CompileSummary>compileSummary; + const buildOutputPath = FileUri.fsPath(buildOutputUri).toString(); + expect(tempBuildPaths.includes(buildOutputPath)).to.be.true; + }); + }); +}); + +async function start( + container: Container, + toDispose: DisposableCollection +): Promise<void> { + await startDaemon(container, toDispose, async (container) => { + const boardService = container.get<BoardsService>(BoardsService); + const searchResults = await boardService.search({ query: avr }); + const platform = searchResults.find(({ id }) => id === avr); + if (!platform) { + throw new Error(`Could not find platform: ${avr}`); + } + await boardService.install({ item: platform, skipPostInstall: true }); + }); +} + +async function createContainer(): Promise<Container> { + return createBaseContainer(); +} diff --git a/arduino-ide-extension/src/test/node/core-service-impl.test.ts b/arduino-ide-extension/src/test/node/core-service-impl.test.ts new file mode 100644 index 000000000..ac419dd2d --- /dev/null +++ b/arduino-ide-extension/src/test/node/core-service-impl.test.ts @@ -0,0 +1,55 @@ +import { expect } from 'chai'; +import { + PortIdentifier, + portIdentifierEquals, + Port, +} from '../../common/protocol/boards-service'; +import { Port as RpcPort } from '../../node/cli-protocol/cc/arduino/cli/commands/v1/port_pb'; +import { CoreServiceImpl } from '../../node/core-service-impl'; + +describe('core-service-impl', () => { + describe('createPort', () => { + it("should map the 'undefined' port object to an 'undefined' gRPC port value", () => { + const actual = new CoreServiceImpl()['createPort'](undefined); + expect(actual).to.be.undefined; + }); + + it('should map a port object to the appropriate gRPC port object', () => { + const properties = { + alma: 'false', + korte: '36', + }; + const port = { + address: 'address', + addressLabel: 'address label', + hardwareId: '1730323', + protocol: 'serial', + protocolLabel: 'serial port', + properties, + } as const; + const resolve = (toResolve: PortIdentifier): Port | undefined => { + if (portIdentifierEquals(toResolve, port)) { + return port; + } + return undefined; + }; + const actual = new CoreServiceImpl()['createPort']( + { protocol: port.protocol, address: port.address }, + resolve + ); + expect(actual).to.be.not.undefined; + const expected = new RpcPort() + .setAddress(port.address) + .setHardwareId(port.hardwareId) + .setLabel(port.addressLabel) + .setProtocol(port.protocol) + .setProtocolLabel(port.protocolLabel); + Object.entries(properties).forEach(([key, value]) => + expected.getPropertiesMap().set(key, value) + ); + expect((<RpcPort>actual).toObject(false)).to.be.deep.equal( + expected.toObject(false) + ); + }); + }); +}); diff --git a/arduino-ide-extension/src/test/node/exec-util.test.ts b/arduino-ide-extension/src/test/node/exec-util.test.ts index ffbd1fbf6..11342179e 100644 --- a/arduino-ide-extension/src/test/node/exec-util.test.ts +++ b/arduino-ide-extension/src/test/node/exec-util.test.ts @@ -1,33 +1,165 @@ -import * as os from 'os'; -import { expect, use } from 'chai'; -import { getExecPath } from '../../node/exec-util'; - -use(require('chai-string')); - -describe('getExecPath', () => { - it('should resolve arduino-cli', async () => { - const actual = await getExecPath('arduino-cli', onError, 'version'); - const expected = - os.platform() === 'win32' ? '\\arduino-cli.exe' : '/arduino-cli'; - expect(actual).to.endsWith(expected); - }); +import { assert, expect } from 'chai'; +import fs from 'node:fs'; +import path from 'node:path'; +import { spawnCommand } from '../../node/exec-util'; +import temp from 'temp'; +import { + arduinoCliPath, + arduinoFirmwareUploaderPath, + arduinoLanguageServerPath, + clangdPath, + clangFormatPath, +} from '../../node/resources'; - it('should resolve arduino-language-server', async () => { - const actual = await getExecPath('arduino-language-server'); - const expected = - os.platform() === 'win32' - ? '\\arduino-language-server.exe' - : '/arduino-language-server'; - expect(actual).to.endsWith(expected); - }); +describe('exec-utils', () => { + describe('spawnCommand', () => { + let tracked: typeof temp; + + before(() => { + tracked = temp.track(); + }); + + after(() => { + if (tracked) { + tracked.cleanupSync(); + } + }); - it('should resolve clangd', async () => { - const actual = await getExecPath('clangd', onError, '--version'); - const expected = os.platform() === 'win32' ? '\\clangd.exe' : '/clangd'; - expect(actual).to.endsWith(expected); + it("should execute the command without 'shell:true' even if the path contains spaces but is not escaped", async () => { + const segment = 'with some spaces'; + const cliPath = arduinoCliPath; + const filename = path.basename(cliPath); + const tempPath = tracked.mkdirSync(); + const tempPathWitSpaces = path.join(tempPath, segment); + fs.mkdirSync(tempPathWitSpaces, { recursive: true }); + const cliCopyPath = path.join(tempPathWitSpaces, filename); + fs.copyFileSync(cliPath, cliCopyPath); + expect(fs.accessSync(cliCopyPath, fs.constants.X_OK)).to.be.undefined; + expect(cliCopyPath.includes(segment)).to.be.true; + const stdout = await spawnCommand(cliCopyPath, ['version']); + expect(stdout.includes(path.parse(filename).name)).to.be.true; + }); }); - function onError(error: Error): void { - console.error(error); - } + describe('getExecPath', () => { + type AssertOutput = (stdout: string) => void; + + interface GetExecPathTestSuite { + readonly binaryName: string; + readonly flags?: string[]; + readonly assertOutput: AssertOutput; + /** + * The Arduino LS repository is not as shiny as the CLI or the firmware uploader. + * It does not support `version` flag either, so non-zero exit is expected. + */ + readonly expectNonZeroExit?: boolean; + } + + const binaryNameToPathMapping: Record<string, string> = { + 'arduino-cli': arduinoCliPath, + 'arduino-language-server': arduinoLanguageServerPath, + 'arduino-fwuploader': arduinoFirmwareUploaderPath, + clangd: clangdPath, + 'clang-format': clangFormatPath, + }; + + function readVersionFromPackageJson(binaryName: string): string { + const raw = fs.readFileSync( + path.join(__dirname, '..', '..', '..', 'package.json'), + { encoding: 'utf8' } + ); + const json = JSON.parse(raw); + expect(json.arduino).to.be.not.undefined; + const version = + json.arduino[binaryName === 'clang-format' ? 'clangd' : binaryName] + .version; + expect(version).to.be.not.undefined; + return version; + } + + function createTaskAssert(name: string): AssertOutput { + const version = readVersionFromPackageJson(name); + if (typeof version === 'string') { + return (stdout: string) => { + expect(stdout.includes(name)).to.be.true; + expect(stdout.includes(version)).to.be.true; + expect(stdout.includes('git-snapshot')).to.be.false; + }; + } + return (stdout: string) => { + expect(stdout.includes(name)).to.be.true; + expect(stdout.includes('git-snapshot')).to.be.true; + }; + } + + function createClangdAssert(name: string): AssertOutput { + const version = readVersionFromPackageJson(name); + return (stdout: string) => { + expect(stdout.includes(name)).to.be.true; + expect(stdout.includes(`version ${version}`)).to.be.true; + }; + } + + const suites: GetExecPathTestSuite[] = [ + { + binaryName: 'arduino-cli', + flags: ['version'], + assertOutput: createTaskAssert('arduino-cli'), + }, + { + binaryName: 'arduino-fwuploader', + flags: ['version'], + assertOutput: createTaskAssert('arduino-fwuploader'), + }, + { + binaryName: 'arduino-language-server', + assertOutput: (stderr: string) => { + expect(stderr.includes('Path to ArduinoCLI config file must be set.')) + .to.be.true; + }, + expectNonZeroExit: true, + }, + { + binaryName: 'clangd', + flags: ['--version'], + assertOutput: createClangdAssert('clangd'), + }, + { + binaryName: 'clang-format', + flags: ['--version'], + assertOutput: createClangdAssert('clang-format'), + }, + ]; + + // This is not a functional test but it ensures all executables provided by IDE2 are tested. + it('should cover all provided executables', () => { + expect(suites.length).to.be.equal( + Object.keys(binaryNameToPathMapping).length + ); + }); + + suites.map((suite) => + it(`should resolve '${suite.binaryName}'`, async () => { + const execPath = binaryNameToPathMapping[suite.binaryName]; + expect(execPath).to.be.not.undefined; + expect(execPath).to.be.not.empty; + expect(fs.accessSync(execPath, fs.constants.X_OK)).to.be.undefined; + if (suite.expectNonZeroExit) { + try { + await spawnCommand(execPath, suite.flags ?? []); + assert.fail('Expected a non-zero exit code'); + } catch (err) { + expect(err).to.be.an.instanceOf(Error); + const stderr = (<Error>err).message; + expect(stderr).to.be.not.undefined; + expect(stderr).to.be.not.empty; + suite.assertOutput(stderr); + } + } else { + const stdout = await spawnCommand(execPath, suite.flags ?? []); + suite.assertOutput(stdout); + } + }) + ); + }); }); diff --git a/arduino-ide-extension/src/test/node/library-service-impl.slow-test.ts b/arduino-ide-extension/src/test/node/library-service-impl.slow-test.ts new file mode 100644 index 000000000..6473660da --- /dev/null +++ b/arduino-ide-extension/src/test/node/library-service-impl.slow-test.ts @@ -0,0 +1,78 @@ +import { DisposableCollection } from '@theia/core/lib/common/disposable'; +import { Container } from '@theia/core/shared/inversify'; +import { expect } from 'chai'; +import { LibrarySearch, LibraryService } from '../../common/protocol'; +import { createBaseContainer, startDaemon } from './node-test-bindings'; + +describe('library-service-impl', () => { + let libraryService: LibraryService; + let toDispose: DisposableCollection; + + before(async function () { + this.timeout(20_000); + toDispose = new DisposableCollection(); + const container = await createContainer(); + await start(container, toDispose); + libraryService = container.get<LibraryService>(LibraryService); + }); + + after(() => toDispose.dispose()); + + describe('search', () => { + it('should run search', async function () { + const result = await libraryService.search({}); + expect(result).is.not.empty; + }); + + it("should boost a result when 'types' includes 'arduino'", async function () { + const result = await libraryService.search({}); + const arduinoIndexes: number[] = []; + const otherIndexes: number[] = []; + // Special `"types": ["Arduino", "Retired"]` case handling: https://github.com/arduino/arduino-ide/issues/1106#issuecomment-1419392742 + const retiredIndexes: number[] = []; + const arduino: LibrarySearch.Type = 'Arduino'; + const retired: LibrarySearch.Type = 'Retired'; + result + .filter((library) => library.types.length === 1) + .forEach((library, index) => { + if (library.types.includes(arduino)) { + if (library.types.includes(retired)) { + retiredIndexes.push(index); + } else { + arduinoIndexes.push(index); + } + } else { + otherIndexes.push(index); + } + }); + arduinoIndexes.forEach( + (index) => + expect(otherIndexes.every((otherIndex) => otherIndex > index)).to.be + .true + ); + otherIndexes.forEach( + (index) => + expect(retiredIndexes.every((retiredIndex) => retiredIndex > index)) + .to.be.true + ); + }); + }); + + it("should boost library 'SD' to the top if the query term is 'SD'", async function () { + const query = 'SD'; + const result = await libraryService.search({ query }); + expect(result.length).greaterThan(1); + expect(result[0].name).to.be.equal(query); + }); +}); + +async function createContainer(): Promise<Container> { + return createBaseContainer(); +} + +async function start( + container: Container, + toDispose: DisposableCollection +): Promise<void> { + return startDaemon(container, toDispose); +} diff --git a/arduino-ide-extension/src/test/node/monitor-settings-utils.test.ts b/arduino-ide-extension/src/test/node/monitor-settings-utils.test.ts index dcaf1cbca..f493be9ca 100644 --- a/arduino-ide-extension/src/test/node/monitor-settings-utils.test.ts +++ b/arduino-ide-extension/src/test/node/monitor-settings-utils.test.ts @@ -3,7 +3,7 @@ import { longestPrefixMatch, reconcileSettings, } from '../../node/monitor-settings/monitor-settings-utils'; -import { PluggableMonitorSettings } from '../../node/monitor-settings/monitor-settings-provider'; +import { PluggableMonitorSettings } from '../../common/protocol'; type DeepWriteable<T> = { -readonly [P in keyof T]: DeepWriteable<T[P]> }; @@ -137,7 +137,7 @@ describe('reconcileSettings', () => { expect(reconciledSettings).not.to.have.property('setting4'); }); - it('should reset non-value fields to those defiend in the default settings', async () => { + it('should reset non-value fields to those defined in the default settings', async () => { const newSettings: DeepWriteable<PluggableMonitorSettings> = JSON.parse( JSON.stringify(defaultSettings) ); diff --git a/arduino-ide-extension/src/test/node/node-test-bindings.ts b/arduino-ide-extension/src/test/node/node-test-bindings.ts new file mode 100644 index 000000000..dfa762c68 --- /dev/null +++ b/arduino-ide-extension/src/test/node/node-test-bindings.ts @@ -0,0 +1,326 @@ +import { + Disposable, + DisposableCollection, +} from '@theia/core/lib/common/disposable'; +import { EnvVariablesServer as TheiaEnvVariablesServer } from '@theia/core/lib/common/env-variables'; +import { waitForEvent } from '@theia/core/lib/common/promise-util'; +import URI from '@theia/core/lib/common/uri'; +import { FileUri } from '@theia/core/lib/common/file-uri'; +import { ProcessUtils } from '@theia/core/lib/node/process-utils'; +import { + Container, + ContainerModule, + injectable, + interfaces, +} from '@theia/core/shared/inversify'; +import deepmerge from 'deepmerge'; +import { dump as dumpYaml } from 'js-yaml'; +import { mkdirSync, promises as fs } from 'node:fs'; +import { join } from 'node:path'; +import { path as tempPath, track } from 'temp'; +import { + ArduinoDaemon, + BoardsPackage, + BoardsService, + ConfigService, + ConfigState, + CoreService, + DetectedPorts, + IndexUpdateDidCompleteParams, + IndexUpdateDidFailParams, + IndexUpdateParams, + LibraryPackage, + LibraryService, + NotificationServiceClient, + NotificationServiceServer, + OutputMessage, + ProgressMessage, + ResponseService, + Sketch, + SketchesService, +} from '../../common/protocol'; +import { ArduinoDaemonImpl } from '../../node/arduino-daemon-impl'; +import { BoardDiscovery } from '../../node/board-discovery'; +import { BoardsServiceImpl } from '../../node/boards-service-impl'; +import { CliConfig, CLI_CONFIG, DefaultCliConfig } from '../../node/cli-config'; +import { ConfigServiceImpl } from '../../node/config-service-impl'; +import { CoreClientProvider } from '../../node/core-client-provider'; +import { CoreServiceImpl } from '../../node/core-service-impl'; +import { IsTempSketch } from '../../node/is-temp-sketch'; +import { LibraryServiceImpl } from '../../node/library-service-impl'; +import { MonitorManager } from '../../node/monitor-manager'; +import { MonitorService } from '../../node/monitor-service'; +import { + MonitorServiceFactory, + MonitorServiceFactoryOptions, +} from '../../node/monitor-service-factory'; +import { SettingsReader } from '../../node/settings-reader'; +import { SketchesServiceImpl } from '../../node/sketches-service-impl'; +import { + ConfigDirUriProvider, + EnvVariablesServer, +} from '../../node/theia/env-variables/env-variables-server'; +import { bindCommon } from '../common/common-test-bindings'; + +const tracked = track(); + +@injectable() +class SilentArduinoDaemon extends ArduinoDaemonImpl { + protected override onData(): void { + // NOOP + } +} + +@injectable() +class TestBoardDiscovery extends BoardDiscovery { + mutableDetectedPorts: DetectedPorts = {}; + + override async start(): Promise<void> { + // NOOP + } + override async stop(): Promise<void> { + // NOOP + } + override get detectedPorts(): DetectedPorts { + return this.mutableDetectedPorts; + } +} + +@injectable() +class TestNotificationServiceServer implements NotificationServiceServer { + readonly events: string[] = []; + + // eslint-disable-next-line @typescript-eslint/no-unused-vars, unused-imports/no-unused-vars + disposeClient(client: NotificationServiceClient): void { + this.events.push('disposeClient:'); + } + notifyDidReinitialize(): void { + this.events.push('notifyDidReinitialize:'); + } + notifyIndexUpdateWillStart(params: IndexUpdateParams): void { + this.events.push(`notifyIndexUpdateWillStart:${JSON.stringify(params)}`); + } + notifyIndexUpdateDidProgress(progressMessage: ProgressMessage): void { + this.events.push( + `notifyIndexUpdateDidProgress:${JSON.stringify(progressMessage)}` + ); + } + notifyIndexUpdateDidComplete(params: IndexUpdateDidCompleteParams): void { + this.events.push(`notifyIndexUpdateDidComplete:${JSON.stringify(params)}`); + } + notifyIndexUpdateDidFail(params: IndexUpdateDidFailParams): void { + this.events.push(`notifyIndexUpdateDidFail:${JSON.stringify(params)}`); + } + notifyDaemonDidStart(port: number): void { + this.events.push(`notifyDaemonDidStart:${port}`); + } + notifyDaemonDidStop(): void { + this.events.push('notifyDaemonDidStop:'); + } + notifyConfigDidChange(event: ConfigState): void { + this.events.push(`notifyConfigDidChange:${JSON.stringify(event)}`); + } + notifyPlatformDidInstall(event: { item: BoardsPackage }): void { + this.events.push(`notifyPlatformDidInstall:${JSON.stringify(event)}`); + } + notifyPlatformDidUninstall(event: { item: BoardsPackage }): void { + this.events.push(`notifyPlatformDidUninstall:${JSON.stringify(event)}`); + } + notifyLibraryDidInstall(event: { + item: LibraryPackage | 'zip-install'; + }): void { + this.events.push(`notifyLibraryDidInstall:${JSON.stringify(event)}`); + } + notifyLibraryDidUninstall(event: { item: LibraryPackage }): void { + this.events.push(`notifyLibraryDidUninstall:${JSON.stringify(event)}`); + } + notifyDetectedPortsDidChange(event: { detectedPorts: DetectedPorts }): void { + this.events.push(`notifyAttachedBoardsDidChange:${JSON.stringify(event)}`); + } + notifyRecentSketchesDidChange(event: { sketches: Sketch[] }): void { + this.events.push(`notifyRecentSketchesDidChange:${JSON.stringify(event)}`); + } + dispose(): void { + this.events.push('dispose:'); + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars, unused-imports/no-unused-vars + setClient(client: NotificationServiceClient | undefined): void { + this.events.push('setClient:'); + } +} + +@injectable() +class TestResponseService implements ResponseService { + readonly outputMessages: OutputMessage[] = []; + readonly progressMessages: ProgressMessage[] = []; + + appendToOutput(message: OutputMessage): void { + this.outputMessages.push(message); + } + reportProgress(message: ProgressMessage): void { + this.progressMessages.push(message); + } +} + +class TestConfigDirUriProvider extends ConfigDirUriProvider { + constructor(private readonly configDirPath: string) { + super(); + } + + override configDirUri(): URI { + return FileUri.create(this.configDirPath); + } +} + +function shouldKeepTestFolder(): boolean { + return ( + typeof process.env.ARDUINO_IDE__KEEP_TEST_FOLDER === 'string' && + /true/i.test(process.env.ARDUINO_IDE__KEEP_TEST_FOLDER) + ); +} + +export function newTempConfigDirPath( + prefix = 'arduino-ide--slow-tests' +): string { + let tempDirPath; + if (shouldKeepTestFolder()) { + tempDirPath = tempPath(prefix); + mkdirSync(tempDirPath, { recursive: true }); + console.log( + `Detected ARDUINO_IDE__KEEP_TEST_FOLDER=true, keeping temporary test configuration folders: ${tempDirPath}` + ); + } else { + tempDirPath = tracked.mkdirSync(); + } + return join(tempDirPath, '.testArduinoIDE'); +} + +interface CreateBaseContainerParams { + readonly cliConfig?: CliConfig | (() => Promise<CliConfig>); + readonly configDirPath?: string; + readonly additionalBindings?: ( + bind: interfaces.Bind, + rebind: interfaces.Rebind + ) => void; +} + +export async function createBaseContainer( + params?: CreateBaseContainerParams +): Promise<Container> { + const configDirUriProvider = new TestConfigDirUriProvider( + params?.configDirPath || newTempConfigDirPath() + ); + if (params?.cliConfig) { + const config = + typeof params.cliConfig === 'function' + ? await params.cliConfig() + : params.cliConfig; + await writeCliConfigFile( + FileUri.fsPath(configDirUriProvider.configDirUri()), + config + ); + } + const container = new Container({ defaultScope: 'Singleton' }); + const module = new ContainerModule((bind, unbind, isBound, rebind) => { + bindCommon(bind, unbind, isBound, rebind); + bind(CoreClientProvider).toSelf().inSingletonScope(); + bind(CoreServiceImpl).toSelf().inSingletonScope(); + bind(CoreService).toService(CoreServiceImpl); + bind(BoardsServiceImpl).toSelf().inSingletonScope(); + bind(BoardsService).toService(BoardsServiceImpl); + bind(TestResponseService).toSelf().inSingletonScope(); + bind(ResponseService).toService(TestResponseService); + bind(MonitorManager).toSelf().inSingletonScope(); + bind(MonitorServiceFactory).toFactory( + ({ container }) => + (options: MonitorServiceFactoryOptions) => { + const child = container.createChild(); + child + .bind<MonitorServiceFactoryOptions>(MonitorServiceFactoryOptions) + .toConstantValue({ + ...options, + }); + child.bind(MonitorService).toSelf(); + return child.get<MonitorService>(MonitorService); + } + ); + bind(ConfigDirUriProvider).toConstantValue(configDirUriProvider); + bind(EnvVariablesServer).toSelf().inSingletonScope(); + bind(TheiaEnvVariablesServer).toService(EnvVariablesServer); + bind(SilentArduinoDaemon).toSelf().inSingletonScope(); + bind(ArduinoDaemon).toService(SilentArduinoDaemon); + bind(ArduinoDaemonImpl).toService(SilentArduinoDaemon); + bind(TestNotificationServiceServer).toSelf().inSingletonScope(); + bind(NotificationServiceServer).toService(TestNotificationServiceServer); + bind(ConfigServiceImpl).toSelf().inSingletonScope(); + bind(ConfigService).toService(ConfigServiceImpl); + bind(TestBoardDiscovery).toSelf().inSingletonScope(); + bind(BoardDiscovery).toService(TestBoardDiscovery); + bind(IsTempSketch).toSelf().inSingletonScope(); + bind(SketchesServiceImpl).toSelf().inSingletonScope(); + bind(SketchesService).toService(SketchesServiceImpl); + bind(SettingsReader).toSelf().inSingletonScope(); + bind(LibraryServiceImpl).toSelf().inSingletonScope(); + bind(LibraryService).toService(LibraryServiceImpl); + bind(ProcessUtils).toSelf().inSingletonScope(); + params?.additionalBindings?.(bind, rebind); + }); + container.load(module); + return container; +} + +async function writeCliConfigFile( + containerFolderPath: string, + cliConfig: CliConfig +): Promise<void> { + await fs.mkdir(containerFolderPath, { recursive: true }); + const yaml = dumpYaml(cliConfig); + const cliConfigPath = join(containerFolderPath, CLI_CONFIG); + await fs.writeFile(cliConfigPath, yaml); + console.debug(`Created CLI configuration file at ${cliConfigPath}: +${yaml} +`); +} + +export async function createCliConfig( + configDirPath: string, + configOverrides: Partial<DefaultCliConfig> = {} +): Promise<DefaultCliConfig> { + const directories = { + data: join(configDirPath, 'data', 'Arduino15'), + downloads: join(configDirPath, 'data', 'Arduino15', 'staging'), + user: join(configDirPath, 'user', 'Arduino'), + }; + for (const directoryPath of Object.values(directories)) { + await fs.mkdir(directoryPath, { recursive: true }); + } + const config = { directories }; + const mergedOverrides = deepmerge(configOverrides, <DefaultCliConfig>{ + logging: { level: 'trace' }, + }); + return deepmerge(config, mergedOverrides); +} + +export async function startDaemon( + container: Container, + toDispose: DisposableCollection, + startCustomizations?: ( + container: Container, + toDispose: DisposableCollection + ) => Promise<void> +): Promise<void> { + const daemon = container.get<ArduinoDaemonImpl>(ArduinoDaemonImpl); + const configService = container.get<ConfigServiceImpl>(ConfigServiceImpl); + const coreClientProvider = + container.get<CoreClientProvider>(CoreClientProvider); + toDispose.push(Disposable.create(() => daemon.stop())); + configService.onStart(); + daemon.onStart(); + await Promise.all([ + waitForEvent(daemon.onDaemonStarted, 10_000), + coreClientProvider.client, + ]); + if (startCustomizations) { + await startCustomizations(container, toDispose); + } +} diff --git a/arduino-ide-extension/src/test/node/settings.reader.test.ts b/arduino-ide-extension/src/test/node/settings.reader.test.ts new file mode 100644 index 000000000..65e6b7a7e --- /dev/null +++ b/arduino-ide-extension/src/test/node/settings.reader.test.ts @@ -0,0 +1,45 @@ +import { expect } from 'chai'; +import { parse } from '../../node/settings-reader'; + +describe('settings-reader', () => { + describe('parse', () => { + it('should handle comments', () => { + const actual = parse(` +{ + "alma": "korte", + // comment + "szilva": false +}`); + expect(actual).to.be.deep.equal({ + alma: 'korte', + szilva: false, + }); + }); + + it('should handle trailing comma', () => { + const actual = parse(` +{ + "alma": "korte", + "szilva": 123, +}`); + expect(actual).to.be.deep.equal({ + alma: 'korte', + szilva: 123, + }); + }); + + it('should parse empty', () => { + const actual = parse(''); + expect(actual).to.be.deep.equal({}); + }); + + it('should parse to undefined when parse has failed', () => { + const actual = parse(` +{ + alma:: 'korte' + trash +}`); + expect(actual).to.be.undefined; + }); + }); +}); diff --git a/arduino-ide-extension/src/test/node/sketches-service-impl.slow-test.ts b/arduino-ide-extension/src/test/node/sketches-service-impl.slow-test.ts new file mode 100644 index 000000000..c97387743 --- /dev/null +++ b/arduino-ide-extension/src/test/node/sketches-service-impl.slow-test.ts @@ -0,0 +1,597 @@ +import { + Disposable, + DisposableCollection, +} from '@theia/core/lib/common/disposable'; +import { FileUri } from '@theia/core/lib/common/file-uri'; +import { isWindows } from '@theia/core/lib/common/os'; +import { URI } from '@theia/core/lib/common/uri'; +import { Container } from '@theia/core/shared/inversify'; +import { expect } from 'chai'; +import { rejects } from 'node:assert/strict'; +import { promises as fs } from 'node:fs'; +import path, { basename, join } from 'node:path'; +import { rimrafSync } from 'rimraf'; +import temp from 'temp'; +import { Sketch, SketchesError, SketchesService } from '../../common/protocol'; +import { + SketchesServiceImpl, + isAccessibleSketchPath, +} from '../../node/sketches-service-impl'; +import { ErrnoException } from '../../node/utils/errors'; +import { createBaseContainer, startDaemon } from './node-test-bindings'; + +const testTimeout = 10_000; + +describe('isAccessibleSketchPath', () => { + let tracked: typeof temp; + let testDirPath: string; + + before(() => (tracked = temp.track())); + beforeEach(() => (testDirPath = tracked.mkdirSync())); + after(() => tracked.cleanupSync()); + + it('should be accessible by the main sketch file', async () => { + const sketchFolderPath = join(testDirPath, 'my_sketch'); + const mainSketchFilePath = join(sketchFolderPath, 'my_sketch.ino'); + await fs.mkdir(sketchFolderPath, { recursive: true }); + await fs.writeFile(mainSketchFilePath, '', { encoding: 'utf8' }); + const actual = await isAccessibleSketchPath(mainSketchFilePath); + expect(actual).to.be.equal(mainSketchFilePath); + }); + + it('should be accessible by the sketch folder', async () => { + const sketchFolderPath = join(testDirPath, 'my_sketch'); + const mainSketchFilePath = join(sketchFolderPath, 'my_sketch.ino'); + await fs.mkdir(sketchFolderPath, { recursive: true }); + await fs.writeFile(mainSketchFilePath, '', { encoding: 'utf8' }); + const actual = await isAccessibleSketchPath(sketchFolderPath); + expect(actual).to.be.equal(mainSketchFilePath); + }); + + it('should be accessible when the sketch folder and main sketch file basenames are different', async () => { + const sketchFolderPath = join(testDirPath, 'my_sketch'); + const mainSketchFilePath = join(sketchFolderPath, 'other_name_sketch.ino'); + await fs.mkdir(sketchFolderPath, { recursive: true }); + await fs.writeFile(mainSketchFilePath, '', { encoding: 'utf8' }); + const actual = await isAccessibleSketchPath(sketchFolderPath); + expect(actual).to.be.equal(mainSketchFilePath); + }); + + it('should be deterministic (and sort by basename) when multiple sketch files exist', async () => { + const sketchFolderPath = join(testDirPath, 'my_sketch'); + const aSketchFilePath = join(sketchFolderPath, 'a.ino'); + const bSketchFilePath = join(sketchFolderPath, 'b.ino'); + await fs.mkdir(sketchFolderPath, { recursive: true }); + await fs.writeFile(aSketchFilePath, '', { encoding: 'utf8' }); + await fs.writeFile(bSketchFilePath, '', { encoding: 'utf8' }); + const actual = await isAccessibleSketchPath(sketchFolderPath); + expect(actual).to.be.equal(aSketchFilePath); + }); + + it('should ignore EACCESS', async function () { + const sketchFolderPath = join(testDirPath, 'my_sketch'); + const mainSketchFilePath = join(sketchFolderPath, 'my_sketch.ino'); + await fs.mkdir(sketchFolderPath, { recursive: true }); + await fs.writeFile(mainSketchFilePath, '', { encoding: 'utf8' }); + await fs.chmod(mainSketchFilePath, 0o000); // remove all permissions + try { + await fs.readFile(mainSketchFilePath); + // If reading the file without sufficient permissions does not result in EACCESS error, do not run the test. + // For example, a `stat` syscall does not result in an EACCESS on Windows after stripping the file permissions. + // an `open` syscall would, but IDE2 on purpose does not check the files. + // the sketch files are provided by the CLI after loading the sketch. + console.info( + 'Skip. Reading the file content without permissions was successful.' + ); + return this.skip(); + } catch (err) { + expect( + ErrnoException.isEACCES(err), + `Expected an error with EACCES code. Got: ${ + typeof err === 'object' ? JSON.stringify(err) : err + }` + ).to.be.true; + } + const actual = await isAccessibleSketchPath(sketchFolderPath); + expect(actual).to.be.equal(mainSketchFilePath); + }); + + it("should not be accessible when there are no '.ino' files in the folder", async () => { + const sketchFolderPath = join(testDirPath, 'my_sketch'); + await fs.mkdir(sketchFolderPath, { recursive: true }); + const actual = await isAccessibleSketchPath(sketchFolderPath); + expect(actual).to.be.undefined; + }); + + it("should not be accessible when the main sketch file extension is not '.ino'", async () => { + const sketchFolderPath = join(testDirPath, 'my_sketch'); + const mainSketchFilePath = join(sketchFolderPath, 'my_sketch.cpp'); + await fs.mkdir(sketchFolderPath, { recursive: true }); + await fs.writeFile(mainSketchFilePath, '', { encoding: 'utf8' }); + const actual = await isAccessibleSketchPath(sketchFolderPath); + expect(actual).to.be.undefined; + }); + + it('should handle ENOENT', async () => { + const sketchFolderPath = join(testDirPath, 'my_sketch'); + const actual = await isAccessibleSketchPath(sketchFolderPath); + expect(actual).to.be.undefined; + }); + + it('should handle UNKNOWN (Windows)', async function () { + if (!isWindows) { + return this.skip(); + } + this.timeout(60_000); + const actual = await isAccessibleSketchPath('\\\\10.0.0.200\\path'); + expect(actual).to.be.undefined; + }); +}); + +describe('sketches-service-impl', () => { + let container: Container; + let toDispose: DisposableCollection; + + before(async () => { + toDispose = new DisposableCollection(); + container = await createContainer(); + await start(container, toDispose); + }); + + after(() => toDispose.dispose()); + + describe('copy', function () { + this.timeout(testTimeout); + this.slow(250); + + it('should error when the destination sketch folder name is invalid', async () => { + const sketchesService = + container.get<SketchesServiceImpl>(SketchesService); + const tempDirPath = await sketchesService['createTempFolder'](); + const destinationPath = join(tempDirPath, 'invalid with spaces'); + const sketch = await sketchesService.createNewSketch(); + toDispose.push(disposeSketch(sketch)); + await rejects( + sketchesService.copy(sketch, { + destinationUri: FileUri.create(destinationPath).toString(), + }), + SketchesError.InvalidFolderName.is + ); + }); + + it('should error when the destination sketch folder name collides with an existing sketch file name', async () => { + const sketchesService = + container.get<SketchesServiceImpl>(SketchesService); + const tempDirPath = await sketchesService['createTempFolder'](); + const destinationPath = join(tempDirPath, 'ExistingSketchFile'); + let sketch = await sketchesService.createNewSketch(); + toDispose.push(disposeSketch(sketch)); + const sourcePath = FileUri.fsPath(sketch.uri); + const otherInoBasename = 'ExistingSketchFile.ino'; + const otherInoPath = join(sourcePath, otherInoBasename); + await fs.writeFile(otherInoPath, '// a comment', { encoding: 'utf8' }); + + sketch = await sketchesService.loadSketch(sketch.uri); + expect(Sketch.isInSketch(FileUri.create(otherInoPath), sketch)).to.be + .true; + + await rejects( + sketchesService.copy(sketch, { + destinationUri: FileUri.create(destinationPath).toString(), + }), + (reason) => { + return ( + typeof reason === 'object' && + reason !== null && + SketchesError.SketchAlreadyContainsThisFile.is(reason) && + reason.data.existingSketchFilename === otherInoBasename + ); + } + ); + }); + + it('should copy a sketch when the destination does not exist', async () => { + const sketchesService = + container.get<SketchesServiceImpl>(SketchesService); + const tempDirPath = await sketchesService['createTempFolder'](); + const destinationPath = join(tempDirPath, 'Does_Not_Exist_but_valid'); + await rejects(fs.readdir(destinationPath), ErrnoException.isENOENT); + let sketch = await sketchesService.createNewSketch(); + toDispose.push(disposeSketch(sketch)); + const sourcePath = FileUri.fsPath(sketch.uri); + const libBasename = 'lib.cpp'; + const libContent = 'lib content'; + const libPath = join(sourcePath, libBasename); + await fs.writeFile(libPath, libContent, { encoding: 'utf8' }); + const headerBasename = 'header.h'; + const headerContent = 'header content'; + const headerPath = join(sourcePath, headerBasename); + await fs.writeFile(headerPath, headerContent, { encoding: 'utf8' }); + + sketch = await sketchesService.loadSketch(sketch.uri); + expect(Sketch.isInSketch(FileUri.create(libPath), sketch)).to.be.true; + expect(Sketch.isInSketch(FileUri.create(headerPath), sketch)).to.be.true; + + const copied = await sketchesService.copy(sketch, { + destinationUri: FileUri.create(destinationPath).toString(), + }); + toDispose.push(disposeSketch(copied)); + expect(copied.name).to.be.equal(basename(destinationPath)); + expect( + Sketch.isInSketch( + FileUri.create( + join(destinationPath, `${basename(destinationPath)}.ino`) + ), + copied + ) + ).to.be.true; + expect( + Sketch.isInSketch( + FileUri.create(join(destinationPath, libBasename)), + copied + ) + ).to.be.true; + expect( + Sketch.isInSketch( + FileUri.create(join(destinationPath, headerBasename)), + copied + ) + ).to.be.true; + }); + + it("should copy only sketch files if 'onlySketchFiles' is true", async () => { + const sketchesService = + container.get<SketchesServiceImpl>(SketchesService); + const tempDirPath = await sketchesService['createTempFolder'](); + const destinationPath = join(tempDirPath, 'OnlySketchFiles'); + let sketch = await sketchesService.createNewSketch(); + toDispose.push(disposeSketch(sketch)); + const sourcePath = FileUri.fsPath(sketch.uri); + const libBasename = 'lib.cpp'; + const libContent = 'lib content'; + const libPath = join(sourcePath, libBasename); + await fs.writeFile(libPath, libContent, { encoding: 'utf8' }); + const headerBasename = 'header.h'; + const headerContent = 'header content'; + const headerPath = join(sourcePath, headerBasename); + await fs.writeFile(headerPath, headerContent, { encoding: 'utf8' }); + const logBasename = 'inols-clangd-err.log'; + const logContent = 'log file content'; + const logPath = join(sourcePath, logBasename); + await fs.writeFile(logPath, logContent, { encoding: 'utf8' }); + const srcPath = join(sourcePath, 'src'); + await fs.mkdir(srcPath, { recursive: true }); + const libInSrcBasename = 'lib_in_src.cpp'; + const libInSrcContent = 'lib in src content'; + const libInSrcPath = join(srcPath, libInSrcBasename); + await fs.writeFile(libInSrcPath, libInSrcContent, { encoding: 'utf8' }); + const logInSrcBasename = 'inols-clangd-err_in_src.log'; + const logInSrcContent = 'log file content in src'; + const logInSrcPath = join(srcPath, logInSrcBasename); + await fs.writeFile(logInSrcPath, logInSrcContent, { encoding: 'utf8' }); + + sketch = await sketchesService.loadSketch(sketch.uri); + expect(Sketch.isInSketch(FileUri.create(libPath), sketch)).to.be.true; + expect(Sketch.isInSketch(FileUri.create(headerPath), sketch)).to.be.true; + expect(Sketch.isInSketch(FileUri.create(logPath), sketch)).to.be.false; + expect(Sketch.isInSketch(FileUri.create(libInSrcPath), sketch)).to.be + .true; + expect(Sketch.isInSketch(FileUri.create(logInSrcPath), sketch)).to.be + .false; + const reloadedLogContent = await fs.readFile(logPath, { + encoding: 'utf8', + }); + expect(reloadedLogContent).to.be.equal(logContent); + + const copied = await sketchesService.copy(sketch, { + destinationUri: FileUri.create(destinationPath).toString(), + onlySketchFiles: true, + }); + toDispose.push(disposeSketch(copied)); + expect(copied.name).to.be.equal(basename(destinationPath)); + expect( + Sketch.isInSketch( + FileUri.create( + join(destinationPath, `${basename(destinationPath)}.ino`) + ), + copied + ) + ).to.be.true; + expect( + Sketch.isInSketch( + FileUri.create(join(destinationPath, libBasename)), + copied + ) + ).to.be.true; + expect( + Sketch.isInSketch( + FileUri.create(join(destinationPath, headerBasename)), + copied + ) + ).to.be.true; + expect( + Sketch.isInSketch( + FileUri.create(join(destinationPath, logBasename)), + copied + ) + ).to.be.false; + expect( + Sketch.isInSketch( + FileUri.create(join(destinationPath, 'src', libInSrcBasename)), + copied + ) + ).to.be.true; + expect( + Sketch.isInSketch( + FileUri.create(join(destinationPath, 'src', logInSrcBasename)), + copied + ) + ).to.be.false; + await rejects( + fs.readFile(join(destinationPath, logBasename)), + ErrnoException.isENOENT + ); + }); + + it('should copy sketch if the main sketch file has pde extension (#2377)', async () => { + const sketchesService = + container.get<SketchesServiceImpl>(SketchesService); + let sketch = await sketchesService.createNewSketch(); + toDispose.push(disposeSketch(sketch)); + expect(sketch.mainFileUri.endsWith('.ino')).to.be.true; + + // Create a sketch and rename the main sketch file to .pde + const mainSketchFilePathIno = FileUri.fsPath(new URI(sketch.mainFileUri)); + const sketchFolderPath = path.dirname(mainSketchFilePathIno); + const mainSketchFilePathPde = path.join( + sketchFolderPath, + `${basename(sketchFolderPath)}.pde` + ); + await fs.rename(mainSketchFilePathIno, mainSketchFilePathPde); + + sketch = await sketchesService.loadSketch(sketch.uri); + expect(sketch.mainFileUri.endsWith('.pde')).to.be.true; + + const tempDirPath = await sketchesService['createTempFolder'](); + const destinationPath = join(tempDirPath, 'GH-2377'); + const destinationUri = FileUri.create(destinationPath).toString(); + + await sketchesService.copy(sketch, { + destinationUri, + }); + + const copiedSketch = await sketchesService.loadSketch(destinationUri); + expect(copiedSketch.mainFileUri.endsWith('.ino')).to.be.true; + }); + + it('should copy sketch inside the sketch folder', async () => { + const sketchesService = + container.get<SketchesServiceImpl>(SketchesService); + let sketch = await sketchesService.createNewSketch(); + const destinationPath = join(FileUri.fsPath(sketch.uri), 'nested_copy'); + toDispose.push(disposeSketch(sketch)); + const sourcePath = FileUri.fsPath(sketch.uri); + const libBasename = 'lib.cpp'; + const libContent = 'lib content'; + const libPath = join(sourcePath, libBasename); + await fs.writeFile(libPath, libContent, { encoding: 'utf8' }); + const headerBasename = 'header.h'; + const headerContent = 'header content'; + const headerPath = join(sourcePath, headerBasename); + await fs.writeFile(headerPath, headerContent, { encoding: 'utf8' }); + + sketch = await sketchesService.loadSketch(sketch.uri); + expect(Sketch.isInSketch(FileUri.create(libPath), sketch)).to.be.true; + expect(Sketch.isInSketch(FileUri.create(headerPath), sketch)).to.be.true; + + const copied = await sketchesService.copy(sketch, { + destinationUri: FileUri.create(destinationPath).toString(), + }); + toDispose.push(disposeSketch(copied)); + expect(copied.name).to.be.equal(basename(destinationPath)); + expect( + Sketch.isInSketch( + FileUri.create( + join(destinationPath, `${basename(destinationPath)}.ino`) + ), + copied + ) + ).to.be.true; + expect( + Sketch.isInSketch( + FileUri.create(join(destinationPath, libBasename)), + copied + ) + ).to.be.true; + expect( + Sketch.isInSketch( + FileUri.create(join(destinationPath, headerBasename)), + copied + ) + ).to.be.true; + }); + + it('should not modify the subfolder structure', async () => { + const sketchesService = + container.get<SketchesServiceImpl>(SketchesService); + const tempDirPath = await sketchesService['createTempFolder'](); + const destinationPath = join(tempDirPath, 'HasSubfolders_copy'); + await fs.mkdir(destinationPath, { recursive: true }); + let sketch = await sketchesService.createNewSketch('HasSubfolders'); + toDispose.push(disposeSketch(sketch)); + + const sourcePath = FileUri.fsPath(sketch.uri); + const srcPath = join(sourcePath, 'src'); + await fs.mkdir(srcPath, { recursive: true }); + const headerPath = join(srcPath, 'FomSubfolder.h'); + await fs.writeFile(headerPath, '// empty', { encoding: 'utf8' }); + + sketch = await sketchesService.loadSketch(sketch.uri); + + expect(sketch.mainFileUri).to.be.equal( + FileUri.create(join(sourcePath, 'HasSubfolders.ino')).toString() + ); + expect(sketch.additionalFileUris).to.be.deep.equal([ + FileUri.create(join(srcPath, 'FomSubfolder.h')).toString(), + ]); + expect(sketch.otherSketchFileUris).to.be.empty; + expect(sketch.rootFolderFileUris).to.be.empty; + + const destinationUri = FileUri.create(destinationPath).toString(); + const copySketch = await sketchesService.copy(sketch, { destinationUri }); + toDispose.push(disposeSketch(copySketch)); + expect(copySketch.mainFileUri).to.be.equal( + FileUri.create( + join(destinationPath, 'HasSubfolders_copy.ino') + ).toString() + ); + expect(copySketch.additionalFileUris).to.be.deep.equal([ + FileUri.create( + join(destinationPath, 'src', 'FomSubfolder.h') + ).toString(), + ]); + expect(copySketch.otherSketchFileUris).to.be.empty; + expect(copySketch.rootFolderFileUris).to.be.empty; + + const actualHeaderContent = await fs.readFile( + join(destinationPath, 'src', 'FomSubfolder.h'), + { encoding: 'utf8' } + ); + expect(actualHeaderContent).to.be.equal('// empty'); + }); + + it('should copy sketch with overwrite when source and destination sketch folder names are the same', async function () { + this.timeout(testTimeout); + const sketchesService = + container.get<SketchesServiceImpl>(SketchesService); + const sketchFolderName = 'alma'; + const contentOne = 'korte'; + const contentTwo = 'szilva'; + const [sketchOne, sketchTwo] = await Promise.all([ + sketchesService.createNewSketch(sketchFolderName, contentOne), + sketchesService.createNewSketch(sketchFolderName, contentTwo), + ]); + toDispose.push(disposeSketch(sketchOne, sketchTwo)); + const [mainFileContentOne, mainFileContentTwo] = await Promise.all([ + mainFileContentOf(sketchOne), + mainFileContentOf(sketchTwo), + ]); + expect(mainFileContentOne).to.be.equal(contentOne); + expect(mainFileContentTwo).to.be.equal(contentTwo); + + await sketchesService.copy(sketchOne, { destinationUri: sketchTwo.uri }); + const [mainFileContentOneAfterCopy, mainFileContentTwoAfterCopy] = + await Promise.all([ + mainFileContentOf(sketchOne), + mainFileContentOf(sketchTwo), + ]); + expect(mainFileContentOneAfterCopy).to.be.equal(contentOne); + expect(mainFileContentTwoAfterCopy).to.be.equal(contentOne); + }); + + ( + [ + ['(', ')', 'parentheses'], + ['[', ']', 'brackets'], + ['{', '}', 'braces'], + [ + '<', + '>', + 'lt+gt', + { + predicate: () => isWindows, + why: '< (less than) and > (greater than) are reserved characters on Windows (https://learn.microsoft.com/en-us/windows/win32/fileio/naming-a-file#naming-conventions)', + }, + ], + ] as [ + open: string, + close: string, + name: string, + skip?: { predicate: () => boolean; why: string } + ][] + ).map(([open, close, name, skip]) => + it(`should copy a sketch when the path contains ${name} in the sketch folder path: '${open},${close}'`, async function () { + if (skip) { + const { predicate, why } = skip; + if (predicate()) { + console.info(why); + return this.skip(); + } + } + this.timeout(testTimeout); + const sketchesService = + container.get<SketchesServiceImpl>(SketchesService); + const content = `// special content when ${name} are in the path`; + const tempRoot = await sketchesService['createTempFolder'](); + toDispose.push(disposeFolder(tempRoot)); + const sketch = await sketchesService.createNewSketch( + 'punctuation_marks', + content + ); + toDispose.push(disposeSketch(sketch)); + + // the destination path contains punctuation marks + const tempRootUri = FileUri.create(tempRoot); + const testSegment = `path segment with ${open}${name}${close}`; + const firstDestinationUri = tempRootUri + .resolve(testSegment) + .resolve('first') + .resolve(sketch.name); + + const firstSketchCopy = await sketchesService.copy(sketch, { + destinationUri: firstDestinationUri.toString(), + }); + expect(firstSketchCopy).to.be.not.undefined; + expect(firstSketchCopy.mainFileUri).to.be.equal( + firstDestinationUri.resolve(`${sketch.name}.ino`).toString() + ); + const firstCopyContent = await mainFileContentOf(firstSketchCopy); + expect(firstCopyContent).to.be.equal(content); + + // the source path contains punctuation marks. yes, the target too, but it does not matter + const secondDestinationUri = tempRootUri + .resolve(testSegment) + .resolve('second') + .resolve(sketch.name); + const secondSketchCopy = await sketchesService.copy(firstSketchCopy, { + destinationUri: secondDestinationUri.toString(), + }); + expect(secondSketchCopy).to.be.not.undefined; + expect(secondSketchCopy.mainFileUri).to.be.equal( + secondDestinationUri.resolve(`${sketch.name}.ino`).toString() + ); + const secondCopyContent = await mainFileContentOf(secondSketchCopy); + expect(secondCopyContent).to.be.equal(content); + }) + ); + }); +}); + +function disposeSketch(...sketch: Sketch[]): Disposable { + return disposeFolder(...sketch.map(({ uri }) => FileUri.fsPath(uri))); +} + +function disposeFolder(...paths: string[]): Disposable { + return new DisposableCollection( + ...paths.map((path) => + Disposable.create(() => rimrafSync(path, { maxRetries: 5 })) + ) + ); +} + +async function mainFileContentOf(sketch: Sketch): Promise<string> { + return fs.readFile(FileUri.fsPath(sketch.mainFileUri), { + encoding: 'utf8', + }); +} + +async function start( + container: Container, + toDispose: DisposableCollection +): Promise<void> { + await startDaemon(container, toDispose); +} + +async function createContainer(): Promise<Container> { + return createBaseContainer(); +} diff --git a/arduino-ide-extension/src/test/node/sketches-service-impl.test.ts b/arduino-ide-extension/src/test/node/sketches-service-impl.test.ts new file mode 100644 index 000000000..e679b9217 --- /dev/null +++ b/arduino-ide-extension/src/test/node/sketches-service-impl.test.ts @@ -0,0 +1,174 @@ +import type { Mutable } from '@theia/core/lib/common/types'; +import { FileUri } from '@theia/core/lib/common/file-uri'; +import stableJsonStringify from 'fast-json-stable-stringify'; +import assert from 'node:assert/strict'; +import { basename, join } from 'node:path'; +import { SketchContainer, SketchRef } from '../../common/protocol'; +import { discoverSketches } from '../../node/sketches-service-impl'; + +const testSketchbook = join( + __dirname, + '..', + '..', + '..', + 'src', + 'test', + 'node', + '__test_sketchbook__' +); +const sketchFolderAsSketchbook = join(testSketchbook, 'a_sketch'); +const emptySketchbook = join(testSketchbook, 'empty'); + +describe('discover-sketches', () => { + it('should recursively discover all sketches in a folder', async () => { + const actual = await discoverSketches( + testSketchbook, + SketchContainer.create('test') + ); + containersDeepEquals( + actual, + expectedTestSketchbookContainer( + testSketchbook, + testSketchbookContainerTemplate + ) + ); + }); + + it('should handle when the sketchbook is a sketch folder', async () => { + const actual = await discoverSketches( + sketchFolderAsSketchbook, + SketchContainer.create('foo-bar') + ); + const name = basename(sketchFolderAsSketchbook); + containersDeepEquals(actual, { + children: [], + label: 'foo-bar', + sketches: [ + { + name, + uri: FileUri.create(sketchFolderAsSketchbook).toString(), + }, + ], + }); + }); + + it('should handle empty sketchbook', async () => { + const actual = await discoverSketches( + emptySketchbook, + SketchContainer.create('empty') + ); + containersDeepEquals(actual, SketchContainer.create('empty')); + }); +}); + +function containersDeepEquals( + actual: SketchContainer, + expected: SketchContainer +) { + const stableActual = JSON.parse(stableJsonStringify(actual)); + const stableExpected = JSON.parse(stableJsonStringify(expected)); + assert.deepStrictEqual(stableActual, stableExpected); // TODO: get rid of `fast-json-stable-stringify` +} + +/** + * A `template://` schema will be resolved against the actual `rootPath` location at runtime. + * For example if `rootPath` is `/path/to/a/folder/` and the template URI is `template://foo/bar/My_Sketch/My_Sketch.ino`, + * then the resolved, expected URI will be `file:///path/to/a/folder/foo/bar/My_Sketch/My_Sketch.ino`. + * The path of a template URI must be relative. + */ +function expectedTestSketchbookContainer( + rootPath: string, + containerTemplate: SketchContainer, + label?: string +): SketchContainer { + let rootUri = FileUri.create(rootPath).toString(); + if (rootUri.charAt(rootUri.length - 1) !== '/') { + rootUri += '/'; + } + const adjustUri = (sketch: Mutable<SketchRef>) => { + assert.strictEqual(sketch.uri.startsWith('template://'), true); + assert.strictEqual(sketch.uri.startsWith('template:///'), false); + sketch.uri = sketch.uri.replace('template://', rootUri).toString(); + return sketch; + }; + const adjustContainer = (container: SketchContainer) => { + container.sketches.forEach(adjustUri); + container.children.forEach(adjustContainer); + return <Mutable<SketchContainer>>container; + }; + const container = adjustContainer(containerTemplate); + if (label) { + container.label = label; + } + return container; +} + +const testSketchbookContainerTemplate: SketchContainer = { + label: 'test', + children: [ + { + label: 'project1', + children: [ + { + label: 'CodeA', + children: [], + sketches: [ + { + name: 'version1A', + uri: 'template://project1/CodeA/version1A', + }, + { + name: 'version2A', + uri: 'template://project1/CodeA/version2A', + }, + ], + }, + { + label: 'CodeB', + children: [], + sketches: [ + { + name: 'version1B', + uri: 'template://project1/CodeB/version1B', + }, + { + name: 'version2B', + uri: 'template://project1/CodeB/version2B', + }, + ], + }, + ], + sketches: [], + }, + { + label: 'nested_4', + children: [ + { + label: 'nested_3', + children: [], + sketches: [ + { + name: 'nested_2', + uri: 'template://nested_4/nested_3/nested_2', + }, + ], + }, + ], + sketches: [], + }, + ], + sketches: [ + { + name: 'bar++', + uri: 'template://bar%2B%2B', + }, + { + name: 'bar++ 2', + uri: 'template://bar%2B%2B%202', + }, + { + name: 'a_sketch', + uri: 'template://a_sketch', + }, + ], +}; diff --git a/arduino-ide-extension/src/test/utils.ts b/arduino-ide-extension/src/test/utils.ts index 799081227..148649126 100644 --- a/arduino-ide-extension/src/test/utils.ts +++ b/arduino-ide-extension/src/test/utils.ts @@ -1,3 +1,6 @@ -export function tick(): Promise<void> { - return new Promise((res) => setTimeout(res, 1)); +import { Emitter, Event } from '@theia/core/lib/common/event'; + +const neverEmitter = new Emitter<unknown>(); +export function never<T = void>(): Event<T> { + return neverEmitter.event as Event<T>; } diff --git a/arduino-ide-extension/tsconfig.json b/arduino-ide-extension/tsconfig.json index 31b89c625..00bb386a7 100644 --- a/arduino-ide-extension/tsconfig.json +++ b/arduino-ide-extension/tsconfig.json @@ -1,7 +1,5 @@ { "compilerOptions": { - "declaration": true, - "declarationMap": true, "noImplicitAny": true, "noEmitOnError": true, "noImplicitThis": true, @@ -11,23 +9,15 @@ "experimentalDecorators": true, "downlevelIteration": true, "emitDecoratorMetadata": true, - "module": "commonjs", - "moduleResolution": "node", + "module": "Node16", + "moduleResolution": "node16", "resolveJsonModule": true, "target": "ES2017", "outDir": "lib", - "lib": [ - "ES2017", - "dom" - ], + "lib": ["ES2017", "dom"], "jsx": "react", "sourceMap": true, "skipLibCheck": true }, - "include": [ - "src" - ], - "files": [ - "../node_modules/nsfw/index.d.ts" - ] + "include": ["src"], } diff --git a/browser-app/package.json b/browser-app/package.json deleted file mode 100644 index c7a9dacd3..000000000 --- a/browser-app/package.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "private": true, - "name": "browser-app", - "version": "2.0.0", - "license": "AGPL-3.0-or-later", - "dependencies": { - "@theia/core": "1.25.0", - "@theia/debug": "1.25.0", - "@theia/editor": "1.25.0", - "@theia/file-search": "1.25.0", - "@theia/filesystem": "1.25.0", - "@theia/keymaps": "1.25.0", - "@theia/messages": "1.25.0", - "@theia/monaco": "1.25.0", - "@theia/navigator": "1.25.0", - "@theia/plugin-ext": "1.25.0", - "@theia/plugin-ext-vscode": "1.25.0", - "@theia/preferences": "1.25.0", - "@theia/process": "1.25.0", - "@theia/terminal": "1.25.0", - "@theia/workspace": "1.25.0", - "arduino-ide-extension": "2.0.0" - }, - "devDependencies": { - "@theia/cli": "1.25.0" - }, - "scripts": { - "prepare": "theia build --mode development", - "start": "theia start --plugins=local-dir:../plugins", - "watch": "theia build --watch --mode development" - }, - "theia": { - "frontend": { - "config": { - "applicationName": "Arduino IDE", - "defaultTheme": "arduino-theme", - "preferences": { - "files.autoSave": "afterDelay", - "editor.minimap.enabled": false, - "editor.tabSize": 2, - "editor.scrollBeyondLastLine": false, - "editor.quickSuggestions": { - "other": false, - "comments": false, - "strings": false - }, - "breadcrumbs.enabled": false - } - } - }, - "backend": { - "config": { - "configDirName": ".arduinoIDE" - } - }, - "generator": { - "config": { - "preloadTemplate": "<div class='theia-preload' style='background-color: rgb(237, 241, 242);'></div>" - } - } - } -} diff --git a/browser-app/webpack.config.js b/browser-app/webpack.config.js deleted file mode 100644 index 38baa16f8..000000000 --- a/browser-app/webpack.config.js +++ /dev/null @@ -1,20 +0,0 @@ -/** - * This file can be edited to customize webpack configuration. - * To reset delete this file and rerun theia build again. - */ -// @ts-check -const config = require('./gen-webpack.config.js'); - -config.resolve.fallback['http'] = false; -config.resolve.fallback['fs'] = false; - -/** - * Expose bundled modules on window.theia.moduleName namespace, e.g. - * window['theia']['@theia/core/lib/common/uri']. - * Such syntax can be used by external code, for instance, for testing. -config.module.rules.push({ - test: /\.js$/, - loader: require.resolve('@theia/application-manager/lib/expose-loader') -}); */ - -module.exports = config; \ No newline at end of file diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md new file mode 100644 index 000000000..a1ca9e0c8 --- /dev/null +++ b/docs/CONTRIBUTING.md @@ -0,0 +1,29 @@ +<!-- Source: https://github.com/arduino/tooling-project-assets/blob/main/documentation-templates/contributor-guide/general/CONTRIBUTING.md --> + +# Contributor Guide + +Thanks for your interest in contributing to this project! + +There are several ways you can get involved: + +| Type of contribution | Contribution method | +| ----------------------------------------- | -------------------------------------------------------------------------------- | +| - Support<br/>- Question<br/>- Discussion | Post on the [**Arduino Forum**][forum] | +| - Bug report<br/>- Feature request | Issue report (see the guide [**here**][issues]) | +| Testing | Beta testing, PR review (see the guide [**here**][beta-testing]) | +| Translation | See the guide [**here**][translate] | +| - Bug fix<br/>- Enhancement | Pull request (see the guide [**here**][prs]) | +| Monetary | - [Donate][donate]<br/>- [Sponsor][sponsor]<br/>- [Buy official products][store] | + +[forum]: https://forum.arduino.cc +[issues]: contributor-guide/issues.md#issue-report-guide +[beta-testing]: contributor-guide/beta-testing.md#beta-testing-guide +[translate]: contributor-guide/translation.md#translator-guide +[prs]: contributor-guide/pull-requests.md#pull-request-guide +[donate]: https://www.arduino.cc/en/donate/ +[sponsor]: https://github.com/sponsors/arduino +[store]: https://store.arduino.cc + +## Resources + +- [**Development Guide**](development.md#development-guide) diff --git a/docs/README.md b/docs/README.md index c5d9cf00f..391c66267 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,43 +1,47 @@ -# Remote Sketchbook - -Arduino IDE provides a Remote Sketchbook feature that can be used to upload sketches to Arduino Cloud. -![](static/remote.png) - +# Cloud Sketchbook +Arduino IDE provides a Cloud Sketchbook feature that can be used to upload sketches to Arduino Cloud. +![](assets/remote.png) In order to use this feature, a user must be registered on [Arduino Cloud](https://store.arduino.cc/digital/create) and logged in. -This feature is completely optional and can be disabled in the IDE via the _"File > Advanced > Hide Remote Sketchbook"_ menu item. +This feature is completely optional and can be disabled in the IDE via the _"File > Advanced > Hide Cloud Sketchbook"_ menu item. ## Developer guide + A developer could use the content of this repo to create a customized version of this feature and implement a different remote storage as follows: ### 1. Changing remote connection parameters in the Preferences panel (be careful while editing the Preferences panel!) + Here a screenshot of the Preferences panel -![](static/preferences.png) -- The settings under _Arduino > Auth_ should be edited to match the OAuth2 configuration of your custom remote sketchbook storage -- The setting under _Arduino > Sketch Sync Endpoint_ should be edited to point to your custom remote sketchbook storage service -### 2. Implementing the Arduino Cloud Store APIs for your custom remote sketchbook storage +![](assets/preferences.png) + +- The settings under _Arduino > Auth_ should be edited to match the OAuth2 configuration of your custom cloud sketchbook storage +- The setting under _Arduino > Sketch Sync Endpoint_ should be edited to point to your custom cloud sketchbook storage service + +### 2. Implementing the Arduino Cloud Store APIs for your custom cloud sketchbook storage + Following the API Reference below: -| API Call | OpenAPI documentation | -| ------------- | ------------- | -| DELETE create/v2/files/d/$HOME/sketches_v2{posixPath} | https://api2.arduino.cc/create/docs#!/files95v2/files_v2_deletedir | -| DELETE create/v2/files/f/$HOME/sketches_v2{posixPath} | https://api2.arduino.cc/create/docs#!/files95v2/files_v2_deletefile | -| GET create/v2/files/d/$HOME/sketches_v2{posixPath} | https://api2.arduino.cc/create/docs#!/files95v2/files_v2_list | -| GET create/v2/files/f/$HOME/sketches_v2{posixPath} | https://api2.arduino.cc/create/docs#!/files95v2/files_v2_read | -| GET create/v2/sketches | https://api2.arduino.cc/create/docs#!/sketches95v2/sketches_v2_search | -| GET create/v2/sketches/byID/{id} | https://api2.arduino.cc/create/docs#!/sketches95v2/sketches_v2_byID | -| GET create/v2/sketches/byPath{path} | https://api2.arduino.cc/create/docs#!/sketches95v2/sketches_v2_byPath | -| POST create/v2/files/d/$HOME/sketches_v2{posixPath} | https://api2.arduino.cc/create/docs#!/files95v2/files_v2_mkdir | -| POST create/v2/files/f/$HOME/sketches_v2{posixPath} | https://api2.arduino.cc/create/docs#!/files95v2/files_v2_write | -| POST create/v2/sketches/{sketch.id} | https://api2.arduino.cc/create/docs#!/sketches95v2/sketches_v2_edit | -| POST create/v3/files/cp | https://api2.arduino.cc/create/docs#!/files95v3/files_v3_copy | -| POST create/v3/files/mv | https://api2.arduino.cc/create/docs#!/files95v3/files_v3_move | -| PUT create/v2/sketches | https://api2.arduino.cc/create/docs#!/sketches95v2/sketches_v2_create | +| API Call | OpenAPI documentation | +| ----------------------------------------------------- | --------------------------------------------------------------------- | +| DELETE create/v2/files/d/$HOME/sketches_v2{posixPath} | https://api2.arduino.cc/create/docs#!/files95v2/files_v2_deletedir | +| DELETE create/v2/files/f/$HOME/sketches_v2{posixPath} | https://api2.arduino.cc/create/docs#!/files95v2/files_v2_deletefile | +| GET create/v2/files/d/$HOME/sketches_v2{posixPath} | https://api2.arduino.cc/create/docs#!/files95v2/files_v2_list | +| GET create/v2/files/f/$HOME/sketches_v2{posixPath} | https://api2.arduino.cc/create/docs#!/files95v2/files_v2_read | +| GET create/v2/sketches | https://api2.arduino.cc/create/docs#!/sketches95v2/sketches_v2_search | +| GET create/v2/sketches/byID/{id} | https://api2.arduino.cc/create/docs#!/sketches95v2/sketches_v2_byID | +| GET create/v2/sketches/byPath{path} | https://api2.arduino.cc/create/docs#!/sketches95v2/sketches_v2_byPath | +| POST create/v2/files/d/$HOME/sketches_v2{posixPath} | https://api2.arduino.cc/create/docs#!/files95v2/files_v2_mkdir | +| POST create/v2/files/f/$HOME/sketches_v2{posixPath} | https://api2.arduino.cc/create/docs#!/files95v2/files_v2_write | +| POST create/v2/sketches/{sketch.id} | https://api2.arduino.cc/create/docs#!/sketches95v2/sketches_v2_edit | +| POST create/v3/files/cp | https://api2.arduino.cc/create/docs#!/files95v3/files_v3_copy | +| POST create/v3/files/mv | https://api2.arduino.cc/create/docs#!/files95v3/files_v3_move | +| PUT create/v2/sketches | https://api2.arduino.cc/create/docs#!/sketches95v2/sketches_v2_create | ## Build the Arduino IDE with this extension To build the Arduino IDE with this extension, run the following in a terminal. On Windows, use _Git Bash_. + ```sh ./bootstrap.sh -``` \ No newline at end of file +``` diff --git a/docs/advanced-usage.md b/docs/advanced-usage.md index bd5d96c3b..a21dad1a1 100644 --- a/docs/advanced-usage.md +++ b/docs/advanced-usage.md @@ -12,3 +12,57 @@ These advanced settings can be accessed by the following procedure: 1. Select the "**Preferences: Open Settings (UI)**" command from the menu. This will open a "**Preferences**" view in the IDE. Once you are finished adjusting settings, it can be closed by clicking the **X** icon on the "**Preferences**" tab. + +## 3rd party themes + +Arduino IDE is built on the [**Eclipse Theia** IDE framework](https://theia-ide.org/), which allows it to use [**VS Code**](https://code.visualstudio.com/) themes. + +--- + +❗ Arduino does not maintain or provide support for individual 3rd party themes. If you experience problems with a theme, report it to the theme's maintainer. + +--- + +### Obtaining themes + +A large selection of free VS Code themes are available from the **Visual Studio Marketplace** website: + +1. Find a theme you want to install: <br /> + https://marketplace.visualstudio.com/search?target=VSCode&category=Themes +1. Click on the theme to open its extension page. +1. Click the "**Download Extension**" link on the right side of the extension page. +1. Wait for the download to finish. + +### Installation + +1. If Arduino IDE is running, select **File > Quit** from the Arduino IDE menus to exit all windows. +1. Create a folder named `plugins` under Arduino IDE's configuration folder: + - **Windows:** + ```text + C:\Users\<username>\.arduinoIDE\ + ``` + (where `<username>` is your Windows username) + - **Linux:** + ```text + ~/.arduinoIDE/ + ``` + ❗ The `.arduinoIDE` folder is hidden by default in the file manager and terminal. + - **macOS:** + ```text + ~/.arduinoIDE/ + ``` + ❗ The `.arduinoIDE` folder is hidden by default. You can make it visible by pressing the <kbd>**Command**</kbd>+<kbd>**Shift**</kbd>+<kbd>**.**</kbd> keyboard shortcut. +1. Copy the downloaded theme file to the `plugins` folder you created. +1. Start Arduino IDE. +1. Select **File > Preferences** from the Arduino IDE menus. <br /> + The "**Preferences**" dialog will open. +1. Select the name of the new theme from the "**Theme**" menu in the "**Preferences**" dialog. +1. Click the "**OK**" button. + +### Uninstall + +If you later decide you would like to remove a 3rd party theme you installed, it can be done by following these instructions: + +1. If Arduino IDE is running, select **File > Quit** from the Arduino IDE menus to exit all windows. +1. Delete the theme's `.vsix` file from [the location you installed it to](#installation). <br /> + ⚠ Please be careful when deleting things from your computer. When in doubt, back up! diff --git a/docs/static/preferences.png b/docs/assets/preferences.png similarity index 100% rename from docs/static/preferences.png rename to docs/assets/preferences.png diff --git a/docs/static/remote.png b/docs/assets/remote.png similarity index 100% rename from docs/static/remote.png rename to docs/assets/remote.png diff --git a/docs/contributor-guide/assets/checks-tab.png b/docs/contributor-guide/assets/checks-tab.png new file mode 100644 index 000000000..ee1854952 Binary files /dev/null and b/docs/contributor-guide/assets/checks-tab.png differ diff --git a/docs/contributor-guide/assets/checks.png b/docs/contributor-guide/assets/checks.png new file mode 100644 index 000000000..888e711b4 Binary files /dev/null and b/docs/contributor-guide/assets/checks.png differ diff --git a/docs/contributor-guide/assets/tester-build-artifacts.png b/docs/contributor-guide/assets/tester-build-artifacts.png new file mode 100644 index 000000000..ab9dada84 Binary files /dev/null and b/docs/contributor-guide/assets/tester-build-artifacts.png differ diff --git a/docs/contributor-guide/assets/tester-build-link.png b/docs/contributor-guide/assets/tester-build-link.png new file mode 100644 index 000000000..136a47948 Binary files /dev/null and b/docs/contributor-guide/assets/tester-build-link.png differ diff --git a/docs/contributor-guide/beta-testing.md b/docs/contributor-guide/beta-testing.md new file mode 100644 index 000000000..487713f28 --- /dev/null +++ b/docs/contributor-guide/beta-testing.md @@ -0,0 +1,108 @@ +<!-- Source: https://github.com/arduino/tooling-project-assets/blob/main/documentation-templates/contributor-guide/application/contributor-guide/beta-testing.md --> + +# Beta Testing Guide + +Beta testing of development versions is a valuable contribution to the project. You can help to ensure the quality of the production release that will be distributed to the user community. + +Builds of the project are automatically created after every relevant change to the project in order to make it easy for anyone to participate in the testing effort. + +--- + +❗ Make sure to always download the newest available tester build in order to ensure effective results from your beta testing efforts. + +--- + +Beta testing is done during both the proposal (pull request) and pre-release (nightly build) phases of development: + +## Testing Pull Requests + +Tester builds are automatically created for every [pull request](https://docs.github.com/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests) (PR) that proposes a relevant change. + +The builds are updated if the author pushes changes to the PR. + +### Installation + +The tester build for a PR can be downloaded by following these instructions: + +1. Sign in to your [**GitHub**](https://github.com/) account.<br /> + (GitHub only allows downloads of the tester builds when you are signed in.) +1. Open the PR you are interested in.<br /> + They are listed here:<br /> + https://github.com/arduino/arduino-ide/pulls +1. Click the "**Checks**" tab at the top of the PR's page. +1. From the list on the left side of the page, click on "**Arduino IDE**". +1. Scroll down to the "**Artifacts**" section of the page that opens. +1. Click the download link for your operating system.<br /> + **ⓘ** For example, if you are using Windows, click the "**Windows_X86-64_zip**" link. +1. Wait for the download to finish. +1. Extract or install the downloaded file as usual. + +![checks tab](assets/checks-tab.png) + +![tester build link](assets/tester-build-link.png) + +![tester build artifacts](assets/tester-build-artifacts.png) + +#### Notes for macOS + +Beginning in macOS 10.14.5, the software [must be notarized to run](https://developer.apple.com/documentation/xcode/notarizing_macos_software_before_distribution). + +For security reasons, signing and notarization are disabled when creating tester builds for pull requests from forks of this repository. This means that macOS will block you from running the tester builds for those PRs. + +Due to this limitation, Mac users have two options for testing PRs from forks: + +##### The Safe Approach + +Build the version of the Arduino IDE you want to test from source instead of using the automatically created tester build. + +[Instructions for building the project](../development.md#build-from-source) + +##### The Risky Approach + +--- + +⚠ Please note that this approach is risky as you are lowering the security on your system, therefore we strongly discourage you from following it. + +--- + +1. Start the tester build.<br /> + A warning will appear: + > "Arduino IDE" cannot be opened because the developer cannot be verified. +1. Follow the instructions from the "**If you want to open an app that hasn't been notarized or is from an unidentified developer**" section of this page to bypass the security restriction:<br /> + [https://support.apple.com/en-us/HT202491](https://support.apple.com/en-us/HT202491#:~:text=If%20you%20want%20to%20open%20an%20app%20that%20hasn%E2%80%99t%20been%20notarized%20or%20is%20from%20an%20unidentified%20developer) + +### Feedback + +Feedback after beta testing a pull request is always valuable, regardless of which categories your findings fall under: + +- working as expected +- problems encountered +- areas for improvement + +Please submit feedback related to the changes made in the pull request as a PR review: + +https://docs.github.com/pull-requests/collaborating-with-pull-requests/reviewing-changes-in-pull-requests/about-pull-request-reviews + +--- + +If you discover problems or areas for improvement that are unrelated to the changes made by the PR (i.e., they also occur when using the [nightly build](#testing-nightly-build)), please submit that feedback as an issue report instead of a review. + +[More information on issue reports](issues.md#issue-report-guide) + +## Testing Nightly Build + +Builds of the project's production branch are produced daily. This build represents the current pre-release state of the project, which is planned for distribution in the next release. + +### Installation + +1. Open Arduino's "**Software**" page:<br /> + https://www.arduino.cc/en/software#nightly-builds +1. Select the appropriate download link from the "**Nightly Builds**" section of the page. +1. Wait for the download to finish. +1. Extract or install the downloaded file as usual. + +### Feedback + +If you discover any problems or areas for improvement please submit an issue report. + +[More information on issue reports](issues.md#issue-report-guide) diff --git a/docs/contributor-guide/issues.md b/docs/contributor-guide/issues.md new file mode 100644 index 000000000..6fdb9ea8c --- /dev/null +++ b/docs/contributor-guide/issues.md @@ -0,0 +1,33 @@ +<!-- Source: https://github.com/arduino/tooling-project-assets/blob/main/documentation-templates/contributor-guide/general/contributor-guide/issues.md --> + +# Issue Report Guide + +--- + +❗ Do you need help or have a question about using this project? Support requests should be made to the [Arduino Forum](https://forum.arduino.cc). + +--- + +High quality bug reports and feature requests are valuable contributions to this project. These can be made by submitting an issue report to the project's GitHub repository: + +https://github.com/arduino/arduino-ide/issues/new/choose + +## Before Reporting an Issue + +- Give the latest development version a test drive to see if your issue was already resolved:<br /> + https://www.arduino.cc/en/software#nightly-builds +- Search [existing pull requests and issues](https://github.com/arduino/arduino-ide/issues?q=) to see if it was already reported.<br /> + If you have additional information to provide about an existing issue, please comment there instead of creating a duplicate. You can use [GitHub's "Reactions" feature](https://github.blog/2016-03-10-add-reactions-to-pull-requests-issues-and-comments/) if you only want to express support 👍. + +## Qualities of an Excellent Report + +- Concise and descriptive issue title.<br /> + Vague titles make it difficult to decipher the purpose of the issue when looking through the list of reports, which might result in your issue not being given proper attention. +- Describe the issue and what behavior you were expecting.<br /> + Include the full and exact text of any relevant error or warning messages you might have encountered. +- Provide a full set of steps necessary to reproduce the issue.<br /> + Demonstration code or commands should be complete and simplified to the minimum necessary to reproduce the issue. +- Be responsive.<br /> + We may need you to provide additional information in order to investigate and resolve the issue.<br /> + Make sure your GitHub account is configured so that you will receive notifications of responses to your issue report. +- If you find a solution to your problem, please comment on your issue report with an explanation of how you were able to fix it, then close the issue. diff --git a/docs/contributor-guide/pull-requests.md b/docs/contributor-guide/pull-requests.md new file mode 100644 index 000000000..6c3d29b23 --- /dev/null +++ b/docs/contributor-guide/pull-requests.md @@ -0,0 +1,199 @@ +<!-- Source: https://github.com/arduino/tooling-project-assets/blob/main/documentation-templates/contributor-guide/general/contributor-guide/pull-requests.md --> + +# Pull Request Guide + +A [**pull request**](https://docs.github.com/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests) (PR) is the mechanism used to propose changes to the content of this project's repository. + +If you are looking for ideas of what to work on, check [the list of open issue reports](https://github.com/arduino/arduino-ide/issues). Pull requests addressing any of those bug reports and feature requests are welcome. + +## Contribution Workflow + +Each contribution travels through a formal process which allows it to be efficiently incorporated into the project. + +### 1. Plan + +#### Research + +Start by searching the repository for existing pull requests and issues related to your planned contribution so you can see any related conversations and proposals and avoid duplicate effort: + +https://github.com/arduino/arduino-ide/issues?q= + +#### Discussion + +It can sometimes be useful to get feedback from others during the planning process. There are a couple good options for discussing planned development work: + +- Talk with the user community on the [Arduino Forum](https://forum.arduino.cc/). +- Talk with Arduino developers on the [Arduino Developers Mailing List](https://groups.google.com/a/arduino.cc/g/developers). + +### 2. Fork + +Forking a GitHub repository creates a copy of it under your account. You will stage contributions in your fork of this project. + +[More information about forking repositories](https://docs.github.com/get-started/quickstart/fork-a-repo) + +#### Enabling CI in Your Fork + +The repository is configured to run automated [continuous integration](https://wikipedia.org/wiki/Continuous_integration) (CI) checks and tests. It's a good idea to enable CI in your fork so you can make sure your work will pass the checks before you submit a pull request: + +1. Open the homepage of your fork in the browser. +1. Click the "**Actions**" tab. +1. Click the <kbd>**I understand my workflows, go ahead and enable them**</kbd> button. +1. Some of the workflows will now need to be activated individually. Perform the following steps for each of the useful workflows listed on the left side of the page that have a "**!**" icon: + 1. Click on the workflow name. + 1. Click the <kbd>**Enable workflow**</kbd> button. + +### 3. Clone + +Cloning a repository creates a copy of it on your computer. + +It is possible to make simple changes to your repository using the GitHub web interface without cloning the repository. However, the GitHub web interface is quite limiting so you will likely find the need to work with a clone (using **Git** directly or your choice of [Git client software](https://git-scm.com/downloads/guis)) for any significant development work. + +[More information about cloning repositories](https://git-scm.com/docs/git-clone) + +### 4. Branch + +Create a branch in your fork to contain the changes for your contribution. You must make a separate branch in your fork for each pull request you submit. + +[More information about branches](https://docs.github.com/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-branches) + +### 5. Make a change + +Some things to keep in mind: + +- Make sure your change complies with the project's established style conventions. +- Remember to also update the documentation content in the repository if required by your changes. +- If the project contains a test suite, update or add tests according to your change as appropriate. + +See [the development guide](../development.md#development-guide) for more information. + +### 6. Test + +Test your change carefully to make sure it works correctly and did not break other components of the project. + +As a supplement for general testing, the project is set up with automated checks and tests to facilitate development. + +See [the development guide](../development.md#development-guide) for instructions. + +### 7. Commit + +Once the work on your change is complete, add it to the revision history of the Git repository by making a commit. + +Make sure to follow the [Commit Guidelines](#commit-guidelines). + +[More information about commits](https://git-scm.com/docs/git-commit) + +### 8. Push + +If you're working from a [clone](#3-clone), you will need to push your commit to your fork on GitHub. + +[More information about pushing commits](https://git-scm.com/docs/git-push) + +#### Checking CI Results + +If you have [enabled CI in your repository](#enabling-ci-in-your-fork), GitHub will run the relevant checks automatically every time you push a commit to your fork. + +You can see the results of these checks by doing either of the following: + +- Clicking the status icon (✔️ or ❌) shown to the right of a commit. +- Opening the repository's "**Actions**" tab. + +### 9. Pull request + +A pull request (PR) is a proposal to make a change in a repository. The repository maintainer is able to accept the changes you propose in a pull request by simply clicking a button. + +[More information about pull requests](https://docs.github.com/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests) + +#### Scope + +Each pull request should address a single bug fix or enhancement. If you have multiple unrelated fixes or enhancements to contribute, submit them as separate pull requests. + +#### Description + +Pull request title and description should follow [the same guidelines as commit messages](#commit-message). + +If your pull request fixes an issue in the issue tracker, use [a closing keyword](https://docs.github.com/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue#linking-a-pull-request-to-an-issue-using-a-keyword) in the body to indicate this. + +In some cases, it might make sense to request feedback on a proposal before it is ready to be merged. You can indicate this by starting the pull request title with **[WIP]** (work in progress). Once the pull request is ready to be merged, edit the title and remove the "[WIP]". + +#### Cross-repository Contributions + +Some proposals may require changes to multiple repositories. Pull requests should be submitted in parallel to each repository. + +Clearly note any dependencies on other PRs in the description so that these can be evaluated by the reviewer and the merges coordinated. + +--- + +Please check whether any changes are required to the related documentation content hosted in the separate dedicated repositories: + +- [**arduino/docs-content**](https://github.com/arduino/docs-content) +- [**arduino/help-center-content**](https://github.com/arduino/help-center-content) + +### 10. Resolve CI failures + +Relevant checks will run automatically once you have submitted the pull request. Once these checks are finished, you can see a summary of the results near the bottom of the pull request page: + +![checks](assets/checks.png) + +Failed checks will be indicated with an ❌. If any checks failed, please fix whatever caused it to fail. Click the "**Details**" link to the right of the check name to open the logs, which provide details about the failure. + +--- + +**ⓘ** In some rare cases, a CI failure may be unrelated to the changes made in your pull request. So if the information in the logs doesn't seem relevant, please comment on the pull request to ask a maintainer to take a look. + +--- + +When you push to the branch of your fork the pull request was submitted from, the commit is automatically added to the pull request. Don't create a new pull request to fix problems; update the existing pull request. + +### 11. Resolve changes requested from reviews + +Interested parties may review your pull request and suggest improvements. + +To act on general review suggestions, you can add commits to the branch you submitted the pull request from, which will automatically be added to the pull request. Don't create a new pull request to act on review suggestions; update the existing pull request. + +Reviewers may suggest specific changes, which can be applied by [clicking the <kbd>**Commit suggestion**</kbd> button](https://docs.github.com/pull-requests/collaborating-with-pull-requests/reviewing-changes-in-pull-requests/incorporating-feedback-in-your-pull-request#applying-suggested-changes). + +[More information about pull request reviews](https://docs.github.com/pull-requests/collaborating-with-pull-requests/reviewing-changes-in-pull-requests/about-pull-request-reviews) + +### 12. Merge + +One of the repository maintainers can now choose to accept your proposed change. Once the pull request is [merged](https://docs.github.com/pull-requests/collaborating-with-pull-requests/incorporating-changes-from-a-pull-request/merging-a-pull-request), you can delete the branch you created in your fork for the pull request and delete the fork as well if you like. + +Thanks so much for your contribution! + +--- + +It is possible that the maintainers may decide a pull request doesn't align with Arduino's goals for the project and close it rather than merging. A record of the proposed changes will always be available on GitHub for future reference. If you think your modifications will be of use to others, you are welcome to maintain your own fork of the repository. + +--- + +## Commit Guidelines + +The commit history of a repository is an important resource for developers. Repositories may accumulate thousands of commits over the course of decades. Each individual commit contributes either to the commit history being pleasant and efficient to work with, or to it being a confusing mess. For this reason, it's essential for contributors to create clean, high quality commits. + +### Scope + +Commits must be "atomic". This means that the commit completely accomplishes a single task. Each commit should result in fully functional code. Multiple tasks should not be combined in a single commit, but a single task should not be split over multiple commits (e.g., one commit per file modified is not a good practice). + +[More information about atomic commits](https://www.freshconsulting.com/insights/blog/atomic-commits/) + +### Commit Message + +The commit message documents what the change was and why it was done. A little effort now writing a good commit message can save future developers from wasted time and frustration trying to understand the purpose of a poorly documented commit. + +#### Commit Message Title + +- Use the [imperative mood](https://cbea.ms/git-commit/#imperative) in the title.<br /> + For example: + > Use LED_BUILTIN macro in LED pin definition +- Capitalize the title. +- Do not end the title with punctuation. +- Do not use GitHub's default commit titles (e.g., "Update examples/Foo/Foo.ino"). + +#### Commit Message Body + +- Separate title from the body with a blank line. If you're committing via GitHub or [GitHub Desktop](https://desktop.github.com/) this will be done automatically. +- Wrap body at 120 characters. +- Completely explain the purpose of the commit.<br /> + Include a rationale for the change, any caveats, side-effects, etc. + +[More information on commit messages](https://cbea.ms/git-commit/) diff --git a/docs/contributor-guide/translation.md b/docs/contributor-guide/translation.md new file mode 100644 index 000000000..4b8b82400 --- /dev/null +++ b/docs/contributor-guide/translation.md @@ -0,0 +1,33 @@ +# 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). + +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: + +## Arduino IDE Text + +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/ + +## Base Application Text + +Arduino IDE leverages the localization data available for the [**VS Code**](https://code.visualstudio.com/) editor to localize shared UI text. This reduces the translation work required to add a new language to the text specific to the Arduino IDE project. + +For this reason, some of Arduino IDE's text is not found in the **Transifex** project. Suggestions for corrections or improvement to this text are made by submitting an issue to the `microsoft/vscode-loc` GitHub repository. + +Before submitting an issue, please check the existing issues to make sure it wasn't already reported:<br /> +https://github.com/microsoft/vscode-loc/issues + +After that, submit an issue here:<br /> +https://github.com/microsoft/vscode-loc/issues/new + +## Arduino CLI Text + +The [**Arduino CLI**](https://arduino.github.io/arduino-cli/latest/) tool handles non-GUI operations for the Arduino IDE. Some of the text printed in the "**Output**" panel and in notifications originates from **Arduino CLI**. + +Translations of Arduino CLI's text is done in the "**Arduino CLI**" Transifex project: + +https://explore.transifex.com/arduino-1/arduino-cli/ diff --git a/docs/development.md b/docs/development.md new file mode 100644 index 000000000..84cd32c66 --- /dev/null +++ b/docs/development.md @@ -0,0 +1,205 @@ +# Development Guide + +This page includes technical documentation for developers who want to build the IDE locally and contribute to the project. + +## Architecture overview + +The IDE consists of three major parts: + +- the _Electron main_ process, +- the _backend_, and +- the _frontend_. + +The _Electron main_ process is responsible for: + +- creating the application, +- managing the application lifecycle via listeners, and +- creating and managing the web pages for the app. + +In Electron, the process that runs the main entry JavaScript file is called the main process. The _Electron main_ process can display a GUI by creating web pages. An Electron app always has exactly one main process. + +By default, whenever the _Electron main_ process creates a web page, it will instantiate a new `BrowserWindow` instance. Since Electron uses Chromium for displaying web pages, Chromium's multi-process architecture is also used. Each web page in Electron runs in its own process, which is called the renderer process. Each `BrowserWindow` instance runs the web page in its own renderer process. When a `BrowserWindow` instance is destroyed, the corresponding renderer process is also terminated. The main process manages all web pages and their corresponding renderer processes. Each renderer process is isolated and only cares about the web page running in it.<sup>[[1]]</sup> + +In normal browsers, web pages usually run in a sandboxed environment, and accessing native resources are disallowed. However, Electron has the power to use Node.js APIs in the web pages allowing lower-level OS interactions. Due to security reasons, accessing native resources is an undesired behavior in the IDE. So [`nodeIntegration`](https://www.electronjs.org/docs/latest/tutorial/security#2-do-not-enable-nodejs-integration-for-remote-content) is disabled, and [context isolation](https://www.electronjs.org/docs/latest/tutorial/context-isolation) is enabled. + +The _backend_ process is responsible for: + +- providing access to the filesystem, +- communicating with the [Arduino CLI](https://github.com/arduino/arduino-cli) via gRPC, +- running your terminal, +- exposing additional RESTful APIs, +- performing the Git commands in the local repositories, +- hosting and running any VS Code extensions, or +- executing VS Code tasks<sup>[[2]]</sup>. + +The _Electron main_ process spawns the _backend_ process. There is always exactly one _backend_ process. However, due to performance considerations, the _backend_ spawns several sub-processes for the filesystem watching, Git repository discovery, etc. The communication between the _backend_ process and its sub-processes is established via IPC. Besides spawning sub-processes, the _backend_ will start an HTTP server on a random available port, and serves the web application as static content. When the sub-processes are up and running, and the HTTP server is also listening, the _backend_ process sends the HTTP server port to the _Electron main_ process via IPC. The _Electron main_ process will load the _backend_'s endpoint in the `BrowserWindow`. + +The _frontend_ is running as an Electron renderer process and can invoke services implemented on the _backend_. The communication between the _backend_ and the _frontend_ is done via JSON-RPC over a websocket connection. This means, the services running in the _frontend_ are all proxies, and will ask the corresponding service implementation on the _backend_. + +[1]: https://www.electronjs.org/docs/tutorial/application-architecture#differences-between-main-process-and-renderer-process +[2]: https://code.visualstudio.com/Docs/editor/tasks + +### Additional Components + +This repository contains the main code, but two more repositories are included during the build process: + +- [vscode-arduino-tools](https://github.com/arduino/vscode-arduino-tools): provides support for the language server and the debugger +- [arduino-language-server](https://github.com/arduino/arduino-language-server): provides the language server that parses Arduino code + +## Prerequisites + +- To build the application, follow the Theia IDE [prerequisites](https://github.com/eclipse-theia/theia/blob/master/doc/Developing.md#prerequisites). +- This project recommends using [Visual Studio Code (VS Code)](https://code.visualstudio.com/) for the development. +- The build system might also need to build the [Arduino CLI](https://github.com/arduino/arduino-cli), the [Arduino Language Server](https://github.com/arduino/arduino-language-server), and other tools from the sources. In this case it is also necessary to have the build prerequisites for those projects installed. For more details, refer to the Arduino CLI's [prerequisites section](https://arduino.github.io/arduino-cli/latest/CONTRIBUTING/#prerequisites). + +## Build from source + +--- + +**ⓘ** If you only want to test an existing version of the project, automatically generated builds are available for download without building from source. See the instructions in the [**beta testing guide**](contributor-guide/beta-testing.md#beta-testing-guide). + +--- + +If you’re familiar with TypeScript, the [Theia IDE](https://theia-ide.org/), and if you want to contribute to the +project, you should be able to build the Arduino IDE locally. +Please refer to the [Theia IDE prerequisites](https://github.com/eclipse-theia/theia/blob/master/doc/Developing.md#prerequisites) documentation for the setup instructions. + +Once you have all the tools installed, you can build the editor following these steps + +### Run From Source + +If you want to develop the application, do the following: + +1. Clone the project from Git and change directory to the `arduino-ide` folder: + + ```sh + git clone https://github.com/arduino/arduino-ide.git + ``` + + ```sh + cd arduino-ide + ``` + +2. Install the dependencies + + ```sh + yarn + ``` + +3. Build the application in development mode + + ```sh + yarn build:dev + ``` + +4. Open the project in VS Code + + ```sh + code . + ``` + + > **ⓘ** For more details on how to start VS Code from the command line, see [here](https://code.visualstudio.com/docs/editor/command-line#_launching-from-command-line). + +5. Rebuild the native dependencies for electron + + - <kbd>Ctrl/⌘</kbd>+<kbd>Shift</kbd>+<kbd>P</kbd> to open the _Command Palette_. + - Type `Tasks: Run Task` and press <kbd>Enter</kbd>. + - Type `Rebuild App` and press <kbd>Enter</kbd>. + - Wait for the "Rebuild App" task to finish, as indicated by a "✔ Rebuild Complete" message in the Terminal. + +6. Start the TypeScript compiler + `webpack` in watch mode + + - <kbd>Ctrl/⌘</kbd>+<kbd>Shift</kbd>+<kbd>P</kbd>. + - Type `Tasks: Run Task` and press <kbd>Enter</kbd>. + - Type `Watch All` and press <kbd>Enter</kbd>. + - Select how you want to scan the task output. You can press <kbd>Enter</kbd> or <kbd>Esc</kbd>. [Click](https://code.visualstudio.com/docs/editor/tasks#_defining-a-problem-matcher) here to learn more. + +7. Start the application in debug mode + - Open the _Run and Debug_ view with <kbd>Ctrl/⌘</kbd>+<kbd>Shift</kbd>+<kbd>D</kbd>, + - Select `App` from the dropdown, + - Start debugging with <kbd>F5</kbd>. + +If you change the backend application, you must restart the electron app in debug mode to use the changes. +If you change the frontend application, it's sufficient to reload the board window with _Reload Window_ command from the _Command Palette_. + +### Bundle the Application + +If you want to bundle the application, execute the following: + +1. Rebuild the native dependencies for electron + + ```sh + yarn --cwd electron-app rebuild + ``` + +2. Bundle the frontend and backend applications with `webpack` + + ```sh + yarn --cwd electron-app build + ``` + +3. Package the application + ```sh + yarn --cwd electron-app package + ``` + +### Notes for Windows contributors + +Windows requires the Microsoft Visual C++ (MSVC) compiler toolset to be installed on your development machine. + +In case it's not already present, it can be downloaded from the "**Tools for Visual Studio 20XX**" section of the Visual Studio [downloads page](https://visualstudio.microsoft.com/downloads/#build-tools-for-visual-studio-2022) via the "**Build Tools for Visual Studio 20XX**" (e.g., "**Build Tools for Visual Studio 2022**") download link. + +Select "**Desktop development with C++**" from the "**Workloads**" tab during the installation procedure. + +## Running Checks + +To run the tests, you must rebuild the native dependencies for the browser target. See [this](https://github.com/arduino/arduino-ide/pull/1823#issuecomment-1400511031) for the technical explanation. + +1. Rebuild the native dependencies for the browser + + ```sh + yarn rebuild:browser + ``` + +2. To run the tests + + ```sh + yarn test + ``` + +3. To run the slow tests + ```sh + yarn test:slow + ``` + +If you want to debug an individual file, open the test module (`*.test.ts` or `*.slow-test.ts`), open the _Run and Debug_ view, select the `Run Test [current]` and press <kbd>F5</kbd>. + +### CI + +This project is built on [GitHub Actions](https://github.com/arduino/arduino-ide/actions). + +- _Snapshot_ builds run when changes are pushed to the `main` branch, or when a PR is created against the `main` branch. For the sake of the review and verification process, the build artifacts for each operating system can be downloaded from the GitHub Actions page. +- _Nightly_ builds run every day at 03:00 GMT from the `main` branch. +- _Release_ builds run when a new tag is pushed to the remote. The tag must follow the [semver](https://semver.org/). For instance, `1.2.3` is a correct tag, but `v2.3.4` won't work. Steps to trigger a new release build: + - Create a local tag: + ```sh + git tag -a 1.2.3 -m "Creating a new tag for the `1.2.3` release." + ``` + - Push it to the remote: + ```sh + git push origin 1.2.3 + ``` + +## FAQ + +- _Can I manually change the version of the [`arduino-cli`](https://github.com/arduino/arduino-cli/) used by the IDE?_ + + Yes. It is possible but not recommended. The CLI exposes a set of functionality via [gRPC](https://github.com/arduino/arduino-cli/tree/master/rpc) and the IDE uses this API to communicate with the CLI. Before we build a new version of IDE, we pin a specific version of CLI and use the corresponding `proto` files to generate TypeScript modules for gRPC. This means, a particular version of IDE is compliant only with the pinned version of CLI. Mismatching IDE and CLI versions might not be able to communicate with each other. This could cause unpredictable IDE behavior. + +- _I have understood that not all versions of the CLI are compatible with my version of IDE but how can I manually update the `arduino-cli` inside the IDE?_ + + [Get](https://arduino.github.io/arduino-cli/installation) the desired version of `arduino-cli` for your platform and manually replace the one inside the IDE. The CLI can be found inside the IDE at: + + - Windows: `C:\path\to\Arduino IDE\resources\app\lib\backend\resources\arduino-cli.exe`, + - macOS: `/path/to/Arduino IDE.app/Contents/Resources/app/lib/backend/resources/arduino-cli`, and + - Linux: `/path/to/Arduino IDE/resources/app/lib/backend/resources/arduino-cli`. diff --git a/docs/internal/Arm.md b/docs/internal/Arm.md deleted file mode 100644 index 8bcca9db4..000000000 --- a/docs/internal/Arm.md +++ /dev/null @@ -1,58 +0,0 @@ -### Building from the sources on Linux ARM - -Building the Pro IDE on Linux `armv7l` (aka `armhf`) and `aarch64` (aka `arm64`): - -1. Install Node.js 14.x with [nvm](https://github.com/nvm-sh/nvm#install--update-script): - ``` - wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash - ``` - Restart your shell then: - ``` - nvm install 14 - nvm use 14 - ``` - Verify: - ``` - node -v - ``` - -2. Install [Yarn](https://classic.yarnpkg.com/en/docs/install/#debian-stable): - - Configure the Debian package repository; otherwise, you will pull a different `yarn`. - ``` - curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - - echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list - ``` - Install: - ``` - sudo apt update && sudo apt install --no-install-recommends yarn - ``` - Verify: - ``` - yarn -v - 1.22.4 - ``` - -3. Other native [dependencies](https://github.com/eclipse-theia/theia/blob/master/doc/Developing.md#prerequisites): - - `make`, - - `gcc`, - - `pkg-config`, - - `build-essential`, - - `libx11-dev`, and - - `libxkbfile-dev` - -4. [Build it](../../BUILDING.md#build-from-source) from the source: - ``` - git clone https://github.com/arduino/arduino-ide.git \ - && cd arduino-ide \ - && yarn \ - && yarn rebuild:electron \ - && yarn --cwd ./electron-app start - ``` - -5. Troubleshoot - - If you see [`ENOSPC` errors](https://github.com/eclipse-theia/theia/blob/master/doc/Developing.md#linux) at runtime, increase the default `inotify` watches: - ``` - echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p - ``` diff --git a/docs/internal/Ubuntu.md b/docs/internal/Ubuntu.md index 5c67b516a..a7ddc5f1c 100644 --- a/docs/internal/Ubuntu.md +++ b/docs/internal/Ubuntu.md @@ -1,6 +1,8 @@ ### Building and start the app from the sources on Ubuntu Linux -Tested and verified on Ubuntu 18.04.4. The source will be checked out to `~/dev/git/arduino-ide`. +Tested and verified on Ubuntu 22.04. The source will be checked out to `~/dev/git/arduino-ide`. + +> ❗ This is an all-in-one script to create production-ready, minified code; you will need ~16GB of RAM to run it. This script will install libraries you might already have on your system and change the default Node.js version you do not want. If you look for documentation on development, please reference [this](../development.md#prerequisites) section instead. ``` #!/bin/bash -i @@ -11,16 +13,17 @@ sudo apt update \ gcc \ curl \ make \ - python \ + python3 \ pkg-config \ libx11-dev \ libxkbfile-dev \ build-essential \ + libsecret-1-dev \ && wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash \ && source ~/.bashrc \ -&& nvm install 14 \ -&& nvm use 14 \ -&& nvm alias default 14 \ +&& nvm install 18.17 \ +&& nvm use 18.17 \ +&& nvm alias default 18.17 \ && curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - \ && echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list \ && sudo apt update && sudo apt install --no-install-recommends yarn \ @@ -28,6 +31,7 @@ sudo apt update \ && rm -rf ~/dev/git/arduino-ide \ && git clone --depth 1 https://github.com/arduino/arduino-ide.git ~/dev/git/arduino-ide \ && yarn --cwd ~/dev/git/arduino-ide \ -&& yarn --cwd ~/dev/git/arduino-ide rebuild:electron \ -&& yarn --cwd ~/dev/git/arduino-ide/electron-app start +&& yarn --cwd ~/dev/git/arduino-ide/electron-app rebuild \ +&& yarn --cwd ~/dev/git/arduino-ide build \ +&& yarn --cwd ~/dev/git/arduino-ide start ``` diff --git a/docs/internal/release-procedure.md b/docs/internal/release-procedure.md index d0c034f7c..0f62d8ffa 100644 --- a/docs/internal/release-procedure.md +++ b/docs/internal/release-procedure.md @@ -1,6 +1,12 @@ # Release Procedure -## 🗺️ Merge localization sync PR +The ["trunk-based" development strategy](https://trunkbaseddevelopment.com/) is used for releases of Arduino IDE. A branch named `<major>.<minor>.x` (where `<major>.<minor>` is the major and minor version numbers), is created for each minor version series. Release tags (both pre-release and production) are created from these branches. This allows a release to be created from a select subset of the commits in the `main` branch, [cherry-picked](https://git-scm.com/docs/git-cherry-pick) to the release branch. + +## Steps + +The following are the steps to follow to make a release of Arduino IDE: + +### 1. 🗺️ Merge localization sync PR A pull request titled "**Update translation files**" is submitted periodically by the "**github-actions**" bot to pull in the localization data from [**Transifex**](https://www.transifex.com/arduino-1/ide2/dashboard/). @@ -10,39 +16,85 @@ It will be shown in these search results: https://github.com/arduino/arduino-ide/pulls/app%2Fgithub-actions -## ⚙ Create the release on GitHub +### 2. 🛠️ Check bundled tool versions -First of all, you need to **set the new version in all the `package.json` files** across the app (`./package.json`, `./arduino-ide-extension/package.json`, `./browser-app/package.json`, `./electron-app/package.json`), create a PR, and merge it on the `main` branch. +The Arduino IDE release includes several tool dependencies. Unstable versions of these tools may be pinned provisionally for use with the development version of Arduino IDE, but production releases of Arduino IDE must use production releases of the tool dependencies. -To do so, you can make use of the `update:version` script. +The tool versions are defined in the `arduino` object of [`arduino-ide-extension/package.json`](../../arduino-ide-extension/package.json). -For example, if you want to release the version `<YOUR_VERSION>`, you should run the following commands: +If any of the tools are pinned to a development version, ensure a suitable production release of the tool is available and then submit a PR to update the version in `arduino-ide-extension/package.json`. -```text -git checkout main -git pull -git checkout -b version-<YOUR_VERSION> -yarn update:version <YOUR_VERSION> -git commit -am <YOUR_VERSION> -git push origin version-<YOUR_VERSION> -``` +### 3. 👀 Check version of packages + +The [`version` field](https://docs.npmjs.com/cli/v8/configuring-npm/package-json#version) of the project's `package.json` metadata files received a patch version bump (e.g., `2.0.1` -> `2.0.2`) at the time of the previous release. + +If this is a patch release, the current metadata values are correct and no action is needed. + +The changes contained in this release might be considered to change the project's "API". If so, a patch version bump will not be appropriate and the version must be adjusted in compliance with the [**Semantic Versioning Specification**](https://semver.org/). + +Follow the instructions for updating the version metadata [**here**](#update-version-metadata). + +#### Examples + +If the version number of the previous release was `2.0.1`: + +- If this is considered a minor release (non-breaking changes to the "API"), the `version` values must be changed to `2.1.0`. +- If this is considered a major release (breaking changes to the "API"), the `version` values must be changed to `3.0.0`. + +### 4. 🍒 Prepare release branch + +#### Create + +A new release branch must be created on every minor version bump. For example, if you are making the `2.2.0` release, then it is necessary to create a branch named `2.2.x`. That branch will be used for all subsequent releases in the `2.2` minor version series (e.g., `2.2.1`, `2.2.2`). + +#### Update + +Push all commits that are to be included in the release to the release branch. This can be a [cherry-picked](https://git-scm.com/docs/git-cherry-pick) subset of the commits from the `main` branch if not all the work from `main` is ready for release. + +### 5. ✅ Validate release + +#### Evaluate CI status + +The checks run by the continuous integration system might provide an indication of a problem that should block the release. Since the code in the release branch doesn't necessarily match to that of the `main` branch, it is essential to check the status of the release branch even when everything is passing in the `main` branch. + +1. Open the following URL in your browser:<br /> + https://github.com/arduino/arduino-ide/actions +1. Type `branch:<release branch>` (where `<release branch>` is the name of the release branch for this release) in the "**Filter workflow runs**" field of the "**Actions**" page. +1. Press the <kbd>**Enter**</kbd> key. +1. Wait for all in progress workflow runs to finish. +1. Click on the first workflow name on the list at the left side of the page. +1. Check the status of the latest run. If it was not successful, investigate the cause and determine if it is of significance to the release. +1. Repeat the above steps for each of the listed workflows. -replacing `<YOUR_VERSION>` with the version you want to release. Then create a PR and merge it. +#### Beta testing + +The "**Arduino IDE**" workflow run that was triggered by the branch creation will contain artifacts that can be used for beta testing. + +[More information about beta testing](../contributor-guide/beta-testing.md) + +### 6. 🚢 Create the release on GitHub Then, you need to **create and push the new tag** and wait for the release to appear on [the "**Releases**" page](https://github.com/arduino/arduino-ide/releases). ⚠ Doing this will create a new release and users who already have the IDE installed will be notified from the automatic updater that a new version is available. Do not push the tag if you don't want that. -```text -git checkout main -git pull -git tag -a <YOUR_VERSION> -m "<YOUR_VERSION>" -git push origin <YOUR_VERSION> -``` +1. Checkout the release branch in the repository. +1. Run the following commands: + ```text + git pull + git tag -a <YOUR_VERSION> -m "<YOUR_VERSION>" + git push origin <YOUR_VERSION> + ``` Pushing a tag will trigger a **GitHub Actions** workflow on the `main` branch. Check the "**Arduino IDE**" workflow and see that everything goes right. If the workflow succeeds, a new release will be created automatically and you should see it on the ["**Releases**"](https://github.com/arduino/arduino-ide/releases) page. -## 📄 Create the changelog +### 7. ⬆️ Bump version metadata of packages + +In order for the version number of the tester and nightly builds to have correct precedence compared to the release version, the `version` field of the project's `package.json` files must be given a patch version bump (e.g., `2.0.1` -> `2.0.2`) **after** the creation of the release tag. + +Follow the instructions for updating the version metadata [**here**](#update-version-metadata). + +### 8. 📄 Create the changelog **Create GitHub issues for the known issues** that we haven't solved in the current release: @@ -61,7 +113,7 @@ Add a list of mentions of GitHub users who contributed to the release in any of Add a "**Known Issues**" section at the bottom of the changelog. -## ✎ Update the "**Software**" Page +### 9. ✎ Update the "**Software**" Page Open a PR on the [bcmi-labs/wiki-content](https://github.com/bcmi-labs/wiki-content) repository to update the links and texts. @@ -78,7 +130,7 @@ When the deploy workflow is done, check if links on the "**Software**" page are https://www.arduino.cc/en/software#future-version-of-the-arduino-ide -## 😎 Brag about it +### 10. 😎 Brag about it - Ask in the `#product_releases` **Slack** channel to write a post for the social media and, if needed, a blog post. - Post a message on the forum (ask @per1234).<br /> @@ -97,3 +149,28 @@ https://www.arduino.cc/en/software#future-version-of-the-arduino-ide > > To see the details, you can take a look at the [Changelog](https://github.com/arduino/arduino-ide/releases/tag/2.0.0-beta.12) > If you want to post about it on social media and you need more details feel free to ask us on #team_tooling! :wink: + +## Operations + +The following are detailed descriptions of operations performed during the release process: + +<a id="update-version-metadata"></a> + +### ⚙ Update version metadata of packages + +You need to **set the new version in all the `package.json` files** across the app (`./package.json`, `./arduino-ide-extension/package.json`, and `./electron-app/package.json`), create a PR, and merge it on the `main` branch. + +To do so, you can make use of the `update:version` script. + +For example, if you want to update the version to `<YOUR_VERSION>`, you should run the following commands: + +```text +git checkout main +git pull +git checkout -b version-<YOUR_VERSION> +yarn update:version <YOUR_VERSION> +git commit -am <YOUR_VERSION> +git push origin version-<YOUR_VERSION> +``` + +replacing `<YOUR_VERSION>` with the version you want. Then create a PR and merge it. diff --git a/electron-app/arduino-ide-backend-main.js b/electron-app/arduino-ide-backend-main.js new file mode 100644 index 000000000..a6e5a12de --- /dev/null +++ b/electron-app/arduino-ide-backend-main.js @@ -0,0 +1,17 @@ +// @ts-check +'use strict'; + +// `true` if the this (backend main) process has been forked. +if (process.send) { + const util = require('util'); + for (const name of ['log', 'trace', 'debug', 'info', 'warn', 'error']) { + console[name] = function () { + // eslint-disable-next-line prefer-rest-params + const args = Object.values(arguments); + const message = util.format(...args); + process.send?.({ severity: name, message }); // send the log message to the parent process (electron main) + }; + } +} + +require('./src-gen/backend/main'); diff --git a/electron-app/arduino-ide-electron-main.js b/electron-app/arduino-ide-electron-main.js new file mode 100644 index 000000000..68f506e84 --- /dev/null +++ b/electron-app/arduino-ide-electron-main.js @@ -0,0 +1,23 @@ +// @ts-check +'use strict'; + +const os = require('os'); +const path = require('path'); +const config = require('./package.json').theia.frontend.config; +// `buildDate` is only available in the bundled application. +if (config.buildDate) { + // `plugins` folder inside IDE2. IDE2 is shipped with these VS Code extensions. Such as cortex-debug, vscode-cpp, and translations. + process.env.THEIA_DEFAULT_PLUGINS = `local-dir:${path.resolve( + __dirname, + 'plugins' + )}`; + // `plugins` folder inside the `~/.arduinoIDE` folder. This is for manually installed VS Code extensions. For example, custom themes. + process.env.THEIA_PLUGINS = [ + process.env.THEIA_PLUGINS, + `local-dir:${path.resolve(os.homedir(), '.arduinoIDE', 'plugins')}`, + ] + .filter(Boolean) + .join(','); +} + +require('./lib/backend/electron-main'); diff --git a/electron-app/package.json b/electron-app/package.json index 1794ec5bd..774fe56bc 100644 --- a/electron-app/package.json +++ b/electron-app/package.json @@ -1,44 +1,78 @@ { "private": true, "name": "electron-app", - "version": "2.0.0", + "version": "2.3.7", "license": "AGPL-3.0-or-later", - "main": "src-gen/frontend/electron-main.js", + "main": "./src-gen/backend/electron-main.js", "dependencies": { - "@theia/core": "1.25.0", - "@theia/debug": "1.25.0", - "@theia/editor": "1.25.0", - "@theia/electron": "1.25.0", - "@theia/file-search": "1.25.0", - "@theia/filesystem": "1.25.0", - "@theia/keymaps": "1.25.0", - "@theia/messages": "1.25.0", - "@theia/monaco": "1.25.0", - "@theia/navigator": "1.25.0", - "@theia/plugin-ext": "1.25.0", - "@theia/plugin-ext-vscode": "1.25.0", - "@theia/preferences": "1.25.0", - "@theia/process": "1.25.0", - "@theia/terminal": "1.25.0", - "@theia/workspace": "1.25.0", - "arduino-ide-extension": "2.0.0" + "@theia/core": "1.57.0", + "@theia/debug": "1.57.0", + "@theia/editor": "1.57.0", + "@theia/electron": "1.57.0", + "@theia/filesystem": "1.57.0", + "@theia/keymaps": "1.57.0", + "@theia/messages": "1.57.0", + "@theia/monaco": "1.57.0", + "@theia/navigator": "1.57.0", + "@theia/plugin-ext": "1.57.0", + "@theia/plugin-ext-vscode": "1.57.0", + "@theia/preferences": "1.57.0", + "@theia/terminal": "1.57.0", + "@theia/workspace": "1.57.0", + "arduino-ide-extension": "2.3.7" }, "devDependencies": { - "@theia/cli": "1.25.0", - "electron": "^15.3.5" + "@theia/cli": "1.57.0", + "7zip-min": "^1.4.4", + "chmodr": "^1.2.0", + "compression-webpack-plugin": "^9.0.0", + "copy-webpack-plugin": "^8.1.1", + "dateformat": "^5.0.3", + "electron": "30.1.2", + "electron-builder": "^24.6.4", + "electron-notarize": "^1.1.1", + "execa": "^7.1.1", + "file-type": "^18.5.0", + "glob": "^10.3.3", + "is-ci": "^2.0.0", + "resolve-package-path": "^4.0.3", + "rimraf": "^5.0.0", + "semver": "^7.3.2", + "temp": "^0.9.1", + "yaml": "^1.10.2" }, "scripts": { - "prepare": "theia build --mode development", + "prepare": "theia download:plugins", + "prebuild": "rimraf lib", + "build": "theia build", + "prebuild:dev": "yarn prebuild", + "build:dev": "theia build --config webpack.dev.js --mode development", + "test": "mocha \"./test/**/*.test.js\"", "start": "theia start --plugins=local-dir:../plugins", - "watch": "theia build --watch --mode development" + "watch": "theia build --config webpack.dev.js --mode development --watch", + "prepackage": "rimraf dist", + "package": "node ./scripts/package.js", + "postpackage": "node ./scripts/post-package.js", + "rebuild": "theia rebuild:browser --cacheRoot .. && theia rebuild:electron --cacheRoot .." }, "theia": { "target": "electron", "frontend": { "config": { "applicationName": "Arduino IDE", - "defaultTheme": "arduino-theme", + "defaultTheme": { + "light": "arduino-theme", + "dark": "arduino-theme-dark" + }, + "defaultIconTheme": "none", + "validatePreferencesSchema": false, + "electron": { + "showWindowEarly": true, + "uriScheme": "arduino-ide" + }, + "reloadOnReconnect": true, "preferences": { + "window.title": "${rootName}${activeEditorShort}${appName}", "files.autoSave": "afterDelay", "editor.minimap.enabled": false, "editor.tabSize": 2, @@ -48,6 +82,8 @@ "comments": false, "strings": false }, + "editor.maxTokenizationLineLength": 500, + "editor.bracketPairColorization.enabled": false, "breadcrumbs.enabled": false, "workbench.tree.renderIndentGuides": "none", "explorer.compactFolders": false @@ -56,7 +92,8 @@ }, "backend": { "config": { - "configDirName": ".arduinoIDE" + "configDirName": ".arduinoIDE", + "singleInstance": true } }, "generator": { @@ -64,5 +101,133 @@ "preloadTemplate": "./resources/preload.html" } } + }, + "author": "Arduino SA", + "description": "Arduino IDE", + "build": { + "appId": "cc.arduino.IDE2", + "productName": "Arduino IDE", + "asar": false, + "detectUpdateChannel": false, + "generateUpdatesFilesForAllChannels": true, + "npmRebuild": false, + "directories": { + "buildResources": "resources" + }, + "fileAssociations": [ + { + "ext": "ino", + "role": "Editor" + } + ], + "files": [ + "arduino-ide-electron-main.js", + "src-gen", + "lib", + "resources/icons/512x512.png", + "!**node_modules/**" + ], + "extraResources": [ + { + "from": "plugins", + "to": "app/plugins" + } + ], + "win": { + "target": [ + "msi", + "nsis", + "zip" + ], + "sign": "./scripts/windowsCustomSign.js" + }, + "mac": { + "darkModeSupport": true, + "hardenedRuntime": true, + "gatekeeperAssess": false, + "entitlements": "resources/entitlements.mac.plist", + "entitlementsInherit": "resources/entitlements.mac.plist", + "target": { + "target": "default" + } + }, + "linux": { + "target": [ + "zip", + "AppImage" + ], + "category": "Development", + "icon": "resources/icons" + }, + "msi": { + "runAfterFinish": false + }, + "nsis": { + "oneClick": false, + "installerHeaderIcon": "resources/icon.ico", + "installerIcon": "resources/icon.ico", + "uninstallerIcon": "resources/icon.ico", + "installerSidebar": "resources/installerSidebar.bmp", + "uninstallerSidebar": "resources/installerSidebar.bmp", + "allowToChangeInstallationDirectory": true, + "license": "resources/eula.txt" + }, + "dmg": { + "icon": "resources/icon.icns", + "iconSize": 128, + "contents": [ + { + "x": 380, + "y": 240, + "type": "link", + "path": "/Applications" + }, + { + "x": 122, + "y": 240, + "type": "file" + } + ] + }, + "afterSign": "scripts/notarize.js", + "publish": [ + { + "provider": "s3", + "bucket": "arduino-downloads-prod-beagle", + "path": "arduino-ide/nightly" + } + ] + }, + "theiaPluginsDir": "plugins", + "theiaPlugins": { + "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-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.88.1/file/vscode.json-1.88.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", + "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.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.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.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.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-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.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.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-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.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.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.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-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.96.0/file/MS-CEINTL.vscode-language-pack-zh-hant-1.96.0.vsix" + }, + "mocha": { + "reporter": "spec", + "colors": true, + "watch-extensions": "js", + "timeout": 10000 } } diff --git a/electron-app/patch/frontend/index.js b/electron-app/patch/frontend/index.js deleted file mode 100644 index 26afbfedd..000000000 --- a/electron-app/patch/frontend/index.js +++ /dev/null @@ -1,100 +0,0 @@ -// Patch for the startup theme. Customizes the `ThemeService.get().defaultTheme();` to dispatch the default IDE2 theme based on the OS' theme. -// For all subsequent starts of the IDE the theme applied will be the last one set by the user. - -// With the current version of Theia adopted (1.25) it is not possible to extend the `ThemeService`, it will be possible starting from Theia 1.27. -// Once the version of Theia is updated, this patch will be removed and this functionality will be implemented via dependency injection. -// Ideally, we should open a PR in Theia and add support for `light` and `dark` default themes in the app config. - -const { - ThemeService, - ThemeServiceSymbol, - BuiltinThemeProvider, -} = require('@theia/core/lib/browser/theming'); -const { - ApplicationProps, -} = require('@theia/application-package/lib/application-props'); -const { - FrontendApplicationConfigProvider, -} = require('@theia/core/lib/browser/frontend-application-config-provider'); - -// It is a mighty hack to support theme updates in the bundled IDE2. -// If the custom theme registration happens before the restoration of the existing monaco themes, then any custom theme changes will be ignored. -// This patch introduces a static deferred promise in the monaco-theming service that will be resolved when the restoration is ready. -// IDE2 cannot require the monaco theme service on the outer module level, as it requires the application config provider to be initialized, -// but the initialization happens only in the generated `index.js`. -// This patch customizes the monaco theme service behavior before loading the DI containers via the preload. -// The preload is called only once before the app loads. The Theia extensions are not loaded at that point, but the app config provider is ready. -const preloader = require('@theia/core/lib/browser/preloader'); -const originalPreload = preloader.preload; -preloader.preload = async function () { - const { MonacoThemingService } = require('@theia/monaco/lib/browser/monaco-theming-service'); - const { MonacoThemeServiceIsReady } = require('arduino-ide-extension/lib/browser/utils/window'); - const { Deferred } = require('@theia/core/lib/common/promise-util'); - const ready = new Deferred(); - if (!window[MonacoThemeServiceIsReady]) { - window[MonacoThemeServiceIsReady] = ready; - console.log('Registered a custom monaco-theme service initialization signal on the window object.'); - } - // Here, it is safe to patch the theme service, app config provider is ready. - MonacoThemingService.init = async function () { - this.updateBodyUiTheme(); - ThemeService.get().onDidColorThemeChange(() => this.updateBodyUiTheme()); - await this.restore(); - ready.resolve(); - }.bind(MonacoThemingService); - return originalPreload(); -}.bind(preloader); - -const lightTheme = 'arduino-theme'; -const darkTheme = 'arduino-theme-dark'; -const defaultTheme = - window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches - ? darkTheme - : lightTheme; - -const originalGet = FrontendApplicationConfigProvider.get; -FrontendApplicationConfigProvider.get = function () { - const originalProps = originalGet.bind(FrontendApplicationConfigProvider)(); - return { ...originalProps, defaultTheme }; -}.bind(FrontendApplicationConfigProvider); - -const arduinoDarkTheme = { - id: 'arduino-theme-dark', - type: 'dark', - label: 'Dark (Arduino)', - editorTheme: 'arduino-theme-dark', - activate() {}, - deactivate() {}, -}; - -const arduinoLightTheme = { - id: 'arduino-theme', - type: 'light', - label: 'Light (Arduino)', - editorTheme: 'arduino-theme', - activate() {}, - deactivate() {}, -}; - -if (!window[ThemeServiceSymbol]) { - const themeService = new ThemeService(); - Object.defineProperty(themeService, 'defaultTheme', { - get: function () { - return ( - this.themes[defaultTheme] || - this.themes[ApplicationProps.DEFAULT.frontend.config.defaultTheme] - ); - }, - }); - themeService.register( - ...BuiltinThemeProvider.themes, - arduinoDarkTheme, - arduinoLightTheme - ); - themeService.startupTheme(); - themeService.setCurrentTheme(defaultTheme); - window[ThemeServiceSymbol] = themeService; -} - -// Require the original, generated `index.js` for `webpack` as the next entry for the `bundle.js`. -require('../../src-gen/frontend/index'); diff --git a/electron/build/resources/entitlements.mac.plist b/electron-app/resources/entitlements.mac.plist similarity index 100% rename from electron/build/resources/entitlements.mac.plist rename to electron-app/resources/entitlements.mac.plist diff --git a/electron/build/resources/eula.txt b/electron-app/resources/eula.txt similarity index 100% rename from electron/build/resources/eula.txt rename to electron-app/resources/eula.txt diff --git a/electron/build/resources/icon.icns b/electron-app/resources/icon.icns similarity index 100% rename from electron/build/resources/icon.icns rename to electron-app/resources/icon.icns diff --git a/electron/build/resources/icon.ico b/electron-app/resources/icon.ico similarity index 100% rename from electron/build/resources/icon.ico rename to electron-app/resources/icon.ico diff --git a/electron/build/resources/icons/512x512.png b/electron-app/resources/icons/512x512.png similarity index 100% rename from electron/build/resources/icons/512x512.png rename to electron-app/resources/icons/512x512.png diff --git a/electron/build/resources/installerSidebar.bmp b/electron-app/resources/installerSidebar.bmp similarity index 100% rename from electron/build/resources/installerSidebar.bmp rename to electron-app/resources/installerSidebar.bmp diff --git a/electron-app/resources/preload.html b/electron-app/resources/preload.html index 9843ac97d..e11e1c6bb 100644 --- a/electron-app/resources/preload.html +++ b/electron-app/resources/preload.html @@ -57,7 +57,7 @@ @keyframes preload-spinner { 0% { - transform: scale(1.0); + transform: scale(1); } 50% { @@ -65,48 +65,127 @@ } 100% { - transform: scale(1.0); + transform: scale(1); } } </style> </head> <body> - <div class='spinner-container'> - <div class='custom-spinner'> - <svg id="spinner" xmlns="http://www.w3.org/2000/svg" width="2499" height="2500" - viewBox="0 0 1372.201 1372.684"> - <path fill="#00979D" stroke="#81C9CB" stroke-width=".932" stroke-miterlimit="10" - d="M1371.701 686.024c0 378.658-306.972 685.605-685.549 685.605C307.451 1371.629.5 1064.682.5 686.024.5 307.455 307.451.483 686.152.483c378.594.001 685.549 306.972 685.549 685.541z" /> - <linearGradient id="a" gradientUnits="userSpaceOnUse" x1="-16.3" y1="16.071" x2="1354.901" y2="16.071" - gradientTransform="matrix(1 0 0 -1 16.8 702.696)"> + <div class="spinner-container"> + <div class="custom-spinner"> + <svg + id="spinner" + xmlns="http://www.w3.org/2000/svg" + width="2499" + height="2500" + viewBox="0 0 1372.201 1372.684" + > + <path + fill="#00979D" + stroke="#81C9CB" + stroke-width=".932" + stroke-miterlimit="10" + d="M1371.701 686.024c0 378.658-306.972 685.605-685.549 685.605C307.451 1371.629.5 1064.682.5 686.024.5 307.455 307.451.483 686.152.483c378.594.001 685.549 306.972 685.549 685.541z" + /> + <linearGradient + id="a" + gradientUnits="userSpaceOnUse" + x1="-16.3" + y1="16.071" + x2="1354.901" + y2="16.071" + gradientTransform="matrix(1 0 0 -1 16.8 702.696)" + > <stop offset=".117" stop-color="#fff" stop-opacity="0" /> - <stop offset=".252" stop-color="#c0d1d3" stop-opacity=".153" /> - <stop offset=".387" stop-color="#91b3b7" stop-opacity=".306" /> - <stop offset=".52" stop-color="#6d9fa3" stop-opacity=".457" /> - <stop offset=".65" stop-color="#4d9195" stop-opacity=".604" /> - <stop offset=".776" stop-color="#30888b" stop-opacity=".746" /> - <stop offset=".895" stop-color="#148386" stop-opacity=".881" /> + <stop + offset=".252" + stop-color="#c0d1d3" + stop-opacity=".153" + /> + <stop + offset=".387" + stop-color="#91b3b7" + stop-opacity=".306" + /> + <stop + offset=".52" + stop-color="#6d9fa3" + stop-opacity=".457" + /> + <stop + offset=".65" + stop-color="#4d9195" + stop-opacity=".604" + /> + <stop + offset=".776" + stop-color="#30888b" + stop-opacity=".746" + /> + <stop + offset=".895" + stop-color="#148386" + stop-opacity=".881" + /> <stop offset="1" stop-color="#008184" /> </linearGradient> - <linearGradient id="b" gradientUnits="userSpaceOnUse" x1="-16.8" y1="16.071" x2="1355.401" y2="16.071" - gradientTransform="matrix(1 0 0 -1 16.8 702.696)"> + <linearGradient + id="b" + gradientUnits="userSpaceOnUse" + x1="-16.8" + y1="16.071" + x2="1355.401" + y2="16.071" + gradientTransform="matrix(1 0 0 -1 16.8 702.696)" + > <stop offset="0" stop-color="#fff" stop-opacity="0" /> - <stop offset=".153" stop-color="#c0d1d3" stop-opacity=".153" /> - <stop offset=".306" stop-color="#91b3b7" stop-opacity=".306" /> - <stop offset=".457" stop-color="#6d9fa3" stop-opacity=".457" /> - <stop offset=".604" stop-color="#4d9195" stop-opacity=".604" /> - <stop offset=".746" stop-color="#30888b" stop-opacity=".746" /> - <stop offset=".881" stop-color="#148386" stop-opacity=".881" /> + <stop + offset=".153" + stop-color="#c0d1d3" + stop-opacity=".153" + /> + <stop + offset=".306" + stop-color="#91b3b7" + stop-opacity=".306" + /> + <stop + offset=".457" + stop-color="#6d9fa3" + stop-opacity=".457" + /> + <stop + offset=".604" + stop-color="#4d9195" + stop-opacity=".604" + /> + <stop + offset=".746" + stop-color="#30888b" + stop-opacity=".746" + /> + <stop + offset=".881" + stop-color="#148386" + stop-opacity=".881" + /> <stop offset="1" stop-color="#008184" /> </linearGradient> - <path opacity=".5" fill="url(#a)" stroke="url(#b)" stroke-miterlimit="10" - d="M1371.701 686.595c0 378.65-306.972 685.606-685.549 685.606C307.451 1372.201.5 1065.23.5 686.595.5 308.019 307.451 1.048 686.152 1.048c378.594.016 685.549 306.97 685.549 685.547z" /> + <path + opacity=".5" + fill="url(#a)" + stroke="url(#b)" + stroke-miterlimit="10" + d="M1371.701 686.595c0 378.65-306.972 685.606-685.549 685.606C307.451 1372.201.5 1065.23.5 686.595.5 308.019 307.451 1.048 686.152 1.048c378.594.016 685.549 306.97 685.549 685.547z" + /> <g fill="#FFF"> <path - d="M947.959 931.196c-12.909 0-26.127-.929-39.127-2.864-108.978-15.554-181.848-93.822-222.665-153.989-40.946 60.166-113.811 138.512-222.74 154.045a275.864 275.864 0 0 1-39.133 2.785c-67.753 0-131.358-25.217-179.201-71.003-48.299-46.165-74.951-108.114-74.951-174.171 0-66.14 26.651-128.004 75.021-174.253 47.797-45.793 111.449-70.936 179.231-70.936 12.918 0 26.067.928 39.023 2.783 108.932 15.535 181.794 93.813 222.743 153.99 40.825-60.177 113.689-138.432 222.658-153.99 13-1.863 26.148-2.783 39.066-2.783 67.753 0 131.401 25.208 179.197 70.936 48.345 46.249 74.937 108.113 74.937 174.253 0 66.057-26.524 128.006-74.868 174.171-47.881 45.785-111.434 71.026-179.191 71.026M734.42 686.024c21.283 40.534 84.067 141.676 186.692 156.375 8.984 1.236 18.028 1.923 26.839 1.923 92.185 0 167.225-71.002 167.225-158.322s-75.023-158.321-167.291-158.321c-8.812 0-17.853.629-26.753 1.921-102.644 14.664-165.428 115.806-186.712 156.424M424.393 527.702c-92.308 0-167.36 70.998-167.36 158.321 0 87.305 75.021 158.322 167.245 158.322 8.852 0 17.897-.688 26.879-1.922 102.629-14.697 165.394-115.783 186.689-156.375-21.237-40.535-84.061-141.761-186.689-156.376-8.877-1.341-17.945-1.97-26.764-1.97" /> + d="M947.959 931.196c-12.909 0-26.127-.929-39.127-2.864-108.978-15.554-181.848-93.822-222.665-153.989-40.946 60.166-113.811 138.512-222.74 154.045a275.864 275.864 0 0 1-39.133 2.785c-67.753 0-131.358-25.217-179.201-71.003-48.299-46.165-74.951-108.114-74.951-174.171 0-66.14 26.651-128.004 75.021-174.253 47.797-45.793 111.449-70.936 179.231-70.936 12.918 0 26.067.928 39.023 2.783 108.932 15.535 181.794 93.813 222.743 153.99 40.825-60.177 113.689-138.432 222.658-153.99 13-1.863 26.148-2.783 39.066-2.783 67.753 0 131.401 25.208 179.197 70.936 48.345 46.249 74.937 108.113 74.937 174.253 0 66.057-26.524 128.006-74.868 174.171-47.881 45.785-111.434 71.026-179.191 71.026M734.42 686.024c21.283 40.534 84.067 141.676 186.692 156.375 8.984 1.236 18.028 1.923 26.839 1.923 92.185 0 167.225-71.002 167.225-158.322s-75.023-158.321-167.291-158.321c-8.812 0-17.853.629-26.753 1.921-102.644 14.664-165.428 115.806-186.712 156.424M424.393 527.702c-92.308 0-167.36 70.998-167.36 158.321 0 87.305 75.021 158.322 167.245 158.322 8.852 0 17.897-.688 26.879-1.922 102.629-14.697 165.394-115.783 186.689-156.375-21.237-40.535-84.061-141.761-186.689-156.376-8.877-1.341-17.945-1.97-26.764-1.97" + /> <path - d="M354.37 662.051h152.625v49.181H354.37zM1016.484 662.051h-51.671v-51.747h-49.348v51.747h-51.648v49.181h51.648v51.737h49.348v-51.737h51.671z" /> + d="M354.37 662.051h152.625v49.181H354.37zM1016.484 662.051h-51.671v-51.747h-49.348v51.747h-51.648v49.181h51.648v51.737h49.348v-51.737h51.671z" + /> </g> </svg> </div> diff --git a/electron-app/scripts/archive.js b/electron-app/scripts/archive.js new file mode 100644 index 000000000..19eeb8165 --- /dev/null +++ b/electron-app/scripts/archive.js @@ -0,0 +1,135 @@ +// @ts-check +'use strict'; + +const fs = require('node:fs'); +const path = require('node:path'); +const zip = require('7zip-min'); +const temp = require('temp'); + +/** + * `pathToZip` is a `path/to/your/app-name.zip`. + * If the `pathToZip` archive does not have a root directory with name `app-name`, it creates one, and move the content from the + * archive's root to the new root folder. If the archive already has the desired root folder, calling this function is a NOOP. + * If `pathToZip` is not a ZIP, rejects. `targetFolder` is the destination folder not the new archive location. + * + * @param {string} pathToZip path to the archive to adjust + * @param {string} targetFolder the adjusted archive will be here + * @param {boolean} [noCleanup=false] for testing + */ +function adjustArchiveStructure(pathToZip, targetFolder, noCleanup = false) { + return new Promise(async (resolve, reject) => { + if (!(await isZip(pathToZip))) { + reject(new Error(`Expected a ZIP file.`)); + return; + } + if (!fs.existsSync(targetFolder)) { + reject(new Error(`${targetFolder} does not exist.`)); + return; + } + if (!fs.lstatSync(targetFolder).isDirectory()) { + reject(new Error(`${targetFolder} is not a directory.`)); + return; + } + console.log(`⏱️ >>> Adjusting ZIP structure ${pathToZip}...`); + + const root = basename(pathToZip); + const resources = await list(pathToZip); + const hasBaseFolder = resources.find((name) => name === root); + if (hasBaseFolder) { + if ( + resources.filter((name) => name.indexOf(path.sep) === -1).length > 1 + ) { + console.warn( + `${pathToZip} ZIP has the desired root folder ${root}, however the ZIP contains other entries too: ${JSON.stringify( + resources + )}` + ); + } + console.log(`👌 <<< The ZIP already has the desired ${root} folder.`); + resolve(pathToZip); + return; + } + + const track = temp.track(); + try { + const unzipOut = path.join(track.mkdirSync(), root); + fs.mkdirSync(unzipOut); + await unpack(pathToZip, unzipOut); + const adjustedZip = path.join(targetFolder, path.basename(pathToZip)); + await pack(unzipOut, adjustedZip); + console.log( + `👌 <<< Adjusted the ZIP structure. Moved the modified ${basename( + pathToZip + )} to the ${targetFolder} folder.` + ); + resolve(adjustedZip); + } finally { + if (!noCleanup) { + track.cleanupSync(); + } + } + }); +} + +/** + * Returns the `basename` of `pathToFile` without the file extension. + */ +function basename(pathToFile) { + const name = path.basename(pathToFile); + const ext = path.extname(pathToFile); + return name.substr(0, name.length - ext.length); +} + +/** + * @param {string} what path to the archive + * @param {string} where path to the destination + */ +function unpack(what, where) { + return new Promise((resolve, reject) => { + zip.unpack(what, where, (error) => { + if (error) { + reject(error); + return; + } + resolve(undefined); + }); + }); +} + +function pack(what, where) { + return new Promise((resolve, reject) => { + zip.pack(what, where, (error) => { + if (error) { + reject(error); + return; + } + resolve(undefined); + }); + }); +} + +function list(what) { + return new Promise((resolve, reject) => { + zip.list(what, (error, result) => { + if (error) { + reject(error); + return; + } + resolve(result.map(({ name }) => name)); + }); + }); +} + +/** + * @param {string} pathToFile + */ +async function isZip(pathToFile) { + if (!fs.existsSync(pathToFile)) { + throw new Error(`${pathToFile} does not exist`); + } + const fileType = await import('file-type'); + const type = await fileType.fileTypeFromFile(pathToFile); + return type && type.ext === 'zip'; +} + +module.exports = { isZip, unpack, adjustArchiveStructure }; diff --git a/electron/build/scripts/notarize.js b/electron-app/scripts/notarize.js similarity index 60% rename from electron/build/scripts/notarize.js rename to electron-app/scripts/notarize.js index 05a7b64b3..0a74e2084 100644 --- a/electron/build/scripts/notarize.js +++ b/electron-app/scripts/notarize.js @@ -1,20 +1,34 @@ +// @ts-check +'use strict'; + const isCI = require('is-ci'); const { notarize } = require('electron-notarize'); exports.default = async function notarizing(context) { if (!isCI) { - console.log('Skipping notarization: not on CI.'); - return; - } - if (process.env.CAN_SIGN === 'false') { - console.log('Skipping the app notarization: certificate was not provided.'); + console.log('Skipping notarization: not on CI'); return; } const { electronPlatformName, appOutDir } = context; if (electronPlatformName !== 'darwin') { + console.log('Skipping notarization: not on macOS'); + return; + } + if (process.env.CAN_SIGN !== 'true') { + console.log('Skipping the app notarization: certificate was not provided'); return; } + if (!process.env.AC_USERNAME) { + throw new Error('AC_USERNAME must be set when notarizing on macOS'); + } + if (!process.env.AC_PASSWORD) { + throw new Error('AC_PASSWORD must be set when notarizing on macOS'); + } + if (!process.env.AC_TEAM_ID) { + throw new Error('AC_TEAM_ID must be set when notarizing on macOS'); + } + const appName = context.packager.appInfo.productFilename; const appBundleId = context.packager.config.appId; console.log( diff --git a/electron-app/scripts/package.js b/electron-app/scripts/package.js new file mode 100644 index 000000000..9e3593e64 --- /dev/null +++ b/electron-app/scripts/package.js @@ -0,0 +1,172 @@ +// @ts-check +'use strict'; + +const semver = require('semver'); +const { isNightly, isRelease } = require('./utils'); + +async function run() { + /** @type {string} */ + const rawElectronVersion = + require('../package.json').devDependencies['electron']; + const electronVersion = semver.clean(rawElectronVersion.replace(/^\^/, '')); + if (!electronVersion) { + throw new Error( + `Electron semver validation failed for version: '${rawElectronVersion}'.` + ); + } + const platform = electronPlatform(); + const version = await getVersion(); + /** @type {string|unknown} */ + const cliVersion = require('../../arduino-ide-extension/package.json') + .arduino['arduino-cli'].version; + const artifactName = await getArtifactName(version); + const args = [ + '--publish', + 'never', + '-c.electronVersion', + electronVersion, + '-c.extraMetadata.version', + version, + // overrides the `name` in the `package.json` to keep the `localStorage` location. (https://github.com/arduino/arduino-ide/pull/2144#pullrequestreview-1554005028) + '-c.extraMetadata.name', + 'arduino-ide', + `-c.${platform}.artifactName`, + artifactName, + '-c.extraMetadata.theia.frontend.config.appVersion', + version, + '-c.extraMetadata.theia.frontend.config.cliVersion', + typeof cliVersion === 'string' ? cliVersion : '', + '-c.extraMetadata.theia.frontend.config.buildDate', + new Date().toISOString(), + // when running in development mode, the main entry is a JS module generated by Theia. In the final application it's a custom module with the file logger. + '-c.extraMetadata.main', + './arduino-ide-electron-main.js', + ]; + const updateChannel = getChannel(); + if (updateChannel) { + // TODO: fix the default nightly update channel preference value if required. + // It's disabled for now: https://github.com/arduino/arduino-ide/issues/2157. + // args.push( + // '-c.extraMetadata.theia.frontend.config.arduino.ide.updateChannel', + // updateChannel + // ); + } + const cp = exec('electron-builder', args, { stdio: 'inherit' }); + await cp; +} + +function electronPlatform() { + switch (process.platform) { + case 'win32': { + return 'win'; + } + case 'darwin': { + return 'mac'; + } + case 'linux': { + return 'linux'; + } + default: + throw new Error(`Unsupported platform: ${process.platform}.`); + } +} + +/** + * @returns {Promise<string>} + */ +async function getVersion() { + /** @type {string} */ + let version = require('../package.json').version; + if (!semver.valid(version)) { + throw new Error( + `Could not read version from root package.json. Version was: '${version}'.` + ); + } + if (!isRelease) { + if (isNightly) { + version = `${version}-nightly-${await timestamp()}`; + } else { + version = `${version}-snapshot-${await currentCommitish()}`; + } + if (!semver.valid(version)) { + throw new Error(`Invalid patched version: '${version}'.`); + } + } + return version; +} + +/** + * @param {string} version + * @returns {Promise<string>} + */ +async function getArtifactName(version) { + const { platform, arch } = process; + version = isNightly ? `nightly-${await timestamp()}` : version; + const name = 'arduino-ide'; + switch (platform) { + case 'win32': { + if (arch === 'x64') { + return `${name}_${version}_Windows_64bit.\$\{ext}`; + } + throw new Error(`Unsupported platform, arch: ${platform}, ${arch}`); + } + case 'darwin': { + if (arch === 'arm64') { + return `${name}_${version}_macOS_arm64.\$\{ext}`; + } + return `${name}_${version}_macOS_64bit.\$\{ext}`; + } + case 'linux': { + switch (arch) { + case 'arm': { + return `${name}_${version}_Linux_armv7.\$\{ext}`; + } + case 'arm64': { + return `${name}_${version}_Linux_arm64.\$\{ext}`; + } + case 'x64': { + return `${name}_${version}_Linux_64bit.\$\{ext}`; + } + default: { + throw new Error(`Unsupported platform, arch: ${platform}, ${arch}`); + } + } + } + default: + throw new Error(`Unsupported platform, arch: ${platform}, ${arch}`); + } +} + +function getChannel() { + if (isRelease) { + return 'stable'; + } + if (isNightly) { + return 'nightly'; + } + return ''; +} + +async function timestamp() { + const { default: dateFormat } = await import('dateformat'); + return dateFormat(new Date(), 'yyyymmdd'); +} + +async function currentCommitish() { + return exec('git', ['rev-parse', '--short', 'HEAD']); +} + +/** + * @param {string} command + * @param {readonly string[]} args + * @param {import('execa').Options<string> | undefined} [options] + * @returns {Promise<string>} + */ +async function exec(command, args, options) { + const execa = await import('execa'); + const promise = execa.execa(command, args, options); + const { stdout } = await promise; + return stdout; +} + +run(); diff --git a/electron-app/scripts/post-package.js b/electron-app/scripts/post-package.js new file mode 100644 index 000000000..b346f558f --- /dev/null +++ b/electron-app/scripts/post-package.js @@ -0,0 +1,186 @@ +// @ts-check +'use strict'; + +const isCI = require('is-ci'); +const fs = require('fs'); +const path = require('path'); +const { glob } = require('glob'); +const { isRelease } = require('./utils'); +const { isZip, adjustArchiveStructure } = require('./archive'); + +async function run() { + if (isCI) { + console.log(`🚢 Detected CI, recalculating artifacts hash...`); + await recalculateArtifactsHash(); + console.log(`🚢 Detected CI, moving build artifacts...`); + await copyFilesToBuildArtifacts(); + console.log('👌 Done.'); + } +} + +async function recalculateArtifactsHash() { + const { platform } = process; + const cwd = path.join(__dirname, '..', 'dist'); + const channelFilePath = path.join(cwd, getChannelFile(platform)); + const yaml = require('yaml'); + + try { + let fileContents = fs.readFileSync(channelFilePath, 'utf8'); + const newChannelFile = yaml.parse(fileContents); + const { files, path: filePath } = newChannelFile; + const newSha512 = await hashFile(path.join(cwd, filePath)); + newChannelFile.sha512 = newSha512; + if (!!files) { + const newFiles = []; + for (let file of files) { + const { url } = file; + const { size } = fs.statSync(path.join(cwd, url)); + const newSha512 = await hashFile(path.join(cwd, url)); + + if (!newFiles.find((f) => f.sha512 === newSha512)) { + newFiles.push({ ...file, sha512: newSha512, size }); + } + } + newChannelFile.files = newFiles; + } + + const newChannelFileRaw = yaml.stringify(newChannelFile); + fs.writeFileSync(channelFilePath, newChannelFileRaw); + console.log(`👌 >>> Channel file updated successfully. New channel file:`); + console.log(newChannelFileRaw); + } catch (e) { + console.log(e); + } +} + +/** + * @param {import('node:fs').PathLike} file + * @param {string|undefined} [algorithm="sha512"] + * @param {BufferEncoding|undefined} [encoding="base64"] + * @param {object|undefined} [options] + */ +function hashFile(file, algorithm = 'sha512', encoding = 'base64', options) { + const crypto = require('node:crypto'); + return new Promise((resolve, reject) => { + const hash = crypto.createHash(algorithm); + hash.on('error', reject).setEncoding(encoding); + fs.createReadStream( + file, + Object.assign({}, options, { + highWaterMark: 1024 * 1024, + /* better to use more memory but hash faster */ + }) + ) + .on('error', reject) + .on('end', () => { + hash.end(); + resolve(hash.read()); + }) + .pipe(hash, { + end: false, + }); + }); +} + +// getChannelFile returns the name of the channel file to be released +// together with the IDE file. +// The channel file depends on the platform and whether we're creating +// a nightly build or a full release. +// In all other cases, like when building a tester build for a PR, +// an empty string is returned since we don't need a channel file. +// The channel files are necessary for updates check with electron-updater +// to work correctly. +// For more information: https://www.electron.build/auto-update +function getChannelFile(platform) { + let currentChannel = 'beta'; + if (isRelease) { + currentChannel = 'latest'; + } + return ( + currentChannel + + { + linux: '-linux.yml', + win32: '.yml', + darwin: '-mac.yml', + }[platform] + ); +} + +async function copyFilesToBuildArtifacts() { + const { platform } = process; + const cwd = path.join(__dirname, '..', 'dist'); + const targetFolder = path.join(cwd, 'build-artifacts'); + await require('fs/promises').mkdir(targetFolder, { recursive: true }); + const filesToCopy = []; + const channelFile = getChannelFile(platform); + // Channel file might be an empty string if we're not building a + // nightly or a full release. This can happen when building a package + // locally or a tester build when creating a new PR on GH. + if (!!channelFile && fs.existsSync(path.join(cwd, channelFile))) { + const channelFilePath = path.join(cwd, channelFile); + const newChannelFilePath = channelFilePath + ?.replace('latest', 'stable') + ?.replace('beta', 'nightly'); + console.log( + `🔨 >>> Renaming ${channelFilePath} to ${newChannelFilePath}.` + ); + await cpf(channelFilePath, newChannelFilePath); + filesToCopy.push(newChannelFilePath); + } + switch (platform) { + case 'linux': { + filesToCopy.push( + ...glob + .sync('**/arduino-ide*.{zip,AppImage}', { cwd }) + .map((p) => path.join(cwd, p)) + ); + break; + } + case 'win32': { + filesToCopy.push( + ...glob + .sync('**/arduino-ide*.{exe,msi,zip}', { cwd }) + .map((p) => path.join(cwd, p)) + ); + break; + } + case 'darwin': { + filesToCopy.push( + ...glob + .sync('**/arduino-ide*.{dmg,zip}', { cwd }) + .map((p) => path.join(cwd, p)) + ); + break; + } + default: { + console.error(`Unsupported platform: ${platform}.`); + process.exit(1); + } + } + if (!filesToCopy.length) { + console.error(`Could not collect any build artifacts from ${cwd}.`); + process.exit(1); + } + for (const fileToCopy of filesToCopy) { + if (platform === 'linux' && (await isZip(fileToCopy))) { + await adjustArchiveStructure(fileToCopy, targetFolder); + } else { + const filename = path.basename(fileToCopy); + await cpf(fileToCopy, path.join(targetFolder, filename)); + } + } +} + +/** + * `cp -f`: copies a file into a target location. Always overrides. + * @param {string} sourceFilePath absolute path to file you want to copy + * @param {string} targetFilePath target location where you want to copy + */ +async function cpf(sourceFilePath, targetFilePath) { + const fs = require('fs/promises'); + console.log(`🚢 >>> Copying ${sourceFilePath} to ${targetFilePath}.`); + await fs.copyFile(sourceFilePath, targetFilePath); + console.log(`👌 >>> Copied ${sourceFilePath} to ${targetFilePath}.`); +} + +run(); diff --git a/electron-app/scripts/utils.js b/electron-app/scripts/utils.js new file mode 100644 index 000000000..f9e4d8b93 --- /dev/null +++ b/electron-app/scripts/utils.js @@ -0,0 +1,8 @@ +// @ts-check +'use strict'; + +// const isElectronPublish = false; // TODO: support auto-updates +const isNightly = process.env.IS_NIGHTLY === 'true'; +const isRelease = process.env.IS_RELEASE === 'true'; + +module.exports = { isNightly, isRelease }; diff --git a/electron-app/scripts/windowsCustomSign.js b/electron-app/scripts/windowsCustomSign.js new file mode 100644 index 000000000..5e9585bc2 --- /dev/null +++ b/electron-app/scripts/windowsCustomSign.js @@ -0,0 +1,30 @@ +const childProcess = require('child_process'); + +exports.default = async function (configuration) { + if (!process.env.GITHUB_ACTIONS || process.env.CAN_SIGN !== 'true') { + return; + } + + const SIGNTOOL_PATH = process.env.SIGNTOOL_PATH; + const INSTALLER_CERT_WINDOWS_CER = process.env.INSTALLER_CERT_WINDOWS_CER; + const CERT_PASSWORD = process.env.WIN_CERT_PASSWORD; + const CONTAINER_NAME = process.env.WIN_CERT_CONTAINER_NAME; + const filePath = configuration.path; + + if ( + SIGNTOOL_PATH && + INSTALLER_CERT_WINDOWS_CER && + CERT_PASSWORD && + CONTAINER_NAME + ) { + childProcess.execSync( + `"${SIGNTOOL_PATH}" sign -d "Arduino IDE" -f "${INSTALLER_CERT_WINDOWS_CER}" -csp "eToken Base Cryptographic Provider" -k "[{{${CERT_PASSWORD}}}]=${CONTAINER_NAME}" -fd sha256 -tr http://timestamp.digicert.com -td SHA256 -v "${filePath}"`, + { stdio: 'inherit' } + ); + } else { + console.warn( + `Custom windows signing was no performed one of the following variables was not provided: SIGNTOOL_PATH (${SIGNTOOL_PATH}), INSTALLER_CERT_WINDOWS_CERT (${INSTALLER_CERT_WINDOWS_CER}), CERT_PASSWORD (${CERT_PASSWORD}), CONTAINER_NAME (${CONTAINER_NAME})` + ); + process.exit(1); + } +}; diff --git a/electron/packager/test/utils.test.js b/electron-app/test/archive.test.js similarity index 52% rename from electron/packager/test/utils.test.js rename to electron-app/test/archive.test.js index 0e5c5d558..4af3e21f3 100644 --- a/electron/packager/test/utils.test.js +++ b/electron-app/test/archive.test.js @@ -1,30 +1,38 @@ -const fs = require('fs'); -const path = require('path'); -const expect = require('chai').expect; -const track = require('temp').track(); -const unpack = require('../utils').unpack; -const testMe = require('../utils'); -const sinon = require('sinon'); +// @ts-check +'use strict'; -describe('utils', () => { +const fs = require('node:fs'); +const path = require('node:path'); +const { expect } = require('chai'); +const temp = require('temp'); +const { unpack, adjustArchiveStructure } = require('../scripts/archive'); +describe('archive', () => { describe('adjustArchiveStructure', () => { + let tracked; + let originalLog; + before(() => { + tracked = temp.track(); + originalLog = console.log; + console.log = () => { + /*NOOP*/ + }; + }); - let consoleStub; - - beforeEach(() => { - consoleStub = sinon.stub(console, 'log').value(() => { }); + after(() => { + if (originalLog) { + console.log = originalLog; + } }); afterEach(() => { - consoleStub.reset(); - track.cleanupSync(); + tracked.cleanupSync(); }); it('should reject when not a zip file', async () => { try { - const invalid = path.join(__dirname, 'resources', 'not-a-zip.dmg'); - await testMe.adjustArchiveStructure(invalid, track.mkdirSync()); + const invalid = path.join(__dirname, 'test-resources', 'not-a-zip.dmg'); + await adjustArchiveStructure(invalid, tracked.mkdirSync()); throw new Error('Expected a rejection'); } catch (e) { expect(e).to.be.an.instanceOf(Error); @@ -34,8 +42,15 @@ describe('utils', () => { it('should reject when target directory does not exist', async () => { try { - const zip = path.join(__dirname, 'resources', 'zip-with-base-folder.zip'); - await testMe.adjustArchiveStructure(zip, path.join(__dirname, 'some', 'missing', 'path')); + const zip = path.join( + __dirname, + 'test-resources', + 'zip-with-base-folder.zip' + ); + await adjustArchiveStructure( + zip, + path.join(__dirname, 'some', 'missing', 'path') + ); throw new Error('Expected a rejection'); } catch (e) { expect(e).to.be.an.instanceOf(Error); @@ -45,8 +60,12 @@ describe('utils', () => { it('should reject when target is a file', async () => { try { - const zip = path.join(__dirname, 'resources', 'zip-with-base-folder.zip'); - await testMe.adjustArchiveStructure(zip, path.join(__filename)); + const zip = path.join( + __dirname, + 'test-resources', + 'zip-with-base-folder.zip' + ); + await adjustArchiveStructure(zip, path.join(__filename)); throw new Error('Expected a rejection'); } catch (e) { expect(e).to.be.an.instanceOf(Error); @@ -55,20 +74,28 @@ describe('utils', () => { }); it('should be a NOOP when the zip already has the desired base folder', async () => { - const zip = path.join(__dirname, 'resources', 'zip-with-base-folder.zip'); - const actual = await testMe.adjustArchiveStructure(zip, track.mkdirSync()); + const zip = path.join( + __dirname, + 'test-resources', + 'zip-with-base-folder.zip' + ); + const actual = await adjustArchiveStructure(zip, tracked.mkdirSync()); expect(actual).to.be.equal(zip); }); it('should handle whitespace in file path gracefully', async () => { - const zip = path.join(__dirname, 'resources', 'zip with whitespace.zip'); - const out = track.mkdirSync(); - const actual = await testMe.adjustArchiveStructure(zip, out, true); + const zip = path.join( + __dirname, + 'test-resources', + 'zip with whitespace.zip' + ); + const out = tracked.mkdirSync(); + const actual = await adjustArchiveStructure(zip, out, true); expect(actual).to.be.equal(path.join(out, 'zip with whitespace.zip')); console.log(actual); expect(fs.existsSync(actual)).to.be.true; - const verifyOut = track.mkdirSync(); + const verifyOut = tracked.mkdirSync(); await unpack(actual, verifyOut); const root = path.join(verifyOut, 'zip with whitespace'); @@ -83,27 +110,41 @@ describe('utils', () => { if (process.platform === 'win32') { this.skip(); } - const zip = path.join(__dirname, 'resources', 'zip-with-symlink.zip'); - const out = track.mkdirSync(); - const actual = await testMe.adjustArchiveStructure(zip, out, true); + const zip = path.join( + __dirname, + 'test-resources', + 'zip-with-symlink.zip' + ); + const out = tracked.mkdirSync(); + const actual = await adjustArchiveStructure(zip, out, true); expect(actual).to.be.equal(path.join(out, 'zip-with-symlink.zip')); console.log(actual); expect(fs.existsSync(actual)).to.be.true; - const verifyOut = track.mkdirSync(); + const verifyOut = tracked.mkdirSync(); await unpack(actual, verifyOut); - expect(fs.lstatSync(path.join(verifyOut, 'zip-with-symlink', 'folder', 'symlinked-sub')).isSymbolicLink()).to.be.true; + expect( + fs + .lstatSync( + path.join(verifyOut, 'zip-with-symlink', 'folder', 'symlinked-sub') + ) + .isSymbolicLink() + ).to.be.true; }); it('should adjust the archive structure if base folder is not present', async () => { - const zip = path.join(__dirname, 'resources', 'zip-without-symlink.zip'); - const out = track.mkdirSync(); - const actual = await testMe.adjustArchiveStructure(zip, out, true); + const zip = path.join( + __dirname, + 'test-resources', + 'zip-without-symlink.zip' + ); + const out = tracked.mkdirSync(); + const actual = await adjustArchiveStructure(zip, out, true); expect(actual).to.be.equal(path.join(out, 'zip-without-symlink.zip')); console.log(actual); expect(fs.existsSync(actual)).to.be.true; - const verifyOut = track.mkdirSync(); + const verifyOut = tracked.mkdirSync(); await unpack(actual, verifyOut); const root = path.join(verifyOut, 'zip-without-symlink'); @@ -113,7 +154,5 @@ describe('utils', () => { expect(subs).to.have.lengthOf(3); expect(subs.sort()).to.be.deep.equal(['a.txt', 'b.txt', 'foo']); }); - }); - -}); \ No newline at end of file +}); diff --git a/electron/packager/test/resources/not-a-zip.dmg b/electron-app/test/test-resources/not-a-zip.dmg similarity index 100% rename from electron/packager/test/resources/not-a-zip.dmg rename to electron-app/test/test-resources/not-a-zip.dmg diff --git a/electron/packager/test/resources/zip with whitespace.zip b/electron-app/test/test-resources/zip with whitespace.zip similarity index 100% rename from electron/packager/test/resources/zip with whitespace.zip rename to electron-app/test/test-resources/zip with whitespace.zip diff --git a/electron/packager/test/resources/zip-with-base-folder.zip b/electron-app/test/test-resources/zip-with-base-folder.zip similarity index 100% rename from electron/packager/test/resources/zip-with-base-folder.zip rename to electron-app/test/test-resources/zip-with-base-folder.zip diff --git a/electron/packager/test/resources/zip-with-symlink.zip b/electron-app/test/test-resources/zip-with-symlink.zip similarity index 100% rename from electron/packager/test/resources/zip-with-symlink.zip rename to electron-app/test/test-resources/zip-with-symlink.zip diff --git a/electron/packager/test/resources/zip-without-symlink.zip b/electron-app/test/test-resources/zip-without-symlink.zip similarity index 100% rename from electron/packager/test/resources/zip-without-symlink.zip rename to electron-app/test/test-resources/zip-without-symlink.zip diff --git a/electron-app/webpack.base.js b/electron-app/webpack.base.js new file mode 100644 index 000000000..27f721d95 --- /dev/null +++ b/electron-app/webpack.base.js @@ -0,0 +1,100 @@ +// @ts-check +'use strict'; + +const chmodr = require('chmodr'); +const CopyWebpackPlugin = require('copy-webpack-plugin'); +const path = require('node:path'); + +/** + * @param {string} target the name of the `npm` package to resolve. + */ +function resolvePackagePath(target, baseDir = __dirname) { + const resolvePackageJsonPath = require('resolve-package-path'); + const packageJsonPath = resolvePackageJsonPath(target, baseDir); + if (!packageJsonPath) { + throw new Error( + `Could not resolve package '${target}'. Base dir: ${baseDir}` + ); + } + return path.join(packageJsonPath, '..'); // one level up to locate the package folder +} + +// restore file permissions after webpack copy +// https://github.com/webpack-contrib/copy-webpack-plugin/issues/35#issuecomment-1407280257 +class PermissionsPlugin { + /** + * @param {string} targetPath + */ + constructor(targetPath) { + this.targetPath = targetPath; + } + + /** + * @param {import('webpack').Compiler} compiler + */ + apply(compiler) { + compiler.hooks.afterEmit.tap('PermissionsPlugin', () => { + return new Promise(async (resolve, reject) => { + chmodr(this.targetPath, 0o755, (err) => + err ? reject(err) : resolve(undefined) + ); + }); + }); + } +} + +/** + * Creates webpack plugins to copy all required resources (binaries, plotter app, translation files, etc.) to the appropriate location. + * @param {string} targetPath where to copy the resources + * @param {string|undefined} [baseDir=__dirname] to calculate the modules from. Defaults to `__dirname` + */ +function createCopyArduinoResourcesPlugins(targetPath, baseDir = __dirname) { + const copyOptions = { + patterns: [ + // binaries + { + from: path.join( + resolvePackagePath('arduino-ide-extension', baseDir), + 'src', + 'node', + 'resources' + ), + to: targetPath, + globOptions: { + ignore: ['**/i18n/**'], + }, + }, + // plotter app + { + from: path.join( + resolvePackagePath('arduino-serial-plotter-webapp', baseDir), + 'build' + ), + to: path.resolve(targetPath, 'arduino-serial-plotter-webapp'), + }, + ], + }; + return [ + new CopyWebpackPlugin(copyOptions), + new PermissionsPlugin(targetPath), + ]; +} + +/** + * Removes the compression webpack plugin if it's set in the config. Otherwise, it's NOOP> + * @param {import('webpack').Configuration} config + */ +function removeCompressionPlugin(config) { + const CompressionPlugin = require('compression-webpack-plugin'); + for (let i = config.plugins?.length || 0; i >= 0; i--) { + const plugin = config.plugins?.[i]; + if (plugin instanceof CompressionPlugin) { + config.plugins?.splice(i, 1); + } + } +} + +module.exports = { + createCopyArduinoResourcesPlugins, + removeCompressionPlugin, +}; diff --git a/electron-app/webpack.config.js b/electron-app/webpack.config.js index 817202e5b..d259e150e 100644 --- a/electron-app/webpack.config.js +++ b/electron-app/webpack.config.js @@ -1,26 +1,53 @@ -/** - * This file can be edited to customize webpack configuration. - * To reset delete this file and rerun theia build again. - */ -// @ts-check -const config = require('./gen-webpack.config.js'); +const path = require('node:path'); +const webpack = require('webpack'); +const frontend = require('./gen-webpack.config'); +const backend = require('./gen-webpack.node.config'); +const { + createCopyArduinoResourcesPlugins, + removeCompressionPlugin, +} = require('./webpack.base'); -config.resolve.fallback['http'] = false; -config.resolve.fallback['fs'] = false; +// https://github.com/browserify/node-util/issues/57#issuecomment-764436352 +const mainWindowConfig = frontend[0]; +mainWindowConfig.resolve.extensions.push('.ts'); +mainWindowConfig.resolve.fallback['util'] = require.resolve('util/'); +mainWindowConfig.plugins?.push( + new webpack.ProvidePlugin({ + // Make a global `process` variable that points to the `process` package, + // because the `util` package expects there to be a global variable named `process`. + // Thanks to https://stackoverflow.com/a/65018686/14239942 + process: 'process/browser', + }) +); +const preloadConfig = frontend[2]; -/** - * Expose bundled modules on window.theia.moduleName namespace, e.g. - * window['theia']['@theia/core/lib/common/uri']. - * Such syntax can be used by external code, for instance, for testing. -config.module.rules.push({ - test: /\.js$/, - loader: require.resolve('@theia/application-manager/lib/expose-loader') -}); */ +// Copy all the IDE2 binaries and the plotter web app. +// XXX: For whatever reason it is important to use `unshift` instead of `push`, and execute the additional webpack plugins before the Theia contributed ones kick in. Otherwise ours do not work. +backend.config.plugins.unshift( + ...createCopyArduinoResourcesPlugins( + path.resolve(__dirname, 'lib', 'backend', 'resources') + ) +); +// Override the default entry from Theia as IDE2 has a customization of the module. +backend.config.entry['parcel-watcher'] = { + import: require.resolve( + 'arduino-ide-extension/lib/node/theia/filesystem/parcel-watcher' + ), + library: { + type: 'commonjs2', + }, +}; -// Load the patched `index.js` that sets the desired theme in IDE2 based on the OS' theme. -// The `patch/frontend/index.js` will require the original, generated `index.js`. -// See: https://github.com/arduino/arduino-ide/pull/1160. -config.entry.bundle = require('path').resolve(__dirname, 'patch/frontend/index.js'); +// Use a customized backend main that can enable the file logger in bundled mode. +backend.config.entry['main'] = require.resolve('./arduino-ide-backend-main.js'); -module.exports = config; \ No newline at end of file +backend.config.optimization.splitChunks = false; +backend.config.optimization.concatenateModules = true; + +// Removed GZIP compression: the frontend is on the same machine as the backend. +removeCompressionPlugin(mainWindowConfig); +removeCompressionPlugin(preloadConfig); + +// Do not include the `secondary-window` configuration from Theia. It's unused in IDE2, and can save up to ~30MB final app size. +module.exports = [mainWindowConfig, preloadConfig, backend.config]; diff --git a/electron-app/webpack.dev.js b/electron-app/webpack.dev.js new file mode 100644 index 000000000..a4f7b06be --- /dev/null +++ b/electron-app/webpack.dev.js @@ -0,0 +1,22 @@ +// When running in development mode, do not webpack the backend and electron main modules. +// It does not work in watch mode: https://github.com/eclipse-theia/theia/issues/12793. +const path = require('node:path'); +const configs = require('./webpack.config'); +const { createCopyArduinoResourcesPlugins } = require('./webpack.base'); +const [mainWindowConfig, preloadConfig] = configs; + +// Use the frontend's webpack config to copy the required resources to the `./arduino-ide-extension/lib/node/resources` folder. +mainWindowConfig.plugins?.push( + ...createCopyArduinoResourcesPlugins( + path.join( + __dirname, + '..', + 'arduino-ide-extension', + 'lib', + 'node', + 'resources' + ) + ) +); + +module.exports = [mainWindowConfig, preloadConfig]; diff --git a/electron/.gitignore b/electron/.gitignore deleted file mode 100644 index c18304ae5..000000000 --- a/electron/.gitignore +++ /dev/null @@ -1,22 +0,0 @@ -# The working-copy folder we use to package the application. -working-copy/ - -# Ignore all Theia generated things. -*.log -src-gen/ -node_modules/ -build/yarn.lock -lib/ - -# The electron-builder output. -dist/ - -# `dotenv` can provide dynamic input for the elecrton-builder. e.g.: commitish for the build. -electron-builder.env - -# The generated `package.json` under the `build` folder. -build/package.json - -# Resources the packager copies from dev to prod -build/resources/preload.html -build/patch/frontend/index.js diff --git a/electron/README.md b/electron/README.md deleted file mode 100644 index 25b8b07b2..000000000 --- a/electron/README.md +++ /dev/null @@ -1,15 +0,0 @@ -## Electron - -All-in-one packager producing the `Arduino IDE` Electron-based application. - -## Prerequisites - -The prerequisites are defined [here](https://github.com/theia-ide/theia/blob/master/doc/Developing.md#prerequisites). - -## Build -To build the Arduino IDE application you have to do the followings: -```bash -yarn --cwd ./electron/packager/ && yarn --cwd ./electron/packager/ package -``` - -The packaged application will be under the `./electron/build/dist` folder. diff --git a/electron/build/patch/backend/main.js b/electron/build/patch/backend/main.js deleted file mode 100644 index cb138d3c4..000000000 --- a/electron/build/patch/backend/main.js +++ /dev/null @@ -1,43 +0,0 @@ -// @ts-check - -// Patch for on Linux when `XDG_CONFIG_HOME` is not available, `node-log-rotate` creates the folder with `undefined` name. -// See https://github.com/lemon-sour/node-log-rotate/issues/23 and https://github.com/arduino/arduino-ide/issues/394. -// If the IDE2 is running on Linux, and the `XDG_CONFIG_HOME` variable is not available, set it to avoid the `undefined` folder. -// From the specs: https://specifications.freedesktop.org/basedir-spec/latest/ar01s03.html -// "If $XDG_CONFIG_HOME is either not set or empty, a default equal to $HOME/.config should be used." -const os = require('os'); -if (os.platform() === 'linux' && !process.env['XDG_CONFIG_HOME']) { - const { join } = require('path'); - const home = process.env['HOME']; - const xdgConfigHome = home ? join(home, '.config') : join(os.homedir(), '.config'); - process.env['XDG_CONFIG_HOME'] = xdgConfigHome; -} - -const { setup, log } = require('node-log-rotate'); -setup({ - appName: 'Arduino IDE', - maxSize: 10 * 1024 * 1024 -}); -for (const name of ['log', 'trace', 'info', 'warn', 'error']) { - const original = console[name]; - console[name] = (data => { - original(data); - log(data); - }).bind(console); -} - -const { BackendApplicationConfigProvider } = require('@theia/core/lib/node/backend-application-config-provider'); -const main = require('@theia/core/lib/node/main'); -BackendApplicationConfigProvider.set({ - "configDirName": ".arduinoIDE", - "singleInstance": true -}); - -const serverModule = require('./server'); -const serverAddress = main.start(serverModule()); -serverAddress.then(function ({ port, address }) { - if (process && process.send) { - process.send({ port, address }); - } -}); -module.exports = serverAddress; diff --git a/electron/build/scripts/arduino-ide-electron-main.js b/electron/build/scripts/arduino-ide-electron-main.js deleted file mode 100644 index 82a63fbec..000000000 --- a/electron/build/scripts/arduino-ide-electron-main.js +++ /dev/null @@ -1,9 +0,0 @@ -const os = require('os'); -const path = require('path'); -// Enables the discovery of the VS Code extensions in the embedded `plugins` folder in the final app. -process.env.THEIA_DEFAULT_PLUGINS = `local-dir:${path.resolve(__dirname, '..', 'plugins')}`; -process.env.THEIA_PLUGINS = [ - process.env.THEIA_PLUGINS, - `local-dir:${path.resolve(os.homedir(), '.arduinoProIDE', 'plugins')}` -].filter(Boolean).join(','); -require('../src-gen/frontend/electron-main.js'); diff --git a/electron/build/template-package.json b/electron/build/template-package.json deleted file mode 100644 index 5c15d0560..000000000 --- a/electron/build/template-package.json +++ /dev/null @@ -1,160 +0,0 @@ -{ - "main": "scripts/arduino-ide-electron-main.js", - "author": "Arduino SA", - "resolutions": { - "**/fs-extra": "^4.0.3", - "electron-builder": "23.0.2" - }, - "dependencies": { - "node-log-rotate": "^0.1.5" - }, - "devDependencies": { - "@theia/cli": "1.25.0", - "cross-env": "^7.0.2", - "electron-builder": "23.0.2", - "electron-notarize": "^1.1.1", - "is-ci": "^2.0.0", - "ncp": "^2.0.0", - "shelljs": "^0.8.3" - }, - "scripts": { - "build": "yarn download:plugins && theia build --mode production && yarn patch", - "rebuild": "yarn theia rebuild:electron", - "package": "cross-env DEBUG=* && electron-builder --publish=never", - "package:publish": "cross-env DEBUG=* && electron-builder --publish=always", - "download:plugins": "theia download:plugins", - "patch": "ncp ./patch/backend/main.js ./src-gen/backend/main.js" - }, - "engines": { - "node": ">=14.0.0 <15" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/arduino/arduino-ide.git" - }, - "// Notes:": [ - "The resolution for `fs-extra` was required due to this: https://spectrum.chat/theia/general/our-theia-electron-builder-app-no-longer-starts~f5cf09a0-6d88-448b-8818-24ad0ec2ee7c" - ], - "theia": { - "target": "electron", - "backend": { - "config": { - "singleInstance": true - } - } - }, - "build": { - "productName": "Arduino IDE", - "asar": false, - "detectUpdateChannel": false, - "generateUpdatesFilesForAllChannels": true, - "npmRebuild": false, - "directories": { - "buildResources": "resources" - }, - "fileAssociations": [ - { - "ext": "ino", - "role": "Editor" - } - ], - "files": [ - "src-gen", - "lib", - "scripts", - "!node_modules/**/*.{ts,map}", - "!node_modules/**/*.spec.js", - "!node_modules/@theia/**/test/*", - "!node_modules/@theia/**/src/*.ts", - "!node_modules/@theia/**/lib/*browser/*", - "node_modules/@theia/core/lib/browser/*", - "!node_modules/@typefox/monaco-editor-core/*", - "!node_modules/electron/**" - ], - "extraResources": [ - { - "from": "plugins", - "to": "app/plugins" - } - ], - "win": { - "target": [ - "msi", - "nsis", - "zip" - ] - }, - "mac": { - "darkModeSupport": true, - "hardenedRuntime": true, - "gatekeeperAssess": false, - "entitlements": "resources/entitlements.mac.plist", - "entitlementsInherit": "resources/entitlements.mac.plist" - }, - "linux": { - "target": [ - "zip", - "AppImage" - ], - "category": "Development", - "icon": "resources/icons" - }, - "msi": { - "runAfterFinish": false - }, - "nsis": { - "oneClick": false, - "installerHeaderIcon": "resources/icon.ico", - "installerIcon": "resources/icon.ico", - "uninstallerIcon": "resources/icon.ico", - "installerSidebar": "resources/installerSidebar.bmp", - "uninstallerSidebar": "resources/installerSidebar.bmp", - "allowToChangeInstallationDirectory": true, - "license": "resources/eula.txt" - }, - "dmg": { - "icon": "resources/icon.icns", - "iconSize": 128, - "contents": [ - { - "x": 380, - "y": 240, - "type": "link", - "path": "/Applications" - }, - { - "x": 122, - "y": 240, - "type": "file" - } - ] - }, - "afterSign": "scripts/notarize.js", - "publish": [ - { - "provider": "s3", - "bucket": "arduino-downloads-prod-beagle", - "path": "arduino-ide/nightly" - } - ] - }, - "theiaPluginsDir": "plugins", - "theiaPlugins": { - "vscode-builtin-cpp": "https://open-vsx.org/api/vscode/cpp/1.52.1/file/vscode.cpp-1.52.1.vsix", - "vscode-arduino-tools": "https://downloads.arduino.cc/vscode-arduino-tools/vscode-arduino-tools-0.0.2-beta.5.vsix", - "vscode-builtin-json": "https://open-vsx.org/api/vscode/json/1.46.1/file/vscode.json-1.46.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", - "cortex-debug": "https://open-vsx.org/api/marus25/cortex-debug/0.3.10/file/marus25.cortex-debug-0.3.10.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-fr": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-fr/1.69.0/file/MS-CEINTL.vscode-language-pack-fr-1.69.0.vsix", - "vscode-language-pack-zh-hans": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-zh-hans/1.69.0/file/MS-CEINTL.vscode-language-pack-zh-hans-1.69.0.vsix", - "vscode-language-pack-de": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-de/1.69.0/file/MS-CEINTL.vscode-language-pack-de-1.69.0.vsix", - "vscode-language-pack-ja": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-ja/1.69.0/file/MS-CEINTL.vscode-language-pack-ja-1.69.0.vsix", - "vscode-language-pack-tr": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-tr/1.69.0/file/MS-CEINTL.vscode-language-pack-tr-1.69.0.vsix", - "vscode-language-pack-it": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-it/1.69.0/file/MS-CEINTL.vscode-language-pack-it-1.69.0.vsix", - "vscode-language-pack-ru":"https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-ru/1.69.0/file/MS-CEINTL.vscode-language-pack-ru-1.69.0.vsix", - "vscode-language-pack-es": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-es/1.69.0/file/MS-CEINTL.vscode-language-pack-es-1.69.0.vsix", - "vscode-language-pack-pt-BR": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-pt-BR/1.69.0/file/MS-CEINTL.vscode-language-pack-pt-BR-1.69.0.vsix", - "vscode-language-pack-cs": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-cs/1.69.0/file/MS-CEINTL.vscode-language-pack-cs-1.69.0.vsix" - } -} diff --git a/electron/build/webpack.config.js b/electron/build/webpack.config.js deleted file mode 100644 index bd042642a..000000000 --- a/electron/build/webpack.config.js +++ /dev/null @@ -1,10 +0,0 @@ -// @ts-check -const config = require('./gen-webpack.config.js'); -const path = require('path'); - -// Load the patched `index.js` that sets the desired theme in IDE2 based on the OS' theme. -// The `patch/frontend/index.js` will require the original, generated `index.js`. -// See: https://github.com/arduino/arduino-ide/pull/1160. -config.entry.bundle = path.resolve(__dirname, 'patch/frontend/index.js'); - -module.exports = config; diff --git a/electron/packager/conf-node-gyp.sh b/electron/packager/conf-node-gyp.sh deleted file mode 100755 index 994c3cd40..000000000 --- a/electron/packager/conf-node-gyp.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/sh - -npm install --global node-gyp@7.0.0 - -if [ "$OSTYPE" = "cygwin" ] || [ "$OSTYPE" = "msys" ]; then - npm config set node_gyp "`npm prefix -g`\node_modules\node-gyp\bin\node-gyp.js" -else - npm config set node_gyp "`npm prefix -g`/lib/node_modules/node-gyp/bin/node-gyp.js" -fi - -echo "npm config get node_gyp -> `npm config get node_gyp`" diff --git a/electron/packager/config.js b/electron/packager/config.js deleted file mode 100644 index 44af9f323..000000000 --- a/electron/packager/config.js +++ /dev/null @@ -1,152 +0,0 @@ -//@ts-check - -const fs = require('fs'); -const path = require('path'); -const semver = require('semver'); -const merge = require('deepmerge'); -const dateFormat = require('dateformat'); -const { isNightly, isRelease, git } = require('./utils'); - -function artifactName() { - const { platform, arch } = process; - const id = (() => { - if (isRelease) { - return getVersion(); - } else if (isNightly) { - return `nightly-${timestamp()}`; - } else { - return getVersion(); - } - })(); - const name = 'arduino-ide'; - switch (platform) { - case 'win32': { - if (arch === 'x64') { - return `${name}_${id}_Windows_64bit.\$\{ext}`; - } - throw new Error(`Unsupported platform, arch: ${platform}, ${arch}`); - } - case 'darwin': { - return `${name}_${id}_macOS_64bit.\$\{ext}`; - } - case 'linux': { - switch (arch) { - case 'arm': { - return `${name}_${id}_Linux_ARMv7.\$\{ext}`; - } - case 'arm64': { - return `${name}_${id}_Linux_ARM64.\$\{ext}`; - } - case 'x64': { - return `${name}_${id}_Linux_64bit.\$\{ext}`; - } - default: { - throw new Error(`Unsupported platform, arch: ${platform}, ${arch}`); - } - } - } - default: - throw new Error(`Unsupported platform, arch: ${platform}, ${arch}`); - } -} - -function electronPlatform() { - switch (process.platform) { - case 'win32': { - return 'win'; - } - case 'darwin': { - return 'mac'; - } - case 'linux': { - return 'linux'; - } - default: - throw new Error(`Unsupported platform: ${process.platform}.`); - } -} - -function getVersion() { - const repositoryRootPath = git('rev-parse --show-toplevel'); - let version = JSON.parse( - fs.readFileSync(path.join(repositoryRootPath, 'package.json'), { - encoding: 'utf8', - }) - ).version; - if (!semver.valid(version)) { - throw new Error( - `Could not read version from root package.json. Version was: '${version}'.` - ); - } - if (!isRelease) { - if (isNightly) { - version = `${version}-nightly-${timestamp()}`; - } else { - version = `${version}-snapshot-${currentCommitish()}`; - } - if (!semver.valid(version)) { - throw new Error(`Invalid patched version: '${version}'.`); - } - } - return version; -} - -function getChannel() { - if (isRelease) { - return 'stable'; - } - if (isNightly) { - return 'nightly'; - } - - return ''; -} - -function timestamp() { - return dateFormat(new Date(), 'yyyymmdd'); -} - -function currentCommitish() { - return git('rev-parse --short HEAD'); -} - -// function currentBranch() { -// return git('rev-parse --abbrev-ref HEAD'); -// } - -function generateTemplate(buildDate) { - // do `export PUBLISH=true yarn package` if you want to mimic CI build locally. - // const electronPublish = release || (isCI && currentBranch() === 'main') || process.env.PUBLISH === 'true'; - const version = getVersion(); - const productName = 'Arduino IDE'; - const name = 'arduino-ide'; - const updateChannel = getChannel(); - let customizations = { - name, - description: productName, - version, - theia: { - frontend: { - config: { - 'arduino.ide.updateChannel': updateChannel, - }, - }, - }, - build: { - productName, - appId: 'cc.arduino.IDE2', - [electronPlatform()]: { - artifactName: artifactName(), - }, - }, - }; - if (buildDate) { - customizations = merge(customizations, { - theia: { frontend: { config: { buildDate } } }, - }); - } - const template = require('../build/template-package.json'); - return merge(template, customizations); -} - -module.exports = { generateTemplate }; diff --git a/electron/packager/extensions.json b/electron/packager/extensions.json deleted file mode 100644 index d494d5087..000000000 --- a/electron/packager/extensions.json +++ /dev/null @@ -1,3 +0,0 @@ -[ - "arduino-ide-extension" -] diff --git a/electron/packager/index.js b/electron/packager/index.js deleted file mode 100644 index eb9430cab..000000000 --- a/electron/packager/index.js +++ /dev/null @@ -1,524 +0,0 @@ -//@ts-check - -(async () => { - const fs = require('fs'); - const join = require('path').join; - const shell = require('shelljs'); - const glob = require('glob'); - const isCI = require('is-ci'); - shell.env.THEIA_ELECTRON_SKIP_REPLACE_FFMPEG = '1'; // Do not run the ffmpeg validation for the packager. - // Note, this will crash on PI if the available memory is less than desired heap size. - // https://github.com/shelljs/shelljs/issues/1024#issuecomment-1001552543 - shell.env.NODE_OPTIONS = '--max_old_space_size=4096'; // Increase heap size for the CI - shell.env.PUPPETEER_SKIP_CHROMIUM_DOWNLOAD = 'true'; // Skip download and avoid `ERROR: Failed to download Chromium`. - const template = require('./config').generateTemplate( - new Date().toISOString() - ); - const utils = require('./utils'); - const merge = require('deepmerge'); - const { isRelease, getChannelFile } = utils; - const { version } = template; - const { productName } = template.build; - - echo(`📦 Building ${isRelease ? 'release ' : ''}version '${version}'...`); - - const workingCopy = 'working-copy'; - - /** - * Relative path from the `__dirname` to the root where the `arduino-ide-extension` and the `electron-app` folders are. - * This could come handy when moving the location of the `electron/packager`. - */ - const rootPath = join('..', '..'); - - // This is a HACK! We rename the root `node_modules` to something else. Otherwise, due to the hoisting, - // multiple Theia extensions will be picked up. - if (fs.existsSync(path(rootPath, 'node_modules'))) { - // We either do this or change the project structure. - echo( - "🔧 >>> [Hack] Renaming the root 'node_modules' folder to '.node_modules'..." - ); - mv('-f', path(rootPath, 'node_modules'), path(rootPath, '.node_modules')); - echo( - "👌 <<< [Hack] Renamed the root 'node_modules' folder to '.node_modules'." - ); - } - - //---------------------------+ - // Clean the previous state. | - //---------------------------+ - // rm -rf ../working-copy - rm('-rf', path('..', workingCopy)); - // Clean up the `./electron/build` folder. - const resourcesToKeep = [ - 'patch', - 'resources', - 'scripts', - 'template-package.json', - 'webpack.config.js' - ]; - fs.readdirSync(path('..', 'build')) - .filter((filename) => resourcesToKeep.indexOf(filename) === -1) - .forEach((filename) => rm('-rf', path('..', 'build', filename))); - - // Clean up the `./electron/build/patch` and `./electron/build/resources` folder with Git. - // To avoid file duplication between bundled app and dev mode, some files are copied from `./electron-app` to `./electron/build` folder. - const foldersToSyncFromDev = ['patch', 'resources']; - foldersToSyncFromDev.forEach(filename => shell.exec(`git -C ${path('..', 'build', filename)} clean -ffxdq`, { async: false })); - - const extensions = require('./extensions.json'); - echo( - `Building the application with the following extensions:\n${extensions - .map((ext) => ` - ${ext}`) - .join(',\n')}` - ); - const allDependencies = [...extensions, 'electron-app']; - - //----------------------------------------------------------------------------------------------+ - // Copy the following items into the `working-copy` folder. Make sure to reuse the `yarn.lock`. | - //----------------------------------------------------------------------------------------------+ - mkdir('-p', path('..', workingCopy)); - for (const filename of [ - ...allDependencies, - 'yarn.lock', - 'package.json', - 'lerna.json', - 'i18n' - ]) { - cp('-rf', path(rootPath, filename), path('..', workingCopy)); - } - - //---------------------------------------------------------------------------------------------+ - // Copy the patched `index.js` for the frontend, the Theia preload, etc. from `./electron-app` | - //---------------------------------------------------------------------------------------------+ - for (const filename of foldersToSyncFromDev) { - cp('-rf', path('..', workingCopy, 'electron-app', filename), path('..', 'build')); - } - - //----------------------------------------------+ - // Sanity check: all versions must be the same. | - //----------------------------------------------+ - verifyVersions(allDependencies); - - //----------------------------------------------------------------------+ - // Use the nightly patch version if not a release but requires publish. | - //----------------------------------------------------------------------+ - if (!isRelease) { - for (const dependency of allDependencies) { - const pkg = require(`../working-copy/${dependency}/package.json`); - pkg.version = version; - for (const dependency in pkg.dependencies) { - if (allDependencies.indexOf(dependency) !== -1) { - pkg.dependencies[dependency] = version; - } - } - fs.writeFileSync( - path('..', workingCopy, dependency, 'package.json'), - JSON.stringify(pkg, null, 2) - ); - } - } - verifyVersions(allDependencies); - - //-------------------------------------------------------------+ - // Save some time: no need to build the `browser-app` example. | - //-------------------------------------------------------------+ - //@ts-ignore - let pkg = require('../working-copy/package.json'); - const workspaces = pkg.workspaces; - // We cannot remove the `electron-app`. Otherwise, there is not way to collect the unused dependencies. - const dependenciesToRemove = ['browser-app']; - for (const dependencyToRemove of dependenciesToRemove) { - const index = workspaces.indexOf(dependencyToRemove); - if (index !== -1) { - workspaces.splice(index, 1); - } - } - pkg.workspaces = workspaces; - fs.writeFileSync( - path('..', workingCopy, 'package.json'), - JSON.stringify(pkg, null, 2) - ); - - //-------------------------------------------------------------------------------------------------+ - // Rebuild the extension with the copied `yarn.lock`. It is a must to use the same Theia versions. | - //-------------------------------------------------------------------------------------------------+ - exec( - `yarn --network-timeout 1000000 --cwd ${path('..', workingCopy)}`, - `Building the ${productName} application` - ); - - //-------------------------------------------------------------------------------------------------------------------------+ - // Test the application. With this approach, we cannot publish test results to GH Actions but save 6-10 minutes per builds | - //-------------------------------------------------------------------------------------------------------------------------+ - exec( - `yarn --network-timeout 1000000 --cwd ${path('..', workingCopy)} test`, - `Testing the ${productName} application` - ); - - // Collect all unused dependencies by the backend. We have to remove them from the electron app. - // The `bundle.js` already contains everything we need for the frontend. - // We have to do it before changing the dependencies to `local-path`. - const unusedDependencies = await utils.collectUnusedDependencies( - '../working-copy/electron-app/' - ); - - //-------------------------------------------------------------------------------------------------------------+ - // Change the regular NPM dependencies to `local-paths`, so that we can build them without any NPM registries. | - //-------------------------------------------------------------------------------------------------------------+ - for (const extension of extensions) { - if (extension !== 'arduino-ide-extension') { - // Do not unlink self. - // @ts-ignore - pkg = require(`../working-copy/${extension}/package.json`); - // @ts-ignore - pkg.dependencies['arduino-ide-extension'] = - 'file:../arduino-ide-extension'; - fs.writeFileSync( - path('..', workingCopy, extension, 'package.json'), - JSON.stringify(pkg, null, 2) - ); - } - } - - //------------------------------------------------------------------------------------+ - // Merge the `working-copy/package.json` with `electron/build/template-package.json`. | - //------------------------------------------------------------------------------------+ - // @ts-ignore - pkg = require('../working-copy/electron-app/package.json'); - template.build.files = [ - ...template.build.files, - ...unusedDependencies.map((name) => `!node_modules/${name}`), - ]; - - const dependencies = {}; - for (const extension of extensions) { - dependencies[extension] = `file:../working-copy/${extension}`; - } - // @ts-ignore - pkg.dependencies = { ...pkg.dependencies, ...dependencies }; - pkg.devDependencies = { ...pkg.devDependencies, ...template.devDependencies }; - // Deep-merging the Theia application configuration. We enable the electron window reload in dev mode but not for the final product. (arduino/arduino-pro-ide#187) - // @ts-ignore - const theia = merge(pkg.theia || {}, template.theia || {}); - const content = { - ...pkg, - ...template, - theia, - // @ts-ignore - dependencies: pkg.dependencies, - devDependencies: pkg.devDependencies, - }; - const overwriteMerge = (destinationArray, sourceArray, options) => - sourceArray; - fs.writeFileSync( - path('..', 'build', 'package.json'), - JSON.stringify( - merge(content, template, { arrayMerge: overwriteMerge }), - null, - 2 - ) - ); - - echo(`📜 Effective 'package.json' for the ${productName} application is: ------------------------ -${fs.readFileSync(path('..', 'build', 'package.json')).toString()} ------------------------ - `); - - // Make sure the original `yarn.lock` file is used from the electron application. - if (fs.existsSync(path('..', 'build', 'yarn.lock'))) { - echo(`${path('..', 'build', 'yarn.lock')} must not exist.`); - shell.exit(1); - } - cp('-rf', path(rootPath, 'yarn.lock'), path('..', 'build')); - if (!fs.existsSync(path('..', 'build', 'yarn.lock'))) { - echo(`${path('..', 'build', 'yarn.lock')} does not exist.`); - shell.exit(1); - } - - //-------------------------------------------------------------------------------------------+ - // Install all private and public dependencies for the electron application and build Theia. | - //-------------------------------------------------------------------------------------------+ - exec( - `yarn --network-timeout 1000000 --cwd ${path('..', 'build')}`, - 'Installing dependencies' - ); - exec( - `yarn --network-timeout 1000000 --cwd ${path('..', 'build')} build`, - `Building the ${productName} application` - ); - exec( - `yarn --network-timeout 1000000 --cwd ${path('..', 'build')} rebuild`, - 'Rebuild native dependencies' - ); - - //------------------------------------------------------------------------------+ - // Create a throw away dotenv file which we use to feed the builder with input. | - //------------------------------------------------------------------------------+ - const dotenv = 'electron-builder.env'; - if (fs.existsSync(path('..', 'build', dotenv))) { - rm('-rf', path('..', 'build', dotenv)); - } - // For the releases we use the desired tag as is defined by `$(Release.Tag)` from Azure. - // For the preview builds we use the version from the `electron/build/package.json` with the short commit hash. - fs.writeFileSync(path('..', 'build', dotenv), `ARDUINO_VERSION=${version}`); - - //-----------------------------------+ - // Package the electron application. | - //-----------------------------------+ - exec( - `yarn --network-timeout 1000000 --cwd ${path('..', 'build')} package`, - `Packaging your ${productName} application` - ); - - //-----------------------------------------------------------------------------------------------------+ - // Recalculate artifacts hash and copy to another folder (because they can change after signing them). - // Azure does not support wildcard for `PublishBuildArtifacts@1.pathToPublish` | - //-----------------------------------------------------------------------------------------------------+ - if (isCI) { - try { - await recalculateArtifactsHash(); - await copyFilesToBuildArtifacts(); - } catch (e) { - echo(JSON.stringify(e)); - shell.exit(1); - } - } - echo(`🎉 Success. Your application is at: ${path('..', 'build', 'dist')}`); - - restore(); - - //--------+ - // Utils. | - //--------+ - function exec(command, toEcho) { - if (toEcho) { - echo(`⏱️ >>> ${toEcho}...`); - } - const { code, stderr, stdout } = shell.exec(command); - if (code !== 0) { - echo(`🔥 Error when executing ${command} => ${stderr}`); - shell.exit(1); - } - if (toEcho) { - echo(`👌 <<< ${toEcho}.`); - } - return stdout; - } - - function cp(options, source, destination) { - shell.cp(options, source, destination); - assertNoError(); - } - - function rm(options, ...files) { - shell.rm(options, files); - assertNoError(); - } - - function mv(options, source, destination) { - shell.mv(options, source, destination); - assertNoError(); - } - - function mkdir(options, ...dir) { - shell.mkdir(options, dir); - assertNoError(); - } - - function echo(command) { - return shell.echo(command); - } - - function assertNoError() { - const error = shell.error(); - if (error) { - echo(error); - restore(); - shell.exit(1); - } - } - - function restore() { - if (fs.existsSync(path(rootPath, '.node_modules'))) { - echo( - "🔧 >>> [Restore] Renaming the root '.node_modules' folder to 'node_modules'..." - ); - mv('-f', path(rootPath, '.node_modules'), path(rootPath, 'node_modules')); - echo( - "👌 >>> [Restore] Renamed the root '.node_modules' folder to 'node_modules'." - ); - } - } - - async function copyFilesToBuildArtifacts() { - echo(`🚢 Detected CI, moving build artifacts...`); - const { platform } = process; - const cwd = path('..', 'build', 'dist'); - const targetFolder = path('..', 'build', 'dist', 'build-artifacts'); - mkdir('-p', targetFolder); - const filesToCopy = []; - const channelFile = getChannelFile(platform); - // Channel file might be an empty string if we're not building a - // nightly or a full release. This can happen when building a package - // locally or a tester build when creating a new PR on GH. - if (!!channelFile && fs.existsSync(join(cwd, channelFile))) { - const channelFilePath = join(cwd, channelFile); - const newChannelFilePath = channelFilePath - ?.replace('latest', 'stable') - ?.replace('beta', 'nightly'); - echo(`🔨 >>> Renaming ${channelFilePath} to ${newChannelFilePath}.`); - cp('-f', channelFilePath, newChannelFilePath); - filesToCopy.push(newChannelFilePath); - } - switch (platform) { - case 'linux': { - filesToCopy.push( - ...glob - .sync('**/arduino-ide*.{zip,AppImage}', { cwd }) - .map((p) => join(cwd, p)) - ); - break; - } - case 'win32': { - filesToCopy.push( - ...glob - .sync('**/arduino-ide*.{exe,msi,zip}', { cwd }) - .map((p) => join(cwd, p)) - ); - break; - } - case 'darwin': { - filesToCopy.push( - ...glob - .sync('**/arduino-ide*.{dmg,zip}', { cwd }) - .map((p) => join(cwd, p)) - ); - break; - } - default: { - echo(`Unsupported platform: ${platform}.`); - shell.exit(1); - } - } - if (!filesToCopy.length) { - echo(`Could not collect any build artifacts from ${cwd}.`); - shell.exit(1); - } - for (const fileToCopy of filesToCopy) { - echo(`🚢 >>> Copying ${fileToCopy} to ${targetFolder}.`); - const isZip = await utils.isZip(fileToCopy); - if (isZip && platform === 'linux') { - await utils.adjustArchiveStructure(fileToCopy, targetFolder); - } else { - cp('-rf', fileToCopy, targetFolder); - } - echo(`👌 >>> Copied ${fileToCopy} to ${targetFolder}.`); - } - } - - async function recalculateArtifactsHash() { - echo(`🚢 Detected CI, recalculating artifacts hash...`); - const { platform } = process; - const cwd = path('..', 'build', 'dist'); - const channelFilePath = join(cwd, getChannelFile(platform)); - const yaml = require('yaml'); - - try { - let fileContents = fs.readFileSync(channelFilePath, 'utf8'); - const newChannelFile = yaml.parse(fileContents); - const { files, path } = newChannelFile; - const newSha512 = await hashFile(join(cwd, path)); - newChannelFile.sha512 = newSha512; - if (!!files) { - const newFiles = []; - for (let file of files) { - const { url } = file; - const { size } = fs.statSync(join(cwd, url)); - const newSha512 = await hashFile(join(cwd, url)); - - if (!newFiles.find((f) => f.sha512 === newSha512)) { - newFiles.push({ ...file, sha512: newSha512, size }); - } - } - newChannelFile.files = newFiles; - } - - const newChannelFileRaw = yaml.stringify(newChannelFile); - fs.writeFileSync(channelFilePath, newChannelFileRaw); - echo(`👌 >>> Channel file updated successfully. New channel file:`); - echo(newChannelFileRaw); - } catch (e) { - console.log(e); - } - } - - /** - * @param {import('fs').PathLike} file - * @param {string|undefined} [algorithm="sha512"] - * @param {BufferEncoding|undefined} [encoding="base64"] - * @param {object|undefined} [options] - */ - async function hashFile( - file, - algorithm = 'sha512', - encoding = 'base64', - options - ) { - const crypto = require('crypto'); - return await new Promise((resolve, reject) => { - const hash = crypto.createHash(algorithm); - hash.on('error', reject).setEncoding(encoding); - fs.createReadStream( - file, - Object.assign({}, options, { - highWaterMark: 1024 * 1024, - /* better to use more memory but hash faster */ - }) - ) - .on('error', reject) - .on('end', () => { - hash.end(); - resolve(hash.read()); - }) - .pipe(hash, { - end: false, - }); - }); - } - - /** - * Joins tha path from `__dirname`. - */ - function path(...paths) { - return join(__dirname, ...paths); - } - - function verifyVersions(allDependencies, expectedVersion) { - const versions = new Set(); - for (const dependency of allDependencies) { - versions.add( - require(`../working-copy/${dependency}/package.json`).version - ); - } - if (versions.size !== 1) { - echo( - `Mismatching version configuration. All dependencies must have the same version. Versions were: ${JSON.stringify( - Array.from(versions), - null, - 2 - )}.` - ); - shell.exit(1); - } - if (expectedVersion) { - if (!versions.has(expectedVersion)) { - echo( - `Mismatching version configuration. Expected version was: '${expectedVersion}' actual was: '${Array.from(versions)[0] - }'.` - ); - shell.exit(1); - } - } - } -})(); diff --git a/electron/packager/package.json b/electron/packager/package.json deleted file mode 100644 index e1f6c72df..000000000 --- a/electron/packager/package.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "private": true, - "name": "packager", - "version": "1.0.0", - "description": "Packager for the Arduino IDE electron application", - "main": "index.js", - "scripts": { - "prepare": "yarn test", - "package": "node index.js", - "test": "mocha \"./test/**/*.test.js\"" - }, - "keywords": [], - "author": "Arduino SA", - "license": "AGPL-3.0-or-later", - "dependencies": { - "7zip-min": "^1.1.1", - "@types/file-type": "^10.9.1", - "@types/temp": "^0.8.32", - "chai": "^4.2.0", - "crypto": "^1.0.1", - "dateformat": "^3.0.3", - "deepmerge": "2.01", - "depcheck": "^0.9.2", - "file-type": "^14.1.4", - "glob": "^7.1.6", - "is-ci": "^2.0.0", - "mocha": "^7.1.1", - "semver": "^7.3.2", - "shelljs": "^0.8.3", - "sinon": "^9.0.1", - "temp": "^0.9.1", - "yaml": "^1.10.2", - "yargs": "^12.0.5" - }, - "engines": { - "node": ">=14.0.0 <15" - }, - "mocha": { - "reporter": "spec", - "colors": true, - "watch-extensions": "js", - "timeout": 10000 - } -} \ No newline at end of file diff --git a/electron/packager/utils.js b/electron/packager/utils.js deleted file mode 100644 index 01be7f92e..000000000 --- a/electron/packager/utils.js +++ /dev/null @@ -1,224 +0,0 @@ -//@ts-check - -const fs = require('fs'); -const zip = require('7zip-min'); -const temp = require('temp'); -const path = require('path'); -const shell = require('shelljs'); -const depcheck = require('depcheck'); -const fromFile = require('file-type').fromFile; - -/** - * Resolves to an array of `npm` package names that are declared in the `package.json` but **not** used by the project. - */ -function collectUnusedDependencies(pathToProject = process.cwd()) { - const p = path.isAbsolute(pathToProject) - ? pathToProject - : path.resolve(process.cwd(), pathToProject); - console.log(`⏱️ >>> Collecting unused backend dependencies for ${p}...`); - return new Promise((resolve) => { - depcheck( - p, - { - ignoreDirs: ['frontend'], - parsers: { - '*.js': depcheck.parser.es6, - '*.jsx': depcheck.parser.jsx, - }, - detectors: [ - depcheck.detector.requireCallExpression, - depcheck.detector.importDeclaration, - ], - specials: [depcheck.special.eslint, depcheck.special.webpack], - }, - (unused) => { - const { dependencies } = unused; - if (dependencies && dependencies.length > 0) { - console.log( - `👌 <<< The following unused dependencies have been found: ${JSON.stringify( - dependencies, - null, - 2 - )}` - ); - } else { - console.log('👌 <<< No unused dependencies have been found.'); - } - resolve(dependencies); - } - ); - }); -} - -/** - * `pathToZip` is a `path/to/your/app-name.zip`. - * If the `pathToZip` archive does not have a root directory with name `app-name`, it creates one, and move the content from the - * archive's root to the new root folder. If the archive already has the desired root folder, calling this function is a NOOP. - * If `pathToZip` is not a ZIP, rejects. `targetFolderName` is the destination folder not the new archive location. - */ -function adjustArchiveStructure(pathToZip, targetFolderName, noCleanup) { - return new Promise(async (resolve, reject) => { - if (!(await isZip(pathToZip))) { - reject(new Error(`Expected a ZIP file.`)); - return; - } - if (!fs.existsSync(targetFolderName)) { - reject(new Error(`${targetFolderName} does not exist.`)); - return; - } - if (!fs.lstatSync(targetFolderName).isDirectory()) { - reject(new Error(`${targetFolderName} is not a directory.`)); - return; - } - console.log(`⏱️ >>> Adjusting ZIP structure ${pathToZip}...`); - - const root = basename(pathToZip); - const resources = await list(pathToZip); - const hasBaseFolder = resources.find((name) => name === root); - if (hasBaseFolder) { - if ( - resources.filter((name) => name.indexOf(path.sep) === -1).length > 1 - ) { - console.warn( - `${pathToZip} ZIP has the desired root folder ${root}, however the ZIP contains other entries too: ${JSON.stringify( - resources - )}` - ); - } - console.log(`👌 <<< The ZIP already has the desired ${root} folder.`); - resolve(pathToZip); - return; - } - - const track = temp.track(); - try { - const unzipOut = path.join(track.mkdirSync(), root); - fs.mkdirSync(unzipOut); - await unpack(pathToZip, unzipOut); - const adjustedZip = path.join(targetFolderName, path.basename(pathToZip)); - await pack(unzipOut, adjustedZip); - console.log( - `👌 <<< Adjusted the ZIP structure. Moved the modified ${basename( - pathToZip - )} to the ${targetFolderName} folder.` - ); - resolve(adjustedZip); - } finally { - if (!noCleanup) { - track.cleanupSync(); - } - } - }); -} - -/** - * Returns the `basename` of `pathToFile` without the file extension. - */ -function basename(pathToFile) { - const name = path.basename(pathToFile); - const ext = path.extname(pathToFile); - return name.substr(0, name.length - ext.length); -} - -function unpack(what, where) { - return new Promise((resolve, reject) => { - zip.unpack(what, where, (error) => { - if (error) { - reject(error); - return; - } - resolve(); - }); - }); -} - -function pack(what, where) { - return new Promise((resolve, reject) => { - zip.pack(what, where, (error) => { - if (error) { - reject(error); - return; - } - resolve(); - }); - }); -} - -function list(what) { - return new Promise((resolve, reject) => { - zip.list(what, (error, result) => { - if (error) { - reject(error); - return; - } - resolve(result.map(({ name }) => name)); - }); - }); -} - -async function isZip(pathToFile) { - if (!fs.existsSync(pathToFile)) { - throw new Error(`${pathToFile} does not exist`); - } - const type = await fromFile(pathToFile); - return type && type.ext === 'zip'; -} - -const isElectronPublish = false; // TODO: support auto-updates -const isNightly = process.env.IS_NIGHTLY === 'true'; -const isRelease = process.env.IS_RELEASE === 'true'; - -function git(command) { - try { - const gitPath = shell.which('git'); - const error = shell.error(); - if (error) { - throw new Error(error); - } - const { stderr, stdout } = shell.exec(`"${gitPath}" ${command}`, { - silent: true, - }); - if (stderr) { - throw new Error(stderr.toString().trim()); - } - return stdout.toString().trim(); - } catch (e) { - throw e; - } -} - -// getChannelFile returns the name of the channel file to be released -// together with the IDE file. -// The channel file depends on the platform and whether we're creating -// a nightly build or a full release. -// In all other cases, like when building a tester build for a PR, -// an empty string is returned since we don't need a channel file. -// The channel files are necessary for updates check with electron-updater -// to work correctly. -// For more information: https://www.electron.build/auto-update -function getChannelFile(platform) { - let currentChannel = 'beta'; - if (isRelease) { - currentChannel = 'latest'; - } - return ( - currentChannel + - { - linux: '-linux.yml', - win32: '.yml', - darwin: '-mac.yml', - }[platform] - ); -} - -module.exports = { - collectUnusedDependencies, - adjustArchiveStructure, - isZip, - unpack, - isNightly, - isRelease, - isElectronPublish, - git, - getChannelFile, -}; diff --git a/electron/packager/yarn.lock b/electron/packager/yarn.lock deleted file mode 100644 index 460fd9699..000000000 --- a/electron/packager/yarn.lock +++ /dev/null @@ -1,1692 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"7zip-bin@^5.0.3": - version "5.0.3" - resolved "https://registry.yarnpkg.com/7zip-bin/-/7zip-bin-5.0.3.tgz#bc5b5532ecafd923a61f2fb097e3b108c0106a3f" - integrity sha512-GLyWIFBbGvpKPGo55JyRZAo4lVbnBiD52cKlw/0Vt+wnmKvWJkpZvsjVoaIolyBXDeAQKSicRtqFNPem9w0WYA== - -"7zip-min@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/7zip-min/-/7zip-min-1.1.1.tgz#96903ea587aa09376843d254a6bea9df107a8aab" - integrity sha512-GPTk3xycxB0NjRM1SKAUL7TWXjgFAyzwXkamkk5YgSLd6OneeWBw+fxULctrVr4XqPBBh+LyqpHlyj9ryfpqoQ== - dependencies: - "7zip-bin" "^5.0.3" - -"@babel/code-frame@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" - integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g== - dependencies: - "@babel/highlight" "^7.8.3" - -"@babel/generator@^7.9.0": - version "7.9.3" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.3.tgz#7c8b2956c6f68b3ab732bd16305916fbba521d94" - integrity sha512-RpxM252EYsz9qLUIq6F7YJyK1sv0wWDBFuztfDGWaQKzHjqDHysxSiRUpA/X9jmfqo+WzkAVKFaUily5h+gDCQ== - dependencies: - "@babel/types" "^7.9.0" - jsesc "^2.5.1" - lodash "^4.17.13" - source-map "^0.5.0" - -"@babel/helper-function-name@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz#eeeb665a01b1f11068e9fb86ad56a1cb1a824cca" - integrity sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA== - dependencies: - "@babel/helper-get-function-arity" "^7.8.3" - "@babel/template" "^7.8.3" - "@babel/types" "^7.8.3" - -"@babel/helper-get-function-arity@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz#b894b947bd004381ce63ea1db9f08547e920abd5" - integrity sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA== - dependencies: - "@babel/types" "^7.8.3" - -"@babel/helper-split-export-declaration@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz#31a9f30070f91368a7182cf05f831781065fc7a9" - integrity sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA== - dependencies: - "@babel/types" "^7.8.3" - -"@babel/helper-validator-identifier@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz#ad53562a7fc29b3b9a91bbf7d10397fd146346ed" - integrity sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw== - -"@babel/highlight@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.8.3.tgz#28f173d04223eaaa59bc1d439a3836e6d1265797" - integrity sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg== - dependencies: - chalk "^2.0.0" - esutils "^2.0.2" - js-tokens "^4.0.0" - -"@babel/parser@^7.7.7", "@babel/parser@^7.9.0": - version "7.9.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.3.tgz#043a5fc2ad8b7ea9facddc4e802a1f0f25da7255" - integrity sha512-E6SpIDJZ0cZAKoCNk+qSDd0ChfTnpiJN9FfNf3RZ20dzwA2vL2oq5IX1XTVT+4vDmRlta2nGk5HGMMskJAR+4A== - -"@babel/parser@^7.8.3": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.8.4.tgz#d1dbe64691d60358a974295fa53da074dd2ce8e8" - integrity sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw== - -"@babel/template@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.3.tgz#e02ad04fe262a657809327f578056ca15fd4d1b8" - integrity sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ== - dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/parser" "^7.8.3" - "@babel/types" "^7.8.3" - -"@babel/traverse@^7.7.4": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.9.0.tgz#d3882c2830e513f4fe4cec9fe76ea1cc78747892" - integrity sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w== - dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.9.0" - "@babel/helper-function-name" "^7.8.3" - "@babel/helper-split-export-declaration" "^7.8.3" - "@babel/parser" "^7.9.0" - "@babel/types" "^7.9.0" - debug "^4.1.0" - globals "^11.1.0" - lodash "^4.17.13" - -"@babel/types@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.8.3.tgz#5a383dffa5416db1b73dedffd311ffd0788fb31c" - integrity sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg== - dependencies: - esutils "^2.0.2" - lodash "^4.17.13" - to-fast-properties "^2.0.0" - -"@babel/types@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.0.tgz#00b064c3df83ad32b2dbf5ff07312b15c7f1efb5" - integrity sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng== - dependencies: - "@babel/helper-validator-identifier" "^7.9.0" - lodash "^4.17.13" - to-fast-properties "^2.0.0" - -"@sinonjs/commons@^1", "@sinonjs/commons@^1.6.0", "@sinonjs/commons@^1.7.0": - version "1.7.1" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.7.1.tgz#da5fd19a5f71177a53778073978873964f49acf1" - integrity sha512-Debi3Baff1Qu1Unc3mjJ96MgpbwTn43S1+9yJ0llWygPwDNu2aaWBD6yc9y/Z8XDRNhx7U+u2UDg2OGQXkclUQ== - dependencies: - type-detect "4.0.8" - -"@sinonjs/fake-timers@^6.0.0": - version "6.0.1" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz#293674fccb3262ac782c7aadfdeca86b10c75c40" - integrity sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA== - dependencies: - "@sinonjs/commons" "^1.7.0" - -"@sinonjs/formatio@^5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@sinonjs/formatio/-/formatio-5.0.1.tgz#f13e713cb3313b1ab965901b01b0828ea6b77089" - integrity sha512-KaiQ5pBf1MpS09MuA0kp6KBQt2JUOQycqVG1NZXvzeaXe5LGFqAKueIS0bw4w0P9r7KuBSVdUk5QjXsUdu2CxQ== - dependencies: - "@sinonjs/commons" "^1" - "@sinonjs/samsam" "^5.0.2" - -"@sinonjs/samsam@^5.0.2", "@sinonjs/samsam@^5.0.3": - version "5.0.3" - resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-5.0.3.tgz#86f21bdb3d52480faf0892a480c9906aa5a52938" - integrity sha512-QucHkc2uMJ0pFGjJUDP3F9dq5dx8QIaqISl9QgwLOh6P9yv877uONPGXh/OH/0zmM3tW1JjuJltAZV2l7zU+uQ== - dependencies: - "@sinonjs/commons" "^1.6.0" - lodash.get "^4.4.2" - type-detect "^4.0.8" - -"@sinonjs/text-encoding@^0.7.1": - version "0.7.1" - resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" - integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== - -"@tokenizer/token@^0.1.0", "@tokenizer/token@^0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@tokenizer/token/-/token-0.1.1.tgz#f0d92c12f87079ddfd1b29f614758b9696bc29e3" - integrity sha512-XO6INPbZCxdprl+9qa/AAbFFOMzzwqYxpjPgLICrMD6C2FCw6qfJOPcBk6JqqPLSaZ/Qx87qn4rpPmPMwaAK6w== - -"@types/color-name@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" - integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== - -"@types/debug@^4.1.5": - version "4.1.5" - resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.5.tgz#b14efa8852b7768d898906613c23f688713e02cd" - integrity sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ== - -"@types/file-type@^10.9.1": - version "10.9.1" - resolved "https://registry.yarnpkg.com/@types/file-type/-/file-type-10.9.1.tgz#fc9a6b38697777eca346dba914fdea4b38e04b97" - integrity sha512-oq0fy8Jqj19HofanFsZ56o5anMDUQtFO9B3wfLqM9o42RyCe1WT+wRbSvRbL2l8ARZXNaJturHk0b442+0yi+g== - dependencies: - file-type "*" - -"@types/node@*": - version "13.9.3" - resolved "https://registry.yarnpkg.com/@types/node/-/node-13.9.3.tgz#6356df2647de9eac569f9a52eda3480fa9e70b4d" - integrity sha512-01s+ac4qerwd6RHD+mVbOEsraDHSgUaefQlEdBbUolnQFjKwCr7luvAlEwW1RFojh67u0z4OUTjPn9LEl4zIkA== - -"@types/temp@^0.8.32": - version "0.8.34" - resolved "https://registry.yarnpkg.com/@types/temp/-/temp-0.8.34.tgz#03e4b3cb67cbb48c425bbf54b12230fef85540ac" - integrity sha512-oLa9c5LHXgS6UimpEVp08De7QvZ+Dfu5bMQuWyMhf92Z26Q10ubEMOWy9OEfUdzW7Y/sDWVHmUaLFtmnX/2j0w== - dependencies: - "@types/node" "*" - -ansi-colors@3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" - integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= - -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= - -ansi-regex@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" - integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== - -ansi-regex@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" - integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== - -ansi-styles@^3.2.0, ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" - integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== - dependencies: - "@types/color-name" "^1.1.1" - color-convert "^2.0.1" - -anymatch@~3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" - integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -assertion-error@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" - integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== - -balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= - -binary-extensions@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c" - integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -browser-stdout@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" - integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== - -builtin-modules@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.1.0.tgz#aad97c15131eb76b65b50ef208e7584cd76a7484" - integrity sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw== - -caller-callsite@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" - integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= - dependencies: - callsites "^2.0.0" - -caller-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" - integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= - dependencies: - caller-callsite "^2.0.0" - -callsites@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" - integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= - -camelcase@^5.0.0, camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -chai@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.2.0.tgz#760aa72cf20e3795e84b12877ce0e83737aa29e5" - integrity sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw== - dependencies: - assertion-error "^1.1.0" - check-error "^1.0.2" - deep-eql "^3.0.1" - get-func-name "^2.0.0" - pathval "^1.1.0" - type-detect "^4.0.5" - -chalk@^2.0.0, chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -check-error@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" - integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= - -chokidar@3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.0.tgz#12c0714668c55800f659e262d4962a97faf554a6" - integrity sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A== - dependencies: - anymatch "~3.1.1" - braces "~3.0.2" - glob-parent "~5.1.0" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.2.0" - optionalDependencies: - fsevents "~2.1.1" - -ci-info@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" - integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== - -cliui@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" - integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== - dependencies: - string-width "^2.1.1" - strip-ansi "^4.0.0" - wrap-ansi "^2.0.0" - -cliui@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" - integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== - dependencies: - string-width "^3.1.0" - strip-ansi "^5.2.0" - wrap-ansi "^5.1.0" - -cliui@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" - integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^6.2.0" - -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -cosmiconfig@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" - integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== - dependencies: - import-fresh "^2.0.0" - is-directory "^0.3.1" - js-yaml "^3.13.1" - parse-json "^4.0.0" - -cross-spawn@^6.0.0: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - -crypto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/crypto/-/crypto-1.0.1.tgz#2af1b7cad8175d24c8a1b0778255794a21803037" - integrity sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig== - -dateformat@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" - integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== - -de-indent@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d" - integrity sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0= - -debug@3.2.6: - version "3.2.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" - integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== - dependencies: - ms "^2.1.1" - -debug@^4.1.0, debug@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" - integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== - dependencies: - ms "^2.1.1" - -decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= - -deep-eql@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" - integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== - dependencies: - type-detect "^4.0.0" - -deepmerge@2.01: - version "2.1.1" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-2.1.1.tgz#e862b4e45ea0555072bf51e7fd0d9845170ae768" - integrity sha512-urQxA1smbLZ2cBbXbaYObM1dJ82aJ2H57A1C/Kklfh/ZN1bgH4G/n5KWhdNfOK11W98gqZfyYj7W4frJJRwA2w== - -define-properties@^1.1.2, define-properties@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== - dependencies: - object-keys "^1.0.12" - -depcheck@^0.9.2: - version "0.9.2" - resolved "https://registry.yarnpkg.com/depcheck/-/depcheck-0.9.2.tgz#9e3198b44a527836914c61ba5395479c62ecbaf4" - integrity sha512-w5f+lSZqLJJkk58s44eOd0Vor7hLZot4PlFL0y2JsIX5LuHQ2eAjHlDVeGBD4Mj6ZQSKakvKWRRCcPlvrdU2Sg== - dependencies: - "@babel/parser" "^7.7.7" - "@babel/traverse" "^7.7.4" - builtin-modules "^3.0.0" - camelcase "^5.3.1" - cosmiconfig "^5.2.1" - debug "^4.1.1" - deps-regex "^0.1.4" - js-yaml "^3.4.2" - lodash "^4.17.15" - minimatch "^3.0.2" - node-sass-tilde-importer "^1.0.2" - please-upgrade-node "^3.2.0" - require-package-name "^2.0.1" - resolve "^1.14.1" - vue-template-compiler "^2.6.11" - walkdir "^0.4.1" - yargs "^15.0.2" - -deps-regex@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deps-regex/-/deps-regex-0.1.4.tgz#518667b7691460a5e7e0a341be76eb7ce8090184" - integrity sha1-UYZnt2kUYKXn4KNBvnbrfOgJAYQ= - -diff@3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" - integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== - -diff@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - -emoji-regex@^7.0.1: - version "7.0.3" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -end-of-stream@^1.1.0: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -es-abstract@^1.17.0-next.1: - version "1.17.5" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.5.tgz#d8c9d1d66c8981fb9200e2251d799eee92774ae9" - integrity sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg== - dependencies: - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - is-callable "^1.1.5" - is-regex "^1.0.5" - object-inspect "^1.7.0" - object-keys "^1.1.1" - object.assign "^4.1.0" - string.prototype.trimleft "^2.1.1" - string.prototype.trimright "^2.1.1" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -escape-string-regexp@1.0.5, escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -execa@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" - integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== - dependencies: - cross-spawn "^6.0.0" - get-stream "^4.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -file-type@*, file-type@^14.1.4: - version "14.1.4" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-14.1.4.tgz#3ac109f2ea9e8f5573d000ec0c6bcdff07fd46de" - integrity sha512-1n6FczX8n73Y/cLjTiMboeTGHfm/i2AWk2oQE7m9a/G5YTCZHCEHEGr32thhLm3iQNUYzTKVQUcYcNHtOLwqgQ== - dependencies: - readable-web-to-node-stream "^2.0.0" - strtok3 "^6.0.0" - token-types "^2.0.0" - typedarray-to-buffer "^3.1.5" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -find-parent-dir@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/find-parent-dir/-/find-parent-dir-0.3.0.tgz#33c44b429ab2b2f0646299c5f9f718f376ff8d54" - integrity sha1-M8RLQpqysvBkYpnF+fcY83b/jVQ= - -find-up@3.0.0, find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - -find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -flat@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.0.tgz#090bec8b05e39cba309747f1d588f04dbaf98db2" - integrity sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw== - dependencies: - is-buffer "~2.0.3" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -fsevents@~2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805" - integrity sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -get-caller-file@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" - integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== - -get-caller-file@^2.0.1: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-func-name@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" - integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= - -get-stream@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" - -glob-parent@~5.1.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" - integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== - dependencies: - is-glob "^4.0.1" - -glob@7.1.3: - version "7.1.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" - integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^7.0.0, glob@^7.1.3, glob@^7.1.6: - version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -growl@1.10.5: - version "1.10.5" - resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" - integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-symbols@^1.0.0, has-symbols@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" - integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -he@1.2.0, he@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - -ieee754@^1.1.13: - version "1.1.13" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" - integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== - -import-fresh@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" - integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= - dependencies: - caller-path "^2.0.0" - resolve-from "^3.0.0" - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -interpret@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" - integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== - -invert-kv@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" - integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-buffer@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623" - integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A== - -is-callable@^1.1.4, is-callable@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" - integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q== - -is-ci@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" - integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== - dependencies: - ci-info "^2.0.0" - -is-date-object@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" - integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== - -is-directory@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" - integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= - -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" - integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== - dependencies: - is-extglob "^2.1.1" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-regex@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" - integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== - dependencies: - has "^1.0.3" - -is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= - -is-symbol@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" - integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== - dependencies: - has-symbols "^1.0.1" - -is-typedarray@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= - -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= - -js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@3.13.1, js-yaml@^3.13.1, js-yaml@^3.4.2: - version "3.13.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" - integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -json-parse-better-errors@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - -just-extend@^4.0.2: - version "4.1.0" - resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.1.0.tgz#7278a4027d889601640ee0ce0e5a00b992467da4" - integrity sha512-ApcjaOdVTJ7y4r08xI5wIqpvwS48Q0PBG4DJROcEkH1f8MdAiNFyFxz3xoL0LWAVwjrwPYZdVHHxhRHcx/uGLA== - -lcid@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" - integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== - dependencies: - invert-kv "^2.0.0" - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -lodash.get@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" - integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= - -lodash@^4.17.13, lodash@^4.17.15: - version "4.17.15" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" - integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== - -log-symbols@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4" - integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ== - dependencies: - chalk "^2.4.2" - -map-age-cleaner@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" - integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== - dependencies: - p-defer "^1.0.0" - -mem@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" - integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== - dependencies: - map-age-cleaner "^0.1.1" - mimic-fn "^2.0.0" - p-is-promise "^2.0.0" - -mimic-fn@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== - -mkdirp@0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.3.tgz#5a514b7179259287952881e94410ec5465659f8c" - integrity sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg== - dependencies: - minimist "^1.2.5" - -mocha@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-7.1.1.tgz#89fbb30d09429845b1bb893a830bf5771049a441" - integrity sha512-3qQsu3ijNS3GkWcccT5Zw0hf/rWvu1fTN9sPvEd81hlwsr30GX2GcDSSoBxo24IR8FelmrAydGC6/1J5QQP4WA== - dependencies: - ansi-colors "3.2.3" - browser-stdout "1.3.1" - chokidar "3.3.0" - debug "3.2.6" - diff "3.5.0" - escape-string-regexp "1.0.5" - find-up "3.0.0" - glob "7.1.3" - growl "1.10.5" - he "1.2.0" - js-yaml "3.13.1" - log-symbols "3.0.0" - minimatch "3.0.4" - mkdirp "0.5.3" - ms "2.1.1" - node-environment-flags "1.0.6" - object.assign "4.1.0" - strip-json-comments "2.0.1" - supports-color "6.0.0" - which "1.3.1" - wide-align "1.1.3" - yargs "13.3.2" - yargs-parser "13.1.2" - yargs-unparser "1.6.0" - -ms@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" - integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== - -ms@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - -nise@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/nise/-/nise-4.0.3.tgz#9f79ff02fa002ed5ffbc538ad58518fa011dc913" - integrity sha512-EGlhjm7/4KvmmE6B/UFsKh7eHykRl9VH+au8dduHLCyWUO/hr7+N+WtTvDUwc9zHuM1IaIJs/0lQ6Ag1jDkQSg== - dependencies: - "@sinonjs/commons" "^1.7.0" - "@sinonjs/fake-timers" "^6.0.0" - "@sinonjs/text-encoding" "^0.7.1" - just-extend "^4.0.2" - path-to-regexp "^1.7.0" - -node-environment-flags@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.6.tgz#a30ac13621f6f7d674260a54dede048c3982c088" - integrity sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw== - dependencies: - object.getownpropertydescriptors "^2.0.3" - semver "^5.7.0" - -node-sass-tilde-importer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/node-sass-tilde-importer/-/node-sass-tilde-importer-1.0.2.tgz#1a15105c153f648323b4347693fdb0f331bad1ce" - integrity sha512-Swcmr38Y7uB78itQeBm3mThjxBy9/Ah/ykPIaURY/L6Nec9AyRoL/jJ7ECfMR+oZeCTVQNxVMu/aHU+TLRVbdg== - dependencies: - find-parent-dir "^0.3.0" - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= - dependencies: - path-key "^2.0.0" - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= - -object-inspect@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" - integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== - -object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@4.1.0, object.assign@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" - integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== - dependencies: - define-properties "^1.1.2" - function-bind "^1.1.1" - has-symbols "^1.0.0" - object-keys "^1.0.11" - -object.getownpropertydescriptors@^2.0.3: - version "2.1.0" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" - integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -os-locale@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" - integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== - dependencies: - execa "^1.0.0" - lcid "^2.0.0" - mem "^4.0.0" - -p-defer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" - integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= - -p-is-promise@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" - integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== - -p-limit@^2.0.0, p-limit@^2.2.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.2.tgz#61279b67721f5287aa1c13a9a7fbbc48c9291b1e" - integrity sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ== - dependencies: - p-try "^2.0.0" - -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== - dependencies: - p-limit "^2.0.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -parse-json@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= - dependencies: - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -path-key@^2.0.0, path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= - -path-parse@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" - integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== - -path-to-regexp@^1.7.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" - integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== - dependencies: - isarray "0.0.1" - -pathval@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" - integrity sha1-uULm1L3mUwBe9rcTYd74cn0GReA= - -peek-readable@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/peek-readable/-/peek-readable-3.1.0.tgz#250b08b7de09db8573d7fd8ea475215bbff14348" - integrity sha512-KGuODSTV6hcgdZvDrIDBUkN0utcAVj1LL7FfGbM0viKTtCHmtZcuEJ+lGqsp0fTFkGqesdtemV2yUSMeyy3ddA== - -picomatch@^2.0.4: - version "2.2.2" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" - integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== - -please-upgrade-node@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz#aeddd3f994c933e4ad98b99d9a556efa0e2fe942" - integrity sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg== - dependencies: - semver-compare "^1.0.0" - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -readable-web-to-node-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/readable-web-to-node-stream/-/readable-web-to-node-stream-2.0.0.tgz#751e632f466552ac0d5c440cc01470352f93c4b7" - integrity sha512-+oZJurc4hXpaaqsN68GoZGQAQIA3qr09Or4fqEsargABnbe5Aau8hFn6ISVleT3cpY/0n/8drn7huyyEvTbghA== - -readdirp@~3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.2.0.tgz#c30c33352b12c96dfb4b895421a49fd5a9593839" - integrity sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ== - dependencies: - picomatch "^2.0.4" - -rechoir@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" - integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= - dependencies: - resolve "^1.1.6" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= - -require-main-filename@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" - integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= - -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== - -require-package-name@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/require-package-name/-/require-package-name-2.0.1.tgz#c11e97276b65b8e2923f75dabf5fb2ef0c3841b9" - integrity sha1-wR6XJ2tluOKSP3Xav1+y7ww4Qbk= - -resolve-from@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" - integrity sha1-six699nWiBvItuZTM17rywoYh0g= - -resolve@^1.1.6, resolve@^1.14.1: - version "1.15.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8" - integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w== - dependencies: - path-parse "^1.0.6" - -rimraf@~2.6.2: - version "2.6.3" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" - integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== - dependencies: - glob "^7.1.3" - -semver-compare@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" - integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= - -semver@^5.5.0, semver@^5.7.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@^7.3.2: - version "7.3.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" - integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== - -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= - dependencies: - shebang-regex "^1.0.0" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= - -shelljs@^0.8.3: - version "0.8.3" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.3.tgz#a7f3319520ebf09ee81275b2368adb286659b097" - integrity sha512-fc0BKlAWiLpwZljmOvAOTE/gXawtCoNrP5oaY7KIaQbbyHeQVg01pSEuEGvGh3HEdBU4baCD7wQBwADmM/7f7A== - dependencies: - glob "^7.0.0" - interpret "^1.0.0" - rechoir "^0.6.2" - -signal-exit@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= - -sinon@^9.0.1: - version "9.0.1" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-9.0.1.tgz#dbb18f7d8f5835bcf91578089c0a97b2fffdd73b" - integrity sha512-iTTyiQo5T94jrOx7X7QLBZyucUJ2WvL9J13+96HMfm2CGoJYbIPqRfl6wgNcqmzk0DI28jeGx5bUTXizkrqBmg== - dependencies: - "@sinonjs/commons" "^1.7.0" - "@sinonjs/fake-timers" "^6.0.0" - "@sinonjs/formatio" "^5.0.1" - "@sinonjs/samsam" "^5.0.3" - diff "^4.0.2" - nise "^4.0.1" - supports-color "^7.1.0" - -source-map@^0.5.0: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= - -string-width@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -string-width@^3.0.0, string-width@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" - -string-width@^4.1.0, string-width@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" - integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.0" - -string.prototype.trimleft@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz#9bdb8ac6abd6d602b17a4ed321870d2f8dcefc74" - integrity sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag== - dependencies: - define-properties "^1.1.3" - function-bind "^1.1.1" - -string.prototype.trimright@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz#440314b15996c866ce8a0341894d45186200c5d9" - integrity sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g== - dependencies: - define-properties "^1.1.3" - function-bind "^1.1.1" - -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= - dependencies: - ansi-regex "^2.0.0" - -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= - dependencies: - ansi-regex "^3.0.0" - -strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== - dependencies: - ansi-regex "^4.1.0" - -strip-ansi@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" - integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== - dependencies: - ansi-regex "^5.0.0" - -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= - -strip-json-comments@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= - -strtok3@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/strtok3/-/strtok3-6.0.0.tgz#d6b900863daeacfe6c1724c6e7bb36d7a58e83c8" - integrity sha512-ZXlmE22LZnIBvEU3n/kZGdh770fYFie65u5+2hLK9s74DoFtpkQIdBZVeYEzlolpGa+52G5IkzjUWn+iXynOEQ== - dependencies: - "@tokenizer/token" "^0.1.1" - "@types/debug" "^4.1.5" - debug "^4.1.1" - peek-readable "^3.1.0" - -supports-color@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a" - integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg== - dependencies: - has-flag "^3.0.0" - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" - integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== - dependencies: - has-flag "^4.0.0" - -temp@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/temp/-/temp-0.9.1.tgz#2d666114fafa26966cd4065996d7ceedd4dd4697" - integrity sha512-WMuOgiua1xb5R56lE0eH6ivpVmg/lq2OHm4+LtT/xtEtPQ+sz6N3bBM6WZ5FvO1lO4IKIOb43qnhoc4qxP5OeA== - dependencies: - rimraf "~2.6.2" - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -token-types@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/token-types/-/token-types-2.0.0.tgz#b23618af744818299c6fbf125e0fdad98bab7e85" - integrity sha512-WWvu8sGK8/ZmGusekZJJ5NM6rRVTTDO7/bahz4NGiSDb/XsmdYBn6a1N/bymUHuWYTWeuLUg98wUzvE4jPdCZw== - dependencies: - "@tokenizer/token" "^0.1.0" - ieee754 "^1.1.13" - -type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5, type-detect@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - -typedarray-to-buffer@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" - integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== - dependencies: - is-typedarray "^1.0.0" - -vue-template-compiler@^2.6.11: - version "2.6.11" - resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.6.11.tgz#c04704ef8f498b153130018993e56309d4698080" - integrity sha512-KIq15bvQDrcCjpGjrAhx4mUlyyHfdmTaoNfeoATHLAiWB+MU3cx4lOzMwrnUh9cCxy0Lt1T11hAFY6TQgroUAA== - dependencies: - de-indent "^1.0.2" - he "^1.1.0" - -walkdir@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/walkdir/-/walkdir-0.4.1.tgz#dc119f83f4421df52e3061e514228a2db20afa39" - integrity sha512-3eBwRyEln6E1MSzcxcVpQIhRG8Q1jLvEqRmCZqS3dsfXEDR/AhOF4d+jHg1qvDCpYaVRZjENPQyrVxAkQqxPgQ== - -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= - -which@1.3.1, which@^1.2.9: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -wide-align@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== - dependencies: - string-width "^1.0.2 || 2" - -wrap-ansi@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" - integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - -wrap-ansi@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" - integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== - dependencies: - ansi-styles "^3.2.0" - string-width "^3.0.0" - strip-ansi "^5.0.0" - -wrap-ansi@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" - integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" - integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== - -yaml@^1.10.2: - version "1.10.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" - integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== - -yargs-parser@13.1.2, yargs-parser@^13.1.2: - version "13.1.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" - integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs-parser@^11.1.1: - version "11.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" - integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs-parser@^18.1.1: - version "18.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.1.tgz#bf7407b915427fc760fcbbccc6c82b4f0ffcbd37" - integrity sha512-KRHEsOM16IX7XuLnMOqImcPNbLVXMNHYAoFc3BKR8Ortl5gzDbtXvvEoGx9imk5E+X1VeNKNlcHr8B8vi+7ipA== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs-unparser@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f" - integrity sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw== - dependencies: - flat "^4.1.0" - lodash "^4.17.15" - yargs "^13.3.0" - -yargs@13.3.2, yargs@^13.3.0: - version "13.3.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" - integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== - dependencies: - cliui "^5.0.0" - find-up "^3.0.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^3.0.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^13.1.2" - -yargs@^12.0.5: - version "12.0.5" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" - integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== - dependencies: - cliui "^4.0.0" - decamelize "^1.2.0" - find-up "^3.0.0" - get-caller-file "^1.0.1" - os-locale "^3.0.0" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1 || ^4.0.0" - yargs-parser "^11.1.1" - -yargs@^15.0.2: - version "15.3.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.3.1.tgz#9505b472763963e54afe60148ad27a330818e98b" - integrity sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA== - dependencies: - cliui "^6.0.0" - decamelize "^1.2.0" - find-up "^4.1.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^4.2.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^18.1.1" diff --git a/i18n/README.md b/i18n/README.md new file mode 100644 index 000000000..b169b3dde --- /dev/null +++ b/i18n/README.md @@ -0,0 +1,11 @@ +# Localization Data + +This folder contains the [localization](https://en.wikipedia.org/wiki/Internationalization_and_localization) data for Arduino IDE. + +❗ These files are automatically generated and so can not be edited directly. If you wish to modify the contents, do it at the source: + +- **en.json** - edit the string in [the source code](../arduino-ide-extension/src) +- **All other files** - the localization is done on **Transifex**:<br /> + https://explore.transifex.com/arduino-1/ide2/ + +For more information on translating Arduino IDE, see [the **Translator Guide**](../docs/contributor-guide/translation.md). diff --git a/i18n/af.json b/i18n/af.json index 2b1a8db1f..4d3c5c0b9 100644 --- a/i18n/af.json +++ b/i18n/af.json @@ -1,38 +1,51 @@ { "arduino": { "about": { - "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}{4} [{5}]\n\n{6}", + "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "About {0}" }, + "account": { + "goToCloudEditor": "Go to Cloud Editor", + "goToIoTCloud": "Go to IoT Cloud", + "goToProfile": "Go to Profile", + "menuTitle": "Arduino Cloud" + }, "board": { "board": "Board{0}", "boardConfigDialogTitle": "Select Other Board and Port", + "boardDataReloaded": "Board data reloaded.", "boardInfo": "Board Info", + "boards": "boards", "configDialog1": "Select both a Board and a Port if you want to upload a sketch.", "configDialog2": "If you only select a Board you will be able to compile, but not to upload your sketch.", "couldNotFindPreviouslySelected": "Could not find previously selected board '{0}' in installed platform '{1}'. Please manually reselect the board you want to use. Do you want to reselect it now?", - "disconnected": "Disconnected", + "editBoardsConfig": "Edit Board and Port...", "getBoardInfo": "Get Board Info", "inSketchbook": " (in Sketchbook)", "installNow": "The \"{0} {1}\" core has to be installed for the currently selected \"{2}\" board. Do you want to install it now?", - "noFQBN": "The FQBN is not available for the selected board \"{0}\". Do you have the corresponding core installed?", + "noBoardsFound": "No boards found for \"{0}\"", + "noNativeSerialPort": "Native serial port, can't obtain info.", "noPortsDiscovered": "No ports discovered", - "noPortsSelected": "No ports selected for board: '{0}'.", - "noneSelected": "Geen bord gekies nie.", + "nonSerialPort": "Non-serial port, can't obtain info.", "openBoardsConfig": "Kies ander bord en poort...", - "platformMissing": "The platform for the selected '{0}' board is not installed.", "pleasePickBoard": "Please pick a board connected to the port you have selected.", "port": "Port{0}", - "portLabel": "Port: {0}", + "ports": "ports", "programmer": "Programeerder", + "reloadBoardData": "Reload Board Data", "reselectLater": "Herselekteer later", + "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "Search board", "selectBoard": "Kies Bord", - "selectBoardForInfo": "Please select a board to obtain board info.", + "selectBoardToReload": "Please select a board first.", "selectPortForInfo": "Please select a port to obtain board info.", "showAllAvailablePorts": "Shows all available ports when enabled", + "showAllPorts": "Show all ports", "succesfullyInstalledPlatform": "Successfully installed platform {0}:{1}", - "succesfullyUninstalledPlatform": "Successfully uninstalled platform {0}:{1}" + "succesfullyUninstalledPlatform": "Successfully uninstalled platform {0}:{1}", + "typeOfPorts": "{0} ports", + "unconfirmedBoard": "Unconfirmed board", + "unknownBoard": "Unknown board" }, "boardsManager": "Boards Manager", "boardsType": { @@ -77,14 +90,15 @@ "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" }, "cloud": { - "account": "Account", "chooseSketchVisibility": "Choose visibility of your Sketch:", + "cloudSketchbook": "Wolk Skets", "connected": "Connected", "continue": "Continue", - "donePulling": "Done pulling ‘{0}’.", - "donePushing": "Done pushing ‘{0}’.", + "donePulling": "Done pulling '{0}'.", + "donePushing": "Done pushing '{0}'.", "embed": "Embed:", "emptySketchbook": "Jou Sketsboek is leeg", + "goToCloud": "Go to Cloud", "learnMore": "Learn more", "link": "Skakel:", "notYetPulled": "Cannot push to Cloud. It is not yet pulled.", @@ -102,10 +116,9 @@ "pushSketch": "Push Sketch", "pushSketchMsg": "This is a Public Sketch. Before pushing, make sure any sensitive information is defined in arduino_secrets.h files. You can make a Sketch private from the Share panel.", "remote": "Remote", - "remoteSketchbook": "Remote Sketchbook", "share": "Deel...", "shareSketch": "Share Sketch", - "showHideRemoveSketchbook": "Show/Hide Remote Sketchbook", + "showHideSketchbook": "Show/Hide Cloud Sketchbook", "signIn": "TEKEN AAN", "signInToCloud": "Sign in to Arduino Cloud", "signOut": "Teken Uit", @@ -113,12 +126,23 @@ "syncEditSketches": "Sync and edit your Arduino Cloud Sketches", "visitArduinoCloud": "Visit Arduino Cloud to create Cloud Sketches." }, + "cloudSketch": { + "alreadyExists": "Cloud sketch '{0}' already exists.", + "creating": "Creating cloud sketch '{0}'...", + "new": "New Cloud Sketch", + "notFound": "Could not pull the cloud sketch '{0}'. It does not exist.", + "pulling": "Synchronizing sketchbook, pulling '{0}'...", + "pushing": "Synchronizing sketchbook, pushing '{0}'...", + "renaming": "Renaming cloud sketch from '{0}' to '{1}'...", + "synchronizingSketchbook": "Synchronizing sketchbook..." + }, "common": { "all": "All", "contributed": "Contributed", "installManually": "Install Manually", "later": "Later", "noBoardSelected": "Geen bord geselekteer", + "noSketchOpened": "No sketch opened", "notConnected": "[nie gekoppel]", "offlineIndicator": "Dit lyk of jy van af lyn is. Sonder 'n internetverbinding kan die Arduino CLI moontlik nie die nodige hulpbronne aflaai nie en kan dit wanfunksionering veroorsaak. Koppel asseblief aan die internet en herbegin die toepassing.", "oldFormat": "The '{0}' still uses the old `.pde` format. Do you want to switch to the new `.ino` extension?", @@ -126,11 +150,13 @@ "processing": "Verwerking", "recommended": "Recommended", "retired": "Retired", + "selectManually": "Select Manually", "selectedOn": "aan {0}", "serialMonitor": "Seriaal Monitor", "type": "Type", "unknown": "Onbekend", - "updateable": "Updatable" + "updateable": "Updatable", + "userAbort": "User abort" }, "compile": { "error": "Compilation error: {0}" @@ -138,22 +164,49 @@ "component": { "boardsIncluded": "Boards included in this package:", "by": "by", + "clickToOpen": "Click to open in browser: {0}", "filterSearch": "Filter your search...", - "install": "INSTALLEER", + "install": "Install", + "installLatest": "Install Latest", + "installVersion": "Install {0}", + "installed": "{0} installed", "moreInfo": "Meer inligting", + "otherVersions": "Other Versions", + "remove": "Remove", + "title": "{0} by {1}", "uninstall": "Uninstall", "uninstallMsg": "Do you want to uninstall {0}?", - "version": "Weergawe {0}" + "update": "Update" + }, + "configuration": { + "cli": { + "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" + } + }, + "connectionStatus": { + "connectionLost": "Connection lost. Cloud sketch actions and updates won't be available." }, "contributions": { "addFile": "Add File", "fileAdded": "Een lêer by skets gevoeg", + "plotter": { + "couldNotOpen": "Couldn't open serial plotter" + }, "replaceTitle": "Vervang" }, + "core": { + "compilerWarnings": { + "all": "All", + "default": "Default", + "more": "More", + "none": "None" + } + }, "coreContribution": { "copyError": "Copy error messages", "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." }, + "createCloudCopy": "Push Sketch to Cloud", "daemon": { "restart": "Restart Daemon", "start": "Start Daemon", @@ -162,8 +215,15 @@ "debug": { "debugWithMessage": "Ontfouting {0}", "debuggingNotSupported": "Debugging is not supported by '{0}'", + "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "Platform is nie geïnstalleer vir ' {0} '", - "optimizeForDebugging": "Geoptimaliseerd vir ontfouting" + "optimizeForDebugging": "Geoptimaliseerd vir ontfouting", + "sketchIsNotCompiled": "Sketch '{0}' must be verified before starting a debug session. Please verify the sketch and start debugging again. Do you want to verify the sketch now?" + }, + "developer": { + "clearBoardList": "Clear the Board List History", + "clearBoardsConfig": "Clear the Board and Port Selection", + "dumpBoardList": "Dump the Board List" }, "dialog": { "dontAskAgain": "Don't ask again" @@ -180,10 +240,6 @@ "previousError": "Previous Error", "revealError": "Reveal Error" }, - "electron": { - "couldNotSave": "Could not save the sketch. Please copy your unsaved work into your favorite text editor, and restart the IDE.", - "unsavedChanges": "Enige ongestoorde veranderinge sal nie gestoor word nie." - }, "examples": { "builtInExamples": "Built-in examples", "couldNotInitializeExamples": "Could not initialize built-in examples.", @@ -201,7 +257,7 @@ "selectBoard": "Kies Bord", "selectVersion": "Select firmware version", "successfullyInstalled": "Firmware successfully installed.", - "updater": "WiFi101 / WiFiNINA Firmware Updater" + "updater": "Firmware Updater" }, "help": { "environment": "Environment", @@ -219,6 +275,9 @@ "checkForUpdates": "Check for Arduino IDE Updates", "closeAndInstallButton": "Close and Install", "closeToInstallNotice": "Close the software and install the update on your machine.", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", "downloadButton": "Aflaai", "downloadingNotice": "Downloading the latest version of the Arduino IDE.", "errorCheckingForUpdates": "Error while checking for Arduino IDE updates.\n{0}", @@ -232,16 +291,20 @@ "updateAvailable": "Update Available", "versionDownloaded": "Arduino IDE {0} has been downloaded." }, + "installable": { + "libraryInstallFailed": "Failed to install library: '{0}{1}'.", + "platformInstallFailed": "Failed to install platform: '{0}{1}'." + }, "library": { "addZip": "Add .ZIP Library...", "arduinoLibraries": "Arduino libraries", "contributedLibraries": "Contributed libraries", - "dependenciesForLibrary": "Dependencies for library {0}:{1}", "include": "Include Library", - "installAll": "Install all", + "installAll": "Install All", + "installLibraryDependencies": "Install library dependencies", "installMissingDependencies": "Would you like to install all the missing dependencies?", "installOneMissingDependency": "Would you like to install the missing dependency?", - "installOnly": "Install {0} only", + "installWithoutDependencies": "Install without dependencies", "installedSuccessfully": "Successfully installed library {0}:{1}", "libraryAlreadyExists": "A library already exists. Do you want to overwrite it?", "manageLibraries": "Manage Libraries...", @@ -278,9 +341,23 @@ "tools": "Gereedskap" }, "monitor": { + "alreadyConnectedError": "Could not connect to {0} {1} port. Already connected.", + "baudRate": "{0} baud", + "connectionFailedError": "Could not connect to {0} {1} port.", + "connectionFailedErrorWithDetails": "{0} Could not connect to {1} {2} port.", + "connectionTimeout": "Timeout. The IDE has not received the 'success' message from the monitor after successfully connecting to it", + "missingConfigurationError": "Could not connect to {0} {1} port. The monitor configuration is missing.", + "notConnectedError": "Not connected to {0} {1} port.", "unableToCloseWebSocket": "Unable to close websocket", "unableToConnectToWebSocket": "Unable to connect to websocket" }, + "newCloudSketch": { + "newSketchTitle": "Name of the new Cloud Sketch" + }, + "portProtocol": { + "network": "Netwerk", + "serial": "Serial" + }, "preferences": { "additionalManagerURLs": "Additional Boards Manager URLs", "auth.audience": "Die OAuth2 gehoor.", @@ -297,6 +374,7 @@ "cloud.pull.warn": "True if users should be warned before pulling a cloud sketch. Defaults to true.", "cloud.push.warn": "True if users should be warned before pushing a cloud sketch. Defaults to true.", "cloud.pushpublic.warn": "True if users should be warned before pushing a public sketch to the cloud. Defaults to true.", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", "cloud.sketchSyncEndpoint": "The endpoint used to push and pull sketches from a backend. By default it points to Arduino Cloud API.", "compile": "saamstel", "compile.experimental": "True if the IDE should handle multiple compiler errors. False by default", @@ -314,29 +392,50 @@ "invalid.editorFontSize": "Invalid editor font size. It must be a positive integer.", "invalid.sketchbook.location": "Invalid sketchbook location: {0}", "invalid.theme": "Invalid theme.", + "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", "language.log": "True if the Arduino Language Server should generate log files into the sketch folder. Otherwise, false. It's false by default.", "language.realTimeDiagnostics": "If true, the language server provides real-time diagnostics when typing in the editor. It's false by default.", "manualProxy": "Manual proxy configuration", + "monitor": { + "dockPanel": "The area of the application shell where the _{0}_ widget will reside. It is either \"bottom\" or \"right\". It defaults to \"{1}\"." + }, "network": "Netwerk", "newSketchbookLocation": "Select new sketchbook location", + "noCliConfig": "Could not load the CLI configuration", "noProxy": "No proxy", + "proxySettings": { + "hostname": "Host name", + "password": "Password", + "port": "Port number", + "username": "Username" + }, "showVerbose": "Wys ontfoutings uitset tydens", + "sketch": { + "inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect." + }, "sketchbook.location": "Sketsboek ligging", "sketchbook.showAllFiles": "True to show all sketch files inside the sketch. It is false by default.", - "survey.notification": "True if users should be notified if a survey is available. True by default.", "unofficialBoardSupport": "Click for a list of unofficial board support URLs", "upload": "oplaai", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", "upload.verbose": "True for verbose upload output. False by default.", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "Verifieer kode na oplaai ", "window.autoScale": "True if the user interface automatically scales with the font size.", - "window.zoomLevel": "Adjust the zoom level of the window. The original size is 0 and each increment above (e.g. 1) or below (e.g. -1) represents zooming 20% larger or smaller. You can also enter decimals to adjust the zoom level with a finer granularity." + "window.zoomLevel": { + "deprecationMessage": "Deprecated. Use 'window.zoomLevel' instead." + } + }, + "renameCloudSketch": { + "renameSketchTitle": "New name of the Cloud Sketch" }, "replaceMsg": "Replace the existing version of {0}?", "selectZip": "Select a zip file containing the library you'd like to add", "serial": { "autoscroll": "Autoscroll", "carriageReturn": "Wagterugkeer", - "message": "Message ({0} + Enter to send message to '{1}' on '{2}')", + "connecting": "Connecting to '{0}' on '{1}'...", + "message": "Message (Enter to send message to '{0}' on '{1}')", "newLine": "Nuwe lyn", "newLineCarriageReturn": "Beide NL & CR", "noLineEndings": "No Line Ending", @@ -348,24 +447,34 @@ "sketch": { "archiveSketch": "Archive Sketch", "cantOpen": "A folder named \"{0}\" already exists. Can't open sketch.", - "close": "Are you sure you want to close the sketch?", "compile": "Compiling sketch...", - "configureAndUpload": "Configure And Upload", + "configureAndUpload": "Configure and Upload", "createdArchive": "Created archive '{0}'.", "doneCompiling": "Done compiling.", "doneUploading": "Done uploading.", + "editInvalidSketchFolderLocationQuestion": "Do you want to try saving the sketch to a different location?", + "editInvalidSketchFolderQuestion": "Do you want to try saving the sketch with a different name?", "exportBinary": "Export Compiled Binary", + "invalidCloudSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", + "invalidSketchFolderLocationDetails": "You cannot save a sketch into a folder inside itself.", + "invalidSketchFolderLocationMessage": "Invalid sketch folder location: '{0}'", + "invalidSketchFolderNameMessage": "Invalid sketch folder name: '{0}'", + "invalidSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", "moving": "Moving", "movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?", - "new": "New", + "new": "New Sketch", + "noTrailingPeriod": "A filename cannot end with a dot", "openFolder": "Open Folder", "openRecent": "Open Recent", "openSketchInNewWindow": "Open Sketch in New Window", + "reservedFilename": "'{0}' is a reserved filename.", "saveFolderAs": "Save sketch folder as...", "saveSketch": "Save your sketch to open it again later.", "saveSketchAs": "Save sketch folder as...", "showFolder": "Show Sketch Folder", "sketch": "Skets", + "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", + "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", "sketchbook": "Sketchbook", "titleLocalSketchbook": "Local Sketchbook", "titleSketchbook": "Sketchbook", @@ -376,10 +485,26 @@ "verify": "Verify", "verifyOrCompile": "Verify/Compile" }, - "survey": { - "answerSurvey": "Answer survey", - "dismissSurvey": "Don't show again", - "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." + "sketchbook": { + "newCloudSketch": "New Cloud Sketch", + "newSketch": "New Sketch" + }, + "theme": { + "currentThemeNotFound": "Could not find the currently selected theme: {0}. Arduino IDE has picked a built-in theme compatible with the missing one.", + "dark": "Dark", + "deprecated": "{0} (deprecated)", + "hc": "Dark High Contrast", + "hcLight": "Light High Contrast", + "light": "Light", + "user": "{0} (user)" + }, + "title": { + "cloud": "Cloud" + }, + "updateIndexes": { + "updateIndexes": "Update Indexes", + "updateLibraryIndex": "Update Library Index", + "updatePackageIndex": "Update Package Index" }, "upload": { "error": "{0} error: {1}" @@ -388,11 +513,27 @@ "cancel": "Cancel", "enterField": "Enter {0}", "upload": "Upload" + }, + "validateSketch": { + "abortFixMessage": "The sketch is still invalid. Do you want to fix the remaining problems? By clicking '{0}', a new sketch will open.", + "abortFixTitle": "Invalid sketch", + "renameSketchFileMessage": "The sketch file '{0}' cannot be used. {1} Do you want to rename the sketch file now?", + "renameSketchFileTitle": "Invalid sketch filename", + "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", + "renameSketchFolderTitle": "Invalid sketch name" + }, + "versionWelcome": { + "cancelButton": "Maybe later", + "donateButton": "Donate now", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Welcome to a new version of the Arduino IDE!", + "titleWithVersion": "Welcome to the new Arduino IDE {0}!" + }, + "workspace": { + "alreadyExists": "'{0}' already exists." } }, - "cloud": { - "GoToCloud": "GAAN NA WOLK" - }, "theia": { "core": { "cannotConnectBackend": "Cannot connect to the backend.", @@ -400,13 +541,9 @@ "couldNotSave": "Could not save the sketch. Please copy your unsaved work into your favorite text editor, and restart the IDE.", "daemonOffline": "CLI Daemon Offline", "offline": "Aflyn", + "offlineText": "Aflyn", "quitTitle": "Are you sure you want to quit?" }, - "debug": { - "start": "Begin...", - "startError": "There was an error starting the debug session, check the logs for more details.", - "typeNotSupported": "The debug session type \"{0}\" is not supported." - }, "editor": { "unsavedTitle": "Unsaved – {0}" }, @@ -415,10 +552,10 @@ "expand": "Expand" }, "workspace": { - "deleteCurrentSketch": "Wil jy die huidige skets uitvee?", + "deleteCloudSketch": "The cloud sketch '{0}' will be permanently deleted from the Arduino servers and the local caches. This action is irreversible. Do you want to delete the current sketch?", + "deleteCurrentSketch": "The sketch '{0}' will be permanently deleted. This action is irreversible. Do you want to delete the current sketch?", "fileNewName": "Naam vir nuwe lêer", "invalidExtension": ".{0} is not a valid extension", - "invalidFilename": "Ongeldige lêernaam", "newFileName": "Nuwe naam vir lêer" } } diff --git a/i18n/ar.json b/i18n/ar.json index 09d79a229..5bb6fad40 100644 --- a/i18n/ar.json +++ b/i18n/ar.json @@ -1,46 +1,59 @@ { "arduino": { "about": { - "detail": "النسخة : {0}\nالتاريخ : {1} {2} \nنسخة موجه سطر الاوامر CLI {3}{4} [{5}] \n{6}", + "detail": "النسخة : {0}\nالتاريخ : {1} {2}\nنسخة CLI : {3}\n{4} ", "label": "حول {0}" }, + "account": { + "goToCloudEditor": "الانتقال الى المحرر السحابي", + "goToIoTCloud": "الانتقال الى سحابة الIoT", + "goToProfile": "الانتقال الى ملف التعريف الشخصي", + "menuTitle": "الخدمة السحابية للأردوينو" + }, "board": { "board": "اللوحة {0}", - "boardConfigDialogTitle": "Select Other Board and Port", + "boardConfigDialogTitle": "اختر لوحة أخرى ومنفذها", + "boardDataReloaded": "Board data reloaded.", "boardInfo": "معلومات اللوحة", + "boards": "اللوحات", "configDialog1": "اختر لوحة و منفذ معا اذا اردت ان ترفع السكتش", "configDialog2": "اذا قمت باختيار لوحة فقط ستسطيع ان تترجم لكن بدون ان ترفع المشروع", "couldNotFindPreviouslySelected": "تعذر ايجاد اللوحة '{0}' المختارة مسبقا في المنصة المثبتة '{1}' . الرجاء اعادة اختيار اللوحة التي تريد استعمالها يدويا . هل تريد باعادة الاختيار الان؟", - "disconnected": "Disconnected", + "editBoardsConfig": "تعديل اللوحة و المنفذ", "getBoardInfo": "الحصول على معلومات اللوحة", "inSketchbook": "(داخل ملف المشاريع)", "installNow": "نواة \"{0} {1}\" يجب تثبيتها للوحة \"{2}\" التي تم اختيارها . هل تريد تثبيتها الان ؟", - "noFQBN": "FQBN غير متاح للوحة المختارة \"{0}\" . هل قمت بتثبيت النواة المعنية ؟", - "noPortsDiscovered": "No ports discovered", - "noPortsSelected": "لا يوجد اية منافذ متاحة للوحة '{0}'", - "noneSelected": "لم يتم اختيار اي لوحة", + "noBoardsFound": "لم يتم العثور على لوحة لـ \"{0}\"", + "noNativeSerialPort": "منفذ الاتصال التسلسلي الاساسي , تعذر الحصول على معلومات", + "noPortsDiscovered": "لم يتم العثور على منفذ متصل", + "nonSerialPort": "منفذ اتصال غير تسلسلي , تعذر الحصول على معلومات", "openBoardsConfig": "قم باختيار لوحة و منفذ مختلفين", - "platformMissing": "المنصة للّوحة المختارة '{0}' غير مثبتة", "pleasePickBoard": "من فضلك اختر لوحة متصلة على المنفذ الذي اخترته", "port": "المنفذ {0}", - "portLabel": "Port: {0}", + "ports": "منافذ", "programmer": "المبرمجة", + "reloadBoardData": "Reload Board Data", "reselectLater": "اعد الاختيار لاحقا", - "searchBoard": "Search board", + "revertBoardsConfig": "استخدم '{0}' تعامل مع '{1}'", + "searchBoard": "أبحث عن متحكم", "selectBoard": "اختر لوحة", - "selectBoardForInfo": "الرجاء اختيار لوحة من احل الحصول على معلومات اللوحة", + "selectBoardToReload": "Please select a board first.", "selectPortForInfo": "الرجاء اختيار منفذ من اجل الحصول على معلومات اللوحة", "showAllAvailablePorts": "يظهر كل المنافذ المتاحة عند تفعيله", + "showAllPorts": "أظهر جميع المنافذ", "succesfullyInstalledPlatform": "تم تثبيت المنصة {0}:{1} بنجاح", - "succesfullyUninstalledPlatform": "تم الغاء تثبيت المنصة {0}:{1} بنجاح" + "succesfullyUninstalledPlatform": "تم الغاء تثبيت المنصة {0}:{1} بنجاح", + "typeOfPorts": "المنافذ {0}", + "unconfirmedBoard": "اللوحة غير مدعومة", + "unknownBoard": "لوحة غير معروفة" }, "boardsManager": "مدير اللوحة", "boardsType": { - "arduinoCertified": "Arduino Certified" + "arduinoCertified": "معتمد من قبل اردوينو" }, "bootloader": { "burnBootloader": "ثبت محمل برنامج الإقلاع", - "burningBootloader": "Burning bootloader...", + "burningBootloader": "جار حرق محمل الاقلاع", "doneBurningBootloader": "تم حرق محمل الاقلاع" }, "burnBootloader": { @@ -64,27 +77,28 @@ "uploadingCertificates": "جار رفع الشهادة" }, "checkForUpdates": { - "checkForUpdates": "Check for Arduino Updates", - "installAll": "Install All", - "noUpdates": "There are no recent updates available.", - "promptUpdateBoards": "Updates are available for some of your boards.", - "promptUpdateLibraries": "Updates are available for some of your libraries.", - "updatingBoards": "Updating boards...", - "updatingLibraries": "Updating libraries..." + "checkForUpdates": "جار التحقق من تجديثات للاردوينو", + "installAll": "تثبيت الكل", + "noUpdates": "لا يوجد تحديثات متاحة حاليا", + "promptUpdateBoards": "يتوفر تحديثات لبعض اللوحات", + "promptUpdateLibraries": "يتوفر تحديثات لبعض المكتبات", + "updatingBoards": "جار تحديث اللوحات", + "updatingLibraries": "جار تحديث المكتبات" }, "cli-error-parser": { "keyboardError": "تعذر ايجاد لوحة المفاتيح 'Keyboard' . هل يحتوي مشروعك على '#include <Keyboard.h>' ؟", "mouseError": "تعذر ايجاد الفأرة 'Mouse' . هل يحتوي مشروعك على '#include <Mouse.h>' ؟" }, "cloud": { - "account": "الحساب", "chooseSketchVisibility": "اختر خصوصية مشروعك:", + "cloudSketchbook": "مشاريع على السحابة", "connected": "متصل", "continue": "استئناف", - "donePulling": "تم السحب بنجاح '{0}'", - "donePushing": "تم الدفع بنجاح '{0}'", + "donePulling": "تم سحب '{0}' بنجاح", + "donePushing": "تم دفع '{0}' بنجاح", "embed": "تضمين:", "emptySketchbook": "ملف المشاريع الخاص بك فارغ", + "goToCloud": "اذهب الى السحابة", "learnMore": "تعرف على المزيد", "link": "الرابط:", "notYetPulled": "تعذر الدفع الى Cloud . انها لم تسحب الى الان", @@ -102,10 +116,9 @@ "pushSketch": "دفع المشروع", "pushSketchMsg": "هذا مشروع عام . قبل دفعه , تاكد من عدم وجود اي معلومات حساسة داخل ملف arduino_secrets.h . تستطيع جعل المشروع خاصا من لوحة المشاركة", "remote": "عن بعد", - "remoteSketchbook": "ملف المشاريع عن بعد (Remote Sketchbook)", "share": "مشاركة...", "shareSketch": "مشاركة المشروع", - "showHideRemoveSketchbook": "اظهار/اخفاء المشاريع عن بعد", + "showHideSketchbook": "اظهار/اخفاء ملف المشاريع على السحابة", "signIn": "تسجيل الدخول", "signInToCloud": "تسجيل الدخول الى Arduino Cloud", "signOut": "تسجيل الخروج", @@ -113,57 +126,104 @@ "syncEditSketches": "المزامنة و التعديل على مشاريعك في Arduino Cloud", "visitArduinoCloud": "قم بزيارة Arduino Cloud من اجل انشاء ملف مشاريع على السحابة" }, + "cloudSketch": { + "alreadyExists": "المشروع السحابي '{0}' موجود مسبقا", + "creating": "جار انشاء المشروع السحابي '{0}' ", + "new": "مشروع سحابي جديد", + "notFound": "تعذر سحب المشروع السحابي '{0}' لانه غير موجود", + "pulling": "جار مزامنة ملف المشاريع , يتم سحب '{0}'", + "pushing": "جار مزامنة ملف المشاريع , يتم دفع '{0}'", + "renaming": "جار اعادة تسمية ملف المشاريع من '{0}' الى '{1}'", + "synchronizingSketchbook": "جار مزامنة ملف المشاريع" + }, "common": { - "all": "All", - "contributed": "Contributed", + "all": "الكل", + "contributed": "مُساهَم", "installManually": "ثبّت يدويا", "later": "لاحقا", "noBoardSelected": "لم يتم اختيار اي لوحة", + "noSketchOpened": "لم يتم فتح صفحة كتابة الكود", "notConnected": "[غير متصل]", "offlineIndicator": "انت غير متصل بالانترنت على الارجح , بدون الاتصال بالانترنت لن تستطيع واجهة سطر الاوامر الخاصة بالاردوينو \"Arduino CLI\" تحميل الموارد المطلوبة و من الممكن ان تسبب باخطاء , الرجاء الاتصال بالانترنت و اعادة تشغيل البرنامج", "oldFormat": "ال '{0}' ما زالت تستخدم صيغة `.pde` القديمة . هل تريد الانتقال الى صيغة `.ino`  الجديدة ؟", - "partner": "Partner", + "partner": "شريك", "processing": "تتم المعالجة", - "recommended": "Recommended", - "retired": "Retired", + "recommended": "يُنصح به", + "retired": "متقاعد", + "selectManually": "اختر يدوياً", "selectedOn": "{0} شغّل", "serialMonitor": "مراقب المنفذ التسلسلي \"سيريال بورت\"\n ", - "type": "Type", + "type": "النوع", "unknown": "غير معروف", - "updateable": "Updatable" + "updateable": "يمكن تحديثه", + "userAbort": "إلغاء المستخدم" }, "compile": { "error": "خطا في الترجمة : {0}" }, "component": { - "boardsIncluded": "Boards included in this package:", + "boardsIncluded": "اللوحات التي تتضمنها هذه الحزمة ", "by": "بواسطة", + "clickToOpen": "اضغط للفتح ضمن المستعرض : {0}", "filterSearch": "ترشيح بحثك...", "install": "تنصيب", + "installLatest": "تثبيت الاحدث", + "installVersion": "تثبيت {0}", + "installed": "تم تثبيت {0}", "moreInfo": "عرض المزيد", + "otherVersions": "نسخ اخرى", + "remove": "حذف", + "title": "{0} من قبل {1}", "uninstall": "الغاء التثبيت", "uninstallMsg": "هل تريد الغاء تثبيت {0}؟", - "version": "النسخة {0}" + "update": "تحديث" + }, + "configuration": { + "cli": { + "inaccessibleDirectory": "تعذر الوصول الى موقع ملف المشاريع في '{0}' : '{1}'" + } + }, + "connectionStatus": { + "connectionLost": "انقطع الاتصال . المشاريع السحابية و التحديثات لن تكون متاحة" }, "contributions": { "addFile": "اضف ملف...", "fileAdded": "تمت اضافة ملف واحد الى المشروع", + "plotter": { + "couldNotOpen": "تعذر فتح راسم اشارة المنفذ التسلسلي" + }, "replaceTitle": "استبدال" }, + "core": { + "compilerWarnings": { + "all": "الكل", + "default": "افتراضي", + "more": "المزيد", + "none": "لا شيء" + } + }, "coreContribution": { "copyError": "نسخ رسالة الخطأ", - "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." + "noBoardSelected": "لم يتم اختيار لوحة , الرجاء تحديد لوحة الاردوينو من ادوات --> قائمة اللوحات" }, + "createCloudCopy": "دفع المشروع الى السحابة", "daemon": { - "restart": "Restart Daemon", - "start": "Start Daemon", - "stop": "Stop Daemon" + "restart": "اعادة تشغيل الناطر", + "start": "تشغيل الناطر", + "stop": "ايقاف الناطر" }, "debug": { "debugWithMessage": "تصحيح برمجي - {0}", "debuggingNotSupported": "'{0}' لا يقبل التصحيح البرمجي", + "getDebugInfo": "الحصول على معلومات التصحيح", "noPlatformInstalledFor": "المنصة غير مثبتة ل '{0}'", - "optimizeForDebugging": "التحسين من اجل التصحيح البرمجي" + "optimizeForDebugging": "التحسين من اجل التصحيح البرمجي", + "sketchIsNotCompiled": "المشروع '{0}' يجب ان يتم التحقق منه قبل بدء جلسة تصحيح الاخطاء . الرجاء التحقق من المشروع و اعادة تشغيل مصحح الاخطاء مرة اخرى .\nهل تريد التحقق من المشروع الان؟" + }, + "developer": { + "clearBoardList": "أمسح سجل قائمة اللوحة", + "clearBoardsConfig": "إزالة تحديد المنفذ و اللوحة المحددة", + "dumpBoardList": "تفريغ قائمة اللوحة" }, "dialog": { "dontAskAgain": "لا تسأل مرة اخرى" @@ -178,11 +238,7 @@ "increaseIndent": "زيادة مسافة البادئة", "nextError": "الخطأ التالي", "previousError": "الخطأ السابق", - "revealError": "Reveal Error" - }, - "electron": { - "couldNotSave": "تعذر حفظ المشروع . الرجاء نسخ عملك الغير محفوظ الى محرر النصوص المفضل لديك و اعادة تشغيل Arduino IDE", - "unsavedChanges": "اي تغييرات لم تحفظ لن يتم حفظها" + "revealError": "الكشف عن الاخطاء" }, "examples": { "builtInExamples": "الأمثلة المدمجة", @@ -201,7 +257,7 @@ "selectBoard": "اختر لوحة", "selectVersion": "اختر نسخة البرامج الثابتة", "successfullyInstalled": "تم تثبيت البرامج الثابتة بنجاح", - "updater": "محدث البرامج الثابتة ل WiFi101 / WiFiNINA " + "updater": "تحديث البرنامج" }, "help": { "environment": "البيئة", @@ -216,9 +272,12 @@ "visit": "زيارة Arduino.cc" }, "ide-updater": { - "checkForUpdates": "Check for Arduino IDE Updates", + "checkForUpdates": "جار التحقق من التحديثات لـ Arduino IDE", "closeAndInstallButton": "قم بالاغلاق و التحديث", "closeToInstallNotice": "اغلق البرمجية و حّدث الجهاز الخاص بك ", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", "downloadButton": "حمّل", "downloadingNotice": "يتم تحميل اخر نسخة من Arduino IDE", "errorCheckingForUpdates": "حدث خطأ اثناء البحث عن تحديثات للـ Arduino IDE \n{0}", @@ -232,16 +291,20 @@ "updateAvailable": "يوجد تحديث", "versionDownloaded": "لقد تم تحميل {0} Arduino IDE" }, + "installable": { + "libraryInstallFailed": "تعذر تثبيت المكتبة : '{0}{1}'", + "platformInstallFailed": "تعذر تثبيت المنصة : '{0}{1}'" + }, "library": { "addZip": "اضف مكتبة .ZIP ...", "arduinoLibraries": "مكتبات Arduino", "contributedLibraries": "المكتبات التي سوهم بها", - "dependenciesForLibrary": "تبعيات المكتبة {0}:{1}", "include": "ضمّن مكتبة", "installAll": "تثبيت الكل", + "installLibraryDependencies": "تثبيت ملحقات المكتبة", "installMissingDependencies": "هل تريد تثبيت التبعيات المفقودة؟", "installOneMissingDependency": "هل تريد تثبيت التبعية المفقودة ؟", - "installOnly": "تثبيت {0} فقط", + "installWithoutDependencies": "التثبيت بدون الملحقات", "installedSuccessfully": "تم تثبيت المكتبة {0}:{1} بنجاح", "libraryAlreadyExists": "المكتبة موجودة مسبقا . هل تريد الكتابة فوقها ؟", "manageLibraries": "ادارة المكتبات", @@ -255,22 +318,22 @@ "zipLibrary": "المكتبة" }, "librarySearchProperty": { - "topic": "Topic" + "topic": "الموضوع" }, "libraryTopic": { - "communication": "Communication", - "dataProcessing": "Data Processing", - "dataStorage": "Data Storage", - "deviceControl": "Device Control", - "display": "Display", - "other": "Other", - "sensors": "Sensors", - "signalInputOutput": "Signal Input/Output", - "timing": "Timing", - "uncategorized": "Uncategorized" + "communication": "التواصل", + "dataProcessing": "معالجة البيانات", + "dataStorage": "تخزين البيانات", + "deviceControl": "التحكم بالاجهزة", + "display": "عرض", + "other": "اخرى", + "sensors": "حساسات", + "signalInputOutput": "ادخال/اخراج الاشارة", + "timing": "التوقيت", + "uncategorized": "غير مصنف" }, "libraryType": { - "installed": "Installed" + "installed": "مُثبَّت" }, "menu": { "advanced": "متقدم", @@ -278,9 +341,23 @@ "tools": "ادوات" }, "monitor": { + "alreadyConnectedError": "تعذر الاتصال الى {0} منفذ {1} لانه تم الاتصال مسبقا", + "baudRate": "{0} baud", + "connectionFailedError": "تعذر الاتصال الى منفذ {0} {1}", + "connectionFailedErrorWithDetails": "{0} تعذر الاتصال ب{1} منفذ {2} ", + "connectionTimeout": "نفذ الوقت . Arduino IDE لم يتلقَّ رسالة 'نجاح' من الشاشة بعد الاتصال بها بنجاح", + "missingConfigurationError": "تعذر الاتصال الى منفذ {0} {1} . اعدادات التهيئة للشاشة غير موجودة", + "notConnectedError": "غير متصل الى المنفذ {0} {1}", "unableToCloseWebSocket": "تعذر اغلاق مقبس الويب", "unableToConnectToWebSocket": "تعذر الاتصال بمقبس الويب" }, + "newCloudSketch": { + "newSketchTitle": "اسم المشروع السحابي الجديد" + }, + "portProtocol": { + "network": "شبكة", + "serial": "تسلسلي" + }, "preferences": { "additionalManagerURLs": "مدير اللوحات الاضافية", "auth.audience": "جمهور OAuth2", @@ -290,17 +367,18 @@ "automatic": "تلقائي", "board.certificates": "قائمة الشهادات التي يمكن رفعها الى اللوحات", "browse": "استعرض", - "checkForUpdate": "Receive notifications of available updates for the IDE, boards, and libraries. Requires an IDE restart after change. It's true by default.", + "checkForUpdate": "الحصول على اشعارات بشان التحديثات للـ IDE , اللوحات و المكتبات . يتطلب اعادة تشغيل الIDE . و هو مفعل بشكل افتراضي ", "choose": "اختر", "cli.daemonDebug": "تفعيل تسجيل تصحيح الاخطاء لـ gRPC calls الى CLI الاردوينو (Enable debug logging of the gRPC calls to the Arduino CLI) يجب اعادة تشغيل ide لكي يصبح هذا الخيار فعالا . الخيار غير مفعل افتراضيا", "cloud.enabled": "True اذا كانت مهام المزامنة مفعلة . True افتراضيا", "cloud.pull.warn": "True اذا كان يجب تحذير المستخدمين قبل سحب مشروع من السحابة . True افتراضيا", "cloud.push.warn": "True اذا كان يجب تحذير المستخدمين قبل دفع مشروع الى السحابة . True افتراضيا", "cloud.pushpublic.warn": "True اذا كان يجب تحذير المستخدمين قبل دفع مشروع عام الى السحابة . True افتراضيا", + "cloud.sharedSpaceId": "معرّف مساحة Arduino Cloud المشتركة لتحميل مجموعة المشاريع منها. إذا تُركت فارغة، يتم اختيار مساحتك الخاصة", "cloud.sketchSyncEndpoint": "الوجهة المستخدمة لدفع و سحب المشاريع من الخلفية . تشير افتراضيا الى Arduino Cloud API.", "compile": "الترجمة", - "compile.experimental": "True if the IDE should handle multiple compiler errors. False by default", - "compile.revealRange": "Adjusts how compiler errors are revealed in the editor after a failed verify/upload. Possible values: 'auto': Scroll vertically as necessary and reveal a line. 'center': Scroll vertically as necessary and reveal a line centered vertically. 'top': Scroll vertically as necessary and reveal a line close to the top of the viewport, optimized for viewing a code definition. 'centerIfOutsideViewport': Scroll vertically as necessary and reveal a line centered vertically only if it lies outside the viewport. The default value is '{0}'.", + "compile.experimental": "مُفعل اذا وَجَبَ على الIDE التعامل مع عدة اخطاء اثناء الترجمة . غير مفعل بشكل افتراضي ", + "compile.revealRange": "يغير كيفية الكشف عن اخطاء الترجمة ضمن المحرر بعد فشل التحقق او الرفع . القيم الممكنة : \n'auto' : يتم التمرير شاقوليا عند الحاجة و الكشف عن السطر\n'center' : يتم التمرير شاقوليا عند الحاجة و يكشف عن سطر في الوسط شاقوليا\n'top' : يتم التمرير شاقوليا عند الحاجة و يكشف عن السطر الاقرب الى اعلى نقطة مشاهدة , مُحسن من اجل عرض الكود\n'centerIfOutsideViewport' : يتم التمرير شاقوليا عند الحاجة و يكشف عن سطر في الوسط شاقوليا فقط اذا كان خارج مجال العرض . \nالقيمة الافتراضية هي '{0}'", "compile.verbose": "True لخرج الترجمة المطول . False افتراضيا", "compile.warnings": "يخبر gcc اي مستوى انذار سيتم استخدامه , قيمته 'None' افتراضيا", "compilerWarnings": "تحذيرات المترجم", @@ -314,85 +392,148 @@ "invalid.editorFontSize": "حجم خط المحرّر غير صالح . يجب ان يكون عدد موجب", "invalid.sketchbook.location": "موقع ملف المشروع غير صالح : {0}", "invalid.theme": "سمة غير صالحة", + "language.asyncWorkers": "عدد العاملين غير المتزامنين المستخدمين من قبل خادم لغة Arduino (clangd). يستخدم الفهرس الخلفي أيضاً نفس عدد العاملين. الحد الأدنى للقيمة هو 0، والحد الأقصى هو 8. عندما تكون القيمة 0، يستخدم خادم اللغة جميع النوى المتاحة. القيمة الافتراضية هي 0", "language.log": "\"True\" اذا كان مخدم اللغات الخاص بArduino يستطيع توليد سجلات الى ملف المشروع , و الا \"False\", و هي كذلك بشكل افتراضي.", - "language.realTimeDiagnostics": "If true, the language server provides real-time diagnostics when typing in the editor. It's false by default.", + "language.realTimeDiagnostics": "اذا تم تفعيله , سيقوم سيرفر اللغة باعطاء تشخيصات للاخطاء خلال الوقت الحقيقي اثناء الكتابة ضمن المحرر . غير مفعل بشكل افتراضي", "manualProxy": "اعدادات الوكيل يدوياً", + "monitor": { + "dockPanel": "منطقة التطبيق هي _{0}_ حيث سيتم وضع عنصر واجهة المستخدم. إنها إما \"أسفل\" أو \"يمين\". الأفتراضي هو \"{1}\"" + }, "network": "شبكة", "newSketchbookLocation": "اختر مكان المشروع الجديد", + "noCliConfig": "تعذر تحميل اعدادات تهيئة ال CLI", "noProxy": "لا يوجد وكيل", + "proxySettings": { + "hostname": "اسم المستضيف", + "password": "كلمة السر", + "port": "رقم المنفذ", + "username": "اسم المستخدم" + }, "showVerbose": "اظهر خرج مطوّل خلال", + "sketch": { + "inoBlueprint": "المسار المطلق للمخطط الاصلي الخاص ب ino. , اذا تم تحديده , محتويات المخطط ستستخدم في كل مشروع جديد يتم انشاؤه من قبل IDE . سيتم انشاء المشروع باستخدام المخططات الاصلية للاردوينو اذا لم يتم تحديده . يتم تجاهل المخططات التي يتعذر الوصول اليها . **يجب اعادة تشغيل IDE ** من اجل ان ياخذ هذا الاعداد مفعوله" + }, "sketchbook.location": "موقع ملف المشاريع", "sketchbook.showAllFiles": "True لعرض كل مجلدات مشاريع داخل المشروع . False افتراضيا", - "survey.notification": "True if users should be notified if a survey is available. True by default.", "unofficialBoardSupport": "انقر لعرض قائمة عناوين URL للوحات المدعومة بشكل غير رسمي", "upload": "الرفع", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", "upload.verbose": "True لخرج الرفع المطول . False افتراضيا", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "التحقق من الكود بعد الرفع", "window.autoScale": "True اذا كان مقياس الواجهة يتزامن تلقائيا مع حجم الخط ", - "window.zoomLevel": "تعديل درجة التكبير للنافذة . الحجم الاصلي 0 و كل زيادة فوقه (مثلا 1) او اقل (مثلا -1) تمثل تكبير بدرجة 20% اكبر او اصغر . تستطيع ايضا ادخال فواصل لتعديل درجة التكبير بدقة اكبر" + "window.zoomLevel": { + "deprecationMessage": "متقاعد. استخدم 'window.zoomLevel' بدلا من ذلك" + } + }, + "renameCloudSketch": { + "renameSketchTitle": "اسم جديد للمشروع السحابي" }, "replaceMsg": "هل تريد استبدال النسخة الحالية من {0} ؟", "selectZip": "اختر ملف .zip يحوي المكتبة التي تريد اضافتها", "serial": { "autoscroll": "تمرير تلقائي", "carriageReturn": "اعادة الحمل", - "message": "الرسالة ({0} + ادخل لارسال رسالة الى '{1}' على '{2}')", + "connecting": "جار الاتصال ب '{0}' من خلال '{1}'", + "message": "الرسالة (ادخل لارسال الرسالة الى '{0}' من خلال '{1}')", "newLine": "سطر جديد", "newLineCarriageReturn": " NL & CR معاً", "noLineEndings": "نهاية السطر غير موجودة", "notConnected": "غير متصل . اختر لوحة و منفذ للاتصال تلقائيا", - "openSerialPlotter": "Serial Plotter", + "openSerialPlotter": "راسم اشارة المنفذ التسلسلي", "timestamp": "الطابع الزمني", "toggleTimestamp": "تبديل الطابع الزمني" }, "sketch": { "archiveSketch": "ارشفة الشيفرة البرمجية", "cantOpen": "المجلد المسمى \"{0}\" موجود مسبقا. لا يمكن فتح الشيفرة البرمجية", - "close": "هل انت متاكد بانك تريد اغلاق المشروع ؟", - "compile": "Compiling sketch...", + "compile": "جار ترجمة المشروع ...", "configureAndUpload": "تهيئة و رفع", "createdArchive": "تم انشاء ارشيف '{0}'", "doneCompiling": "تمت الترجمة بنجاح.", "doneUploading": "تم الرفع بنجاح.", + "editInvalidSketchFolderLocationQuestion": "هل تريد حفظ المشروع في مكان اخر ؟", + "editInvalidSketchFolderQuestion": "هل تريد حفظ المشروع باسم مختلف؟", "exportBinary": "تصدير الملف الثنائي المترجم", + "invalidCloudSketchName": "يجب ان بيدا الاسم بحرف , رقم , او شرطة سفلية _ , و يلحق به حرف , رقم , شرطة - , شرطة سفلية _ و نقطة . اكبر طول ممكن هو 36 محرف", + "invalidSketchFolderLocationDetails": "لا يمكنك حفظ المشروع داخل ملف موجود ضمن ملفات المشروع اصلا", + "invalidSketchFolderLocationMessage": "موقع ملف المشروع '{0}' غير صالح", + "invalidSketchFolderNameMessage": "اسم مجلد المشروع '{0}' غير صالح ", + "invalidSketchName": "يجب ان بيدا الاسم بحرف , رقم , او شرطة سفلية _ , و يلحق به حرف , رقم , شرطة - , شرطة سفلية _ و نقطة . اكبر طول ممكن هو 63 محرف", "moving": "يتم النقل", "movingMsg": "الملف \"{0}\" يجب ان يكون داخل مجلد مشروع مسمى \"{1}\"\nهل انشئ المجلد , ثم انقل الملف و اكمل ؟", - "new": "جديد", + "new": "مشروع جديد", + "noTrailingPeriod": "لا يمكن ان ينتهي اسم الملف بنقطة", "openFolder": "فتح المجلد", "openRecent": "فُتِحَ مؤخرا ", "openSketchInNewWindow": "فتح المشروع في نافذة جديدة", + "reservedFilename": "'{0}' هو اسم ملف محجوز مسبقا", "saveFolderAs": "احفظ مجلد المشروع باسم", "saveSketch": "احفظ ملف المشروع لفتحه مرة اخرى لاحقا", "saveSketchAs": "حفظ ملف المشروع باسم ...", "showFolder": "اعرض ملف المشروع", "sketch": "مشروع", + "sketchAlreadyContainsThisFileError": "السكيتش يحتوي بالفعل على ملف باسم{0}", + "sketchAlreadyContainsThisFileMessage": "فشل في حفظ السكيتش {0} كـ {1} {2}", "sketchbook": "مجلد المشاريع", "titleLocalSketchbook": "مجلد المشاريع المحلي", "titleSketchbook": "مجلد المشاريع", "upload": "رفع", "uploadUsingProgrammer": "الرفع باستخدام مبرمجة", - "uploading": "Uploading...", + "uploading": "جار التحديث ....", "userFieldsNotFoundError": "تعذر ايجاد حقول المستخدم للوحة المتصلة", "verify": "تحقق", "verifyOrCompile": "تحقق/ترجم" }, - "survey": { - "answerSurvey": "الاجابة على الاستبيان", - "dismissSurvey": "لا تظهر مرة اخرى", - "surveyMessage": "يرجى ان تساعدنا لنحسن ادائنا من خلال الاجابة على هذا الاستبيان القصير جدا . نحن نحترم المجتمع الخاص بنا و نريد ان نتعرف بشكل افضل على داعمينا " + "sketchbook": { + "newCloudSketch": "مشروع سحابي جديد", + "newSketch": "مشروع جديد" + }, + "theme": { + "currentThemeNotFound": "تعذر الحصول على السمة التي تم اختيارها : {0} . Arduino IDE اختار سمات موجودة مسبقا و متوافقة مع السمة الغير متوفرة", + "dark": "غامق", + "deprecated": "{0} (متقاعد)", + "hc": "غامق ذو تباين عالٍ", + "hcLight": "فاتح ذو تباين عال", + "light": "فاتح", + "user": "{0} (المستخدم)" + }, + "title": { + "cloud": "السحابة" + }, + "updateIndexes": { + "updateIndexes": "تحديث الفهارس", + "updateLibraryIndex": "تحديث فهرس المكتبات", + "updatePackageIndex": "تحديث فهرس الحزم" }, "upload": { "error": "خطا {0} : {1}" }, "userFields": { "cancel": "الغاء", - "enterField": "Enter {0}", + "enterField": "ادخل {0}", "upload": "رفع" + }, + "validateSketch": { + "abortFixMessage": "المشروع ما يزال غير صالح . هل تريد اصلاح المشاكل المتبقية ؟ من خلال ضغط '{0}' , سيتم فتح مشروع جديد", + "abortFixTitle": "مشروع غير صالح", + "renameSketchFileMessage": "لا يمكن استخدام ملف المشروع '{0}' . {1} هل تريد اعادة تسمية المشروع الان ؟", + "renameSketchFileTitle": "اسم المشروع غير صالح", + "renameSketchFolderMessage": "لا يمكن استخدام المشروع '{0}' , {1} قم باعادة تسمية المشروع للتخلص من هذه الرسالة . هل تريد اعادة تسمية المشروع الان؟", + "renameSketchFolderTitle": "اسم المشروع غير صالح" + }, + "versionWelcome": { + "cancelButton": "Maybe later", + "donateButton": "Donate now", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Welcome to a new version of the Arduino IDE!", + "titleWithVersion": "Welcome to the new Arduino IDE {0}!" + }, + "workspace": { + "alreadyExists": "'{0}' موجود مسبقا" } }, - "cloud": { - "GoToCloud": "الانتقال الى السحابة" - }, "theia": { "core": { "cannotConnectBackend": "تعذر الاتصال بالخلفية", @@ -400,13 +541,9 @@ "couldNotSave": "تعذر حفظ المشروع . الرجاء نسخ عملك الغير محفوظ الى محرر النصوص المفضل لديك و اعادة تشغيل Arduino IDE", "daemonOffline": "CLI Daemon غير متصل", "offline": "غير متصل", + "offlineText": "غير متصل", "quitTitle": "هل انت متاكد بانك تريد الخروج؟" }, - "debug": { - "start": "البدء...", - "startError": "لقد حصل خطأ اثناء بدأ جلسة التصحيح . تحقق من السجلات للمزيد من المعلومات", - "typeNotSupported": "جلسة التصحيح من نوع \"{0}\" غير مدعومة" - }, "editor": { "unsavedTitle": "غير محفوظ – {0}" }, @@ -415,10 +552,10 @@ "expand": "توسيع" }, "workspace": { - "deleteCurrentSketch": "هل تريد حذف المشروع الحالي؟", + "deleteCloudSketch": "سيتم حذف المشروع السحابي '{0}' بشكل دائم من سيرفرات اردوينو و المخازن المحلية . هذا الاجراء لا يمكن التراجع عنه . هل تريد حذف المشروع الحالي؟", + "deleteCurrentSketch": "سيتم حذف المشروع '{0}' بشكل دائم . هذا الاجراء لا يمكن التراجع عنه . هل تريد حذف المشروع الحالي؟", "fileNewName": "اسم الملف الجديد", "invalidExtension": "\".{0}\" امتداد غير صالح", - "invalidFilename": "اسم الملف خاطئ", "newFileName": "الاسم الجديد لملف" } } diff --git a/i18n/az.json b/i18n/az.json index 66c66f757..8eaa924b5 100644 --- a/i18n/az.json +++ b/i18n/az.json @@ -1,38 +1,51 @@ { "arduino": { "about": { - "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}{4} [{5}]\n\n{6}", + "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "Haqqında {0}" }, + "account": { + "goToCloudEditor": "Go to Cloud Editor", + "goToIoTCloud": "Go to IoT Cloud", + "goToProfile": "Go to Profile", + "menuTitle": "Arduino Cloud" + }, "board": { "board": "Board{0}", "boardConfigDialogTitle": "Select Other Board and Port", + "boardDataReloaded": "Board data reloaded.", "boardInfo": "Board Info", + "boards": "boards", "configDialog1": "Select both a Board and a Port if you want to upload a sketch.", "configDialog2": "If you only select a Board you will be able to compile, but not to upload your sketch.", "couldNotFindPreviouslySelected": "Could not find previously selected board '{0}' in installed platform '{1}'. Please manually reselect the board you want to use. Do you want to reselect it now?", - "disconnected": "Disconnected", + "editBoardsConfig": "Edit Board and Port...", "getBoardInfo": "Get Board Info", "inSketchbook": " (in Sketchbook)", "installNow": "The \"{0} {1}\" core has to be installed for the currently selected \"{2}\" board. Do you want to install it now?", - "noFQBN": "The FQBN is not available for the selected board \"{0}\". Do you have the corresponding core installed?", + "noBoardsFound": "No boards found for \"{0}\"", + "noNativeSerialPort": "Native serial port, can't obtain info.", "noPortsDiscovered": "No ports discovered", - "noPortsSelected": "No ports selected for board: '{0}'.", - "noneSelected": "No boards selected.", + "nonSerialPort": "Non-serial port, can't obtain info.", "openBoardsConfig": "Select other board and port…", - "platformMissing": "The platform for the selected '{0}' board is not installed.", "pleasePickBoard": "Please pick a board connected to the port you have selected.", "port": "Port{0}", - "portLabel": "Port: {0}", + "ports": "ports", "programmer": "Proqramlayıcı", + "reloadBoardData": "Reload Board Data", "reselectLater": "Daha Sonra Yenidən Seç", + "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "Search board", "selectBoard": "Select Board", - "selectBoardForInfo": "Please select a board to obtain board info.", + "selectBoardToReload": "Please select a board first.", "selectPortForInfo": "Please select a port to obtain board info.", "showAllAvailablePorts": "Shows all available ports when enabled", + "showAllPorts": "Show all ports", "succesfullyInstalledPlatform": "Successfully installed platform {0}:{1}", - "succesfullyUninstalledPlatform": "Uğurla Silindi\nPlatforma 1{0}:2{1}" + "succesfullyUninstalledPlatform": "Uğurla Silindi Platforma {0}:{1}", + "typeOfPorts": "{0} ports", + "unconfirmedBoard": "Unconfirmed board", + "unknownBoard": "Unknown board" }, "boardsManager": "Boards Manager", "boardsType": { @@ -77,14 +90,15 @@ "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" }, "cloud": { - "account": "Account", "chooseSketchVisibility": "Choose visibility of your Sketch:", + "cloudSketchbook": "Cloud Sketchbook", "connected": "Əlaqə Yaradıldı", "continue": "Davam Et", - "donePulling": "Done pulling ‘{0}’.", - "donePushing": "Done pushing ‘{0}’.", + "donePulling": "Done pulling '{0}'.", + "donePushing": "Done pushing '{0}'.", "embed": "Embed:", "emptySketchbook": "Your Sketchbook is empty", + "goToCloud": "Go to Cloud", "learnMore": "Learn more", "link": "Link:", "notYetPulled": "Cannot push to Cloud. It is not yet pulled.", @@ -102,10 +116,9 @@ "pushSketch": "Push Sketch", "pushSketchMsg": "This is a Public Sketch. Before pushing, make sure any sensitive information is defined in arduino_secrets.h files. You can make a Sketch private from the Share panel.", "remote": "Remote", - "remoteSketchbook": "Remote Sketchbook", "share": "Share...", "shareSketch": "Share Sketch", - "showHideRemoveSketchbook": "Show/Hide Remote Sketchbook", + "showHideSketchbook": "Show/Hide Cloud Sketchbook", "signIn": "Giriş Edin", "signInToCloud": "Ardunio Cloud'a Giriş Edin", "signOut": "Çıxış Edin", @@ -113,12 +126,23 @@ "syncEditSketches": "Sync and edit your Arduino Cloud Sketches", "visitArduinoCloud": "Visit Arduino Cloud to create Cloud Sketches." }, + "cloudSketch": { + "alreadyExists": "Cloud sketch '{0}' already exists.", + "creating": "Creating cloud sketch '{0}'...", + "new": "New Cloud Sketch", + "notFound": "Could not pull the cloud sketch '{0}'. It does not exist.", + "pulling": "Synchronizing sketchbook, pulling '{0}'...", + "pushing": "Synchronizing sketchbook, pushing '{0}'...", + "renaming": "Renaming cloud sketch from '{0}' to '{1}'...", + "synchronizingSketchbook": "Synchronizing sketchbook..." + }, "common": { "all": "All", "contributed": "Contributed", "installManually": "Əl ilə yüklə", "later": "Later", "noBoardSelected": "No board selected", + "noSketchOpened": "No sketch opened", "notConnected": "[not connected]", "offlineIndicator": "You appear to be offline. Without an Internet connection, the Arduino CLI might not be able to download the required resources and could cause malfunction. Please connect to the Internet and restart the application.", "oldFormat": "The '{0}' still uses the old `.pde` format. Do you want to switch to the new `.ino` extension?", @@ -126,11 +150,13 @@ "processing": "Processing", "recommended": "Recommended", "retired": "Retired", + "selectManually": "Select Manually", "selectedOn": "on {0}", "serialMonitor": "Serial Monitor", "type": "Type", "unknown": "Bilnməyən", - "updateable": "Updatable" + "updateable": "Updatable", + "userAbort": "User abort" }, "compile": { "error": "Compilation error: {0}" @@ -138,22 +164,49 @@ "component": { "boardsIncluded": "Boards included in this package:", "by": "by", + "clickToOpen": "Click to open in browser: {0}", "filterSearch": "Filter your search...", - "install": "INSTALL", + "install": "Yüklə", + "installLatest": "Install Latest", + "installVersion": "Install {0}", + "installed": "{0} installed", "moreInfo": "More info", + "otherVersions": "Other Versions", + "remove": "Sil", + "title": "{0} by {1}", "uninstall": "Sil", "uninstallMsg": "Do you want to uninstall {0}?", - "version": "Version {0}" + "update": "Update" + }, + "configuration": { + "cli": { + "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" + } + }, + "connectionStatus": { + "connectionLost": "Connection lost. Cloud sketch actions and updates won't be available." }, "contributions": { "addFile": "Fayl Əlavə Et", "fileAdded": "One file added to the sketch.", + "plotter": { + "couldNotOpen": "Couldn't open serial plotter" + }, "replaceTitle": "Yükləmə Uğursuz.Yenidən Sınayın" }, + "core": { + "compilerWarnings": { + "all": "All", + "default": "Default", + "more": "More", + "none": "None" + } + }, "coreContribution": { "copyError": "Copy error messages", "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." }, + "createCloudCopy": "Push Sketch to Cloud", "daemon": { "restart": "Restart Daemon", "start": "Start Daemon", @@ -162,8 +215,15 @@ "debug": { "debugWithMessage": "Debug - {0}", "debuggingNotSupported": "Debugging is not supported by '{0}'", + "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "Platform is not installed for '{0}'", - "optimizeForDebugging": "Optimize for Debugging" + "optimizeForDebugging": "Optimize for Debugging", + "sketchIsNotCompiled": "Sketch '{0}' must be verified before starting a debug session. Please verify the sketch and start debugging again. Do you want to verify the sketch now?" + }, + "developer": { + "clearBoardList": "Clear the Board List History", + "clearBoardsConfig": "Clear the Board and Port Selection", + "dumpBoardList": "Dump the Board List" }, "dialog": { "dontAskAgain": "Yenidən Soruşma" @@ -180,10 +240,6 @@ "previousError": "Previous Error", "revealError": "Reveal Error" }, - "electron": { - "couldNotSave": "Could not save the sketch. Please copy your unsaved work into your favorite text editor, and restart the IDE.", - "unsavedChanges": "Yadda Saxlanılmamış Dəyişikliklər Yadda Saxlanılmayacaq" - }, "examples": { "builtInExamples": "Əvvəlcəcədən Yüklənmmiş Nümunələr", "couldNotInitializeExamples": "Could not initialize built-in examples.", @@ -201,7 +257,7 @@ "selectBoard": "Select Board", "selectVersion": "Select firmware version", "successfullyInstalled": "Firmware successfully installed.", - "updater": "WiFi101 / WiFiNINA Firmware Updater" + "updater": "Firmware Updater" }, "help": { "environment": "Environment", @@ -219,6 +275,9 @@ "checkForUpdates": "Check for Arduino IDE Updates", "closeAndInstallButton": "Bağla Və Yüklə", "closeToInstallNotice": "Close the software and install the update on your machine.", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", "downloadButton": "Download", "downloadingNotice": "Downloading the latest version of the Arduino IDE.", "errorCheckingForUpdates": "Error while checking for Arduino IDE updates.\n{0}", @@ -232,16 +291,20 @@ "updateAvailable": "Update Available", "versionDownloaded": "Arduino IDE {0} has been downloaded." }, + "installable": { + "libraryInstallFailed": "Failed to install library: '{0}{1}'.", + "platformInstallFailed": "Failed to install platform: '{0}{1}'." + }, "library": { "addZip": ".ZİP Kitabxana Daxil Edin", "arduinoLibraries": "Ardunio Kitabxanalar", "contributedLibraries": "Contributed libraries", - "dependenciesForLibrary": "Dependencies for library {0}:{1}", "include": "Kitabxana Daxil Edin", - "installAll": "Hamısını Yüklə", + "installAll": "Install All", + "installLibraryDependencies": "Install library dependencies", "installMissingDependencies": "Would you like to install all the missing dependencies?", "installOneMissingDependency": "Would you like to install the missing dependency?", - "installOnly": "Install {0} only", + "installWithoutDependencies": "Install without dependencies", "installedSuccessfully": "Kitabxana Uğurla Yükləndi {0}:{1}", "libraryAlreadyExists": "A library already exists. Do you want to overwrite it?", "manageLibraries": "Kitabxanaları İdarə Et", @@ -278,9 +341,23 @@ "tools": "Tools" }, "monitor": { + "alreadyConnectedError": "Could not connect to {0} {1} port. Already connected.", + "baudRate": "{0} baud", + "connectionFailedError": "Could not connect to {0} {1} port.", + "connectionFailedErrorWithDetails": "{0} Could not connect to {1} {2} port.", + "connectionTimeout": "Timeout. The IDE has not received the 'success' message from the monitor after successfully connecting to it", + "missingConfigurationError": "Could not connect to {0} {1} port. The monitor configuration is missing.", + "notConnectedError": "Not connected to {0} {1} port.", "unableToCloseWebSocket": "Unable to close websocket", "unableToConnectToWebSocket": "Unable to connect to websocket" }, + "newCloudSketch": { + "newSketchTitle": "Name of the new Cloud Sketch" + }, + "portProtocol": { + "network": "Network", + "serial": "Serial" + }, "preferences": { "additionalManagerURLs": "Additional Boards Manager URLs", "auth.audience": "The OAuth2 audience.", @@ -297,6 +374,7 @@ "cloud.pull.warn": "True if users should be warned before pulling a cloud sketch. Defaults to true.", "cloud.push.warn": "True if users should be warned before pushing a cloud sketch. Defaults to true.", "cloud.pushpublic.warn": "True if users should be warned before pushing a public sketch to the cloud. Defaults to true.", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", "cloud.sketchSyncEndpoint": "The endpoint used to push and pull sketches from a backend. By default it points to Arduino Cloud API.", "compile": "compile", "compile.experimental": "True if the IDE should handle multiple compiler errors. False by default", @@ -314,29 +392,50 @@ "invalid.editorFontSize": "Invalid editor font size. It must be a positive integer.", "invalid.sketchbook.location": "Invalid sketchbook location: {0}", "invalid.theme": "Invalid theme.", + "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", "language.log": "True if the Arduino Language Server should generate log files into the sketch folder. Otherwise, false. It's false by default.", "language.realTimeDiagnostics": "If true, the language server provides real-time diagnostics when typing in the editor. It's false by default.", "manualProxy": "Manual proxy configuration", + "monitor": { + "dockPanel": "The area of the application shell where the _{0}_ widget will reside. It is either \"bottom\" or \"right\". It defaults to \"{1}\"." + }, "network": "Network", "newSketchbookLocation": "Select new sketchbook location", + "noCliConfig": "Could not load the CLI configuration", "noProxy": "No proxy", + "proxySettings": { + "hostname": "Host name", + "password": "Password", + "port": "Port number", + "username": "Username" + }, "showVerbose": "Show verbose output during", + "sketch": { + "inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect." + }, "sketchbook.location": "Sketchbook location", "sketchbook.showAllFiles": "True to show all sketch files inside the sketch. It is false by default.", - "survey.notification": "True if users should be notified if a survey is available. True by default.", "unofficialBoardSupport": "Click for a list of unofficial board support URLs", "upload": "upload", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", "upload.verbose": "True for verbose upload output. False by default.", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "Verify code after upload", "window.autoScale": "True if the user interface automatically scales with the font size.", - "window.zoomLevel": "Adjust the zoom level of the window. The original size is 0 and each increment above (e.g. 1) or below (e.g. -1) represents zooming 20% larger or smaller. You can also enter decimals to adjust the zoom level with a finer granularity." + "window.zoomLevel": { + "deprecationMessage": "Deprecated. Use 'window.zoomLevel' instead." + } + }, + "renameCloudSketch": { + "renameSketchTitle": "New name of the Cloud Sketch" }, "replaceMsg": "Replace the existing version of {0}?", "selectZip": "Select a zip file containing the library you'd like to add", "serial": { "autoscroll": "Autoscroll", "carriageReturn": "Carriage Return", - "message": "Message ({0} + Enter to send message to '{1}' on '{2}')", + "connecting": "Connecting to '{0}' on '{1}'...", + "message": "Message (Enter to send message to '{0}' on '{1}')", "newLine": "New Line", "newLineCarriageReturn": "Both NL & CR", "noLineEndings": "No Line Ending", @@ -348,24 +447,34 @@ "sketch": { "archiveSketch": "Archive Sketch", "cantOpen": "A folder named \"{0}\" already exists. Can't open sketch.", - "close": "Are you sure you want to close the sketch?", "compile": "Compiling sketch...", - "configureAndUpload": "Configure And Upload", + "configureAndUpload": "Configure and Upload", "createdArchive": "Created archive '{0}'.", "doneCompiling": "Done compiling.", "doneUploading": "Done uploading.", + "editInvalidSketchFolderLocationQuestion": "Do you want to try saving the sketch to a different location?", + "editInvalidSketchFolderQuestion": "Do you want to try saving the sketch with a different name?", "exportBinary": "Export Compiled Binary", + "invalidCloudSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", + "invalidSketchFolderLocationDetails": "You cannot save a sketch into a folder inside itself.", + "invalidSketchFolderLocationMessage": "Invalid sketch folder location: '{0}'", + "invalidSketchFolderNameMessage": "Invalid sketch folder name: '{0}'", + "invalidSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", "moving": "Moving", "movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?", - "new": "New", + "new": "New Sketch", + "noTrailingPeriod": "A filename cannot end with a dot", "openFolder": "Open Folder", "openRecent": "Open Recent", "openSketchInNewWindow": "Open Sketch in New Window", + "reservedFilename": "'{0}' is a reserved filename.", "saveFolderAs": "Save sketch folder as...", "saveSketch": "Save your sketch to open it again later.", "saveSketchAs": "Save sketch folder as...", "showFolder": "Show Sketch Folder", "sketch": "Sketch", + "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", + "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", "sketchbook": "Sketchbook", "titleLocalSketchbook": "Local Sketchbook", "titleSketchbook": "Sketchbook", @@ -376,10 +485,26 @@ "verify": "Verify", "verifyOrCompile": "Verify/Compile" }, - "survey": { - "answerSurvey": "Answer survey", - "dismissSurvey": "Don't show again", - "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." + "sketchbook": { + "newCloudSketch": "New Cloud Sketch", + "newSketch": "New Sketch" + }, + "theme": { + "currentThemeNotFound": "Could not find the currently selected theme: {0}. Arduino IDE has picked a built-in theme compatible with the missing one.", + "dark": "Dark", + "deprecated": "{0} (deprecated)", + "hc": "Dark High Contrast", + "hcLight": "Light High Contrast", + "light": "Light", + "user": "{0} (user)" + }, + "title": { + "cloud": "Cloud" + }, + "updateIndexes": { + "updateIndexes": "Update Indexes", + "updateLibraryIndex": "Update Library Index", + "updatePackageIndex": "Update Package Index" }, "upload": { "error": "{0} error: {1}" @@ -388,11 +513,27 @@ "cancel": "Cancel", "enterField": "Enter {0}", "upload": "Upload" + }, + "validateSketch": { + "abortFixMessage": "The sketch is still invalid. Do you want to fix the remaining problems? By clicking '{0}', a new sketch will open.", + "abortFixTitle": "Invalid sketch", + "renameSketchFileMessage": "The sketch file '{0}' cannot be used. {1} Do you want to rename the sketch file now?", + "renameSketchFileTitle": "Invalid sketch filename", + "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", + "renameSketchFolderTitle": "Invalid sketch name" + }, + "versionWelcome": { + "cancelButton": "Maybe later", + "donateButton": "Donate now", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Welcome to a new version of the Arduino IDE!", + "titleWithVersion": "Welcome to the new Arduino IDE {0}!" + }, + "workspace": { + "alreadyExists": "'{0}' already exists." } }, - "cloud": { - "GoToCloud": "GO TO CLOUD" - }, "theia": { "core": { "cannotConnectBackend": "Cannot connect to the backend.", @@ -400,13 +541,9 @@ "couldNotSave": "Could not save the sketch. Please copy your unsaved work into your favorite text editor, and restart the IDE.", "daemonOffline": "CLI Daemon Offline", "offline": "Offlayn", + "offlineText": "Offlayn", "quitTitle": "Are you sure you want to quit?" }, - "debug": { - "start": "Başlat", - "startError": "There was an error starting the debug session, check the logs for more details.", - "typeNotSupported": "The debug session type \"{0}\" is not supported." - }, "editor": { "unsavedTitle": "Unsaved – {0}" }, @@ -415,10 +552,10 @@ "expand": "Genişləndir" }, "workspace": { - "deleteCurrentSketch": "Do you want to delete the current sketch?", + "deleteCloudSketch": "The cloud sketch '{0}' will be permanently deleted from the Arduino servers and the local caches. This action is irreversible. Do you want to delete the current sketch?", + "deleteCurrentSketch": "The sketch '{0}' will be permanently deleted. This action is irreversible. Do you want to delete the current sketch?", "fileNewName": "Name for new file", "invalidExtension": ".{0} is not a valid extension", - "invalidFilename": "Invalid filename.", "newFileName": "New name for file" } } diff --git a/i18n/be.json b/i18n/be.json new file mode 100644 index 000000000..6b753341b --- /dev/null +++ b/i18n/be.json @@ -0,0 +1,562 @@ +{ + "arduino": { + "about": { + "detail": "Версія: {0}\nДата: {1}{2}\nВерсія CLI: {3}\n\n{4}", + "label": "Пра {0}" + }, + "account": { + "goToCloudEditor": "Перайсці ў сродак праўкі воблака", + "goToIoTCloud": "Перайсці ў воблака IoT", + "goToProfile": "Перайсці ў профіль", + "menuTitle": "Воблака Arduino" + }, + "board": { + "board": "Плата{0}", + "boardConfigDialogTitle": "Абярыце іншую плату і порт", + "boardDataReloaded": "Дадзеныя на плату былі загружаныя нанова.", + "boardInfo": "Інфармацыя пра плату", + "boards": "платы", + "configDialog1": "Абярыце як плату, так і порт, калі вы жадаеце загрузіць сцэнар.", + "configDialog2": "Калі вы выбіраеце толькі плату, вы зможаце кампіліраваць, але не загружаць сцэнар.", + "couldNotFindPreviouslySelected": "Не атрымалася знайсці раней абраную плату '{0}' на ўсталяванай платформе '{1}'.\nКалі ласка, абярыце ўручную плату, якую вы жадаеце ўжываць.\nЦі жадаеце вы паўторна абраць яе зараз?", + "editBoardsConfig": "Змяніць плату і порт…", + "getBoardInfo": "Атрымаць інфармацыю пра плату", + "inSketchbook": " (у альбоме з сцэнарамі)", + "installNow": "Ядро \"{0} {1}\" павінна быць усталяванае для абранай у бягучы час платы \"{2}\".\nЦі жадаеце вы ўсталяваць яе зараз?", + "noBoardsFound": "Не знойдзена плат для \"{0}\"", + "noNativeSerialPort": "Уласны паслядоўны порт, не атрымалася атрымаць інфармацыю.", + "noPortsDiscovered": "Парты не выяўленыя", + "nonSerialPort": "Уласны паслядоўны порт, не атрымалася атрымаць інфармацыю.", + "openBoardsConfig": "Абярыце іншую плату і порт…", + "pleasePickBoard": "Калі ласка, абярыце плату, якая злучаная з абраным вамі портам.", + "port": "Порт{0}", + "ports": "порты", + "programmer": "Сродак праграмавання", + "reloadBoardData": "Загрузіць дадзеныя на плату нанова", + "reselectLater": "Абярыце паўторна пазней", + "revertBoardsConfig": "Ужыта '{0}' выяўлена ў '{1}'", + "searchBoard": "Знайсці плату", + "selectBoard": "Знайсці плату", + "selectBoardToReload": "Калі ласка, спачатку абярыце плату.", + "selectPortForInfo": "Калі ласка, абярыце порт, каб атрымаць інфармацыю пра плату.", + "showAllAvailablePorts": "Паказвае ўсе даступныя порты, калі яны ўключаныя", + "showAllPorts": "Паказаць усе порты", + "succesfullyInstalledPlatform": "Платформа {0}:{1} паспяхова ўсталяваная", + "succesfullyUninstalledPlatform": "Платформа {0}:{1} паспяхова выдаленая", + "typeOfPorts": "{0} порты", + "unconfirmedBoard": "Непацвержданная плата", + "unknownBoard": "Невядомая плата" + }, + "boardsManager": "Кіраванне платамі", + "boardsType": { + "arduinoCertified": "Сертыфікаваны Arduino" + }, + "bootloader": { + "burnBootloader": "Прашыць загрузнік", + "burningBootloader": "Прашыўка загрузніка…", + "doneBurningBootloader": "Прашыўка загрузніка скончаная." + }, + "burnBootloader": { + "error": "Памылка пры запісу загрузніка: {0}" + }, + "certificate": { + "addNew": "Дадаць новы", + "addURL": "Дадаць адрас URL для атрымання сертыфіката SSL", + "boardAtPort": "{0} у {1}", + "certificatesUploaded": "Сертыфікаты загружаныя.", + "enterURL": "Увядзіце адрас URL", + "noSupportedBoardConnected": "Плата, якая падтрымліваецца, не падключаная", + "openContext": "Адчыніць кантэкст", + "remove": "Выдаліць", + "selectBoard": "Абраць плату…", + "selectCertificateToUpload": "1. Абярыце сертыфікат для выгрузкі", + "selectDestinationBoardToUpload": "2. Абярыце мэтавую плату, і выгрузіце сертыфікат", + "upload": "Выгрузіць", + "uploadFailed": "Не атрымалася выгрузіць.\nКалі ласка, паспрабуйце зноў.", + "uploadRootCertificates": "Выгрузіць каранёвые сертыфікаты SSL", + "uploadingCertificates": "Выгрузка сертыфікатаў." + }, + "checkForUpdates": { + "checkForUpdates": "Праверыць наяўнасць абнаўленняў Arduino", + "installAll": "Усталяваць усе", + "noUpdates": "Апошнія абнаўленні недаступныя.", + "promptUpdateBoards": "Даступныя абнаўленні для некаторых вашых плат.", + "promptUpdateLibraries": "Даступныя абнаўленні для некаторых вашых бібліятэк.", + "updatingBoards": "Абнаўленне плат…", + "updatingLibraries": "Абнаўленне бібліятэк…" + }, + "cli-error-parser": { + "keyboardError": "'Keyboard' не знойдзеная.\nЦі прысутнічае ў вашым сцэнары радок '#include <Keyboard.h>'?", + "mouseError": "'Mouse' Не знойдзеная.\nЦі прысутнічае ў вашым сцэнары радок '#include <Mouse.h>'?" + }, + "cloud": { + "chooseSketchVisibility": "Абярыце бачнасць вашага сцэнару:", + "cloudSketchbook": "Альбом з сцэнарамі ў воблаке", + "connected": "Злучана", + "continue": "Працягнуць", + "donePulling": "Скончана выцягванне '{0}'.", + "donePushing": "Скончана адпраўка '{0}'.", + "embed": "Убудаваны:", + "emptySketchbook": "Ваш альбом з сцэнарамі пусты", + "goToCloud": "Перайсці ў воблака", + "learnMore": "Вывучыць больш", + "link": "Спасылак:", + "notYetPulled": "Не атрымалася паслаць у воблака.\nСцэнар яшчэ не выцягнуты.", + "offline": "Не ў сетцы", + "openInCloudEditor": "Адчыніць у сродку праўкі воблака", + "options": "Налады…", + "privateVisibility": "Асабісты.\nТолькі вы можаце глядзець сцэнар.", + "profilePicture": "Выява профілю", + "publicVisibility": "Грамадскі.\nЛюбы, хто мае спасылак, можа глядзець сцэнар.", + "pull": "Выцягнуць", + "pullFirst": "Спачатку вы павінны выцягнуць, каб мець магчымасць перайсці да воблака.", + "pullSketch": "Выцягнуць сцэнар", + "pullSketchMsg": "Пры выцягванні гэтага сцэнару з воблаку, будзе перазапісаная яго лакальная версія.\nЦі жадаеце працягнуць?", + "push": "Адправіць", + "pushSketch": "Адправіць сцэнар", + "pushSketchMsg": "Гэта грамадскі сцэнар.\nПерад адпраўкай пераканайцеся, што ў файлах arduino_secrets.h паказана любая канфідэнцыйная інфармацыя.\nВы можаце зрабіць сцэнар прыватным з панэлі агульнага доступу.", + "remote": "Падалены", + "share": "Падзяліцца…", + "shareSketch": "Падзяліцца сцэнарам", + "showHideSketchbook": "Адлюстраваць/схаваць альбом з сцэнарамі ў воблаке", + "signIn": "Увайсці", + "signInToCloud": "Увайсці ў воблака Arduino", + "signOut": "Выйсці", + "sync": "Сінхранізаваць", + "syncEditSketches": "Сінхранізаваць і змяніць сцэнары ў воблаку Arduino", + "visitArduinoCloud": "Наведаць воблака Arduino, каб стварыць сцэнары ў воблаке." + }, + "cloudSketch": { + "alreadyExists": "Сцэнар '{0}' ў воблаке ўжо існуе.", + "creating": "Стварэнне сцэнара '{0}' ў воблаке…", + "new": "Новы сцэнар у воблаку", + "notFound": "Не атрымалася выцягнуць сцэнар '{0}' з воблака.\nСцэнар не існуе.", + "pulling": "Сінхранізацыя альбому, выцягванне '{0}'…", + "pushing": "Сінхранізацыя альбому, адпраўка '{0}'…", + "renaming": "Пераназваць сцэнар '{0}' у '{1}' у воблаке…", + "synchronizingSketchbook": "Сінхранізацыя альбому з сцэнарамі…" + }, + "common": { + "all": "Усе", + "contributed": "Уклад", + "installManually": "Усталяваць уручную", + "later": "Пазней", + "noBoardSelected": "плата не абраная", + "noSketchOpened": "Сцэнар не абраны", + "notConnected": "[не злучана]", + "offlineIndicator": "Падобна на тое, што вы знаходзіцеся не ў сетцы.\nБез злучэння з інтэрнэтам Arduino CLI можа не загружаць неабходныя рэсурсы і гэтае можа прывесці да збою ў працы.\nКалі ласка, злучыцеся з інтэрнэтам, і запусціце праграму нанова.", + "oldFormat": "'{0}' ужывае стары фармат `.pde`.\nЦі жадаеце вы перайсці на новае пашырэнне `.ino`?", + "partner": "Партнёр", + "processing": "Апрацоўка", + "recommended": "Рэкамендаваны", + "retired": "У адстаўцы", + "selectManually": "Абраць уручную", + "selectedOn": "уключана {0}", + "serialMonitor": "Манітор паслядоўнага порта", + "type": "Тып", + "unknown": "Невядома", + "updateable": "Абнаўляецца", + "userAbort": "Перапыненне карыстальнікам" + }, + "compile": { + "error": "Памылка кампіляцыі: {0}" + }, + "component": { + "boardsIncluded": "Платы, якія ўваходзяць у гэты пакет:", + "by": "ад", + "clickToOpen": "Пстрыкніце, каб адчыніць ў інтэрнэт-аглядальніку: {0}", + "filterSearch": "Фільтраваць пошук…", + "install": "Усталяваць", + "installLatest": "Усталяваць пазней", + "installVersion": "Усталяваць {0}", + "installed": "{0} усталяваны", + "moreInfo": "Дадатковая інфармацыя", + "otherVersions": "Іншыя версіі", + "remove": "Выдаліць", + "title": "{0} ад {1}", + "uninstall": "Выдаліць", + "uninstallMsg": "Ці сапраўды вы жадаеце выдаліць {0}?", + "update": "Абнавіць" + }, + "configuration": { + "cli": { + "inaccessibleDirectory": "Не атрымалася атрымаць доступ да размяшчэння альбому па адрасу '{0}': {1}" + } + }, + "connectionStatus": { + "connectionLost": "Злучэнне страчанае.\nДзеянні і абнаўленні сцэнараў воблаку будуць недаступныя." + }, + "contributions": { + "addFile": "Дадаць файл", + "fileAdded": "Адзін файл дададзены ў сцэнар.", + "plotter": { + "couldNotOpen": "Не атрымалася адчыніць паслядоўны плотэр" + }, + "replaceTitle": "Замяніць" + }, + "core": { + "compilerWarnings": { + "all": "Усе", + "default": "Першапачаткова", + "more": "Больш", + "none": "Ніхто" + } + }, + "coreContribution": { + "copyError": "Капіраваць паведамленні пра памылкі", + "noBoardSelected": "Плата не выбрана.\nКалі ласка, абярыце вашу плату Arduino у меню Інструменты > Плата." + }, + "createCloudCopy": "Перамясціць сцэнар у воблака", + "daemon": { + "restart": "Запусціць Daemon нанова", + "start": "Запусціць Daemon", + "stop": "Спыніць Daemon" + }, + "debug": { + "debugWithMessage": "Адладзіць - {0}", + "debuggingNotSupported": "Адладка не падтрымліваецца для '{0}'", + "getDebugInfo": "Атрыманне дадатковай інфармацыі…", + "noPlatformInstalledFor": "Платформа не ўсталяваная для '{0}'", + "optimizeForDebugging": "Аптымізаваць для адладкі", + "sketchIsNotCompiled": "Сцэнар '{0}' неабходна праверыць перад пачаткам сеансу адладкі.\nКалі ласка, праверце сцэнар, і пачніце адладку нанова.\nЦі жадаеце праверыць сцэнар зараз?" + }, + "developer": { + "clearBoardList": "Ачысціць гісторыю спісу плат", + "clearBoardsConfig": "Ачысціць плату і абраць порт", + "dumpBoardList": "Звалка спісу плат" + }, + "dialog": { + "dontAskAgain": "Болей не пытаць" + }, + "editor": { + "autoFormat": "Аўтаматычнае фарматаванне", + "commentUncomment": "Каментаваць/раскаментаваць", + "copyForForum": "Капіраваць для форуму (Markdown)", + "decreaseFontSize": "Паменшыць памер шрыфту", + "decreaseIndent": "Паменшыць водступ", + "increaseFontSize": "Павялічыць памер шрыфту", + "increaseIndent": "Павялічыць водступ", + "nextError": "Наступная памылка", + "previousError": "Папярэдняя памылка", + "revealError": "Выявіць памылку" + }, + "examples": { + "builtInExamples": "Убудаваныя прыклады", + "couldNotInitializeExamples": "Не атрымалася ініцыялізаваць убудаваныя прыклады.", + "customLibrary": "Прыклады з карыстальніцкіх бібліятэк", + "for": "Прыклады для {0}", + "forAny": "Прыклады для любой платы", + "menu": "Прыклады" + }, + "firmware": { + "checkUpdates": "Праверыць наяўнасць абнаўленняў", + "failedInstall": "Памылка ўсталявання.\nКалі ласка, паспрабуйце зноў.", + "install": "Усталяваць", + "installingFirmware": "Усталяванне прашыўкі.", + "overwriteSketch": "Усталяванне перазапіша сцэнар на плаце.", + "selectBoard": "Знайсці плату", + "selectVersion": "Абярыце версію прашыўкі", + "successfullyInstalled": "Прашыўка паспяхова ўсталяваная.", + "updater": "Сродак абнаўлення прашыўкі" + }, + "help": { + "environment": "Асяроддзе", + "faq": "Часта задаваныя пытанні", + "findInReference": "Знайсці ў даведніку", + "gettingStarted": "Прыступаючы да працы", + "keyword": "Увядзіце ключавае слова", + "privacyPolicy": "Палітыка прыватнасці", + "reference": "Даведнік", + "search": "Пошук на Arduino.cc", + "troubleshooting": "Дыягностыка", + "visit": "Перайсці на Arduino.cc" + }, + "ide-updater": { + "checkForUpdates": "Праверыць наяўнасць абнаўленняў Arduino IDE", + "closeAndInstallButton": "Зачыніць і ўсталяваць", + "closeToInstallNotice": "Зачыніце праграмнае забеспячэнне і ўсталюйце абнаўленне на свой кампутар.", + "donateLinkIconTitle": "адчыніць старонку ахвяраванняў", + "donateLinkText": "ахвяраваць, каб падтрымаць нас", + "donateText": "Адкрыты зыходны код - гэта любоў, {0}", + "downloadButton": "Спампаваць", + "downloadingNotice": "Пампуе апошнюю версію Arduino IDE.", + "errorCheckingForUpdates": "Памылка пры праверцы абнаўленняў Arduino IDE.\n{0}", + "goToDownloadButton": "Перайсці да спампоўкі", + "goToDownloadPage": "Даступна абнаўленне для Arduino IDE, але мы не можам загрузіць і ўсталяваць яго аўтаматычна.\nКалі ласка, перайдзіце на старонку спампоўкі і спампуйце адтуль апошнюю версію.", + "ideUpdaterDialog": "Абнаўленне праграмнага забеспячэння", + "newVersionAvailable": "Новая версія Arduino IDE ({0}) даступная для спампоўкі.", + "noUpdatesAvailable": "Апошнія абнаўленні для Arduino IDE недаступныя", + "notNowButton": "Не цяпер", + "skipVersionButton": "Прапусціць версію", + "updateAvailable": "Даступна абнаўленне", + "versionDownloaded": "Arduino IDE {0} быў спампаваны." + }, + "installable": { + "libraryInstallFailed": "Не атрымалася ўсталяваць бібліятэку: '{0}{1}'.", + "platformInstallFailed": "Не атрымалася ўсталяваць платформу: '{0}{1}'." + }, + "library": { + "addZip": "Дадаць бібліятэку .ZIP…", + "arduinoLibraries": "Бібліятэкі Arduino", + "contributedLibraries": "Прадстаўленыя бібліятэкі", + "include": "Уключыць бібліятэку", + "installAll": "Усталяваць усе", + "installLibraryDependencies": "Усталяваць залежнасці бібліятэк", + "installMissingDependencies": "Ці жадаеце вы ўсталяваць усе залежнасці, якія адсутнічаюць?", + "installOneMissingDependency": "Ці жадаеце вы ўсталяваць залежнасць, якая адсутнічае?", + "installWithoutDependencies": "Усталяваць без залежнасцяў", + "installedSuccessfully": "Бібліятэка {0}:{1} паспяхова ўсталяваная", + "libraryAlreadyExists": "Бібліятэка ўжо існуе.\nЦі жадаеце вы перазапісаць яе?", + "manageLibraries": "Кіраваць бібліятэкамі…", + "namedLibraryAlreadyExists": "Каталог бібліятэкі {0} ужо існуе.\nЦі жадаеце вы перазапісаць яе?", + "needsMultipleDependencies": "Бібліятэцы <b>{0}:{1}</b> патрэбныя некаторыя іншыя залежнасці, якія ў бягучы час не ўсталяваныя:", + "needsOneDependency": "Бібліятэцы <b>{0}:{1}</b> патрабуецца іншая залежнасць, якая ў бягучы час не ўсталяваная:", + "overwriteExistingLibrary": "Ці жадаеце вы перазапісаць існуючую бібліятэку?", + "successfullyInstalledZipLibrary": "Бібліятэка з архіва {0} паспяхова ўсталяваная", + "title": "Кіраванне бібліятэкай", + "uninstalledSuccessfully": "Бібліятэка {0}:{1} паспяхова выдаленая", + "zipLibrary": "Бібліятэка" + }, + "librarySearchProperty": { + "topic": "Тэма" + }, + "libraryTopic": { + "communication": "Зносіны", + "dataProcessing": "Апрацоўка дадзеных", + "dataStorage": "Сховішча дадзеных", + "deviceControl": "Кіраванне прыладай", + "display": "Дысплей", + "other": "Іншае", + "sensors": "Датчыкі", + "signalInputOutput": "Сігналы ўводу/вываду", + "timing": "Сінхранізацыя", + "uncategorized": "Без рубрыкі" + }, + "libraryType": { + "installed": "Усталяваная" + }, + "menu": { + "advanced": "Пашыраны", + "sketch": "Сцэнар", + "tools": "Інструменты" + }, + "monitor": { + "alreadyConnectedError": "Не атрымалася злучыцца з портам {0} {1}.\nУжо злучаны.", + "baudRate": "{0} бод", + "connectionFailedError": "Не атрымалася злучыцца з портам {0} {1}", + "connectionFailedErrorWithDetails": "{0} не атрымалася злучыцца з портам {1} {2}.", + "connectionTimeout": "Затрымка.\nIDE не атрымалася паведамленне 'success' ад манітора паслядоўнага злучэння", + "missingConfigurationError": "Не атрымалася злучыцца з портам {0} {1}.\nКанфігурацыя манітора адсутнічае.", + "notConnectedError": "Не злучаны з портам {0} {1}.", + "unableToCloseWebSocket": "Не атрымалася зачыніць вэб-сокет", + "unableToConnectToWebSocket": "Не атрымалася злучыцца з вэб-сокетам" + }, + "newCloudSketch": { + "newSketchTitle": "Назва новага сцэнара ў воблаку" + }, + "portProtocol": { + "network": "Сетка", + "serial": "Паслядоўны порт" + }, + "preferences": { + "additionalManagerURLs": "Адрасы URL кіраўніка дадатковых плат", + "auth.audience": "Аўдыторыя OAuth2.", + "auth.clientID": "Ідэнтыфікатар кліенту OAuth2.", + "auth.domain": "Дамен OAuth2.", + "auth.registerUri": "URI, які ўжываецца пры рэгістрацыі новага карыстальніка.", + "automatic": "Аўтаматычна", + "board.certificates": "Спіс сертыфікатаў, якія могуць быць загружаныя на плату", + "browse": "Праглядзець", + "checkForUpdate": "Атрымліваць апавяшчэнні аб даступных абнаўленнях для IDE, плат і бібліятэк.\nПатрабуецца запусціць IDE нанова пасля ўнясення змяненняў.\nПершапачаткова true.", + "choose": "Выбраць", + "cli.daemonDebug": "Уключыць вядзенне часопісу адладкі выклікаў gRPC ў Arduino CLI.\nКаб уступіла ў сілу гэтая налада, патрабуецца запусціць IDE нанова.\nПершапачаткова false.", + "cloud.enabled": "Калі true, функцыі сінхранізацыі сцэнару ўключаныя.\nПершапачаткова true.", + "cloud.pull.warn": "Калі true, карыстальнікі павінны быць папярэджаныя перад стварэннем сцэнара ў воблаку.\nПершапачаткова true.", + "cloud.push.warn": "Калі true, карыстальнікі павінны быць папярэджаныя перад запускам сцэнара ў воблаку.\nПершапачаткова true.", + "cloud.pushpublic.warn": "Калі true, карыстальнікі павінны быць папярэджаныя перад адпраўкай агульнадаступнага сцэнара ў воблака.\nПершапачаткова true.", + "cloud.sharedSpaceId": "Ідэнтыфікатар агульнай прасторы воблака Arduino, з якога можна загрузіць альбом сцэнараў.\nКалі пустое, абрана вашая асабістая прастора.", + "cloud.sketchSyncEndpoint": "Канчатковая кропка, якая ўжываецца для адпраўкі і выцягвання сцэнара з сервернай часткі.\nПершапачаткова яна паказвае на API воблака Arduino.", + "compile": "кампіляваць", + "compile.experimental": "Калі true, асяроддзе IDE павінна апрацоўваць некалькі памылак кампілятара.\nПершапачаткова false", + "compile.revealRange": "Наладжвае спосаб адлюстравання памылак кампілятара ў сродку праўкі пасля няўдалай праверкі/загрузкі.\nМагчымыя значэнні:\n'auto': пракруціць па вертыкалі па меры неабходнасці і адлюстраваць радок.\n'center': пракруціць па вертыкалі па меры неабходнасці і адлюстраваць радок па цэнтры па вертыкалі.\n'top': пракруціць па вертыкалі па меры неабходнасці і паказаць лінію блізка да верхняй частцы вобласці прагляду, аптымізаваную для прагляду вызначэння кода.\n'centerIfOutsideViewport': пракруціць па вертыкалі па меры неабходнасці і паказаць лінію, цэнтраваць па вертыкалі, толькі калі яна знаходзіцца за межамі вобласці прагляду.\nПершапачаткова - '{0}'.", + "compile.verbose": "Калі true, каб быў падрабязны вывад кампілятарам.\nПершапачаткова false", + "compile.warnings": "Паказвае gcc, які ўжываць узровень папярэджанняў.\nПершапачаткова 'None'", + "compilerWarnings": "Папярэджанні кампілятара", + "editorFontSize": "Памер шрыфту ў сродку праўкі", + "editorQuickSuggestions": "Хуткія падказкі ў сродку праўкі", + "enterAdditionalURLs": "Увядзіце дадатковыя адрасы URL, па адным на кожным радку", + "files.inside.sketches": "Адлюстраваць файлы ўнутры сцэнара", + "ide.updateBaseUrl": "Асноўны адрас URL, з якога можна спампаваць абнаўленні.\nПершапачаткова 'https://downloads.arduino.cc/arduino-ide'", + "ide.updateChannel": "Канал выпуску, з якога можна атрымліваць абнаўленні.\n'stable' - гэта стабільны выпуск, 'nightly' - апошняя зборка для распрацоўшчыкаў.", + "interfaceScale": "Маштабаванне інтэрфейсу", + "invalid.editorFontSize": "Хібны памер шрыфту сродку праўкі.\nПавінны быць станоўчы цэлы лік.", + "invalid.sketchbook.location": "Хібнае размяшчэнне альбому з сцэнарамі: {0}", + "invalid.theme": "Хібная тэма.", + "language.asyncWorkers": "Колькасць асінхронных працоўных працэсаў, якія ўжываюцца моўным серверам Arduino (clangd).\nФонавы індэкс таксама ўжывае дадзеную колькасць працоўных працэсаў.\nНайменшае значэнне 0, а найбольшае - 8.\nКалі 0, моўны сервер ужывае ўсе даступныя ядры.\nПершапачаткова 0.", + "language.log": "Калі true, моўны сервер Arduino павінен ствараць файлы часопісу ў каталог з сцэнарам.\nУ адваротным выпадку false.\nПершапачаткова false.", + "language.realTimeDiagnostics": "Калі true, моўны сервер забяспечвае дыягностыку пры ўводзе тэксту ў сродку праўкі ў рэальным часе.\nПершапачаткова false.", + "manualProxy": "Ручная налада проксі-сервера", + "monitor": { + "dockPanel": "Вобласць асяроддзя праграмы, дзе будзе знаходзіцца віджэт _{0}_.\nГэта \"bottom\" ці \"right\".\nПершапачаткова \"{1}\"." + }, + "network": "Сетка", + "newSketchbookLocation": "Абраць новае месцазнаходжанне альбому з сцэнарамі", + "noCliConfig": "Не атрымалася загрузіць канфігурацыю CLI", + "noProxy": "Без проксі-сервера", + "proxySettings": { + "hostname": "Назва вузла", + "password": "Пароль", + "port": "Нумар порта", + "username": "Імя карыстальніка" + }, + "showVerbose": "Паказаць падрабязныя выходныя дадзеныя падчас", + "sketch": { + "inoBlueprint": "Абсалютны шлях файлавай сістэмы да першапачатковага файла схемы `.ino`.\nКалі паказана, змест файлу схемы будзе ўжывацца для кожнага новага сцэнара, які створаны ў IDE.\nСцэнары будуць створаныя з ужываннем першапачатковага зместу Arduino, калі не пазначана.\nНедаступныя файлы схемы ігнаруюцца.\nКаб гэты параметр уступіў сілу, **патрабуецца запуск IDE нанова**." + }, + "sketchbook.location": "Месцазнаходжанне альбому з сцэнарамі", + "sketchbook.showAllFiles": "Калі true, адлюстроўваюцца ўсе файлы сцэнараў унутры сцэнара.\nПершапачаткова false.", + "unofficialBoardSupport": "Пстрыкніце, каб праглядзець спіс адрасоў URL падтрымкі неафіцыйных плат", + "upload": "выгрузіць", + "upload.autoVerify": "True, калі IDE павінна аўтаматычна правяраць код перад загрузкай.\nПершапачаткова значэнне роўнае true.\nКалі false, IDE не кампілюе код нанова перад загрузкай двайковага файла на плату.\nНастойліва рэкамендуецца ўсталяваць false толькі калі вы ведаеце, што робіце.", + "upload.verbose": "Калі true, каб быў падрабязны вывад пры загрузцы.\nПершапачаткова false.", + "upload.verify": "Пасля загрузкі пераканайцеся, што змест памяці на плаце адпавядае загружанаму двайковаму файлу.", + "verifyAfterUpload": "Праверыць код пасля выгрузкі", + "window.autoScale": "Калі true, карыстальніцкі інтэрфейс аўтаматычна маштабуецца ў адпаведнасці з памерам шрыфту.", + "window.zoomLevel": { + "deprecationMessage": "Састарэлы.\nЗамест гэтага ўжывайце 'window.zoomLevel'." + } + }, + "renameCloudSketch": { + "renameSketchTitle": "Новая назва сцэнара ў воблаку" + }, + "replaceMsg": "Ці замяніць існуючую версію {0}?", + "selectZip": "Абярыце файл zip, які змяшчае бібліятэку, якую вы жадаеце дадаць", + "serial": { + "autoscroll": "Аўтаматычная пракрутка", + "carriageReturn": "CR - вяртанне карэткі", + "connecting": "Злучэнне з '{0}' на '{1}'…", + "message": "Паведамленне (увядзіце, каб адправіць паведамленне '{0}' на '{1}')", + "newLine": "NL - новы радок", + "newLineCarriageReturn": "NL & CR - новы радок і вяртанне карэткі", + "noLineEndings": "Без канца радка", + "notConnected": "Не злучаны.\nАбярыце плату і порт для аўтаматычнага злучэння.", + "openSerialPlotter": "Паслядоўны плотэр", + "timestamp": "Адзнака часу", + "toggleTimestamp": "Пераключыць адзнаку часу" + }, + "sketch": { + "archiveSketch": "Архіваваць сцэнар", + "cantOpen": "Каталог \"{0}\" ужо існуе.\nНе атрымалася адчыніць сцэнар.", + "compile": "Кампіляцыя сцэнара…", + "configureAndUpload": "Наладзіць і выгрузіць", + "createdArchive": "Створаны архіў '{0}'.", + "doneCompiling": "Кампіляцыя скончана.", + "doneUploading": "Выгрузка скончана.", + "editInvalidSketchFolderLocationQuestion": "Ці жадаеце вы паспрабаваць захаваць сцэнар у іншым месцы?", + "editInvalidSketchFolderQuestion": "Ці жадаеце вы паспрабаваць захаваць сцэнар пад іншай назвай?", + "exportBinary": "Экспартаваць скампіляваны двайковы файл", + "invalidCloudSketchName": "Назва павінна пачынацца з літары, лічбы ці знака падкрэсляння, за якім ідуць літары, лічбы, працяжнікі, кропкі і знакі падкрэсляння.\nНайбольшая даўжыня - 36 знакаў.", + "invalidSketchFolderLocationDetails": "Вы не можаце захаваць сцэнар у каталогу ўнутры самога сабе.", + "invalidSketchFolderLocationMessage": "Хібнае размяшчэнне каталогу з сцэнарам: '{0}'", + "invalidSketchFolderNameMessage": "Хібнае імя каталогу з сцэнарам: '{0}'", + "invalidSketchName": "Назва павінна пачынацца з літары, лічбы ці знака падкрэсляння, за якім ідуць літары, лічбы, працяжнікі, кропкі і знакі падкрэсляння.\nНайбольшая даўжыня - 63 знакі.", + "moving": "Які рухаецца", + "movingMsg": "Файл \"{0}\" павінен знаходзіцца ў каталогу з сцэнарам \"{1}\".\nЦі стварыць каталог, перамясціць файл, і працягнуць?", + "new": "Новы сцэнар", + "noTrailingPeriod": "Імя файла не можа заканчвацца кропкай", + "openFolder": "Адчыніць каталог", + "openRecent": "Адчыніць нядаўні", + "openSketchInNewWindow": "Адчыніць сцэнар у новым акне", + "reservedFilename": "'{0}' - зарэзерваванае імя файла.", + "saveFolderAs": "Захаваць каталог з сцэнарам як…", + "saveSketch": "Захаваць сцэнар, каб адчыніць яго пазней.", + "saveSketchAs": "Захаваць каталог з сцэнарам як…", + "showFolder": "Адлюстраваць каталог з сцэнарам", + "sketch": "Сцэнар", + "sketchAlreadyContainsThisFileError": "Сцэнар ужо ўтрымлівае файл з іменем '{0}'", + "sketchAlreadyContainsThisFileMessage": "Не атрымалася захаваць сцэнар \"{0}\" як \"{1}\".\n{2}", + "sketchbook": "Альбом з сцэнарам", + "titleLocalSketchbook": "Лакальны альбом з сцэнарам", + "titleSketchbook": "Альбом з сцэнарам", + "upload": "Выгрузіць", + "uploadUsingProgrammer": "Выгрузіць з дапамогай сродку праграмавання", + "uploading": "Выгрузка…", + "userFieldsNotFoundError": "Не атрымалася знайсці карыстальніцкія палі для злучанай платы", + "verify": "Праверыць", + "verifyOrCompile": "Праверыць/Кампіляваць" + }, + "sketchbook": { + "newCloudSketch": "Новы сцэнар у воблаку", + "newSketch": "Новы сцэнар" + }, + "theme": { + "currentThemeNotFound": "Не атрымалася знайсці абраную ў дадзены момант тэму: {0}.\nArduino IDE абрала ўбудаваную тэму, якая сумяшчальная з адсутнай.", + "dark": "Цёмная", + "deprecated": "{0} (састарэлая)", + "hc": "Цёмная высокакантрасная", + "hcLight": "Светлая высокакантрасная", + "light": "Светлая", + "user": "{0} (карыстальніцкая)" + }, + "title": { + "cloud": "Воблака" + }, + "updateIndexes": { + "updateIndexes": "Абнавіць індэксы", + "updateLibraryIndex": "Абнавіць індэксы бібліятэкі", + "updatePackageIndex": "Абнавіць індэксы пакетаў" + }, + "upload": { + "error": "{0} памылка: {1}" + }, + "userFields": { + "cancel": "Адмяніць", + "enterField": "Увясці {0}", + "upload": "Выгрузіць" + }, + "validateSketch": { + "abortFixMessage": "Сцэнар па-ранейшаму хібны.\nЦі жадаеце вы ліквідаваць пакінутыя праблемы?\nНацісніце '{0}', адчыніцца новы сцэнар.", + "abortFixTitle": "Хібны сцэнар", + "renameSketchFileMessage": "Файл сцэнара '{0}' не можа быць ужыты.\n{1} Ці жадаеце вы пераназваць файл сцэнара прама зараз?", + "renameSketchFileTitle": "Хібнае імя файлу сцэнара", + "renameSketchFolderMessage": "Сцэнар '{0}' не можа быць ужыты.\n{1} Каб пазбавіцца ад гэтага паведамлення, пераназавіце сцэнар.\nЦі жадаеце вы пераназваць сцэнар?", + "renameSketchFolderTitle": "Хібная назва сцэнара" + }, + "versionWelcome": { + "cancelButton": "Можа, пазней", + "donateButton": "Ахвераваць зараз", + "donateMessage": "Arduino імкнецца захаваць праграмнае забеспячэнне бясплатным і з адкрытым зыходным кодам для ўсіх.\nВашыя ахвяраванні дапамагаюць нам распрацоўваць новыя функцыі, удасканальваць бібліятэкі і падтрымліваць мільёны карыстальнікаў па ўсім свеце.", + "donateMessage2": "Калі ласка, падумайце пра падтрымку нашай працы над бясплатнай Arduino IDE з адкрытым зыходным кодам.", + "title": "Сардэчна запрашаем у новую версію Arduino IDE!", + "titleWithVersion": "Сардэчна запрашаем у новае асяроддзе распрацоўкі Arduino IDE {0}!" + }, + "workspace": { + "alreadyExists": "{0}' ужо існуе." + } + }, + "theia": { + "core": { + "cannotConnectBackend": "Не атрымалася злучыцца з сервернай часткай.", + "cannotConnectDaemon": "Не атрымалася злучыцца з дэманам CLI.", + "couldNotSave": "Не атрымалася захаваць сцэнар.\nКалі ласка, скапіруйце вашую незахаваную працу ў ваш любімы тэкставы сродак праўкі, і запусціце асяроддзе IDE нанова.", + "daemonOffline": "Дэман CLI у аўтаномным рэжыме", + "offline": "Аўтаномны", + "offlineText": "Не ў сетцы", + "quitTitle": "Ці ўпэўненыя вы, што жадаеце выйсці?" + }, + "editor": { + "unsavedTitle": "Незахаваны – {0}" + }, + "messages": { + "collapse": "Згарнуць", + "expand": "Разгарнуць" + }, + "workspace": { + "deleteCloudSketch": "Сцэнар у воблаку '{0}' будзе незваротна выдалены з сервераў Arduino і лакальных кэшаў.\nГэтае дзеянне незваротнае.\nЦі жадаеце вы выдаліць бягучы сцэнар?", + "deleteCurrentSketch": "Сцэнар '{0}' будзе незваротна выдалены.\nГэтае дзеянне незваротнае.\nЦі жадаеце вы выдаліць бягучы сцэнар?", + "fileNewName": "Імя для новага файла", + "invalidExtension": ".{0} не з'яўляецца дапушчальным пашырэннем", + "newFileName": "Новае імя для файла" + } + } +} diff --git a/i18n/bg.json b/i18n/bg.json index 6ebefd32c..d564bf42c 100644 --- a/i18n/bg.json +++ b/i18n/bg.json @@ -1,38 +1,51 @@ { "arduino": { "about": { - "detail": "Версия: {0}\nДата: {1}{2}\nВерсия на CLI: {3}{4} [{5}]\n\n{6}", + "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "Относно {0}" }, + "account": { + "goToCloudEditor": "Go to Cloud Editor", + "goToIoTCloud": "Go to IoT Cloud", + "goToProfile": "Go to Profile", + "menuTitle": "Arduino Cloud" + }, "board": { "board": "Платка{0}", "boardConfigDialogTitle": "Select Other Board and Port", + "boardDataReloaded": "Board data reloaded.", "boardInfo": "Информация за платка", + "boards": "boards", "configDialog1": "Изберете както платка, така и порт, ако искате да качите скица.", "configDialog2": "If you only select a Board you will be able to compile, but not to upload your sketch.", "couldNotFindPreviouslySelected": "Не можа да се намери по-рано избрана платка „{0}“ в инсталираната платформа „{1}“. Моля, изберете отново ръчно платката, която искате да използвате. Искате ли да я изберете отново сега?", - "disconnected": "Disconnected", + "editBoardsConfig": "Edit Board and Port...", "getBoardInfo": "Вземи информация за платката", "inSketchbook": "(в Скицника)", "installNow": "Ядрото „{0} {1}“ трябва да бъде инсталирано за текущо избраната платка „{2}“. Искате ли да го инсталирате сега?", - "noFQBN": "FQBN не е наличен за избраната платка „{0}“. Имате ли инсталирано съответното ядро?", + "noBoardsFound": "No boards found for \"{0}\"", + "noNativeSerialPort": "Native serial port, can't obtain info.", "noPortsDiscovered": "No ports discovered", - "noPortsSelected": "Няма избрани портове за платка: „{0}“.", - "noneSelected": "Няма избрани платка.", + "nonSerialPort": "Non-serial port, can't obtain info.", "openBoardsConfig": "Изберете друга платка и порт...", - "platformMissing": "Платформата за избраната платка „{0}“ не е инсталирана.", "pleasePickBoard": "Моля, изберете платка, свързана към порта, който сте избрали.", "port": "Порт{0}", - "portLabel": "Port: {0}", + "ports": "ports", "programmer": "Програматор", + "reloadBoardData": "Reload Board Data", "reselectLater": "Изберете отново по-късно", + "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "Search board", "selectBoard": "Изберете платка", - "selectBoardForInfo": "Моля, изберете платка, за да получите информация за нея.", + "selectBoardToReload": "Please select a board first.", "selectPortForInfo": "Моля, изберете порт, за да получите информация за платката.", "showAllAvailablePorts": "Показва всички налични портове, когато е активиран", + "showAllPorts": "Show all ports", "succesfullyInstalledPlatform": "Успешно инсталирана платформа {0}:{1}", - "succesfullyUninstalledPlatform": "Успешно деинсталирана платформа {0}:{1}" + "succesfullyUninstalledPlatform": "Успешно деинсталирана платформа {0}:{1}", + "typeOfPorts": "{0} ports", + "unconfirmedBoard": "Unconfirmed board", + "unknownBoard": "Unknown board" }, "boardsManager": "Мениджър на платки", "boardsType": { @@ -77,14 +90,15 @@ "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" }, "cloud": { - "account": "Account", "chooseSketchVisibility": "Изберете видимост на вашата скица:", + "cloudSketchbook": "Облачен скицник", "connected": "Свързано", "continue": "Продължи", - "donePulling": "Изтеглянето на „{0}“ приключи.", - "donePushing": "Изпращането на „{0}“ приключи.", + "donePulling": "Done pulling '{0}'.", + "donePushing": "Done pushing '{0}'.", "embed": "Вграждане:", "emptySketchbook": "Вашият Скицник е празен", + "goToCloud": "Go to Cloud", "learnMore": "Научете повече", "link": "Връзка:", "notYetPulled": "Не може да се изпрати към облака. Още не е изтеглен.", @@ -102,10 +116,9 @@ "pushSketch": "Изпрати скица", "pushSketchMsg": "Това е публична скица. Преди да я изпратите, уверете се, че всяка чувствителна информация е дефинирана във файловете arduino_secrets.h. Можете да направите скица частна от панела за споделяне.", "remote": "Отдалечен", - "remoteSketchbook": "Remote Sketchbook", "share": "Сподели...", "shareSketch": "Споделете скица", - "showHideRemoveSketchbook": "Показване/скриване на отдалечен скицник", + "showHideSketchbook": "Show/Hide Cloud Sketchbook", "signIn": "ВПИШИ СЕ", "signInToCloud": "Влезте в Arduino Cloud", "signOut": "Отписване", @@ -113,12 +126,23 @@ "syncEditSketches": "Синхронизирайте и редактирайте на вашите Arduino облачни скици", "visitArduinoCloud": "Посетете Arduino Cloud, за да създадете облачни скици." }, + "cloudSketch": { + "alreadyExists": "Cloud sketch '{0}' already exists.", + "creating": "Creating cloud sketch '{0}'...", + "new": "New Cloud Sketch", + "notFound": "Could not pull the cloud sketch '{0}'. It does not exist.", + "pulling": "Synchronizing sketchbook, pulling '{0}'...", + "pushing": "Synchronizing sketchbook, pushing '{0}'...", + "renaming": "Renaming cloud sketch from '{0}' to '{1}'...", + "synchronizingSketchbook": "Synchronizing sketchbook..." + }, "common": { "all": "All", "contributed": "Contributed", "installManually": "Инсталирай ръчно", "later": "По-късно", "noBoardSelected": "Не е избрана платка", + "noSketchOpened": "No sketch opened", "notConnected": "[няма връзка]", "offlineIndicator": "Изглежда, че сте офлайн. Без интернет връзка, Arduino CLI може да не успее да изтегли необходимите ресурси и може да причини неизправност. Моля, свържете се с интернет и рестартирайте приложението.", "oldFormat": "„{0}“ все още използва стария формат .pde. Искате ли да преминете към новото разширение `.ino`?", @@ -126,11 +150,13 @@ "processing": "Обработва се", "recommended": "Recommended", "retired": "Retired", + "selectManually": "Select Manually", "selectedOn": "на {0}", "serialMonitor": "Сериен Монитор", "type": "Type", "unknown": "Неизвестно", - "updateable": "Updatable" + "updateable": "Updatable", + "userAbort": "User abort" }, "compile": { "error": "Грешка при компилация: {0}" @@ -138,22 +164,49 @@ "component": { "boardsIncluded": "Boards included in this package:", "by": "от", + "clickToOpen": "Click to open in browser: {0}", "filterSearch": "Филтрирайте търсенето си...", - "install": "ИНСТАЛИРАЙ", + "install": "Инсталирай", + "installLatest": "Install Latest", + "installVersion": "Install {0}", + "installed": "{0} installed", "moreInfo": "Повече информация", + "otherVersions": "Other Versions", + "remove": "Премахване", + "title": "{0} by {1}", "uninstall": "Деинсталиране", "uninstallMsg": "Искате ли да деинсталирате {0}?", - "version": "Версия {0}" + "update": "Update" + }, + "configuration": { + "cli": { + "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" + } + }, + "connectionStatus": { + "connectionLost": "Connection lost. Cloud sketch actions and updates won't be available." }, "contributions": { "addFile": "Добави файл", "fileAdded": "Към скицата е добавен един файл.", + "plotter": { + "couldNotOpen": "Couldn't open serial plotter" + }, "replaceTitle": "Замени" }, + "core": { + "compilerWarnings": { + "all": "All", + "default": "Default", + "more": "More", + "none": "None" + } + }, "coreContribution": { "copyError": "Copy error messages", "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." }, + "createCloudCopy": "Push Sketch to Cloud", "daemon": { "restart": "Restart Daemon", "start": "Start Daemon", @@ -162,8 +215,15 @@ "debug": { "debugWithMessage": "Отстраняване на грешки - {0}", "debuggingNotSupported": "Отстраняването на грешки не се поддържа от „{0}“", + "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "Платформата не е инсталирана за „{0}“", - "optimizeForDebugging": "Оптимизиране за отстраняване на грешки" + "optimizeForDebugging": "Оптимизиране за отстраняване на грешки", + "sketchIsNotCompiled": "Sketch '{0}' must be verified before starting a debug session. Please verify the sketch and start debugging again. Do you want to verify the sketch now?" + }, + "developer": { + "clearBoardList": "Clear the Board List History", + "clearBoardsConfig": "Clear the Board and Port Selection", + "dumpBoardList": "Dump the Board List" }, "dialog": { "dontAskAgain": "Не питай отново" @@ -180,10 +240,6 @@ "previousError": "Previous Error", "revealError": "Reveal Error" }, - "electron": { - "couldNotSave": "Скицата не можа да бъде запазена. Моля, копирайте незапазената си работа в любимия си текстов редактор и рестартирайте IDE-то.", - "unsavedChanges": "Всички незапазени промени няма да бъдат запазени." - }, "examples": { "builtInExamples": "Вградени примери", "couldNotInitializeExamples": "Не можа да се инициализира вградените примери.", @@ -201,7 +257,7 @@ "selectBoard": "Изберете платка", "selectVersion": "Изберете версия на фърмуера", "successfullyInstalled": "Firmware successfully installed.", - "updater": "WiFi101 / WiFiNINA Firmware Updater" + "updater": "Firmware Updater" }, "help": { "environment": "Околна среда", @@ -219,6 +275,9 @@ "checkForUpdates": "Check for Arduino IDE Updates", "closeAndInstallButton": "Close and Install", "closeToInstallNotice": "Close the software and install the update on your machine.", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", "downloadButton": "Download", "downloadingNotice": "Downloading the latest version of the Arduino IDE.", "errorCheckingForUpdates": "Error while checking for Arduino IDE updates.\n{0}", @@ -232,16 +291,20 @@ "updateAvailable": "Update Available", "versionDownloaded": "Arduino IDE {0} has been downloaded." }, + "installable": { + "libraryInstallFailed": "Failed to install library: '{0}{1}'.", + "platformInstallFailed": "Failed to install platform: '{0}{1}'." + }, "library": { "addZip": "Добавяне на .ZIP библиотека...", "arduinoLibraries": "Arduino библиотеки", "contributedLibraries": "Допринесени библиотеки", - "dependenciesForLibrary": "Зависимости за библиотека {0}:{1}", "include": "Включи библиотека", - "installAll": "Инсталирай всички", + "installAll": "Install All", + "installLibraryDependencies": "Install library dependencies", "installMissingDependencies": "Искате ли да инсталирате всички липсващи зависимости?", "installOneMissingDependency": "Искате ли да инсталирате липсващата зависимост?", - "installOnly": "Инсталирайте само {0}", + "installWithoutDependencies": "Install without dependencies", "installedSuccessfully": "Успешно инсталирана библиотека {0}:{1}", "libraryAlreadyExists": "Библиотека вече съществува. Искате ли да я презапишете?", "manageLibraries": "Управление на библиотеки...", @@ -278,9 +341,23 @@ "tools": "Инструменти" }, "monitor": { + "alreadyConnectedError": "Could not connect to {0} {1} port. Already connected.", + "baudRate": "{0} baud", + "connectionFailedError": "Could not connect to {0} {1} port.", + "connectionFailedErrorWithDetails": "{0} Could not connect to {1} {2} port.", + "connectionTimeout": "Timeout. The IDE has not received the 'success' message from the monitor after successfully connecting to it", + "missingConfigurationError": "Could not connect to {0} {1} port. The monitor configuration is missing.", + "notConnectedError": "Not connected to {0} {1} port.", "unableToCloseWebSocket": "Unable to close websocket", "unableToConnectToWebSocket": "Unable to connect to websocket" }, + "newCloudSketch": { + "newSketchTitle": "Name of the new Cloud Sketch" + }, + "portProtocol": { + "network": "Мрежа", + "serial": "Serial" + }, "preferences": { "additionalManagerURLs": "Допълнителни URL адреси на мениджър на платки", "auth.audience": "OAuth2 аудиторията.", @@ -297,6 +374,7 @@ "cloud.pull.warn": "True е, ако потребителите трябва да бъдат предупредени, преди да се изтегли скица от облака. По подразбиране е true.", "cloud.push.warn": "True, ако потребителите трябва да бъдат предупредени, преди да бъде пусната скица в облака. По подразбиране е true.", "cloud.pushpublic.warn": "True, ако потребителите трябва да бъдат предупредени, преди да бъде изпратена публична скица в облака. По подразбиране е true.", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", "cloud.sketchSyncEndpoint": "Крайната точка, използвана за изпращане и изтегляне на скици от бекенда. По подразбиране той сочи към Arduino Cloud API.", "compile": "компилиране", "compile.experimental": "True if the IDE should handle multiple compiler errors. False by default", @@ -314,29 +392,50 @@ "invalid.editorFontSize": "Невалиден размер на шрифта на редактора. Трябва да е положително цяло число.", "invalid.sketchbook.location": "Невалидно местоположение на скицника: {0}", "invalid.theme": "Невалидна тема.", + "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", "language.log": "True, ако езиковият сървър на Arduino трябва да генерира лог файлове в папката за скици. В противен случай false. По подразбиране е false.", "language.realTimeDiagnostics": "If true, the language server provides real-time diagnostics when typing in the editor. It's false by default.", "manualProxy": "Ръчна конфигурация на прокси", + "monitor": { + "dockPanel": "The area of the application shell where the _{0}_ widget will reside. It is either \"bottom\" or \"right\". It defaults to \"{1}\"." + }, "network": "Мрежа", "newSketchbookLocation": "Изберете местоположение за новата скицниката", + "noCliConfig": "Could not load the CLI configuration", "noProxy": "Без прокси", + "proxySettings": { + "hostname": "Host name", + "password": "Password", + "port": "Port number", + "username": "Username" + }, "showVerbose": "Показване на подробен изход по време на", + "sketch": { + "inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect." + }, "sketchbook.location": "Местоположение на скицника", "sketchbook.showAllFiles": "True , за да се покажат всички файлове вътре в скицата. По подразбиране е false.", - "survey.notification": "True if users should be notified if a survey is available. True by default.", "unofficialBoardSupport": "Щракнете за списък с неофициално поддържаните URL адреси на платки", "upload": "качване", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", "upload.verbose": "True за подробен изход за качване. False по подразбиране.", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "Потвърдете кода след качване", "window.autoScale": "True , ако потребителският интерфейс автоматично се мащабира с размера на шрифта.", - "window.zoomLevel": "Регулирайте нивото на увеличение на прозореца. Оригиналният размер е 0 и всяко увеличение над (напр. 1) или под (напр. -1) представлява увеличение с 20% по-голямо или по-малко. Можете също да въведете десетични знаци, за да регулирате нивото на увеличение по-финно." + "window.zoomLevel": { + "deprecationMessage": "Deprecated. Use 'window.zoomLevel' instead." + } + }, + "renameCloudSketch": { + "renameSketchTitle": "New name of the Cloud Sketch" }, "replaceMsg": "Да се замени ли съществуващата версия на {0}?", "selectZip": "Изберете zip файл, съдържащ библиотеката, която искате да добавите", "serial": { "autoscroll": "Автоматично превъртане", "carriageReturn": "Carriage Return", - "message": "Message ({0} + Enter to send message to '{1}' on '{2}')", + "connecting": "Connecting to '{0}' on '{1}'...", + "message": "Message (Enter to send message to '{0}' on '{1}')", "newLine": "Нов ред", "newLineCarriageReturn": "Както NL, така и CR", "noLineEndings": "Без край на реда", @@ -348,24 +447,34 @@ "sketch": { "archiveSketch": "Архивирай скица", "cantOpen": "Папка с име „{0}“ вече съществува. Не може да се отвори скица.", - "close": "Наистина ли искате да затворите скицата?", "compile": "Compiling sketch...", - "configureAndUpload": "Конфигуриране и качване", + "configureAndUpload": "Configure and Upload", "createdArchive": "Създаден е архив „{0}“.", "doneCompiling": "Готово е компилирането.", "doneUploading": "Качването приключи.", + "editInvalidSketchFolderLocationQuestion": "Do you want to try saving the sketch to a different location?", + "editInvalidSketchFolderQuestion": "Do you want to try saving the sketch with a different name?", "exportBinary": "Експортиране на компилиран двоичен файл", + "invalidCloudSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", + "invalidSketchFolderLocationDetails": "You cannot save a sketch into a folder inside itself.", + "invalidSketchFolderLocationMessage": "Invalid sketch folder location: '{0}'", + "invalidSketchFolderNameMessage": "Invalid sketch folder name: '{0}'", + "invalidSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", "moving": "Преместване", "movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?", - "new": "Нов", + "new": "New Sketch", + "noTrailingPeriod": "A filename cannot end with a dot", "openFolder": "Отвори папка", "openRecent": "Отвори Скорошен", "openSketchInNewWindow": "Отвори скицата в нов прозорец", + "reservedFilename": "'{0}' is a reserved filename.", "saveFolderAs": "Запазете папката със скица като...", "saveSketch": "Save your sketch to open it again later.", "saveSketchAs": "Запазете папката със скици като...", "showFolder": "Показване на папка за скици", "sketch": "Скица", + "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", + "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", "sketchbook": "Скицник", "titleLocalSketchbook": "Локален скицник", "titleSketchbook": "Скицник", @@ -376,10 +485,26 @@ "verify": "Потвърдете", "verifyOrCompile": "Проверете/компилирайте" }, - "survey": { - "answerSurvey": "Answer survey", - "dismissSurvey": "Don't show again", - "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." + "sketchbook": { + "newCloudSketch": "New Cloud Sketch", + "newSketch": "New Sketch" + }, + "theme": { + "currentThemeNotFound": "Could not find the currently selected theme: {0}. Arduino IDE has picked a built-in theme compatible with the missing one.", + "dark": "Dark", + "deprecated": "{0} (deprecated)", + "hc": "Dark High Contrast", + "hcLight": "Light High Contrast", + "light": "Light", + "user": "{0} (user)" + }, + "title": { + "cloud": "Cloud" + }, + "updateIndexes": { + "updateIndexes": "Update Indexes", + "updateLibraryIndex": "Update Library Index", + "updatePackageIndex": "Update Package Index" }, "upload": { "error": "{0} грешка: {1}" @@ -388,11 +513,27 @@ "cancel": "Отмяна", "enterField": "Enter {0}", "upload": "Качване" + }, + "validateSketch": { + "abortFixMessage": "The sketch is still invalid. Do you want to fix the remaining problems? By clicking '{0}', a new sketch will open.", + "abortFixTitle": "Invalid sketch", + "renameSketchFileMessage": "The sketch file '{0}' cannot be used. {1} Do you want to rename the sketch file now?", + "renameSketchFileTitle": "Invalid sketch filename", + "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", + "renameSketchFolderTitle": "Invalid sketch name" + }, + "versionWelcome": { + "cancelButton": "Maybe later", + "donateButton": "Donate now", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Welcome to a new version of the Arduino IDE!", + "titleWithVersion": "Welcome to the new Arduino IDE {0}!" + }, + "workspace": { + "alreadyExists": "'{0}' already exists." } }, - "cloud": { - "GoToCloud": "КЪМ ОБЛАКА" - }, "theia": { "core": { "cannotConnectBackend": "Не може да се свърже с бекенда.", @@ -400,13 +541,9 @@ "couldNotSave": "Скицата не можа да бъде запазена. Моля, копирайте незапазената си работа в любимия си текстов редактор и рестартирайте IDE-то.", "daemonOffline": "CLI Daemon офлайн", "offline": "Офлайн", + "offlineText": "Офлайн", "quitTitle": "Are you sure you want to quit?" }, - "debug": { - "start": "Започнете...", - "startError": "Възникна грешка при стартиране на сесията за отстраняване на грешки, проверете регистрационните файлове за повече подробности.", - "typeNotSupported": "Типът на сесията за отстраняване на грешки „{0}“ не се поддържа." - }, "editor": { "unsavedTitle": "Незапазено – {0}" }, @@ -415,10 +552,10 @@ "expand": "Разгънете" }, "workspace": { - "deleteCurrentSketch": "Искате ли да изтриете текущата скица?", + "deleteCloudSketch": "The cloud sketch '{0}' will be permanently deleted from the Arduino servers and the local caches. This action is irreversible. Do you want to delete the current sketch?", + "deleteCurrentSketch": "The sketch '{0}' will be permanently deleted. This action is irreversible. Do you want to delete the current sketch?", "fileNewName": "Име за нов файл", "invalidExtension": ".{0} не е валидно разширение", - "invalidFilename": "Невалидно име на файла.", "newFileName": "Ново име на файла" } } diff --git a/i18n/ca.json b/i18n/ca.json deleted file mode 100644 index 1ebc51e5d..000000000 --- a/i18n/ca.json +++ /dev/null @@ -1,350 +0,0 @@ -{ - "arduino": { - "common": { - "offlineIndicator": "You appear to be offline. Without an Internet connection, the Arduino CLI might not be able to download the required resources and could cause malfunction. Please connect to the Internet and restart the application.", - "noBoardSelected": "No board selected", - "selectedOn": "on {0}", - "notConnected": "[not connected]", - "serialMonitor": "Serial Monitor", - "oldFormat": "The '{0}' still uses the old `.pde` format. Do you want to switch to the new `.ino` extension?", - "later": "Later", - "selectBoard": "Select Board", - "unknown": "Unknown", - "processing": "Processing", - "saveChangesToSketch": "Do you want to save changes to this sketch before closing?", - "loseChanges": "If you don't save, your changes will be lost." - }, - "ide-updater": { - "errorCheckingForUpdates": "Error while checking for Arduino IDE updates.\n{0}", - "notNowButton": "Not now", - "versionDownloaded": "Arduino IDE {0} has been downloaded.", - "closeToInstallNotice": "Close the software and install the update on your machine.", - "closeAndInstallButton": "Close and Install", - "downloadingNotice": "Downloading the latest version of the Arduino IDE.", - "updateAvailable": "Update Available", - "newVersionAvailable": "A new version of Arduino IDE ({0}) is available for download.", - "skipVersionButton": "Skip Version", - "downloadButton": "Download", - "goToDownloadPage": "An update for the Arduino IDE is available, but we're not able to download and install it automatically. Please go to the download page and download the latest version from there.", - "goToDownloadButton": "Go To Download", - "ideUpdaterDialog": "Software Update", - "noUpdatesAvailable": "There are no recent updates available for the Arduino IDE" - }, - "menu": { - "sketch": "Sketch", - "tools": "Tools" - }, - "debug": { - "optimizeForDebugging": "Optimize for Debugging", - "debugWithMessage": "Debug - {0}", - "noPlatformInstalledFor": "Platform is not installed for '{0}'", - "debuggingNotSupported": "Debugging is not supported by '{0}'" - }, - "preferences": { - "language.log": "True if the Arduino Language Server should generate log files into the sketch folder. Otherwise, false. It's false by default.", - "compile.verbose": "True for verbose compile output. False by default", - "compile.warnings": "Tells gcc which warning level to use. It's 'None' by default", - "upload.verbose": "True for verbose upload output. False by default.", - "window.autoScale": "True if the user interface automatically scales with the font size.", - "window.zoomLevel": "Adjust the zoom level of the window. The original size is 0 and each increment above (e.g. 1) or below (e.g. -1) represents zooming 20% larger or smaller. You can also enter decimals to adjust the zoom level with a finer granularity.", - "ide.updateChannel": "Release channel to get updated from. 'stable' is the stable release, 'nightly' is the latest development build.", - "board.certificates": "List of certificates that can be uploaded to boards", - "sketchbook.showAllFiles": "True to show all sketch files inside the sketch. It is false by default.", - "cloud.enabled": "True if the sketch sync functions are enabled. Defaults to true.", - "cloud.pull.warn": "True if users should be warned before pulling a cloud sketch. Defaults to true.", - "cloud.push.warn": "True if users should be warned before pushing a cloud sketch. Defaults to true.", - "cloud.pushpublic.warn": "True if users should be warned before pushing a public sketch to the cloud. Defaults to true.", - "cloud.sketchSyncEnpoint": "The endpoint used to push and pull sketches from a backend. By default it points to Arduino Cloud API.", - "auth.clientID": "The OAuth2 client ID.", - "auth.domain": "The OAuth2 domain.", - "auth.audience": "The OAuth2 audience.", - "auth.registerUri": "The URI used to register a new user.", - "network": "Network", - "sketchbook.location": "Sketchbook location", - "browse": "Browse", - "files.inside.sketches": "Show files inside Sketches", - "editorFontSize": "Editor font size", - "interfaceScale": "Interface scale", - "showVerbose": "Show verbose output during", - "compilerWarnings": "Compiler warnings", - "automatic": "Automatic", - "compile": "compile", - "upload": "upload", - "verifyAfterUpload": "Verify code after upload", - "editorQuickSuggestions": "Editor Quick Suggestions", - "additionalManagerURLs": "Additional Boards Manager URLs", - "noProxy": "No proxy", - "manualProxy": "Manual proxy configuration", - "newSketchbookLocation": "Select new sketchbook location", - "choose": "Choose", - "enterAdditionalURLs": "Enter additional URLs, one for each row", - "unofficialBoardSupport": "Click for a list of unofficial board support URLs", - "invalid.sketchbook.location": "Invalid sketchbook location: {0}", - "invalid.editorFontSize": "Invalid editor font size. It must be a positive integer.", - "invalid.theme": "Invalid theme." - }, - "cloud": { - "signIn": "SIGN IN", - "signOut": "Sign Out", - "chooseSketchVisibility": "Choose visibility of your Sketch:", - "privateVisibility": "Private. Only you can view the Sketch.", - "publicVisibility": "Public. Anyone with the link can view the Sketch.", - "link": "Link:", - "embed": "Embed:", - "cloudSketchbook": "Cloud Sketchbook", - "shareSketch": "Share Sketch", - "showHideRemoveSketchbook": "Show/Hide Remote Sketchbook", - "pullSketch": "Pull Sketch", - "openInCloudEditor": "Open in Cloud Editor", - "options": "Options...", - "share": "Share...", - "remote": "Remote", - "emptySketchbook": "Your Sketchbook is empty", - "visitArduinoCloud": "Visit Arduino Cloud to create Cloud Sketches.", - "signInToCloud": "Sign in to Arduino Cloud", - "syncEditSketches": "Sync and edit your Arduino Cloud Sketches", - "learnMore": "Learn more", - "continue": "Continue", - "pushSketch": "Push Sketch", - "pushSketchMsg": "This is a Public Sketch. Before pushing, make sure any sensitive information is defined in arduino_secrets.h files. You can make a Sketch private from the Share panel.", - "pull": "Pull", - "pullSketchMsg": "Pulling this Sketch from the Cloud will overwrite its local version. Are you sure you want to continue?", - "donePulling": "Done pulling ‘{0}’.", - "notYetPulled": "Cannot push to Cloud. It is not yet pulled.", - "push": "Push", - "pullFirst": "You have to pull first to be able to push to the Cloud.", - "donePushing": "Done pushing ‘{0}’.", - "connected": "Connected", - "offline": "Offline", - "profilePicture": "Profile picture" - }, - "board": { - "installManually": "Install Manually", - "installNow": "The \"{0} {1}\" core has to be installed for the currently selected \"{2}\" board. Do you want to install it now?", - "configDialogTitle": "Select Other Board & Port", - "configDialog1": "Select both a Board and a Port if you want to upload a sketch.", - "configDialog2": "If you only select a Board you will be able to compile, but not to upload your sketch.", - "pleasePickBoard": "Please pick a board connected to the port you have selected.", - "showAllAvailablePorts": "Shows all available ports when enabled", - "programmer": "Programmer", - "succesfullyInstalledPlatform": "Successfully installed platform {0}:{1}", - "succesfullyUninstalledPlatform": "Successfully uninstalled platform {0}:{1}", - "couldNotFindPreviouslySelected": "Could not find previously selected board '{0}' in installed platform '{1}'. Please manually reselect the board you want to use. Do you want to reselect it now?", - "reselectLater": "Reselect later", - "noneSelected": "No boards selected.", - "noPortsSelected": "No ports selected for board: '{0}'.", - "noFQBN": "The FQBN is not available for the selected board \"{0}\". Do you have the corresponding core installed?", - "openBoardsConfig": "Select other board and port…", - "boardListItem": "{0} at {1}", - "selectBoardForInfo": "Please select a board to obtain board info.", - "platformMissing": "The platform for the selected '{0}' board is not installed.", - "selectPortForInfo": "Please select a port to obtain board info.", - "boardInfo": "Board Info", - "board": "Board{0}", - "port": "Port{0}", - "getBoardInfo": "Get Board Info", - "inSketchbook": " (in Sketchbook)" - }, - "boardsManager": "Boards Manager", - "about": { - "label": "About {0}", - "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}{4} [{5}]\n\n{6}" - }, - "contributions": { - "addFile": "Add File", - "replaceTitle": "Replace", - "fileAdded": "One file added to the sketch." - }, - "replaceMsg": "Replace the existing version of {0}?", - "library": { - "addZip": "Add .ZIP Library...", - "zipLibrary": "Library", - "overwriteExistingLibrary": "Do you want to overwrite the existing library?", - "successfullyInstalledZipLibrary": "Successfully installed library from {0} archive", - "namedLibraryAlreadyExists": "A library folder named {0} already exists. Do you want to overwrite it?", - "libraryAlreadyExists": "A library already exists. Do you want to overwrite it?", - "include": "Include Library", - "manageLibraries": "Manage Libraries...", - "arduinoLibraries": "Arduino libraries", - "contributedLibraries": "Contributed libraries", - "title": "Library Manager", - "needsOneDependency": "The library <b>{0}:{1}</b> needs another dependency currently not installed:", - "needsMultipleDependencies": "The library <b>{0}:{1}</b> needs some other dependencies currently not installed:", - "installOneMissingDependency": "Would you like to install the missing dependency?", - "installMissingDependencies": "Would you like to install all the missing dependencies?", - "dependenciesForLibrary": "Dependencies for library {0}:{1}", - "installAll": "Install all", - "installOnly": "Install {0} only", - "installedSuccessfully": "Successfully installed library {0}:{1}", - "uninstalledSuccessfully": "Successfully uninstalled library {0}:{1}" - }, - "selectZip": "Select a zip file containing the library you'd like to add", - "sketch": { - "archiveSketch": "Archive Sketch", - "saveSketchAs": "Save sketch folder as...", - "createdArchive": "Created archive '{0}'.", - "new": "New", - "openRecent": "Open Recent", - "showFolder": "Show Sketch Folder", - "sketch": "Sketch", - "moving": "Moving", - "movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?", - "cantOpen": "A folder named \"{0}\" already exists. Can't open sketch.", - "saveFolderAs": "Save sketch folder as...", - "sketchbook": "Sketchbook", - "upload": "Upload", - "uploadUsingProgrammer": "Upload Using Programmer", - "userFieldsNotFoundError": "Can't find user fields for connected board", - "doneUploading": "Done uploading.", - "configureAndUpload": "Configure And Upload", - "verifyOrCompile": "Verify/Compile", - "exportBinary": "Export Compiled Binary", - "verify": "Verify", - "doneCompiling": "Done compiling.", - "couldNotConnectToSerial": "Could not reconnect to serial port. {0}", - "openSketchInNewWindow": "Open Sketch in New Window", - "openFolder": "Open Folder", - "titleLocalSketchbook": "Local Sketchbook", - "titleSketchbook": "Sketchbook", - "close": "Are you sure you want to close the sketch?" - }, - "bootloader": { - "burnBootloader": "Burn Bootloader", - "doneBurningBootloader": "Done burning bootloader." - }, - "editor": { - "copyForForum": "Copy for Forum (Markdown)", - "commentUncomment": "Comment/Uncomment", - "increaseIndent": "Increase Indent", - "decreaseIndent": "Decrease Indent", - "increaseFontSize": "Increase Font Size", - "decreaseFontSize": "Decrease Font Size", - "autoFormat": "Auto Format" - }, - "examples": { - "menu": "Examples", - "couldNotInitializeExamples": "Could not initialize built-in examples.", - "builtInExamples": "Built-in examples", - "customLibrary": "Examples from Custom Libraries", - "for": "Examples for {0}", - "forAny": "Examples for any board" - }, - "help": { - "search": "Search on Arduino.cc", - "keyword": "Type a keyword", - "gettingStarted": "Getting Started", - "environment": "Environment", - "troubleshooting": "Troubleshooting", - "reference": "Reference", - "findInReference": "Find in Reference", - "faq": "Frequently Asked Questions", - "visit": "Visit Arduino.cc", - "privacyPolicy": "Privacy Policy" - }, - "certificate": { - "uploadRootCertificates": "Upload SSL Root Certificates", - "openContext": "Open context", - "remove": "Remove", - "upload": "Upload", - "addURL": "Add URL to fetch SSL certificate", - "enterURL": "Enter URL", - "selectCertificateToUpload": "1. Select certificate to upload", - "addNew": "Add New", - "selectDestinationBoardToUpload": "2. Select destination board and upload certificate", - "uploadingCertificates": "Uploading certificates.", - "certificatesUploaded": "Certificates uploaded.", - "uploadFailed": "Upload failed. Please try again.", - "selectBoard": "Select a board...", - "boardAtPort": "{0} at {1}", - "noSupportedBoardConnected": "No supported board connected" - }, - "firmware": { - "updater": "WiFi101 / WiFiNINA Firmware Updater", - "selectBoard": "Select Board", - "checkUpdates": "Check Updates", - "selectVersion": "Select firmware version", - "install": "Install", - "overwriteSketch": "Installation will overwrite the Sketch on the board.", - "installingFirmware": "Installing firmware.", - "successfullyInstalled": "Firmware successfully installed.", - "failedInstall": "Installation failed. Please try again." - }, - "dialog": { - "dontAskAgain": "Don't ask again" - }, - "userFields": { - "cancel": "Cancel", - "upload": "Upload" - }, - "serial": { - "toggleTimestamp": "Toggle Timestamp", - "autoscroll": "Autoscroll", - "timestamp": "Timestamp", - "noLineEndings": "No Line Ending", - "newLine": "New Line", - "carriageReturn": "Carriage Return", - "newLineCarriageReturn": "Both NL & CR", - "notConnected": "Not connected. Select a board and a port to connect automatically.", - "message": "Message ({0} + Enter to send message to '{1}' on '{2}')", - "connectionBusy": "Connection failed. Serial port is busy: {0}", - "disconnected": "Disconnected {0} from {1}.", - "unexpectedError": "Unexpected error. Reconnecting {0} on port {1}.", - "failedReconnect": "Failed to reconnect {0} to serial port after 10 consecutive attempts. The {1} serial port is busy.", - "reconnect": "Reconnecting {0} to {1} in {2} seconds..." - }, - "component": { - "uninstall": "Uninstall", - "uninstallMsg": "Do you want to uninstall {0}?", - "by": "by", - "version": "Version {0}", - "moreInfo": "More info", - "install": "INSTALL", - "filterSearch": "Filter your search..." - }, - "electron": { - "couldNotSave": "Could not save the sketch. Please copy your unsaved work into your favorite text editor, and restart the IDE.", - "unsavedChanges": "Any unsaved changes will not be saved." - }, - "compile": { - "error": "Compilation error: {0}" - }, - "upload": { - "error": "{0} error: {1}" - }, - "burnBootloader": { - "error": "Error while burning the bootloader: {0}" - } - }, - "theia": { - "core": { - "couldNotSave": "Could not save the sketch. Please copy your unsaved work into your favorite text editor, and restart the IDE.", - "offline": "Offline", - "daemonOffline": "CLI Daemon Offline", - "cannotConnectBackend": "Cannot connect to the backend.", - "cannotConnectDaemon": "Cannot connect to the CLI daemon." - }, - "debug": { - "start": "Start...", - "typeNotSupported": "The debug session type \"{0}\" is not supported.", - "startError": "There was an error starting the debug session, check the logs for more details." - }, - "editor": { - "unsavedTitle": "Unsaved – {0}" - }, - "messages": { - "expand": "Expand", - "collapse": "Collapse" - }, - "workspace": { - "fileNewName": "Name for new file", - "invalidFilename": "Invalid filename.", - "invalidExtension": ".{0} is not a valid extension", - "newFileName": "New name for file", - "deleteCurrentSketch": "Do you want to delete the current sketch?", - "sketchDirectoryError": "There was an error creating the sketch directory. See the log for more details. The application will probably not work as expected." - } - }, - "cloud": { - "GoToCloud": "GO TO CLOUD" - } -} diff --git a/i18n/ca_ES.json b/i18n/ca_ES.json index 93ba69872..f14e61cc1 100644 --- a/i18n/ca_ES.json +++ b/i18n/ca_ES.json @@ -4,166 +4,226 @@ "detail": "Versió: {0}\nData: {1}{2}\nVersió de CLI: {3}{4} [{5}]\n\n{6}", "label": "Sobre{0}" }, + "account": { + "goToCloudEditor": "Ves a l'editor del núvol", + "goToIoTCloud": "Ves al núvol de l'IoT", + "goToProfile": "Ves al perfil", + "menuTitle": "Núvol d'Arduino" + }, "board": { - "board": "Tarja{0}", - "boardConfigDialogTitle": "Select Other Board and Port", - "boardInfo": "Informació de la Tarja", - "configDialog1": "Seleccioneu una Tarja i un port si voleu carregar un programa.", - "configDialog2": "Si només seleccioneu una Tarja, podreu compilar, però no carregar el vostre programa.", - "couldNotFindPreviouslySelected": "No s'ha pogut trobar la Tarja seleccionada anteriorment '{0}' a la plataforma instal·lada '{1}'. Torneu a seleccionar manualment la tarja que voleu utilitzar. Vols tornar a seleccionar-la ara?", - "disconnected": "Disconnected", - "getBoardInfo": "Obtenir informació de la Tarja", + "board": "Placa {0}", + "boardConfigDialogTitle": "Selecciona una altra placa i port", + "boardDataReloaded": "Board data reloaded.", + "boardInfo": "Informació de la placa", + "boards": "plaques", + "configDialog1": "Selecciona una placa i un port si vols carregar un programa.", + "configDialog2": "Si només selecciones una placa, podràs compilar, però no carregar un programa.", + "couldNotFindPreviouslySelected": "No s'ha trobat la placa \"{0}\" seleccionada anteriorment en la plataforma instal·lada \"{1}\". Torna a seleccionar manualment la placa que vols utilitzar. Vols tornar-la a seleccionar ara?", + "editBoardsConfig": "Selecciona placa i port...", + "getBoardInfo": "Obtín informació de la placa", "inSketchbook": "(al quadern de programes)", - "installNow": "El nucli de \"{0} {1}\" s'ha d'instal·lar per a la Tarja \"{2}\" seleccionada actualment. Vols instal·lar-lo ara?", - "noFQBN": "El FQBN no està disponible per la Tarja seleccionada \"{0}\". Tens instal·lat el nucli corresponent?", - "noPortsDiscovered": "No ports discovered", - "noPortsSelected": "No hi ha cap port seleccionat per a la tarja: '{0}'.", - "noneSelected": "No hi ha cap tarja seleccionada.", - "openBoardsConfig": "Selecciona una altre tarja i port...", - "platformMissing": "La plataforma per a la tarja '{0}' seleccionada no està instal·lada.", - "pleasePickBoard": "Si us plau, trieu una tarja connectada al port que heu seleccionat.", + "installNow": "El nucli de \"{0} {1}\" s'ha d'instal·lar en la placa \"{2}\" seleccionada actualment. Vols instal·lar-lo ara?", + "noBoardsFound": "No s'han trobat plaques per a \"{0}\"", + "noNativeSerialPort": "No s'ha pogut obtenir informació del port série natiu.", + "noPortsDiscovered": "No s'ha trobat cap port", + "nonSerialPort": "No s'ha pogut obtenir informació del port no série.", + "openBoardsConfig": "Selecciona una altra placa i port...", + "pleasePickBoard": "Per favor, tria una placa connectada al port seleccionat.", "port": "Port {0}", - "portLabel": "Port: {0}", + "ports": "ports", "programmer": "Programador", - "reselectLater": "Torneu a seleccionar més tard", - "searchBoard": "Search board", - "selectBoard": "Seleccioneu la Tarja", - "selectBoardForInfo": "Seleccioneu una tarja per obtenir informació sobre ella.", - "selectPortForInfo": "Seleccioneu un port per obtenir la informació de la tarja.", - "showAllAvailablePorts": "Mostra tots els ports disponibles quan estiguin habilitats", + "reloadBoardData": "Reload Board Data", + "reselectLater": "Torna a triar més tard", + "revertBoardsConfig": "Fes servir ' {0} ' descobert a ' {1} '", + "searchBoard": "Busca una placa", + "selectBoard": "Tria una placa", + "selectBoardToReload": "Please select a board first.", + "selectPortForInfo": "Tria un port per obtenir informació de la placa.", + "showAllAvailablePorts": "Mostra tots els ports disponibles habilitats", + "showAllPorts": "Mostra tots els ports", "succesfullyInstalledPlatform": "Plataforma instal·lada correctament {0}:{1}", - "succesfullyUninstalledPlatform": "Plataforma desinstal·lada correctament {0}:{1}" + "succesfullyUninstalledPlatform": "Plataforma desinstal·lada correctament {0}:{1}", + "typeOfPorts": "{0} ports", + "unconfirmedBoard": "Placa no confirmada", + "unknownBoard": "Placa desconeguda" }, - "boardsManager": "Gestor de Targetes", + "boardsManager": "Gestor de plaques", "boardsType": { - "arduinoCertified": "Arduino Certified" + "arduinoCertified": "Certificat per Arduino" }, "bootloader": { "burnBootloader": "Grava el carregador d'arrencada (Bootloader)", - "burningBootloader": "Burning bootloader...", - "doneBurningBootloader": "S'ha acabat de gravar el carregador d'arrencada (Bootloader)." + "burningBootloader": "Gravant el carregador d'arrencada...", + "doneBurningBootloader": "S'ha acabat de gravar el carregador d'arrencada." }, "burnBootloader": { - "error": "Error mentre es gravava el carregador d'arrencada (Bootloader): {0} " + "error": "Error mentre es gravava el carregador d'arrencada: {0} " }, "certificate": { - "addNew": "Afegir Nou", + "addNew": "Afig nou", "addURL": "Afegeix l'URL per obtenir el certificat SSL", "boardAtPort": "{0} a {1}", "certificatesUploaded": "S'han carregat els certificats.", "enterURL": "Introduïu l'URL", - "noSupportedBoardConnected": "No hi ha cap tarja compatible connectada", + "noSupportedBoardConnected": "No hi ha cap placa compatible connectada", "openContext": "Context obert", - "remove": "Eliminar", - "selectBoard": "Seleccioneu una tarja...", + "remove": "Elimina", + "selectBoard": "Tria una placa...", "selectCertificateToUpload": "1. Seleccioneu el certificat per carregar", - "selectDestinationBoardToUpload": "2. Seleccioneu la tarja de destinació i carregueu el certificat", + "selectDestinationBoardToUpload": "2. Tria la placa de destinació i carrega el certificat", "upload": "Carrega", "uploadFailed": "La càrrega ha fallat. Si us plau, torna-ho a provar.", "uploadRootCertificates": "Carregueu els certificats arrel SSL", "uploadingCertificates": "Càrrega de certificats." }, "checkForUpdates": { - "checkForUpdates": "Check for Arduino Updates", - "installAll": "Install All", - "noUpdates": "There are no recent updates available.", - "promptUpdateBoards": "Updates are available for some of your boards.", - "promptUpdateLibraries": "Updates are available for some of your libraries.", - "updatingBoards": "Updating boards...", - "updatingLibraries": "Updating libraries..." + "checkForUpdates": "Comprovant actualitzacions d'Arduino", + "installAll": "Instal·la-ho tot", + "noUpdates": "No hi ha actualitzacions disponibles", + "promptUpdateBoards": "Algunes plaques tenen actualitzacions disponibles.", + "promptUpdateLibraries": "Algunes llibreries tenen actualitzacions disponibles.", + "updatingBoards": "Actualitzant plaques...", + "updatingLibraries": "Actualitzant llibreries..." }, "cli-error-parser": { - "keyboardError": "'Keyboard' not found. Does your sketch include the line '#include <Keyboard.h>'?", - "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" + "keyboardError": "No s'ha trobat \"Keyboard\". El teu programa té la línia \"#include <Keyboard.h>\"?", + "mouseError": "No s'ha trobat \"Mouse\". El teu programa té la línia \"#include <Mouse.h>\"?" }, "cloud": { - "account": "Account", "chooseSketchVisibility": "Trieu la visibilitat del vostre programa:", + "cloudSketchbook": "Quadern de programes del núvol", "connected": "Connectat", - "continue": "Continuar", - "donePulling": "S'ha acabat de extreure '{0}.", - "donePushing": "S'ha acabat de enviar '{0}'.", - "embed": "Incrustar:", + "continue": "Continua", + "donePulling": "Descarregat correctament \"{0}\".", + "donePushing": "Pujat correctament \"{0}\".", + "embed": "Encasta:", "emptySketchbook": "El teu quadern de programes està buit", + "goToCloud": "Ves al núvol", "learnMore": "Aprèn més", "link": "Enllaç:", - "notYetPulled": "No es pot enviar cap als núvol. Encara no ha estat baixat", + "notYetPulled": "No es pot enviar al núvol. Encara no s'ha descarregat.", "offline": "Fora de línia", - "openInCloudEditor": "Obre a l'Editor del núvol", + "openInCloudEditor": "Obri a l'editor del núvol", "options": "Opcions...", "privateVisibility": "Privat. Només tu pots veure el programa.", "profilePicture": "Imatge del perfil", "publicVisibility": "Públic. Qualsevol persona amb l'enllaç pot veure el programa.", - "pull": "Descarregar", + "pull": "Descarrega", "pullFirst": "Primer has de descarregar per poder enviar al núvol.", - "pullSketch": "Descarregar programa", - "pullSketchMsg": "Si descarregueu aquest programa del núvol, sobreescriurà la seva versió local. Esteu segur que voleu continuar?", - "push": "Enviar", - "pushSketch": "Enviar programa", - "pushSketchMsg": "Aquest és un programa públic. Abans d'enviar, assegureu-vos que qualsevol informació sensible estigui definida als fitxers arduino_secrets.h. Podeu fer un programa privat des del tauler Compartir.", + "pullSketch": "Baixa el programa", + "pullSketchMsg": "Si descarregueu aquest programa del núvol, sobreescriurà la seva versió local. Segur que vols continuar?", + "push": "Envia", + "pushSketch": "Envia el programa", + "pushSketchMsg": "Aquest és un programa públic. Abans d'enviar, assegureu-vos que qualsevol informació sensible estigui definida als fitxers arduino_secrets.h. Podeu fer un programa privat des del tauler de compartir.", "remote": "Remot", - "remoteSketchbook": "Remote Sketchbook", - "share": "Compartir...", - "shareSketch": "Compartir programa", - "showHideRemoveSketchbook": "Mostra/amaga el quadern de programes remot", - "signIn": "Inicieu sessió", - "signInToCloud": "Inicieu la sessió a Arduino Cloud", + "share": "Comparteix...", + "shareSketch": "Comparteix programa...", + "showHideSketchbook": "Mostra/Amaga el quadern de programes del núvol", + "signIn": "Inicia sessió", + "signInToCloud": "Inicia la sessió a Arduino Cloud", "signOut": "Tanca sessió", - "sync": "Sync", + "sync": "Sincronitza", "syncEditSketches": "Tanca la sessió de sincronització i edita els teus programes del núvol Arduino", "visitArduinoCloud": "Visiteu Arduino Cloud per crear programes al núvol." }, + "cloudSketch": { + "alreadyExists": "El programa del núvol \"{0}\" ja existeix.", + "creating": "Creant programa al núvol \"{0}\"...", + "new": "Programa al núvol nou", + "notFound": "No s'ha pogut baixar el programa del núvol \"{0}\". No existeix.", + "pulling": "Sincronitzant quadern de programes, descarregant \"{0}\"...", + "pushing": "Sincronitzant el quadern de programes, pujant \"{0}\"...", + "renaming": "Reanomenant el programa del núvol de \"{0}\" a \"{1}\"...", + "synchronizingSketchbook": "Sincronitzant el quadern de programes..." + }, "common": { - "all": "All", - "contributed": "Contributed", - "installManually": "Instal·la Manualment", + "all": "Tot", + "contributed": "Contribucions", + "installManually": "Instal·la manualment", "later": "Més tard", - "noBoardSelected": "No s'ha seleccionat cap tarja", + "noBoardSelected": "No s'ha seleccionat cap placa", + "noSketchOpened": "Cap sketch obert", "notConnected": "[no connectat]", "offlineIndicator": "Sembla que estàs fora de línia. Sense connexió a Internet, és possible que l'Arduino CLI no pugui descarregar els recursos necessaris i podria provocar un mal funcionament. Connecteu-vos a Internet i reinicieu l'aplicació.", - "oldFormat": "El '{0}' encara utilitza l'antic format `.pde`. Voleu canviar a la nova extensió '.ino'`?", - "partner": "Partner", + "oldFormat": "El \"{0}\" encara utilitza l'antic format \".pde\". Voleu canviar a la nova extensió \".ino\"?", + "partner": "Company", "processing": "Processant", - "recommended": "Recommended", - "retired": "Retired", + "recommended": "Recomanat", + "retired": "Retirat", + "selectManually": "Selecciona manualment", "selectedOn": "sobre {0}", "serialMonitor": "Monitor sèrie", - "type": "Type", + "type": "Tipus", "unknown": "Desconegut", - "updateable": "Updatable" + "updateable": "Actualitzable", + "userAbort": "Abortar per l'usuari" }, "compile": { "error": "Error de compilació: {0}" }, "component": { - "boardsIncluded": "Boards included in this package:", + "boardsIncluded": "Plaques incloses al paquet:", "by": "per", + "clickToOpen": "Fes clic per obrir-ho al navegador: {0}", "filterSearch": "Filtra la teva cerca...", - "install": "INSTAL·LA", + "install": "Instal·la", + "installLatest": "Instal·la l'última", + "installVersion": "Instal·la {0}", + "installed": "{0} instal·lada", "moreInfo": "Més informació", + "otherVersions": "Altres versions", + "remove": "Elimina", + "title": "{0} en {1}", "uninstall": "Desinstal·la", "uninstallMsg": "Vols desinstal·lar {0}?", - "version": "Versió {0}" + "update": "Actualitza" + }, + "configuration": { + "cli": { + "inaccessibleDirectory": "No s'ha pogut accedir a la ubicació del quadern de programes a \"{0}\": {1}" + } + }, + "connectionStatus": { + "connectionLost": "Connexió perduda. Les accions i actualitzacions del programa del núvol no estaran disponibles." }, "contributions": { "addFile": "Afegeix un fitxer", "fileAdded": "S'ha afegit un fitxer al programa.", + "plotter": { + "couldNotOpen": "No s'ha pogut obrir el gràfic sèrie" + }, "replaceTitle": "Substitueix" }, + "core": { + "compilerWarnings": { + "all": "Tot", + "default": "Per defecte", + "more": "Més", + "none": "Cap" + } + }, "coreContribution": { - "copyError": "Copy error messages", - "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." + "copyError": "Còpia els missatges d'error", + "noBoardSelected": "No s'ha seleccionat cap placa. Tria una placa Arduino des d'Eines > Plaques" }, + "createCloudCopy": "Puja el programa al núvol", "daemon": { - "restart": "Restart Daemon", - "start": "Start Daemon", - "stop": "Stop Daemon" + "restart": "Reinicia el servei", + "start": "Inicia el servei", + "stop": "Para el servei" }, "debug": { "debugWithMessage": "Depuració - {0}", "debuggingNotSupported": "La depuració no és compatible amb '{0}'", + "getDebugInfo": "Recopilant info depuració", "noPlatformInstalledFor": "La plataforma no està instal·lada per a '{0}'", - "optimizeForDebugging": "Optimitzar per a la depuració" + "optimizeForDebugging": "Optimitzar per a la depuració", + "sketchIsNotCompiled": "El programa \"{0}\" s'ha de comprovar abans de començar la depuració. Per favor, verifica el programa i comença a depurar de nou. Vols verificar el programa ara?" + }, + "developer": { + "clearBoardList": "Esborra historial del llistat de plaques", + "clearBoardsConfig": "Esborra la selecció de placa i port", + "dumpBoardList": "Dump the Board List" }, "dialog": { "dontAskAgain": "No ho tornis a preguntar" @@ -171,42 +231,38 @@ "editor": { "autoFormat": "Format automàtic", "commentUncomment": "Comenta/Descomenta", - "copyForForum": "Còpia per al fòrum (Markdown)", + "copyForForum": "Còpia per al fòrum (baix de l'últim)", "decreaseFontSize": "Disminueix la mida de la lletra", "decreaseIndent": "Disminueix el sagnat", "increaseFontSize": "Augmenta la mida de la lletra", "increaseIndent": "Augmenta el sagnat", - "nextError": "Next Error", - "previousError": "Previous Error", - "revealError": "Reveal Error" - }, - "electron": { - "couldNotSave": "No s'ha pogut desar el programa. Copieu el vostre treball no desat al vostre editor de text preferit i reinicieu l'IDE.", - "unsavedChanges": "Els canvis no desats no es desaran." + "nextError": "Següent error", + "previousError": "Error anterior", + "revealError": "Mostra l'error" }, "examples": { "builtInExamples": "Exemples incorporats", "couldNotInitializeExamples": "No es poden inicialitzar els exemples incorporats.", - "customLibrary": "Exemples de Llibreries personalitzades", - "for": "Exemples per {0}", - "forAny": "Exemples per a qualsevol tarja", + "customLibrary": "Exemples de llibreries personalitzades", + "for": "Exemples per a {0}", + "forAny": "Exemples per a qualsevol placa", "menu": "Exemples" }, "firmware": { - "checkUpdates": "Consulta les actualitzacions", + "checkUpdates": "Comprova si hi ha actualitzacions", "failedInstall": "La instal·lació ha fallat. Si us plau, torna-ho a provar.", - "install": "Instal·lar", - "installingFirmware": "Instal·lació del firmware.", - "overwriteSketch": "La instal·lació sobreescriurà el programa a la tarja.", - "selectBoard": "Seleccioneu la Tarja", - "selectVersion": "Seleccioneu la versió del firmware", - "successfullyInstalled": "El firmware s'ha instal·lat correctament.", - "updater": "Actualitzador de firmware WiFi101 / WiFiNINA" + "install": "Instal·la", + "installingFirmware": "Instal·lació de l'entorn.", + "overwriteSketch": "La instal·lació sobreescriurà el programa a la placa.", + "selectBoard": "Selecciona una placa", + "selectVersion": "Selecciona la versió de l'entorn", + "successfullyInstalled": "L'entorn s'ha instal·lat correctament.", + "updater": "Actualitzador de l'entorn WiFi101 / WiFiNINA" }, "help": { - "environment": "L'entorn", + "environment": "Entorn", "faq": "Preguntes freqüents", - "findInReference": "Cerca a Referència", + "findInReference": "Busca a les referències", "gettingStarted": "Com començar", "keyword": "Escriviu una paraula clau", "privacyPolicy": "Política de privacitat", @@ -216,209 +272,290 @@ "visit": "Visiteu Arduino.cc" }, "ide-updater": { - "checkForUpdates": "Check for Arduino IDE Updates", + "checkForUpdates": "Comprova si hi ha actualitzacions de l'IDE d'Arduino", "closeAndInstallButton": "Tanca i instal·la", "closeToInstallNotice": "Tanqueu el programari i instal·leu l'actualització a la vostra màquina.", - "downloadButton": "Descarregar", - "downloadingNotice": "Descàrrega de l'última versió de l'IDE d'Arduino.", - "errorCheckingForUpdates": "S'ha produït un error en comprovar si hi ha actualitzacions d'IDE d'Arduino. \n{0}", - "goToDownloadButton": "Vés a Descarregar", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", + "downloadButton": "Descarrega", + "downloadingNotice": "Descarregant de l'última versió de l'IDE d'Arduino.", + "errorCheckingForUpdates": "S'ha produït un error en comprovar si hi ha actualitzacions de l'IDE d'Arduino.\n{0}", + "goToDownloadButton": "Ves a descàrregues", "goToDownloadPage": "Hi ha disponible una actualització per a l'IDE d'Arduino, però no podem baixar-la i instal·lar-la automàticament. Si us plau, aneu a la pàgina de descàrrega i descarregueu-ne la darrera versió.", - "ideUpdaterDialog": "Actualització de software", - "newVersionAvailable": "Una nova versió d'Arduino IDE ({0}) està disponible per descarregar.", + "ideUpdaterDialog": "Actualització de programari", + "newVersionAvailable": "Una nova versió de l'IDE d'Arduino ({0}) està disponible per descarregar.", "noUpdatesAvailable": "No hi ha actualitzacions recents disponibles per a l'IDE d'Arduino", "notNowButton": "Ara no", "skipVersionButton": "Omet la versió", "updateAvailable": "Actualització disponible", - "versionDownloaded": "Arduino IDE {0} s'ha descarregat." + "versionDownloaded": "L'IDE d'Arduino {0} s'ha descarregat" + }, + "installable": { + "libraryInstallFailed": "Instal.lació de llibrería fallida '{0}{1}'.", + "platformInstallFailed": "Instal.lació fallida de plataforma '{0}{1}'." }, "library": { "addZip": "Afegeix llibreria .ZIP...", - "arduinoLibraries": "Llibreries Arduino", + "arduinoLibraries": "Llibreries d'Arduino", "contributedLibraries": "Llibreriess aportades", - "dependenciesForLibrary": "Dependències de la llibreria {0}:{1}", "include": "Inclou llibreria", - "installAll": "Instal·leu-ho tot", + "installAll": "Instal·la-ho tot", + "installLibraryDependencies": "Instal·la les dependències de la llibreria", "installMissingDependencies": "Voleu instal·lar totes les dependències que falten?", "installOneMissingDependency": "Voleu instal·lar la dependència que falta?", - "installOnly": "Instal·leu {0} només", + "installWithoutDependencies": "Instal·la sense les dependències", "installedSuccessfully": "Llibreria instal·lada correctament {0}:{1}", "libraryAlreadyExists": "Ja existeix una llibreria. Voleu sobreescriure-la?", - "manageLibraries": "Gestiona les Llibreries...", - "namedLibraryAlreadyExists": "Ja existeix una carpeta de llibreria anomenada {0}. Voleu sobreescriure-lo?", + "manageLibraries": "Gestiona les llibreries...", + "namedLibraryAlreadyExists": "Ja existeix una carpeta de llibreria anomenada {0}. Voleu sobreescriure-la?", "needsMultipleDependencies": "La llibreria <b>{0}: {1}</b> necessita algunes altres dependències actualment no instal·lades:", "needsOneDependency": "La llibreria<b>{0}:{1}</b> necessita una altra dependència actualment no instal·lada:", "overwriteExistingLibrary": "Voleu sobreescriure la llibreria existent?", "successfullyInstalledZipLibrary": "La llibreria s'ha instal·lat correctament des de l'arxiu {0}", - "title": "Gestor de Llibreries", + "title": "Gestor de llibreries", "uninstalledSuccessfully": "Llibreria desinstal·lada correctament {0}:{1}", "zipLibrary": "Llibreria" }, "librarySearchProperty": { - "topic": "Topic" + "topic": "Tema" }, "libraryTopic": { - "communication": "Communication", - "dataProcessing": "Data Processing", - "dataStorage": "Data Storage", - "deviceControl": "Device Control", - "display": "Display", - "other": "Other", + "communication": "Comunicació", + "dataProcessing": "Processament de dades", + "dataStorage": "Emmagatzematge de dades", + "deviceControl": "Control del dispositiu", + "display": "Pantalla", + "other": "Altres", "sensors": "Sensors", - "signalInputOutput": "Signal Input/Output", - "timing": "Timing", - "uncategorized": "Uncategorized" + "signalInputOutput": "Senyal entrada/eixida", + "timing": "Temporitzador", + "uncategorized": "Sense categoria" }, "libraryType": { - "installed": "Installed" + "installed": "Instal·lat" }, "menu": { - "advanced": "Advanced", + "advanced": "Avançat", "sketch": "Programa", "tools": "Eines" }, "monitor": { - "unableToCloseWebSocket": "Unable to close websocket", - "unableToConnectToWebSocket": "Unable to connect to websocket" + "alreadyConnectedError": "No s'ha pogut connectar al port {0} {1}. Ja està connectat.", + "baudRate": "{0}bàudis", + "connectionFailedError": "No s'ha pogut connectar al port {0} {1}.", + "connectionFailedErrorWithDetails": "{0}No s'ha pogut connectar al port {1} {2}.", + "connectionTimeout": "Temps esgotat. L'IDE no ha rebut el missatge \"correcte\" del monitor després de connectar-se a ell", + "missingConfigurationError": "No s'ha pogut connectar al port {0} {1}. Falta la configuració del monitor.", + "notConnectedError": "No connectat al port {0} {1}. ", + "unableToCloseWebSocket": "No s'ha pogut tancar la ranura web", + "unableToConnectToWebSocket": "No s'ha pogut connectar a la ranura web" + }, + "newCloudSketch": { + "newSketchTitle": "Nom del nou programa del núvol" + }, + "portProtocol": { + "network": "Xarxa", + "serial": "Sèrie" }, "preferences": { - "additionalManagerURLs": "URL addicionals del gestor de targetes", + "additionalManagerURLs": "URLs addicionals del gestor de plaques", "auth.audience": "L'audiència d'OAuth2.", "auth.clientID": "L'identificador de client OAuth2.", "auth.domain": "El domini OAuth2.", "auth.registerUri": "L'URI utilitzat per registrar un nou usuari.", "automatic": "Automàtic", - "board.certificates": "Llista de certificats que es poden carregar a les targes", + "board.certificates": "Llistat de certificats que es poden carregar a les plaques", "browse": "Navega", - "checkForUpdate": "Receive notifications of available updates for the IDE, boards, and libraries. Requires an IDE restart after change. It's true by default.", + "checkForUpdate": "Rep notificacions d'actualitzacions disponibles per a l'IDE, plaques i llibreries. Requereix reiniciar l'IDE per aplicar els canvis. Per defecte està activat.", "choose": "Tria", - "cli.daemonDebug": "Enable debug logging of the gRPC calls to the Arduino CLI. A restart of the IDE is needed for this setting to take effect. It's false by default.", - "cloud.enabled": "És cert si les funcions de sincronització del programa estan habilitades. El valor predeterminat és true.", - "cloud.pull.warn": "És cert si s'ha d'avisar als usuaris abans de baixar un programa del núvol. El valor predeterminat és true.", - "cloud.push.warn": "És cert si s'ha d'avisar als usuaris abans d'enviar un programa del núvol. El valor predeterminat és true.", - "cloud.pushpublic.warn": "És cert si s'ha d'avisar als usuaris abans d'enviar un programa públic al núvol. El valor predeterminat és true.", - "cloud.sketchSyncEndpoint": "El punt final s'utilitza per a enviar i descarregar programes des d'un backend. Per defecte apunta a l'API d'Arduino Cloud.", - "compile": "compilar", - "compile.experimental": "True if the IDE should handle multiple compiler errors. False by default", - "compile.revealRange": "Adjusts how compiler errors are revealed in the editor after a failed verify/upload. Possible values: 'auto': Scroll vertically as necessary and reveal a line. 'center': Scroll vertically as necessary and reveal a line centered vertically. 'top': Scroll vertically as necessary and reveal a line close to the top of the viewport, optimized for viewing a code definition. 'centerIfOutsideViewport': Scroll vertically as necessary and reveal a line centered vertically only if it lies outside the viewport. The default value is '{0}'.", - "compile.verbose": "Veritat per a la sortida de compilació detallada. Fals per defecte", + "cli.daemonDebug": "Activa la depuració de registre de les cridades gRPC a l'Arduino CLI. Requereix reiniciar l'IDE perquè els canvis tinguen efecte. Per defecte està desactivat.", + "cloud.enabled": "És cert si les funcions de sincronització del programa estan habilitades. Per defecte està activat.", + "cloud.pull.warn": "És cert si s'ha d'avisar als usuaris abans de baixar un programa del núvol. Per defecte està activat.", + "cloud.push.warn": "És cert si s'ha d'avisar als usuaris abans d'enviar un programa del núvol. Per defecte està activat.", + "cloud.pushpublic.warn": "És cert si s'ha d'avisar als usuaris abans d'enviar un programa públic al núvol. Per defecte està activat.", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", + "cloud.sketchSyncEndpoint": "El punt final s'utilitza per a enviar i descarregar programes des d'un administrador. Per defecte apunta a l'API d'Arduino Cloud.", + "compile": "compila", + "compile.experimental": "És cert si l'IDE gestiona múltiples errors de compilació. Per defecte està desactivat.", + "compile.revealRange": "Ajusta com els errors de compilació es mostren a l'editor després d'un error de verificació/pujada. Els possibles valors són \"auto\": Baixa verticalment si és necessari per revelar una línia. \"center\": Baixa verticalment si és necessari revelar una línia centrada verticalment. \"top\": Baixa verticalment si és necessari revelar una línia prop de la part de dalt de tot de la consola, optimitzat per veure la definició del codi. \"centerIfOutsideViewport\": Baixa verticalment si és necessari revelar una línia centrada verticalment només si se n'ix de la consola. Per defecte el valor és \"{0}\".", + "compile.verbose": "És cert si l'eixida de la compilació és detallada. Per defecte està desactivat.", "compile.warnings": "Indica a gcc quin nivell d'avís s'ha d'utilitzar. Per defecte és \"Cap\".", "compilerWarnings": "Advertències del compilador", "editorFontSize": "Mida de lletra de l'editor", "editorQuickSuggestions": "Suggeriments ràpids de l'editor", "enterAdditionalURLs": "Introduïu URL addicionals, un per a cada fila", - "files.inside.sketches": "Mostra fitxers dins del programes", + "files.inside.sketches": "Mostra fitxers dins dels programes", "ide.updateBaseUrl": "L'URL base des d'on baixar les actualitzacions. El valor per defecte és \"https://downloads.arduino.cc/arduino-ide\"", - "ide.updateChannel": "Allibera el canal per rebre actualitzacions. 'stable' és la versió estable, 'nightly' és l'última versió de desenvolupament.", + "ide.updateChannel": "Canal de novetats per rebre actualitzacions. \"stable\" és la versió estable, \"nightly\" és l'última versió de desenvolupament.", "interfaceScale": "Escala de la interfície", "invalid.editorFontSize": "Mida del tipus de lletra de l'editor no vàlida. Ha de ser un nombre enter positiu.", "invalid.sketchbook.location": "La ubicació del quadern de programes no és vàlida: {0}", "invalid.theme": "Tema no vàlid.", + "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", "language.log": "És cert si el servidor d'idiomes Arduino hauria de generar fitxers de registre a la carpeta de programes. En cas contrari, fals. És fals per defecte.", - "language.realTimeDiagnostics": "If true, the language server provides real-time diagnostics when typing in the editor. It's false by default.", + "language.realTimeDiagnostics": "Si està activat, el servidor d'idiomes ofereix diagnòstics en temps real mentre s'escriu. Per defecte està desactivat.", "manualProxy": "Configuració manual del proxy", + "monitor": { + "dockPanel": "The area of the application shell where the _{0}_ widget will reside. It is either \"bottom\" or \"right\". It defaults to \"{1}\"." + }, "network": "Xarxa", "newSketchbookLocation": "Seleccioneu una ubicació nova del quadern de programes", + "noCliConfig": "No s'ha pogut carregar la configuració del CLI", "noProxy": "Sense proxy", + "proxySettings": { + "hostname": "Nom de l'hostatge", + "password": "Contrasenya", + "port": "Número de port", + "username": "Nom d'usuari" + }, "showVerbose": "Mostra la sortida detallada durant", + "sketch": { + "inoBlueprint": "Ruta del sistema d'arxius absolut per als fitxers per defecte \".ino\". Si s'especifica, el contingut dels fitxers s'utilitzarà per als nous programes creats per l'IDE. Si no, els programes es generaran amb el contingut per defecte d'Arduino. Els fitxers inaccessibles seran ignorats. **Es requereix reiniciar l'IDE** perquè els canvis tinguen efecte." + }, "sketchbook.location": "Ubicació del quadern de programes", - "sketchbook.showAllFiles": "True per mostrar tots els fitxers del programa dins del programa. És fals per defecte.", - "survey.notification": "True if users should be notified if a survey is available. True by default.", - "unofficialBoardSupport": "Feu clic per obtenir una llista d'URL de suport de targetes no oficials", - "upload": "carregar", - "upload.verbose": "True per a la sortida detallada de la càrrega. Fals per defecte.", - "verifyAfterUpload": "Verifica el codi després de pujar", - "window.autoScale": "És cert si la interfície d'usuari escala automàticament amb la mida de la lletra.", - "window.zoomLevel": "Ajusteu el nivell de zoom de la finestra. La mida original és 0 i cada increment per sobre (p. ex. 1) o per sota (p. ex. -1) representa un 20% més gran o més petit. També podeu introduir decimals per ajustar el nivell de zoom amb una granularitat més fina." + "sketchbook.showAllFiles": "Si està activat es mostraran els fitxers dins del programa. Per defecte està desactivat.", + "unofficialBoardSupport": "Fes clic per obtenir una llista d'URLs de suport de plaques no oficials", + "upload": "carrega", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", + "upload.verbose": "Si està activat es mostrarà l'eixida detallada de la càrrega. Per defecte està desactivat.", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", + "verifyAfterUpload": "Verifica el codi després de pujar-lo", + "window.autoScale": "Si està activat la interfície s'escalarà automàticament amb la mida de la lletra.", + "window.zoomLevel": { + "deprecationMessage": "Obsolet. Utilitza \"window.zoomLevel\"." + } + }, + "renameCloudSketch": { + "renameSketchTitle": "Nou nom del programa del núvol" }, "replaceMsg": "Substitueix la versió existent de {0}?", "selectZip": "Seleccioneu un fitxer zip que contingui la llibreria que voleu afegir", "serial": { "autoscroll": "Desplaçament automàtic", "carriageReturn": "Retorn de carro", - "message": "Missatge ({0}+ Intro per enviar el missatge a '{1}' a '{2}')", - "newLine": "Nova Línia", + "connecting": "Connectant a \"{0}\" en \"{1}\"...", + "message": "Missatge (escriu per enviar un missatge a \"{0}\" en \"{1}\")", + "newLine": "Línia nova", "newLineCarriageReturn": "Ambdós NL & CR", "noLineEndings": "Sense final de línia", - "notConnected": "No connectat. Seleccioneu una tarja i un port per connectar-vos automàticament.", - "openSerialPlotter": "Serial Plotter", + "notConnected": "No connectat. Selecciona una placa i un port per connectar-te automàticament.", + "openSerialPlotter": "Gràfic sèrie", "timestamp": "Marca de temps", "toggleTimestamp": "Activa o desactiva la marca de temps" }, "sketch": { - "archiveSketch": "Guardar programa", + "archiveSketch": "Arxiva el programa", "cantOpen": "Ja existeix una carpeta anomenada \"{0}\". No es pot obrir el programa.", - "close": "Esteu segur que voleu tancar el programa?", - "compile": "Compiling sketch...", + "compile": "Compilant el programa...", "configureAndUpload": "Configura i puja", - "createdArchive": "S'ha creat l'arxiu '{0}'.", - "doneCompiling": "S'ha fet la compilació.", - "doneUploading": "S'ha acabat de carregar.", + "createdArchive": "S'ha creat l'arxiu \"{0}\".", + "doneCompiling": "Compilació enllestida.", + "doneUploading": "Pujada enllestida.", + "editInvalidSketchFolderLocationQuestion": "Vols provar guardant el programa en una ubicació diferent?", + "editInvalidSketchFolderQuestion": "Vols provar guardant el programa amb un nom diferent?", "exportBinary": "Exporta el binari compilat", + "invalidCloudSketchName": "El nom ha de començar amb una lletra, un número o una barra baixa, seguit per lletres, números, guions, punts i barres baixes. La llargària màxima és de 36 caràcters.", + "invalidSketchFolderLocationDetails": "No pots guardar un programa en una carpeta dins d'ell mateix.", + "invalidSketchFolderLocationMessage": "La carpeta d'ubicació del programa no és vàlida: \"{0}\"", + "invalidSketchFolderNameMessage": "El nom de la carpeta del programa no és vàlid: \"{0}\"", + "invalidSketchName": "El nom ha de començar amb una lletra, un número o una barra baixa, seguit per lletres, números, guions, punts i barres baixes. La llargària màxima és de 63 caràcters.", "moving": "Movent-se", - "movingMsg": "El fitxer \"{0}\" ha d'estar dins d'una carpeta deprograma anomenada \"{1}\".\nVoleu crear aquesta carpeta, moure el fitxer i continuar?", - "new": "Nou", - "openFolder": "Obrir carpeta", - "openRecent": "Obre Recent", - "openSketchInNewWindow": "Obriu el programa a una finestra nova", - "saveFolderAs": "Desa la carpeta de programa com a...", - "saveSketch": "Save your sketch to open it again later.", - "saveSketchAs": "Desa la carpeta de programa com a...", - "showFolder": "Mostra la carpeta de programa", + "movingMsg": "El fitxer \"{0}\" ha d'estar dins d'una carpeta anomenada \"{1}\".\nVoleu crear aquesta carpeta, moure el fitxer i continuar?", + "new": "Programa nou", + "noTrailingPeriod": "Un nom de fitxer no pot acabar amb un punt", + "openFolder": "Obri la carpeta", + "openRecent": "Obri recent", + "openSketchInNewWindow": "Obri el programa en una finestra nova", + "reservedFilename": "\"{0}\" és un nom de fitxer reservat.", + "saveFolderAs": "Desa la carpeta del programa com a...", + "saveSketch": "Guarda el fitxer per obrir-lo de nou més tard.", + "saveSketchAs": "Desa la carpeta del programa com a...", + "showFolder": "Mostra la carpeta del programa", "sketch": "Programa", + "sketchAlreadyContainsThisFileError": "L' sketch ja conté un arxiu anomenat '{0}'", + "sketchAlreadyContainsThisFileMessage": "No s'ha pogut desar l' sketch \"{0}\" com a \"{1}\". {2}", "sketchbook": "Quadern de programes", - "titleLocalSketchbook": "Quadern de programes Local", + "titleLocalSketchbook": "Quadern de programes local", "titleSketchbook": "Quadern de programes", "upload": "Carrega", - "uploadUsingProgrammer": "Càrrega mitjançant el programador", - "uploading": "Uploading...", - "userFieldsNotFoundError": "No s'han trobat camps d'usuari per a la tarja connectada", - "verify": "Verificar", - "verifyOrCompile": "Verificar/Compilar" - }, - "survey": { - "answerSurvey": "Answer survey", - "dismissSurvey": "Don't show again", - "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." + "uploadUsingProgrammer": "Carrega mitjançant el programador", + "uploading": "Carregant...", + "userFieldsNotFoundError": "No s'han trobat camps d'usuari per a la placa connectada", + "verify": "Verifica", + "verifyOrCompile": "Verifica/Compila" + }, + "sketchbook": { + "newCloudSketch": "Programa del núvol nou", + "newSketch": "Programa nou" + }, + "theme": { + "currentThemeNotFound": "No s'ha trobat el nom seleccionat: {0}. L'IDE d'Arduino ha agafat un tema compatible amb el que falta.", + "dark": "Fosc", + "deprecated": "{0} (obsolet)", + "hc": "Fosc alt contrast", + "hcLight": "Clar alt contrast", + "light": "Clar", + "user": "{0} (usuari)" + }, + "title": { + "cloud": "Núvol" + }, + "updateIndexes": { + "updateIndexes": "Actualitza els índexs", + "updateLibraryIndex": "Actualitza l'índex de la llibreria", + "updatePackageIndex": "Actualitza l'índex del paquet" }, "upload": { "error": "{0} error: {1}" }, "userFields": { - "cancel": "Cancel · lar", - "enterField": "Enter {0}", + "cancel": "Cancel·la", + "enterField": "Entra {0}", "upload": "Carrega" + }, + "validateSketch": { + "abortFixMessage": "El programa encara no és vàlid. Vols corregir els problemes persistents? Clicant \"{0}\" s'obrirà un nou programa.", + "abortFixTitle": "El programa no és vàlid", + "renameSketchFileMessage": "L'arxiu del programa \"{0}\" no es pot usar. {1} Vols reanomenar-lo ara?", + "renameSketchFileTitle": "El nom del fitxer del programa no és vàlid", + "renameSketchFolderMessage": "El programa \"{0}\" no es pot usar. {1} Per obtindre detalls del missatge, reanomena el programa. Vols reanomenar-lo ara?", + "renameSketchFolderTitle": "El nom del programa no és vàlid" + }, + "versionWelcome": { + "cancelButton": "Maybe later", + "donateButton": "Donate now", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Welcome to a new version of the Arduino IDE!", + "titleWithVersion": "Welcome to the new Arduino IDE {0}!" + }, + "workspace": { + "alreadyExists": "\"{0}\" ja existeix." } }, - "cloud": { - "GoToCloud": "VES AL NÚVOL" - }, "theia": { "core": { - "cannotConnectBackend": "No es pot connectar al backend.", - "cannotConnectDaemon": "No es pot connectar al CLI daemon.", + "cannotConnectBackend": "No es pot connectar amb l'administrador.", + "cannotConnectDaemon": "No es pot connectar amb el servei del CLI.", "couldNotSave": "No s'ha pogut desar el programa. Copieu el vostre treball no desat al vostre editor de text preferit i reinicieu l'IDE.", - "daemonOffline": "CLI Daemon fora de línia", + "daemonOffline": "El servei CLI està fora de línia", "offline": "Fora de línia", - "quitTitle": "Are you sure you want to quit?" - }, - "debug": { - "start": "Començar...", - "startError": "S'ha produït un error en iniciar la sessió de depuració, comproveu els registres per obtenir més informació.", - "typeNotSupported": "No s'admet el tipus de sessió de depuració \"{0}\"." + "offlineText": "Fora de línia", + "quitTitle": "Segur que vols eixir?" }, "editor": { "unsavedTitle": "No desat –{0}" }, "messages": { - "collapse": "Col·lapsar", + "collapse": "Col·lapsa", "expand": "Expandeix" }, "workspace": { + "deleteCloudSketch": "El programa del núvol \"{0}\" s'eliminarà per sempre dels servidors d'Arduino i de les memòries cau locals. Aquesta acció no es pot desfer. Vols eliminar el programa actual?", "deleteCurrentSketch": "Voleu eliminar el programa actual?", "fileNewName": "Nom del nou fitxer", "invalidExtension": ". {0} no és una extensió vàlida", - "invalidFilename": "El nom del fitxer no és vàlid.", "newFileName": "Nou nom per al fitxer" } } diff --git a/i18n/cs.json b/i18n/cs.json index 3d2ecdaf7..ea2270185 100644 --- a/i18n/cs.json +++ b/i18n/cs.json @@ -4,43 +4,56 @@ "detail": "Verze: {0}\nDatum: {1}[2]\nVerze CLI: {3}{4} [{5}]\n\n{6}", "label": "O {0}" }, + "account": { + "goToCloudEditor": "Otevřít v cloudovém editoru", + "goToIoTCloud": "Jít do IoT cloudu", + "goToProfile": "Jdi do profilu", + "menuTitle": "Arduino Cloud" + }, "board": { "board": "Deska {0}", - "boardConfigDialogTitle": "Select Other Board and Port", + "boardConfigDialogTitle": "Zvolit jinou desku a port", + "boardDataReloaded": "Informace o desce znovunačteny", "boardInfo": "Info o desce", - "configDialog1": "Pokud chcete nahrát sketch, musíte zvolit jak desku tak i port.", - "configDialog2": "Pokud zvolíte jen desku, budete schopni kompilovat sketch, ale nebudete ji moci nahrát do desky.", - "couldNotFindPreviouslySelected": "Dříve zvolená deska '{0}' v instalované platformě '{1}' nebyla nalezena. Zvolte prosím manuálně desku kterou chcete použít. Chcete tuto desku zvolit nyní? ", - "disconnected": "Disconnected", - "getBoardInfo": "Získat info o desce.", + "boards": "Desky", + "configDialog1": "Pokud chcete nahrát projekt do desky, musíte zvolit jak desku, tak i port.", + "configDialog2": "Pokud zvolíte pouze desku, budete schopni projekt kompilovat, ale nebudete jej moci nahrát do desky.", + "couldNotFindPreviouslySelected": "Dříve zvolená deska '{0}' v instalované platformě '{1}' nebyla nalezena. Zvolte prosím manuálně desku, kterou chcete použít. Chcete tuto desku zvolit nyní? ", + "editBoardsConfig": "Editovat Desku a Port", + "getBoardInfo": "Získat info o desce", "inSketchbook": "(v projektech)", - "installNow": "\"{0}{1}\" jádro musí být instalováno pro aktuálně zvolenou \"{2}\" desku. Chcete ho nyní nainstalovat?", - "noFQBN": "FQBN není dostupné pro zvolenou desku \"{0}\". Máte nainstalované příslušné jádro? ", - "noPortsDiscovered": "No ports discovered", - "noPortsSelected": "Nebyl zvolen port pro desku '{0}'.", - "noneSelected": "Nebyla zvolena deska.", + "installNow": "Jádro \"{0}{1}\" musí být instalováno pro aktuálně zvolenou \"{2}\" desku. Chcete ho nyní nainstalovat?", + "noBoardsFound": "Nenalezeny žádné desky pro \"{0}\"", + "noNativeSerialPort": "Fyzický sériový port, nemohu získat informace.", + "noPortsDiscovered": "Nenalezeny žádné porty", + "nonSerialPort": "Nemohu získat informace, tohle není sériový port.", "openBoardsConfig": "Zvolte jinou desku a port...", - "platformMissing": "Platforma pro zvolenou desku '{0}' není nainstalována.", "pleasePickBoard": "Vyberte prosím desku která je připojená k zvolenému portu. ", "port": "Port {0}", - "portLabel": "Port: {0}", + "ports": "porty", "programmer": "Programátor", + "reloadBoardData": "Znovunačíst údaje o desce", "reselectLater": "Zvolit později", - "searchBoard": "Search board", + "revertBoardsConfig": "Použij '{0}' objeven na '{1}'", + "searchBoard": "Vyhledat desku", "selectBoard": "Zvolit desku", - "selectBoardForInfo": "Prosím zvolte desku pro získání informací o desce.", + "selectBoardToReload": "Nejprve zvolte desku", "selectPortForInfo": "Prosím zvolte port pro získání informací o desce.", "showAllAvailablePorts": "Zobrazit všechny dostupné porty (pokud je zaškrtnuto)", + "showAllPorts": "Ukázat všechny porty", "succesfullyInstalledPlatform": "Platforma {0}:{1} byla úspěšně nainstalována.", - "succesfullyUninstalledPlatform": "Platforma {0}:{1} byla úspěšně odinstalována." + "succesfullyUninstalledPlatform": "Platforma {0}:{1} byla úspěšně odinstalována.", + "typeOfPorts": "{0}porty", + "unconfirmedBoard": "Nepotvrzená deska", + "unknownBoard": "Neznámá deska" }, "boardsManager": "Manažér desek", "boardsType": { - "arduinoCertified": "Arduino Certified" + "arduinoCertified": "Certifikováno Arduinem" }, "bootloader": { - "burnBootloader": "Nahrát zavaděč", - "burningBootloader": "Burning bootloader...", + "burnBootloader": "Vypálit zavaděč", + "burningBootloader": "Vypalování zavaděče...", "doneBurningBootloader": "Nahrání zavaděče bylo dokončeno. " }, "burnBootloader": { @@ -64,106 +77,153 @@ "uploadingCertificates": "Nahrávám certifikát." }, "checkForUpdates": { - "checkForUpdates": "Check for Arduino Updates", - "installAll": "Install All", - "noUpdates": "There are no recent updates available.", - "promptUpdateBoards": "Updates are available for some of your boards.", - "promptUpdateLibraries": "Updates are available for some of your libraries.", - "updatingBoards": "Updating boards...", - "updatingLibraries": "Updating libraries..." + "checkForUpdates": "Kontrola pro aktualizace", + "installAll": "Instalovat vše", + "noUpdates": "Nejsou k dispozici žádné aktualizace", + "promptUpdateBoards": "Pro některé z vašich desek jsou k dispozici aktualizace", + "promptUpdateLibraries": "Jsou k dispozici aktualizace pro některé z vašich knihoven", + "updatingBoards": "Aktualizuji desky...", + "updatingLibraries": "Aktualizuji knihovny..." }, "cli-error-parser": { - "keyboardError": "'Keyboard' not found. Does your sketch include the line '#include <Keyboard.h>'?", - "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" + "keyboardError": "‚Keyboard‘ nebylo nalezeno. Nechybí ve vašem projektu řádek ‚#include <Keyboard.h>‘?", + "mouseError": "‚Mouse‘ nebylo nalezeno. Nechybí ve vašem projektu řádek ‚#include <Mouse.h>‘?" }, "cloud": { - "account": "Account", - "chooseSketchVisibility": "Zvolte viditelnost sketche:", + "chooseSketchVisibility": "Zvolte viditelnost projektu:", + "cloudSketchbook": "Cloudové umístění projektů", "connected": "Připojen", "continue": "Pokračovat", - "donePulling": "Stahování dokončeno ’{0}’.", - "donePushing": "Odesílání dokončeno ‘{0}’.", + "donePulling": "Dokončeno stahování '{0}'.", + "donePushing": "Dokončeno odesílání '{0}'.", "embed": "Vložit: ", "emptySketchbook": "Umístění projektů je prázdné", + "goToCloud": "Jít na Cloud", "learnMore": "Zjistit více", "link": "Adresa: ", "notYetPulled": "Nemohu odeslat do cloudu jelikož z něj ještě nebylo staženo.", "offline": "Nepřipojen", "openInCloudEditor": "Otevřít v cloudovém editoru", "options": "Možnosti...", - "privateVisibility": "Soukromá. Pouze vy můžete vidět tuto sketch.", + "privateVisibility": "Soukromý projekt. Pouze vy jej můžete vidět.", "profilePicture": "Profilový obrázek", - "publicVisibility": "Veřejná. Kdokoli s odkazem může vidět tuto sketch.", + "publicVisibility": "Veřejný projekt. Kdokoliv s tímto odkazem jej může vidět.", "pull": "Stáhnout", "pullFirst": "Nejprve musíte stáhnout z cloudu, aby bylo možno do něj odeslat.", - "pullSketch": "Stáhnout sketch", - "pullSketchMsg": "Stažením této sketche z cloudu přepíšete její lokální verzi. Chcete opravdu pokračovat?", + "pullSketch": "Stáhnout projekt", + "pullSketchMsg": "Stažení tohoto projektu z cloudu přepíše jeho místní verzi. Jste si jisti, že chcete pokračovat?", "push": "Odeslat", - "pushSketch": "Odeslat sketch", - "pushSketchMsg": "Toto je veřejná sketch. Před odesláním se prosím ujistěte že jsou smazané citlivé informace ze souboru arduino_secrets.h . Tuto sketch můžete změnit na soukromou v panelu pro sdílení. ", + "pushSketch": "Odeslat projekt", + "pushSketchMsg": "Toto je veřejný projekt. Před odesláním se prosím ujistěte, že všechny citlivé informace ze souboru arduino_secrets.h jsou smazané. Tento projekt můžete kdykoliv učinit znovu soukromým v panelu sdílení. ", "remote": "Vzdálený", - "remoteSketchbook": "Remote Sketchbook", "share": "Sdílet...", - "shareSketch": "Sdílet sketch", - "showHideRemoveSketchbook": "Zobrazit/skrýt vzdálenou sketch", + "shareSketch": "Sdílet projekt", + "showHideSketchbook": "Zobrazit/skrýt cloudové projekty", "signIn": "Přihlásit se", "signInToCloud": "Přihlásit se do Arduino Cloud", "signOut": "Odhlásit se", - "sync": "Sync", - "syncEditSketches": "Synchronizovat a editovat sketche v Arduino Cloud", - "visitArduinoCloud": "Navštivte Arduino Cloud pro vytvoření cloudové sketche" + "sync": "Synchronizovat", + "syncEditSketches": "Synchronizujte a upravujte vaše Arduino cloudové projekty", + "visitArduinoCloud": "Navštivte Arduino Cloud pro vytvoření cloudového projektu." + }, + "cloudSketch": { + "alreadyExists": "Cloudový projekt '{0}' již existuje.", + "creating": "Vytváření cloudového projektu '{0}'…", + "new": "Nový cloudový projekt", + "notFound": "Nepodařilo se odeslat cloudový projekt '{0}'. Neexistuje.", + "pulling": "Synchronizace projektů, odesílání '{0}'…", + "pushing": "Synchronizace projektů, odesílání '{0}'…", + "renaming": "Přejmenovávání cloudového projektu z '{0}' na '{1}'…", + "synchronizingSketchbook": "Synchronizuji projekt..." }, "common": { - "all": "All", - "contributed": "Contributed", + "all": "Vše", + "contributed": "Přispěl", "installManually": "Instalovat ručně", "later": "Později", "noBoardSelected": "Nebyla zvolena deska", + "noSketchOpened": "Žádný otevřený projekt", "notConnected": "[nepřipojen]", - "offlineIndicator": "Nejspíše nejste online. Bez Internetového připojení nebude Arduino CLI schopno stáhnout potřebné zdroje a toto může způsobit chybu. Prosím připojte se k Internetu a restartujte aplikaci.", + "offlineIndicator": "Nejspíše jste offline. Bez Internetového připojení není Arduino CLI schopno stáhnout potřebné zdroje, a to může způsobit chybu. Prosím připojte se k internetu a restartujte aplikaci.", "oldFormat": "{0}používá stále starý formát `.pde`. Chcete ho převést na soubor s příponou `.ino`?", "partner": "Partner", "processing": "Zpracovávám", - "recommended": "Recommended", - "retired": "Retired", + "recommended": "Doporučené", + "retired": "Zastaralý", + "selectManually": "Zvolit ručně", "selectedOn": "zapnuto{0}", "serialMonitor": "Seriový monitor", - "type": "Type", + "type": "typ", "unknown": "Neznámý", - "updateable": "Updatable" + "updateable": "Aktualizovatelné", + "userAbort": "Přerušení uživatelem" }, "compile": { "error": "Chyba kompilace: {0}" }, "component": { - "boardsIncluded": "Boards included in this package:", + "boardsIncluded": "Desky obsažené v tomto balíku:", "by": "od", + "clickToOpen": "Klikněte pro otevření v prohlížeči: {0}", "filterSearch": "Filtrovat vyhledávání... ", "install": "Instalovat", + "installLatest": "Instalovat poslední", + "installVersion": "Instalovat {0}", + "installed": "{0} nainstalováno", "moreInfo": "Více informací", + "otherVersions": "Ostatní verze", + "remove": "Odstranit", + "title": "{0} podle {1}", "uninstall": "Odinstalovat", "uninstallMsg": "Chcete odinstalovat {0}?", - "version": "Verze {0}" + "update": "Aktualizovat" + }, + "configuration": { + "cli": { + "inaccessibleDirectory": "Nepodařilo se získat přístup k lokaci projektu v '{0}': {1}" + } + }, + "connectionStatus": { + "connectionLost": "Připojení ztraceno. Cloudové akce a aktualizace nebudou dostupné. " }, "contributions": { "addFile": "Přidat soubor", - "fileAdded": "Soubor byl přidán do sketche.", + "fileAdded": "Jeden soubor byl přidán do projektu.", + "plotter": { + "couldNotOpen": "Nepodařilo se otevřít sériový vykreslovač" + }, "replaceTitle": "Vyměnit" }, + "core": { + "compilerWarnings": { + "all": "Vše", + "default": "Výchozí", + "more": "Více", + "none": "Žádný" + } + }, "coreContribution": { - "copyError": "Copy error messages", - "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." + "copyError": "Kopírovat chybové hlášky", + "noBoardSelected": "Není vybraná žádná deska. Vyberte vaši desku z Nástroje > Deska nabídky." }, + "createCloudCopy": "Odeslat projekt do cloudu", "daemon": { - "restart": "Restart Daemon", - "start": "Start Daemon", - "stop": "Stop Daemon" + "restart": "Restartovat Daemon", + "start": "Spustit Daemon", + "stop": "Zastavit Daemon" }, "debug": { "debugWithMessage": "Debug - {0}", "debuggingNotSupported": "Debugging není podporován s '{0}'", + "getDebugInfo": "Získat informace o ladění…", "noPlatformInstalledFor": "Platforma není nainstalována pro '{0}'", - "optimizeForDebugging": "optimalizovat pro Debugging" + "optimizeForDebugging": "optimalizovat pro Debugging", + "sketchIsNotCompiled": "Projekt '{0}' musí být ověřený před zahájením relace ladění. Ověřte projekt a zahajte ladění znovu. Přejete si ověřit projekt rovnou?" + }, + "developer": { + "clearBoardList": "Vyčistit historii seznamu desek", + "clearBoardsConfig": "Vymazat výběr desky a portu", + "dumpBoardList": "Vypsat seznam desek" }, "dialog": { "dontAskAgain": "Znovu se neptat" @@ -176,13 +236,9 @@ "decreaseIndent": "Zmenšit odrážku", "increaseFontSize": "Zvýšit velikost písma", "increaseIndent": "Zvětšit odrážku", - "nextError": "Next Error", - "previousError": "Previous Error", - "revealError": "Reveal Error" - }, - "electron": { - "couldNotSave": "Nebylo možné uložit sketch. Zkopírujte prosím neuloženou práci do Vašeho oblíbeného textového editoru a restartujte IDE. ", - "unsavedChanges": "Jakékoli změny nebudou uloženy. " + "nextError": "Další chyba", + "previousError": "Předchozí chyba", + "revealError": "Zobrazit Chybu" }, "examples": { "builtInExamples": "Vestavěné příklady.", @@ -197,11 +253,11 @@ "failedInstall": "Instalace se nezdařila. Prosím zkuste to později. ", "install": "Instalovat", "installingFirmware": "Instaluji firmware.", - "overwriteSketch": "Instalace přepíše sketch na desce.", + "overwriteSketch": "Instalace přepíše projekt nahraný na desce.", "selectBoard": "Zvolit desku", "selectVersion": "Zvolit verzi firmwaru", "successfullyInstalled": "Firmware byl úspěšně nainstalován. ", - "updater": "WiFi101 / WiFiNINA Firmware Updater" + "updater": "aktualizační program firmwaru" }, "help": { "environment": "Prostředí", @@ -216,9 +272,12 @@ "visit": "Navštívit Arduino.cc" }, "ide-updater": { - "checkForUpdates": "Check for Arduino IDE Updates", + "checkForUpdates": "Zkontrolovat aktualizace", "closeAndInstallButton": "Zavřít a nainstalovat", "closeToInstallNotice": "Vypněte program a nainstalujte update na Váš stroj. ", + "donateLinkIconTitle": "otevřít stránku pro darování", + "donateLinkText": "darujte, abyste nás podpořili", + "donateText": "Open source is láska, {0}", "downloadButton": "Stáhnout", "downloadingNotice": "Stahuji poslední verzi Arduino IDE.", "errorCheckingForUpdates": "Nastala chyba při kontrole aktualizací Arduino IDE{0}", @@ -232,16 +291,20 @@ "updateAvailable": "Je dostupná aktualizace", "versionDownloaded": "Arduino IDE {0}bylo staženo." }, + "installable": { + "libraryInstallFailed": "Instalace knihovny '{0}{1}' se nezdařila. ", + "platformInstallFailed": "Instalace platformy '{0}{1}' se nezdařila. " + }, "library": { "addZip": "Přidat .ZIP knihovnu...", "arduinoLibraries": "Arduino knihovny", "contributedLibraries": "Přispěné knihovny", - "dependenciesForLibrary": "Závislosti pro knihovny {0}:{1}", "include": "Zahrnout knihovnu", "installAll": "Instalovat vše", + "installLibraryDependencies": "Instalovat závislosti knihovny", "installMissingDependencies": "Chcete nainstalovat všechny chybějící závislosti? ", "installOneMissingDependency": "Chcete nainstalovat chybějící závislost? ", - "installOnly": "Instalovat pouze {0}", + "installWithoutDependencies": "Instalovat bez závislostí", "installedSuccessfully": "Knihovna {0}:{1}byla úspěšně nainstalována", "libraryAlreadyExists": "Knihovna již existuje. Chcete jí přepsat?", "manageLibraries": "Spravovat knihovny...", @@ -255,31 +318,45 @@ "zipLibrary": "Knihovna" }, "librarySearchProperty": { - "topic": "Topic" + "topic": "Téma" }, "libraryTopic": { - "communication": "Communication", - "dataProcessing": "Data Processing", - "dataStorage": "Data Storage", - "deviceControl": "Device Control", - "display": "Display", - "other": "Other", - "sensors": "Sensors", - "signalInputOutput": "Signal Input/Output", - "timing": "Timing", - "uncategorized": "Uncategorized" + "communication": "Komunikace", + "dataProcessing": "Zpracovávání dat", + "dataStorage": "Ukládání dat", + "deviceControl": "Ovládání zařízení", + "display": "Displej", + "other": "Jiné", + "sensors": "Senzory", + "signalInputOutput": "Vstup/výstup signálu", + "timing": "Časování", + "uncategorized": "Nezařazeno" }, "libraryType": { - "installed": "Installed" + "installed": "Nainstalováno" }, "menu": { - "advanced": "Advanced", - "sketch": "Sketch", + "advanced": "Pokročilé", + "sketch": "Projekt", "tools": "Nástroje" }, "monitor": { - "unableToCloseWebSocket": "Unable to close websocket", - "unableToConnectToWebSocket": "Unable to connect to websocket" + "alreadyConnectedError": "Nepovedlo se připojit k {0} {1} portu. Již připojeno.", + "baudRate": "{0} baudů", + "connectionFailedError": "Nepovedlo se připojit k {0} {1} portu.", + "connectionFailedErrorWithDetails": "{0} Nepovedlo se připojit k {1} {2} portu.", + "connectionTimeout": "Vypršel časový limit. IDE neobdrželo od sériového monitoru zprávu o úspěchu po úspěšném připojení", + "missingConfigurationError": "Nepovedlo se připojit k {0} {1} portu. Chybí konfigurace sériového monitoru.", + "notConnectedError": "Nepřipojeno k {0} {1} portu.", + "unableToCloseWebSocket": "Nelze uzavřít websocket", + "unableToConnectToWebSocket": "Nelze se připojit k websocketu" + }, + "newCloudSketch": { + "newSketchTitle": "Název nového cloudového projektu" + }, + "portProtocol": { + "network": "Síť", + "serial": "Sériový" }, "preferences": { "additionalManagerURLs": "Další URL pro manager desek", @@ -290,96 +367,144 @@ "automatic": "Automaticky", "board.certificates": "Seznam certifikátů, které mohou být nahrány na desky", "browse": "Procházet", - "checkForUpdate": "Receive notifications of available updates for the IDE, boards, and libraries. Requires an IDE restart after change. It's true by default.", + "checkForUpdate": "Dostávejte oznámení o dostupných aktualizacích pro IDE, desky a knihovny. Po změně vyžaduje restart IDE. Ve výchozím nastavení zapnuto.", "choose": "Zvolit", - "cli.daemonDebug": "Enable debug logging of the gRPC calls to the Arduino CLI. A restart of the IDE is needed for this setting to take effect. It's false by default.", - "cloud.enabled": "Ano pokud je povolená automatická synchronizace sketche. Ano je výchozí hodnota. ", - "cloud.pull.warn": "Ano pokud by měl být uživatel varován před stahováním cloud sketche. Ano je výchozí hodnota. ", - "cloud.push.warn": "Ano pokud by měl být uživatel varován před odesláním cloud sketche. Ano je výchozí hodnota. ", - "cloud.pushpublic.warn": "Ano pokud by měl být uživatel varován před odesláním veřejné sketche do cloudu. Ano je výchozí hodnota. ", - "cloud.sketchSyncEndpoint": "Endpoint použitý pro stahování a odesílání sketchí z backendu. Ve výchozím stavu je toto směrováno na Arduino Cloud API.", + "cli.daemonDebug": "Zapnout ladící logování gRPC volání na Arduino CLI. Pro aplikaci tohoto nastavení je nutný restart IDE. Ve výchozím nastavení vypnuto.", + "cloud.enabled": "Zapnuto, pokud jsou zapnuty funkce synchonizace. Ve výchozím nastavení zapnuto.", + "cloud.pull.warn": "Zapnout, pokud uživatelé mají být varováni před stahování cloudového projektu. Ve výchozím nastavení zapnuto.", + "cloud.push.warn": "Zapnout, pokud uživatelé mají být varováni před odesláním cloudového projektu. Ve výchozím nastavení zapnuto.", + "cloud.pushpublic.warn": "Zapnout, pokud uživatelé mají být varováni před odesláním veřejného projektu do cloudu. Ve výchozím nastavení zapnuto. ", + "cloud.sharedSpaceId": "ID sdíleného prostoru Arduino Cloud, z nějž se načítají projekty. Pokud je prázdné, je vybrán váš soukromý prostor.", + "cloud.sketchSyncEndpoint": "Koncový bod používaný k odesílání a stahování projektů ze vzdáleného úložiště. Ve výchozím nastavení směřuje na API Arduino Cloud.", "compile": "kompilovat", - "compile.experimental": "True if the IDE should handle multiple compiler errors. False by default", - "compile.revealRange": "Adjusts how compiler errors are revealed in the editor after a failed verify/upload. Possible values: 'auto': Scroll vertically as necessary and reveal a line. 'center': Scroll vertically as necessary and reveal a line centered vertically. 'top': Scroll vertically as necessary and reveal a line close to the top of the viewport, optimized for viewing a code definition. 'centerIfOutsideViewport': Scroll vertically as necessary and reveal a line centered vertically only if it lies outside the viewport. The default value is '{0}'.", + "compile.experimental": "Zapnout, pokud má IDE zpracovávat více chyb kompilátoru. Ve výchozím nastavení vypnuto.", + "compile.revealRange": "Upravuje způsob, jakým jsou chyby kompilátoru zobrazeny v editoru po neúspěšném ověření/nahrání. Možné hodnoty: „auto\": Posune zobrazení svisle podle potřeby a zobrazí řádek. „center\": Posune zobrazení svisle podle potřeby a zobrazí řádek ve středu. „top\": Posune zobrazení svisle podle potřeby a zobrazí řádek blízko horní části okna, optimalizováno pro zobrazení definice kódu. „centerIfOutsideViewport\": Posune zobrazení svisle podle potřeby a zobrazí řádek ve středu pouze pokud je mimo aktuální zobrazení. Výchozí hodnota je '{0}'.", "compile.verbose": "Ano pro podrobný výstup při kompilaci. Ne je výchozí hodnota. ", "compile.warnings": "Řekne gcc který stupeň varování se má použít. \"Žádný\" je výchozí hodnota. ", "compilerWarnings": "Varování kompileru", "editorFontSize": "Editor velikosti fontu", "editorQuickSuggestions": "Rychlá nápověda v editoru", "enterAdditionalURLs": "Vložte další URL, jednu pro každý řádek", - "files.inside.sketches": "Zobrazit soubory uvnitř sketche", - "ide.updateBaseUrl": "The base URL where to download updates from. Defaults to 'https://downloads.arduino.cc/arduino-ide'", + "files.inside.sketches": "Zobrazit soubory uvnitř projektů", + "ide.updateBaseUrl": "Základní URL, z níž se stahují aktualizace. Ve výchozím nastavení: 'https://downloads.arduino.cc/arduino-ide'.", "ide.updateChannel": "Výběr kanálu pro aktualizace. 'stable' pro stabilní vydání, 'nightly' pro nejnovější vývojové verze.", - "interfaceScale": "Měřítko prostředí", + "interfaceScale": "Velikost rozhraní", "invalid.editorFontSize": "Neplatná velikost editoru písem: Toto číslo musí být kladné.", "invalid.sketchbook.location": "Neplatné umístění projektů:{0}", "invalid.theme": "Neplatné téma.", - "language.log": "Ano pokud by jazykový server pro Arduino měl generovat logovací soubory do složky se sketchi, jinak ne. Ne je výchozí hodnota.", - "language.realTimeDiagnostics": "If true, the language server provides real-time diagnostics when typing in the editor. It's false by default.", + "language.asyncWorkers": "Počet asynchronních pracovníků – async workers – používaných Arduino Language Serverem (clangd). Indexování na pozadí používá také tento počet pracovníků. Minimální hodnota je 0 a maximální 8. Při hodnotě 0 používá jazykový server všechna dostupná jádra. Výchozí hodnota je 0.", + "language.log": "Zapnout, aby Arduino Language Server vytvářel soubory `.log` do složek projektů. Jinak vypnuto. Ve výchozím nastavení vypnuto. ", + "language.realTimeDiagnostics": "Pokud je zapnuto, jazykový server poskytuje diagnostiku v reálném čase při psaní v editoru. Ve výchozím nastavení vypnuto.", "manualProxy": "Ruční nastavení proxy", + "monitor": { + "dockPanel": "Oblast aplikačního prostředí, kde bude umístěn widget _{0}_. Může být buď „bottom\" – dole – nebo „right\" – vpravo. Výchozí hodnota je „{1}\"." + }, "network": "Síť", "newSketchbookLocation": "Zvolit nové umístění projektů", + "noCliConfig": "Nepovedlo se načíst CLI konfiguraci", "noProxy": "Bez proxy", + "proxySettings": { + "hostname": "Jméno hosta", + "password": "Heslo", + "port": "Číslo portu", + "username": "Uživatelské jméno" + }, "showVerbose": "Zobrazit podrobný výstup během", - "sketchbook.location": "Umístění sketche", - "sketchbook.showAllFiles": "Ano pro zobrazení všech souborů sketche. Ne je výchozí hodnota. ", - "survey.notification": "True if users should be notified if a survey is available. True by default.", + "sketch": { + "inoBlueprint": "Cesta v souborovém systému k výchozí šabloně souborů `.ino`. Pokud je specifikována, obsah této šablony bude použit pro každý nový projekt vytvořený v IDE. Pokud není specifikována, projekty budou generovány s výchozím Arduino obsahem. Nedostupné šablony jsou ignorovány. Pro aplikaci tohoto nastavení **je potřeba restartovat IDE**." + }, + "sketchbook.location": "Umístění projektu", + "sketchbook.showAllFiles": "Zapnout zobrazování všech projektů uvnitř projektu. Ve výchozím nastavení vypnuto.", "unofficialBoardSupport": "Zde klikněte pro seznam adres neoficiálně podporovaných desek", "upload": "nahrát", + "upload.autoVerify": "Zapnout, pokud má IDE automaticky ověřit kód před nahráním. Ve výchozím nastavení zapnuto. Pokud je tato hodnota vypnuta, IDE nekompiluje kód znovu před nahráním binárního souboru na desku. Nanejvýš důrazně se doporučuje nastavit tuto hodnotu na vypnuto pouze, pokud jste si naprosto jisti tím, že víte, co děláte.", "upload.verbose": "Ano pro podrobný výstup při nahrávání. Ne je výchozí hodnota. ", + "upload.verify": "Po nahrání ověřte, že obsah paměti na desce odpovídá nahranému binárnímu souboru.", "verifyAfterUpload": "Kontrolovat kód po nahrání", "window.autoScale": "Ano pokud se měřítko uživatelského prostředí automaticky mění s velikostí písma. ", - "window.zoomLevel": "Přizpůsobení přiblížení okna. Originální velikost je 0, zvýšení (např. o 1) nebo snížení (např. o -1) znamená 20% přiblížení nebo oddálení. Můžete použít desetinná čísla pro jemnější přizpůsobení." + "window.zoomLevel": { + "deprecationMessage": "Zastaralé. Použijte místo toho 'window.zoomLevel'." + } + }, + "renameCloudSketch": { + "renameSketchTitle": "Nový název cloudového projektu" }, "replaceMsg": "Vyměnit existující verzi {0}?", "selectZip": "Zvolte ZIP soubor s knihovnou kterou chcete přidat", "serial": { "autoscroll": "Autoscroll", "carriageReturn": "Enter (CR)", - "message": "Zpráva ({0}+ Enter pro odeslání zprávy do '{1}' na '{2}')", + "connecting": "Připojování k '{0}' na '{1}'…", + "message": "Zpráva (Enter pro odeslání zprávy do '{0}' na '{1}')", "newLine": "Nový řádek (NL)", "newLineCarriageReturn": "Oba NL & CR", "noLineEndings": "Bez konce řádku", "notConnected": "Nepřipojen. Zvolte desku a port pro automatické připojení.", - "openSerialPlotter": "Serial Plotter", + "openSerialPlotter": "Sériový vykreslovač", "timestamp": "Časová značka", "toggleTimestamp": "Přepnout časovou značku" }, "sketch": { - "archiveSketch": "Archivovat sketch", - "cantOpen": "Složka s názvem \"{0}\" již existuje, proto nemohu otevřít sketch. ", - "close": "Opravdu chcete zavřít tuto sketch? ", - "compile": "Compiling sketch...", + "archiveSketch": "Archivovat projekt", + "cantOpen": "Složka s názvem \"{0}\" již existuje, proto nelze projekt otevřít. ", + "compile": "Kompiluji projekt…", "configureAndUpload": "Nastavit a nahrát", "createdArchive": "Vytvořen archív '{0}'.", "doneCompiling": "Ověřování dokončeno.", "doneUploading": "Nahrávání dokončeno. ", + "editInvalidSketchFolderLocationQuestion": "Chcete zkusit projekt uložit s jiným umístěním?", + "editInvalidSketchFolderQuestion": "Chcete zkusit projekt uložit s jiným názvem?", "exportBinary": "Exportovat kompilované soubory", + "invalidCloudSketchName": "Název musí začínat písmenem, číslicí nebo podtržítkem, za nímž následují písmena, číslice, pomlčky, tečky a podtržítka. Maximální délka názvu činí 36 znaků.", + "invalidSketchFolderLocationDetails": "Projekt nelze uložit do složky uvnitř sebe sama.", + "invalidSketchFolderLocationMessage": "Neplatné umístění složky projektu: '{0}'", + "invalidSketchFolderNameMessage": "Neplatný název složky projektu '{0}'", + "invalidSketchName": "Název musí začínat písmenem, číslicí nebo podtržítkem, za nímž následují písmena, číslice, pomlčky, tečky a podtržítka. Maximální délka názvu činí 63 znaků.", "moving": "Přesouvám", - "movingMsg": "Soubor \"{0}\" musí být uvnitř složky která je shodná názvem \"{1}\".\nVytvořit složku, přesunout tam- soubor a pokračovat? ", - "new": "Nový", + "movingMsg": "Soubor \"{0}\" musí být uvnitř složky pojmenované \"{1}\".\nVytvořit složku, přesunout do ní soubor a pokračovat?", + "new": "Nový projekt", + "noTrailingPeriod": "Název souboru nemůže končit tečkou", "openFolder": "Otevřít složku", "openRecent": "Otevřít nedávné", - "openSketchInNewWindow": "Otevřít sketch v novém okně", - "saveFolderAs": "Uložit složku sketche jako...", - "saveSketch": "Save your sketch to open it again later.", - "saveSketchAs": "Uložit složku sketche jako...", - "showFolder": "Zobrazit složku sketche", - "sketch": "Sketch", + "openSketchInNewWindow": "Otevřít projekt v novém okně", + "reservedFilename": "'{0}' je vyhrazený název souboru.", + "saveFolderAs": "Uložit projekt jako…", + "saveSketch": "Uložte svůj projekt, abyste ho mohli znovu otevřít později.", + "saveSketchAs": "Uložit složku projektu jako…", + "showFolder": "Zobrazit složku projektu", + "sketch": "Projekt", + "sketchAlreadyContainsThisFileError": "Projekt již obsahuje soubor pojmenovaný ‚{0}‘", + "sketchAlreadyContainsThisFileMessage": "Nepovedlo se uložit projekt „{0}“ jako „{1}“. {2}", "sketchbook": "Projekty", "titleLocalSketchbook": "Složka lokálních projektů", "titleSketchbook": "Projekty", "upload": "Nahrát", "uploadUsingProgrammer": "Nahrát pomocí programátoru", - "uploading": "Uploading...", + "uploading": "Nahrávám...", "userFieldsNotFoundError": "Nemohu nalézt uživatelská pole pro připojenou desku", "verify": "Ověřit", "verifyOrCompile": "Ověřit/Kompilovat" }, - "survey": { - "answerSurvey": "Answer survey", - "dismissSurvey": "Don't show again", - "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." + "sketchbook": { + "newCloudSketch": "Nový cloudový projekt", + "newSketch": "Nový projekt" + }, + "theme": { + "currentThemeNotFound": "Nelze najít aktuálně vybrané téma: {0}. Arduino IDE vybralo vestavěné téma kompatibilní s chybějícím tématem.", + "dark": "Tmavý", + "deprecated": "{0} (zastaralé)", + "hc": "Tmavý s vysokým kontrastem", + "hcLight": "Světlý s vysokým kontrastem", + "light": "Světlý", + "user": "{0} (uživatel)" + }, + "title": { + "cloud": "Cloud" + }, + "updateIndexes": { + "updateIndexes": "Aktualizovat indexy", + "updateLibraryIndex": "Aktualizovat index knihoven", + "updatePackageIndex": "Aktualizovat index balíků" }, "upload": { "error": "{0}chyba: {1}" @@ -388,24 +513,36 @@ "cancel": "Zrušit", "enterField": "Enter {0}", "upload": "Nahrát" + }, + "validateSketch": { + "abortFixMessage": "Projekt je stále neplatný. Přejete si opravit zbývající problémy? Kliknutím na '{0}' se otevře nový projekt.", + "abortFixTitle": "Neplatný projekt", + "renameSketchFileMessage": "Projekt '{0}' nelze použít. {1} Přejete si jej teď přejmenovat?", + "renameSketchFileTitle": "Neplatný název projektu", + "renameSketchFolderMessage": "Projekt '{0}' nelze použít. {1} Chcete-li se této zprávy zbavit, přejmenujte jej. Přejete si projekt teď přejmenovat?", + "renameSketchFolderTitle": "Neplatný název projektu" + }, + "versionWelcome": { + "cancelButton": "Možná později.", + "donateButton": "Darujte teď! 😀", + "donateMessage": "Arduino se zavázalo udržovat software zdarma a s otevřeným zdrojovým kódem pro všechny. Váš příspěvek nám pomáhá vyvíjet nové funkce, vylepšovat knihovny a podporovat miliony uživatelů po celém světě.", + "donateMessage2": "Zvažte prosím podporu naší práce na bezplatném a open source Arduino IDE.", + "title": "Vítejte v nové verzi Arduina IDE!", + "titleWithVersion": "Vítejte v novém Arduino IDE {0}!" + }, + "workspace": { + "alreadyExists": "'{0}' již existuje." } }, - "cloud": { - "GoToCloud": "Přejdi do Cloudu" - }, "theia": { "core": { "cannotConnectBackend": "Nebylo možné se připojit k backendu. ", "cannotConnectDaemon": "Nebylo možné se připojit k CLI Daemon.", - "couldNotSave": "Nebylo možné uložit sketch. Zkopírujte prosím neuloženou práci do Vašeho oblíbeného textového editoru a restartujte IDE. ", + "couldNotSave": "Nebylo možné projekt uložit. Zkopírujte prosím neuloženou práci do vašeho oblíbeného textového editoru a restartujte IDE. ", "daemonOffline": "CLI Daemon nepřipojen", "offline": "Nepřipojen", - "quitTitle": "Are you sure you want to quit?" - }, - "debug": { - "start": "Start...", - "startError": "Vyskytla se chyba při spouštění debugovacího spojení, zkontrolujte prosím log pro více informací. ", - "typeNotSupported": "Typ \"{0}\" debugovacího spojení není podporován, " + "offlineText": "Nepřipojen", + "quitTitle": "Jste si jisti že chcete odejít" }, "editor": { "unsavedTitle": "Neuloženo – {0}" @@ -415,10 +552,10 @@ "expand": "Rozšířit" }, "workspace": { - "deleteCurrentSketch": "Opravdu chcete vymazat aktuální sketch? ", + "deleteCloudSketch": "Cloudový projekt '{0}' bude navždy smazán z Arduino serverů a místní mezipaměti. Tato akce je nevratná. Přejete si pokračovat?", + "deleteCurrentSketch": "Projekt '{0}' bude navždy smazán. Tato akce je nevratná. Přejete si pokračovat?", "fileNewName": "Název pro nový soubor", "invalidExtension": ".{0}je neplatná přípona", - "invalidFilename": "Neplatný název souboru.", "newFileName": "Nový název souboru" } } diff --git a/i18n/uz.json b/i18n/da.json similarity index 54% rename from i18n/uz.json rename to i18n/da.json index 19a3645e0..b07fbd894 100644 --- a/i18n/uz.json +++ b/i18n/da.json @@ -1,41 +1,59 @@ { "arduino": { "about": { - "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}{4} [{5}]\n\n{6}", - "label": "About {0}" + "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", + "label": "Om 1{0}" + }, + "account": { + "goToCloudEditor": "Gå til Cloud Editor", + "goToIoTCloud": "Gå til IoT Cloud", + "goToProfile": "Gå til Profil", + "menuTitle": "Arduino Cloud" }, "board": { "board": "Board{0}", - "boardInfo": "Board Info", - "configDialog1": "Select both a Board and a Port if you want to upload a sketch.", - "configDialog2": "If you only select a Board you will be able to compile, but not to upload your sketch.", - "configDialogTitle": "Select Other Board & Port", - "couldNotFindPreviouslySelected": "Could not find previously selected board '{0}' in installed platform '{1}'. Please manually reselect the board you want to use. Do you want to reselect it now?", - "disconnected": "Disconnected", - "getBoardInfo": "Get Board Info", - "inSketchbook": " (in Sketchbook)", - "installManually": "Install Manually", - "installNow": "The \"{0} {1}\" core has to be installed for the currently selected \"{2}\" board. Do you want to install it now?", - "noFQBN": "The FQBN is not available for the selected board \"{0}\". Do you have the corresponding core installed?", - "noPortsSelected": "No ports selected for board: '{0}'.", - "noneSelected": "No boards selected.", + "boardConfigDialogTitle": "Vælg andet Board og Port", + "boardDataReloaded": "Board data genhentet", + "boardInfo": "Board info", + "boards": "Boards", + "configDialog1": "Vælg både et Board og en Port, hvis du ønsker at oploade en skitse", + "configDialog2": "Hvis du kun vælger et Board, vil du kunne kompilere, men ikke uploade din skitse.", + "couldNotFindPreviouslySelected": "Kunne ikke finde tidligere valgte board '1 {0}' i installerede platform '2 {1}'. Vælg venligst det board du ønsker at anvende. Ønsker du at vælge det nu?", + "editBoardsConfig": "Ret Board og Port...", + "getBoardInfo": "Hent Board info", + "inSketchbook": "(I skitsebog)", + "installNow": "\" 1 {0} 2 {1} \" kerne skal installeres for det nuværende valgte \" 3 {2}\" board. Vil du installere det nu?", + "noBoardsFound": "Intet board fundet for \" 1 {0} \"", + "noNativeSerialPort": "Native serial port, can't obtain info.", + "noPortsDiscovered": "No ports discovered", + "nonSerialPort": "Non-serial port, can't obtain info.", "openBoardsConfig": "Select other board and port…", - "platformMissing": "The platform for the selected '{0}' board is not installed.", "pleasePickBoard": "Please pick a board connected to the port you have selected.", "port": "Port{0}", - "portLabel": "Port: {0}", + "ports": "ports", "programmer": "Programmer", + "reloadBoardData": "Reload Board Data", "reselectLater": "Reselect later", + "revertBoardsConfig": "Use '{0}' discovered on '{1}'", + "searchBoard": "Search board", "selectBoard": "Select Board", - "selectBoardForInfo": "Please select a board to obtain board info.", + "selectBoardToReload": "Please select a board first.", "selectPortForInfo": "Please select a port to obtain board info.", "showAllAvailablePorts": "Shows all available ports when enabled", + "showAllPorts": "Show all ports", "succesfullyInstalledPlatform": "Successfully installed platform {0}:{1}", - "succesfullyUninstalledPlatform": "Successfully uninstalled platform {0}:{1}" + "succesfullyUninstalledPlatform": "Successfully uninstalled platform {0}:{1}", + "typeOfPorts": "{0} ports", + "unconfirmedBoard": "Unconfirmed board", + "unknownBoard": "Unknown board" }, "boardsManager": "Boards Manager", + "boardsType": { + "arduinoCertified": "Arduino Certified" + }, "bootloader": { "burnBootloader": "Burn Bootloader", + "burningBootloader": "Burning bootloader...", "doneBurningBootloader": "Done burning bootloader." }, "burnBootloader": { @@ -58,19 +76,29 @@ "uploadRootCertificates": "Upload SSL Root Certificates", "uploadingCertificates": "Uploading certificates." }, + "checkForUpdates": { + "checkForUpdates": "Check for Arduino Updates", + "installAll": "Install All", + "noUpdates": "There are no recent updates available.", + "promptUpdateBoards": "Updates are available for some of your boards.", + "promptUpdateLibraries": "Updates are available for some of your libraries.", + "updatingBoards": "Updating boards...", + "updatingLibraries": "Updating libraries..." + }, "cli-error-parser": { "keyboardError": "'Keyboard' not found. Does your sketch include the line '#include <Keyboard.h>'?", "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" }, "cloud": { - "account": "Account", "chooseSketchVisibility": "Choose visibility of your Sketch:", + "cloudSketchbook": "Cloud Sketchbook", "connected": "Connected", "continue": "Continue", - "donePulling": "Done pulling ‘{0}’.", - "donePushing": "Done pushing ‘{0}’.", + "donePulling": "Done pulling '{0}'.", + "donePushing": "Done pushing '{0}'.", "embed": "Embed:", "emptySketchbook": "Your Sketchbook is empty", + "goToCloud": "Go to Cloud", "learnMore": "Learn more", "link": "Link:", "notYetPulled": "Cannot push to Cloud. It is not yet pulled.", @@ -88,10 +116,9 @@ "pushSketch": "Push Sketch", "pushSketchMsg": "This is a Public Sketch. Before pushing, make sure any sensitive information is defined in arduino_secrets.h files. You can make a Sketch private from the Share panel.", "remote": "Remote", - "remoteSketchbook": "Remote Sketchbook", "share": "Share...", "shareSketch": "Share Sketch", - "showHideRemoveSketchbook": "Show/Hide Remote Sketchbook", + "showHideSketchbook": "Show/Hide Cloud Sketchbook", "signIn": "SIGN IN", "signInToCloud": "Sign in to Arduino Cloud", "signOut": "Sign Out", @@ -99,38 +126,87 @@ "syncEditSketches": "Sync and edit your Arduino Cloud Sketches", "visitArduinoCloud": "Visit Arduino Cloud to create Cloud Sketches." }, + "cloudSketch": { + "alreadyExists": "Cloud sketch '{0}' already exists.", + "creating": "Creating cloud sketch '{0}'...", + "new": "New Cloud Sketch", + "notFound": "Could not pull the cloud sketch '{0}'. It does not exist.", + "pulling": "Synchronizing sketchbook, pulling '{0}'...", + "pushing": "Synchronizing sketchbook, pushing '{0}'...", + "renaming": "Renaming cloud sketch from '{0}' to '{1}'...", + "synchronizingSketchbook": "Synchronizing sketchbook..." + }, "common": { + "all": "All", + "contributed": "Contributed", + "installManually": "Install Manually", "later": "Later", "noBoardSelected": "No board selected", + "noSketchOpened": "No sketch opened", "notConnected": "[not connected]", "offlineIndicator": "You appear to be offline. Without an Internet connection, the Arduino CLI might not be able to download the required resources and could cause malfunction. Please connect to the Internet and restart the application.", "oldFormat": "The '{0}' still uses the old `.pde` format. Do you want to switch to the new `.ino` extension?", + "partner": "Partner", "processing": "Processing", - "selectBoard": "Select Board", + "recommended": "Recommended", + "retired": "Retired", + "selectManually": "Select Manually", "selectedOn": "on {0}", "serialMonitor": "Serial Monitor", - "unknown": "Unknown" + "type": "Type", + "unknown": "Unknown", + "updateable": "Updatable", + "userAbort": "User abort" }, "compile": { "error": "Compilation error: {0}" }, "component": { + "boardsIncluded": "Boards included in this package:", "by": "by", + "clickToOpen": "Click to open in browser: {0}", "filterSearch": "Filter your search...", - "install": "INSTALL", + "install": "Install", + "installLatest": "Install Latest", + "installVersion": "Install {0}", + "installed": "{0} installed", "moreInfo": "More info", + "otherVersions": "Other Versions", + "remove": "Remove", + "title": "{0} by {1}", "uninstall": "Uninstall", "uninstallMsg": "Do you want to uninstall {0}?", - "version": "Version {0}" + "update": "Update" + }, + "configuration": { + "cli": { + "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" + } + }, + "connectionStatus": { + "connectionLost": "Connection lost. Cloud sketch actions and updates won't be available." }, "contributions": { "addFile": "Add File", "fileAdded": "One file added to the sketch.", + "plotter": { + "couldNotOpen": "Couldn't open serial plotter" + }, "replaceTitle": "Replace" }, + "core": { + "compilerWarnings": { + "all": "All", + "default": "Default", + "more": "More", + "none": "None" + } + }, "coreContribution": { - "copyError": "Copy error messages" + "copyError": "Copy error messages", + "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." }, + "createCloudCopy": "Push Sketch to Cloud", "daemon": { "restart": "Restart Daemon", "start": "Start Daemon", @@ -139,8 +215,15 @@ "debug": { "debugWithMessage": "Debug - {0}", "debuggingNotSupported": "Debugging is not supported by '{0}'", + "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "Platform is not installed for '{0}'", - "optimizeForDebugging": "Optimize for Debugging" + "optimizeForDebugging": "Optimize for Debugging", + "sketchIsNotCompiled": "Sketch '{0}' must be verified before starting a debug session. Please verify the sketch and start debugging again. Do you want to verify the sketch now?" + }, + "developer": { + "clearBoardList": "Clear the Board List History", + "clearBoardsConfig": "Clear the Board and Port Selection", + "dumpBoardList": "Dump the Board List" }, "dialog": { "dontAskAgain": "Don't ask again" @@ -154,11 +237,8 @@ "increaseFontSize": "Increase Font Size", "increaseIndent": "Increase Indent", "nextError": "Next Error", - "previousError": "Previous Error" - }, - "electron": { - "couldNotSave": "Could not save the sketch. Please copy your unsaved work into your favorite text editor, and restart the IDE.", - "unsavedChanges": "Any unsaved changes will not be saved." + "previousError": "Previous Error", + "revealError": "Reveal Error" }, "examples": { "builtInExamples": "Built-in examples", @@ -177,7 +257,7 @@ "selectBoard": "Select Board", "selectVersion": "Select firmware version", "successfullyInstalled": "Firmware successfully installed.", - "updater": "WiFi101 / WiFiNINA Firmware Updater" + "updater": "Firmware Updater" }, "help": { "environment": "Environment", @@ -192,9 +272,12 @@ "visit": "Visit Arduino.cc" }, "ide-updater": { - "checkForUpdates": "Check for Arduino IDE updates", + "checkForUpdates": "Check for Arduino IDE Updates", "closeAndInstallButton": "Close and Install", "closeToInstallNotice": "Close the software and install the update on your machine.", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", "downloadButton": "Download", "downloadingNotice": "Downloading the latest version of the Arduino IDE.", "errorCheckingForUpdates": "Error while checking for Arduino IDE updates.\n{0}", @@ -208,16 +291,20 @@ "updateAvailable": "Update Available", "versionDownloaded": "Arduino IDE {0} has been downloaded." }, + "installable": { + "libraryInstallFailed": "Failed to install library: '{0}{1}'.", + "platformInstallFailed": "Failed to install platform: '{0}{1}'." + }, "library": { "addZip": "Add .ZIP Library...", "arduinoLibraries": "Arduino libraries", "contributedLibraries": "Contributed libraries", - "dependenciesForLibrary": "Dependencies for library {0}:{1}", "include": "Include Library", - "installAll": "Install all", + "installAll": "Install All", + "installLibraryDependencies": "Install library dependencies", "installMissingDependencies": "Would you like to install all the missing dependencies?", "installOneMissingDependency": "Would you like to install the missing dependency?", - "installOnly": "Install {0} only", + "installWithoutDependencies": "Install without dependencies", "installedSuccessfully": "Successfully installed library {0}:{1}", "libraryAlreadyExists": "A library already exists. Do you want to overwrite it?", "manageLibraries": "Manage Libraries...", @@ -230,15 +317,47 @@ "uninstalledSuccessfully": "Successfully uninstalled library {0}:{1}", "zipLibrary": "Library" }, + "librarySearchProperty": { + "topic": "Topic" + }, + "libraryTopic": { + "communication": "Communication", + "dataProcessing": "Data Processing", + "dataStorage": "Data Storage", + "deviceControl": "Device Control", + "display": "Display", + "other": "Other", + "sensors": "Sensors", + "signalInputOutput": "Signal Input/Output", + "timing": "Timing", + "uncategorized": "Uncategorized" + }, + "libraryType": { + "installed": "Installed" + }, "menu": { "advanced": "Advanced", "sketch": "Sketch", "tools": "Tools" }, "monitor": { + "alreadyConnectedError": "Could not connect to {0} {1} port. Already connected.", + "baudRate": "{0} baud", + "connectionFailedError": "Could not connect to {0} {1} port.", + "connectionFailedErrorWithDetails": "{0} Could not connect to {1} {2} port.", + "connectionTimeout": "Timeout. The IDE has not received the 'success' message from the monitor after successfully connecting to it", + "missingConfigurationError": "Could not connect to {0} {1} port. The monitor configuration is missing.", + "notConnectedError": "Not connected to {0} {1} port.", "unableToCloseWebSocket": "Unable to close websocket", "unableToConnectToWebSocket": "Unable to connect to websocket" }, + "newCloudSketch": { + "newSketchTitle": "Name of the new Cloud Sketch" + }, + "portProtocol": { + "network": "Network", + "serial": "Serial" + }, "preferences": { "additionalManagerURLs": "Additional Boards Manager URLs", "auth.audience": "The OAuth2 audience.", @@ -248,12 +367,14 @@ "automatic": "Automatic", "board.certificates": "List of certificates that can be uploaded to boards", "browse": "Browse", + "checkForUpdate": "Receive notifications of available updates for the IDE, boards, and libraries. Requires an IDE restart after change. It's true by default.", "choose": "Choose", "cli.daemonDebug": "Enable debug logging of the gRPC calls to the Arduino CLI. A restart of the IDE is needed for this setting to take effect. It's false by default.", "cloud.enabled": "True if the sketch sync functions are enabled. Defaults to true.", "cloud.pull.warn": "True if users should be warned before pulling a cloud sketch. Defaults to true.", "cloud.push.warn": "True if users should be warned before pushing a cloud sketch. Defaults to true.", "cloud.pushpublic.warn": "True if users should be warned before pushing a public sketch to the cloud. Defaults to true.", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", "cloud.sketchSyncEndpoint": "The endpoint used to push and pull sketches from a backend. By default it points to Arduino Cloud API.", "compile": "compile", "compile.experimental": "True if the IDE should handle multiple compiler errors. False by default", @@ -271,29 +392,50 @@ "invalid.editorFontSize": "Invalid editor font size. It must be a positive integer.", "invalid.sketchbook.location": "Invalid sketchbook location: {0}", "invalid.theme": "Invalid theme.", + "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", "language.log": "True if the Arduino Language Server should generate log files into the sketch folder. Otherwise, false. It's false by default.", "language.realTimeDiagnostics": "If true, the language server provides real-time diagnostics when typing in the editor. It's false by default.", "manualProxy": "Manual proxy configuration", + "monitor": { + "dockPanel": "The area of the application shell where the _{0}_ widget will reside. It is either \"bottom\" or \"right\". It defaults to \"{1}\"." + }, "network": "Network", "newSketchbookLocation": "Select new sketchbook location", + "noCliConfig": "Could not load the CLI configuration", "noProxy": "No proxy", + "proxySettings": { + "hostname": "Host name", + "password": "Password", + "port": "Port number", + "username": "Username" + }, "showVerbose": "Show verbose output during", + "sketch": { + "inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect." + }, "sketchbook.location": "Sketchbook location", "sketchbook.showAllFiles": "True to show all sketch files inside the sketch. It is false by default.", - "survey.notification": "True if users should be notified if a survey is available. True by default.", "unofficialBoardSupport": "Click for a list of unofficial board support URLs", "upload": "upload", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", "upload.verbose": "True for verbose upload output. False by default.", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "Verify code after upload", "window.autoScale": "True if the user interface automatically scales with the font size.", - "window.zoomLevel": "Adjust the zoom level of the window. The original size is 0 and each increment above (e.g. 1) or below (e.g. -1) represents zooming 20% larger or smaller. You can also enter decimals to adjust the zoom level with a finer granularity." + "window.zoomLevel": { + "deprecationMessage": "Deprecated. Use 'window.zoomLevel' instead." + } + }, + "renameCloudSketch": { + "renameSketchTitle": "New name of the Cloud Sketch" }, "replaceMsg": "Replace the existing version of {0}?", "selectZip": "Select a zip file containing the library you'd like to add", "serial": { "autoscroll": "Autoscroll", "carriageReturn": "Carriage Return", - "message": "Message ({0} + Enter to send message to '{1}' on '{2}')", + "connecting": "Connecting to '{0}' on '{1}'...", + "message": "Message (Enter to send message to '{0}' on '{1}')", "newLine": "New Line", "newLineCarriageReturn": "Both NL & CR", "noLineEndings": "No Line Ending", @@ -305,48 +447,93 @@ "sketch": { "archiveSketch": "Archive Sketch", "cantOpen": "A folder named \"{0}\" already exists. Can't open sketch.", - "close": "Are you sure you want to close the sketch?", - "configureAndUpload": "Configure And Upload", + "compile": "Compiling sketch...", + "configureAndUpload": "Configure and Upload", "createdArchive": "Created archive '{0}'.", "doneCompiling": "Done compiling.", "doneUploading": "Done uploading.", + "editInvalidSketchFolderLocationQuestion": "Do you want to try saving the sketch to a different location?", + "editInvalidSketchFolderQuestion": "Do you want to try saving the sketch with a different name?", "exportBinary": "Export Compiled Binary", + "invalidCloudSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", + "invalidSketchFolderLocationDetails": "You cannot save a sketch into a folder inside itself.", + "invalidSketchFolderLocationMessage": "Invalid sketch folder location: '{0}'", + "invalidSketchFolderNameMessage": "Invalid sketch folder name: '{0}'", + "invalidSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", "moving": "Moving", "movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?", - "new": "New", + "new": "New Sketch", + "noTrailingPeriod": "A filename cannot end with a dot", "openFolder": "Open Folder", "openRecent": "Open Recent", "openSketchInNewWindow": "Open Sketch in New Window", + "reservedFilename": "'{0}' is a reserved filename.", "saveFolderAs": "Save sketch folder as...", + "saveSketch": "Save your sketch to open it again later.", "saveSketchAs": "Save sketch folder as...", - "saveTempSketch": "Save your sketch to open it again later.", "showFolder": "Show Sketch Folder", "sketch": "Sketch", + "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", + "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", "sketchbook": "Sketchbook", "titleLocalSketchbook": "Local Sketchbook", "titleSketchbook": "Sketchbook", "upload": "Upload", "uploadUsingProgrammer": "Upload Using Programmer", + "uploading": "Uploading...", "userFieldsNotFoundError": "Can't find user fields for connected board", "verify": "Verify", "verifyOrCompile": "Verify/Compile" }, - "survey": { - "answerSurvey": "Answer survey", - "dismissSurvey": "Don't show again", - "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." + "sketchbook": { + "newCloudSketch": "New Cloud Sketch", + "newSketch": "New Sketch" + }, + "theme": { + "currentThemeNotFound": "Could not find the currently selected theme: {0}. Arduino IDE has picked a built-in theme compatible with the missing one.", + "dark": "Dark", + "deprecated": "{0} (deprecated)", + "hc": "Dark High Contrast", + "hcLight": "Light High Contrast", + "light": "Light", + "user": "{0} (user)" + }, + "title": { + "cloud": "Cloud" + }, + "updateIndexes": { + "updateIndexes": "Update Indexes", + "updateLibraryIndex": "Update Library Index", + "updatePackageIndex": "Update Package Index" }, "upload": { "error": "{0} error: {1}" }, "userFields": { "cancel": "Cancel", + "enterField": "Enter {0}", "upload": "Upload" + }, + "validateSketch": { + "abortFixMessage": "The sketch is still invalid. Do you want to fix the remaining problems? By clicking '{0}', a new sketch will open.", + "abortFixTitle": "Invalid sketch", + "renameSketchFileMessage": "The sketch file '{0}' cannot be used. {1} Do you want to rename the sketch file now?", + "renameSketchFileTitle": "Invalid sketch filename", + "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", + "renameSketchFolderTitle": "Invalid sketch name" + }, + "versionWelcome": { + "cancelButton": "Maybe later", + "donateButton": "Donate now", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Welcome to a new version of the Arduino IDE!", + "titleWithVersion": "Welcome to the new Arduino IDE {0}!" + }, + "workspace": { + "alreadyExists": "'{0}' already exists." } }, - "cloud": { - "GoToCloud": "GO TO CLOUD" - }, "theia": { "core": { "cannotConnectBackend": "Cannot connect to the backend.", @@ -354,14 +541,9 @@ "couldNotSave": "Could not save the sketch. Please copy your unsaved work into your favorite text editor, and restart the IDE.", "daemonOffline": "CLI Daemon Offline", "offline": "Offline", - "quitMessage": "Any unsaved changes will not be saved.", + "offlineText": "Offline", "quitTitle": "Are you sure you want to quit?" }, - "debug": { - "start": "Start...", - "startError": "There was an error starting the debug session, check the logs for more details.", - "typeNotSupported": "The debug session type \"{0}\" is not supported." - }, "editor": { "unsavedTitle": "Unsaved – {0}" }, @@ -370,10 +552,10 @@ "expand": "Expand" }, "workspace": { - "deleteCurrentSketch": "Do you want to delete the current sketch?", + "deleteCloudSketch": "The cloud sketch '{0}' will be permanently deleted from the Arduino servers and the local caches. This action is irreversible. Do you want to delete the current sketch?", + "deleteCurrentSketch": "The sketch '{0}' will be permanently deleted. This action is irreversible. Do you want to delete the current sketch?", "fileNewName": "Name for new file", "invalidExtension": ".{0} is not a valid extension", - "invalidFilename": "Invalid filename.", "newFileName": "New name for file" } } diff --git a/i18n/de.json b/i18n/de.json index b2fb2cae6..0404d0bf5 100644 --- a/i18n/de.json +++ b/i18n/de.json @@ -1,213 +1,269 @@ { "arduino": { "about": { - "detail": "Version: {0}\nDatum: {1}{2}\nCLI Version: {3}{4} [{5}]\n\n{6}", + "detail": "Version: {0}\nDatum: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "Über {0}" }, + "account": { + "goToCloudEditor": "Zum Cloud-Editor", + "goToIoTCloud": "Zur IoT-Cloud", + "goToProfile": "Profil aufrufen", + "menuTitle": "Arduino-Cloud" + }, "board": { "board": "Board{0}", - "boardConfigDialogTitle": "Select Other Board and Port", + "boardConfigDialogTitle": "Andere Boards und Ports wählen", + "boardDataReloaded": "Board Daten neu gelesen.", "boardInfo": "Board-Informationen", - "configDialog1": "Wählen Sie ein Board und einen Port, wenn Sie den Sketch hochladen möchten.", - "configDialog2": "Wenn Sie nur ein Board auswählen, werden Sie den Sketch nur kompilieren können, jedoch nicht hochladen.", - "couldNotFindPreviouslySelected": "Zuvor gewähltes Board '{0}' wurde nicht in der installierten Plaftform '{1}' gefunden. Bitte Board erneut auswählen. Jetzt auswählen?", - "disconnected": "Disconnected", - "getBoardInfo": "Board-Informationen abrufen", + "boards": "Boards", + "configDialog1": " Wähle ein Board und einen Port, wenn du den Sketch hochladen möchtest.", + "configDialog2": " Wenn du nur das Board und keinen Port wählst, kannst du den Sketch kompilieren, aber nicht hochladen.", + "couldNotFindPreviouslySelected": " Das vorher gewählte Board '{0}' gehört nicht zur installierten Plattform '{1}'. Möchtest du das Board neu auswählen?", + "editBoardsConfig": "Board und Port ändern...", + "getBoardInfo": "Board-Infos abrufen", "inSketchbook": "(im Sketchbook)", - "installNow": "Der \"{0} {1}\" Core muss für das ausgewählte \"{2}\" Board installiert werden. Jetzt installieren?", - "noFQBN": "Der FQBN ist für das gewählte Board \"{0}\" nicht verfügbar. Wurde der zugehörige Core installiert?", - "noPortsDiscovered": "No ports discovered", - "noPortsSelected": "Kein Port für das Board : '{0}' ausgewählt.", - "noneSelected": "Kein Board ausgewählt.", - "openBoardsConfig": "Wähle einen anderes Board und einen anderen Port...", - "platformMissing": "Die Plattform für das gewählte '{0}' Board ist nicht installiert.", - "pleasePickBoard": "Bitte wählen Sie das Board, welches am ausgewählten Port angeschlossen ist.", + "installNow": " Der Core \"{0}{1}\" muss für das ausgewählte Board \"{2}\" installiert werden. Möchtest du jetzt installieren?", + "noBoardsFound": "Für \"{0}\" wurden keine Boards gefunden.", + "noNativeSerialPort": " Nativer serieller Port, keine Infos verfügbar.", + "noPortsDiscovered": "Keine Ports gefunden", + "nonSerialPort": " Nicht-serieller Port, keine Infos verfügbar.", + "openBoardsConfig": " Wähle ein anderes Board und einen anderen Port ...", + "pleasePickBoard": " Wähle bitte ein Board, das am angegebenen Port angeschlossen ist.", "port": "Port{0}", - "portLabel": "Port: {0}", + "ports": "Ports", "programmer": "Programmer", + "reloadBoardData": "Board Daten neuladen", "reselectLater": "Später auswählen", - "searchBoard": "Search board", + "revertBoardsConfig": "'{0}' an '{1}' verwenden", + "searchBoard": "Board suchen", "selectBoard": "Board wählen", - "selectBoardForInfo": "Wähle ein Board für die Board-Informationen.", - "selectPortForInfo": "Wähle ein Port, um Informationen über das Board zu erhalten.", - "showAllAvailablePorts": "Zeige alle verfügbaren Ports, wenn aktiviert.", + "selectBoardToReload": "Bitte erst ein Board auswählen.", + "selectPortForInfo": " Wähle einen Port, um Infos über das Board zu erhalten.", + "showAllAvailablePorts": " Alle verfügbaren Ports anzeigen, wenn aktiviert.", + "showAllPorts": "Alle Ports anzeigen", "succesfullyInstalledPlatform": "Plattform erfolgreich installiert {0}:{1}", - "succesfullyUninstalledPlatform": "Plattform erfolgreich deinstalliert {0}:{1}" + "succesfullyUninstalledPlatform": "Plattform erfolgreich deinstalliert {0}:{1}", + "typeOfPorts": "{0} Ports", + "unconfirmedBoard": "Unbestätigtes Board", + "unknownBoard": "Unbekanntes Board" }, "boardsManager": "Board-Verwaltung", "boardsType": { - "arduinoCertified": "Arduino Certified" + "arduinoCertified": "Arduino-zertifiziert" }, "bootloader": { "burnBootloader": "Bootloader brennen", - "burningBootloader": "Burning bootloader...", + "burningBootloader": "Bootloader wird gebrannt ...", "doneBurningBootloader": "Bootloader erfolgreich gebrannt." }, "burnBootloader": { - "error": "Fehler beim Brennen des Bootloaders: {0}" + "error": " Fehler beim Brennen des Bootloaders: {0}" }, "certificate": { "addNew": "Neu hinzufügen", "addURL": "URL hinzufügen, um das SSL-Zertifikat abzurufen", "boardAtPort": "{0} bei {1}", - "certificatesUploaded": "Die Zertifikate wurden erfolgreich hochgeladen.", + "certificatesUploaded": "Zertifikate erfolgreich hochgeladen.", "enterURL": "URL eingeben", "noSupportedBoardConnected": "Kein unterstütztes Board angeschlossen", "openContext": "Kontext öffnen", "remove": "Entfernen", "selectBoard": "Wähle ein Board...", - "selectCertificateToUpload": "1. Zertifikat zum hochladen auswählen", + "selectCertificateToUpload": "1. Zertifikat zum Hochladen auswählen", "selectDestinationBoardToUpload": "2. Zielboard wählen und Zertifikat hochladen", "upload": "Hochladen", - "uploadFailed": "Hochladen fehlgeschlagen. Bitte versuchen Sie es erneut.", + "uploadFailed": "Hochladen fehlgeschlagen. Versuche es bitte noch einmal.", "uploadRootCertificates": "SSL Root Zertifikat hochladen", "uploadingCertificates": "Zertifikate hochladen..." }, "checkForUpdates": { - "checkForUpdates": "Check for Arduino Updates", - "installAll": "Install All", - "noUpdates": "There are no recent updates available.", - "promptUpdateBoards": "Updates are available for some of your boards.", - "promptUpdateLibraries": "Updates are available for some of your libraries.", - "updatingBoards": "Updating boards...", - "updatingLibraries": "Updating libraries..." + "checkForUpdates": "Arduino-Updates suchen", + "installAll": "Alle installieren", + "noUpdates": " Es sind keine neuen Updates verfügbar.", + "promptUpdateBoards": " Es sind Updates für einige deiner Boards verfügbar.", + "promptUpdateLibraries": " Es sind Updates für einige deiner Bibliotheken verfügbar.", + "updatingBoards": "Boards werden aktualisiert ...", + "updatingLibraries": "Bibliotheken werden aktualisiert ..." }, "cli-error-parser": { - "keyboardError": "'Keyboard' not found. Does your sketch include the line '#include <Keyboard.h>'?", - "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" + "keyboardError": " 'Keyboard' nicht gefunden. Enthält dein Sketch die Zeile '#include <Keyboard.h>'?", + "mouseError": " 'Mouse' nicht gefunden. Enthält dein Sketch die Zeile '#include <Mouse.h>'?" }, "cloud": { - "account": "Account", "chooseSketchVisibility": "Wähle die Sichtbarkeit deines Sketches:", + "cloudSketchbook": "Cloud Sketchbook", "connected": "Verbunden", "continue": "Fortfahren", "donePulling": "Herunterladen von '{0}' erfolgreich.", "donePushing": "Hochladen von '{0}' erfolgreich.", "embed": "Einbetten:", "emptySketchbook": "Dein Sketchbook ist leer", + "goToCloud": "Zur Cloud gehen", "learnMore": "Mehr erfahren", "link": "Link:", "notYetPulled": "Kann nicht in die Cloud geschoben werden. Es ist noch nicht heruntergeladen.", "offline": "Offline", "openInCloudEditor": "Im Cloud Editor öffnen", - "options": "Optionen....", - "privateVisibility": "Private. Nur du siehst diesen Sketch.", + "options": "Optionen ...", + "privateVisibility": "Privat. Nur du siehst diesen Sketch.", "profilePicture": "Profilbild", - "publicVisibility": "Public. Jeder kann mit diesen Link den Sketch sehen.", + "publicVisibility": " Öffentlich. Jeder mit diesen Link kann den Sketch sehen.", "pull": "Pull", "pullFirst": "Du musst zuerst herunterladen, damit du in die Cloud schieben kannst.", "pullSketch": "Pull Sketch", "pullSketchMsg": "Wenn du diesen Sketch aus der Cloud lädst, wird die lokale Version überschrieben. Möchtest du fortfahren?", "push": "Push", "pushSketch": "Push Sketch", - "pushSketchMsg": "Das ist ein öffentliches Sketch. Vor dem Pushen solltest du überprüfen, ob alle sensiblen Informationen in arduino_secrets.h definiert sind. Du kannst einen Sketch mit dem Teilen-Feld privat machen.", + "pushSketchMsg": " Der Sketch ist öffentlich. Prüfe vor dem Pushen, dass alle sensiblen Infos in arduino_secrets.h definiert sind. Du kannst einen Sketch beim Teilen als privat definieren.", "remote": "Remote", - "remoteSketchbook": "Remote Sketchbook", - "share": "Teilen....", + "share": "Teilen ...", "shareSketch": "Sketch teilen", - "showHideRemoveSketchbook": "Zeige/Verstecke Remote Sketchbook", + "showHideSketchbook": "Zeige/verstecke Cloud Sketchbook", "signIn": "Anmelden", "signInToCloud": "Anmelden zur Arduino Cloud", "signOut": "Abmelden", - "sync": "Sync", + "sync": "Synchronisieren", "syncEditSketches": "Synchronisiere und editiere deine Arduino Cloud Sketches.", - "visitArduinoCloud": "Besuche Arduino Cloud um Cloud Sketche zu erstellen." + "visitArduinoCloud": "Arduino Cloud besuchen, um Cloud Sketches zu erstellen." + }, + "cloudSketch": { + "alreadyExists": "Cloud-Sketch '{0}' existiert bereits.", + "creating": "Cloud-Sketch '{0}' wird erstellt...", + "new": "Neuer Cloud-Sketch", + "notFound": "Cloud-Sketch '{0}' konnte nicht heruntergeladen werden. Er existiert nicht.", + "pulling": "Sketchbook synchronisieren und '{0}' herunterladen ...", + "pushing": "Sketchbook synchronisieren und '{0}' hochladen ...", + "renaming": "Cloud-Sketch wird von '{0}' nach '{1}' umbenannt ...", + "synchronizingSketchbook": "Sketchbook wird synchronisiert ..." }, "common": { - "all": "All", - "contributed": "Contributed", + "all": "Alle", + "contributed": "Beigetragen", "installManually": "Manuell installieren", "later": "später", "noBoardSelected": "Kein Board ausgewählt", + "noSketchOpened": "Kein Sketch geöffnet", "notConnected": "[keine Verbindung]", "offlineIndicator": "Anscheinend bist du offline. Ohne eine aktive Internetverbindung kann das Arduino CLI nicht die nötigen Ressourcen herunterladen, was zu Problemen führen kann. Bitte überprüfe deine Internetverbindung und starte das Programm neu. ", - "oldFormat": "Der Sketch '{0}' verwendet noch das alte '.pde' Format. Möchtest du auf die neuere '.ino' Endung wechseln?", + "oldFormat": " Der Sketch '{0}' verwendet das alte Format '.pde'. Möchtest du auf die neue Endung '.ino' wechseln?", "partner": "Partner", "processing": "Verarbeiten", - "recommended": "Recommended", - "retired": "Retired", + "recommended": "Empfohlen", + "retired": "Zurückgezogen", + "selectManually": "Manuell auswählen", "selectedOn": "an {0}", "serialMonitor": "Serieller Monitor", - "type": "Type", + "type": "Typ", "unknown": "unbekannt", - "updateable": "Updatable" + "updateable": "Aktualisierbar", + "userAbort": "Nutzerabbruch" }, "compile": { "error": "Fehler beim kompilieren: {0}" }, "component": { - "boardsIncluded": "Boards included in this package:", + "boardsIncluded": "Im Paket enthaltene Boards:", "by": "von", - "filterSearch": "Filtern Sie Ihre Suche...", + "clickToOpen": " Klicke, um im Browser zu öffnen: {0}", + "filterSearch": "Filtere deine Suche ...", "install": "Installieren", + "installLatest": "Neueste installieren", + "installVersion": "{0} installieren", + "installed": "{0} installiert", "moreInfo": "Mehr Information", - "uninstall": "deinstalieren", - "uninstallMsg": "Möchten Sie {0} deinstallieren?", - "version": "Version {0}" + "otherVersions": "Andere Versionen", + "remove": "Entfernen", + "title": "{0} von {1}", + "uninstall": "Deinstallieren", + "uninstallMsg": "Möchtest du {0} deinstallieren?", + "update": "Aktualisieren" + }, + "configuration": { + "cli": { + "inaccessibleDirectory": "Kein Zugriff möglich auf Sketchbook-Pfad bei '{0}': {1}" + } + }, + "connectionStatus": { + "connectionLost": "Keine Verbindung. Aktionen und Updates für Cloud-Sketches sind nicht möglich." }, "contributions": { - "addFile": "Datei hinzufügen...", + "addFile": " Datei hinzufügen", "fileAdded": "Eine Datei wurde zum Sketch hinzugefügt.", - "replaceTitle": "Ersetzten" + "plotter": { + "couldNotOpen": " Der serielle Plotter konnte nicht geöffnet werden." + }, + "replaceTitle": "Ersetzen" + }, + "core": { + "compilerWarnings": { + "all": "Alle", + "default": "Standard", + "more": "Mehr", + "none": "Keine" + } }, "coreContribution": { - "copyError": "Copy error messages", - "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." + "copyError": "Fehlermeldungen kopieren", + "noBoardSelected": "Kein Board ausgewählt. Wähle dein Arduino-Board im Menü 'Werkzeuge > Board'." }, + "createCloudCopy": "Sketch in die Cloud hochladen", "daemon": { - "restart": "Restart Daemon", - "start": "Start Daemon", - "stop": "Stop Daemon" + "restart": "Daemon neustarten", + "start": "Daemon starten", + "stop": "Daemon stoppen" }, "debug": { "debugWithMessage": "Debug - {0}", - "debuggingNotSupported": "'{0}' unterstützt kein Debuggen", - "noPlatformInstalledFor": "Die Platform für '{0}' ist nicht instaliert.", - "optimizeForDebugging": "Für Debugging optimieren" + "debuggingNotSupported": "Debugging wird von '{0}' nicht unterstützt.", + "getDebugInfo": "Debug-Infos holen ...", + "noPlatformInstalledFor": "Plattform ist für \"{0}\" nicht installiert.", + "optimizeForDebugging": "Für Debugging optimieren", + "sketchIsNotCompiled": "Der Sketch '{0}' muss vor dem Debugging überprüft werden. Überprüfe den Sketch und starte das Debugging erneut. Möchtest du den Sketch jetzt überprüfen?" + }, + "developer": { + "clearBoardList": "Board-Tabellen-Verlauf löschen", + "clearBoardsConfig": "Board- und Portauswahl aufheben", + "dumpBoardList": "Board-Tabelle löschen" }, "dialog": { "dontAskAgain": "Nicht noch einmal fragen" }, "editor": { - "autoFormat": "automatisch Formatieren", + "autoFormat": "Automatisch formatieren", "commentUncomment": "Kommentieren/Kommentar aufheben", "copyForForum": "Für Forum kopieren (Markdown)", "decreaseFontSize": "Schrift verkleinern", "decreaseIndent": "Einrückung verringern ", - "increaseFontSize": "Schriftgröße vergrößern ", + "increaseFontSize": "Schrift vergrößern", "increaseIndent": "Einrückung erweitern", - "nextError": "Next Error", - "previousError": "Previous Error", - "revealError": "Reveal Error" - }, - "electron": { - "couldNotSave": "Der Sketch konnte nicht gesichert werden. Bitte kopiere deine ungesicherte Arbeit in deinen bevorzugten Texteditor und starte die IDE neu.", - "unsavedChanges": "Alle ungesicherten Änderung werden nicht gespeichert." + "nextError": "Nächster Fehler", + "previousError": "Vorheriger Fehler", + "revealError": "Fehler zeigen" }, "examples": { "builtInExamples": "Mitgelieferte Beispiele", - "couldNotInitializeExamples": "Mitgelieferte Beispiele konnten nicht initialisiert werden", - "customLibrary": "Beispiele aus eigenen Bibliotheken", + "couldNotInitializeExamples": "Die integrierten Beispiele konnten nicht initialisiert werden.", + "customLibrary": "Beispiele aus angepassten Bibliotheken", "for": "Beispiele für {0}", "forAny": "Beispiele für jedes Board", "menu": "Beispiele" }, "firmware": { - "checkUpdates": "Nach Updates Suchen", + "checkUpdates": "Nach Updates suchen", "failedInstall": "Installation fehlgeschlagen. Bitte versuche es erneut ", "install": "Installieren", "installingFirmware": "Firmware wird installiert.", - "overwriteSketch": "Die Installation wird den Sketch auf dem Board überschreiben.", + "overwriteSketch": "Die Installation überschreibt den Sketch auf dem Board.", "selectBoard": "Board auswählen", - "selectVersion": "Firmware Version wählen", - "successfullyInstalled": "Firmware wurde erfolgreich installiert.", - "updater": "WiFi101 / WiFiNINA Firmware Aktualisierer" + "selectVersion": "Firmware-Version wählen", + "successfullyInstalled": "Die Firmware wurde erfolgreich installiert.", + "updater": "Firmware-Updater" }, "help": { "environment": "Umgebung", "faq": "Häufig gestellte Fragen", "findInReference": "Referenzsuche", - "gettingStarted": "Loslegen...", + "gettingStarted": "Loslegen ...", "keyword": "Schlagwort eingeben", "privacyPolicy": "Datenschutzbestimmungen", "reference": "Referenz", @@ -216,197 +272,278 @@ "visit": "Besuche Arduino.cc" }, "ide-updater": { - "checkForUpdates": "Check for Arduino IDE Updates", + "checkForUpdates": "Arduino IDE Updates suchen", "closeAndInstallButton": "Schließen und Installieren", - "closeToInstallNotice": "Schließe die Software und installiere das Update auf deinem Computer", + "closeToInstallNotice": "Software beenden und Update auf deinem Computer installieren", + "donateLinkIconTitle": "Öffne die Spenden Seite", + "donateLinkText": "Spenden um uns zu Unterstützen", + "donateText": "Open Source ist Liebe, {0}", "downloadButton": "Download", - "downloadingNotice": "Die neueste Version der Arduino IDE wird heruntergeladen", + "downloadingNotice": "Die neueste Version der Arduino IDE wird heruntergeladen.", "errorCheckingForUpdates": "Fehler bei der Suche nach IDE Updates{0}", - "goToDownloadButton": "Zum Download Wechseln", - "goToDownloadPage": "Eine Update für die Arduino IDE ist verfügbar, konnte aber nicht automatisch heruntergeladen und installiert werden. Bitte gehen sie zur Download-Seite und laden sie dort die neueste Version herunter", - "ideUpdaterDialog": "Software Update", - "newVersionAvailable": "Eine neue Version der Arduino IDE ({0}) ist zum Download verfügbar", - "noUpdatesAvailable": "Es gibt keine neuen Updates für die Arduino IDE", + "goToDownloadButton": "Zum Download wechseln", + "goToDownloadPage": "Ein Update für die Arduino IDE ist verfügbar, konnte aber nicht automatisch installiert werden. Gehe zur Download-Seite und lade dort die neueste Version herunter. ", + "ideUpdaterDialog": "Software-Update", + "newVersionAvailable": "Eine neue Version der Arduino IDE ({0}) ist zum Download verfügbar.", + "noUpdatesAvailable": "Es gibt keine neuen Updates für die Arduino IDE.", "notNowButton": "Später", - "skipVersionButton": "Version Überspringen", - "updateAvailable": "Update Verfügbar", + "skipVersionButton": "Version überspringen", + "updateAvailable": "Update verfügbar", "versionDownloaded": "Arduino IDE {0} wurde heruntergeladen" }, + "installable": { + "libraryInstallFailed": "Bibliothek '{0}{1}' konnte nicht installiert werden.", + "platformInstallFailed": "Plattform '{0}{1}' konnte nicht installiert werden." + }, "library": { "addZip": ".ZIP-Bibliothek hinzufügen...", - "arduinoLibraries": "Arduino Bibliotheken", - "contributedLibraries": "Bibliotheken, zu denen beigetragen wurde", - "dependenciesForLibrary": "Abhängigkeiten für die Bibliothek {0}:{1}", + "arduinoLibraries": "Arduino-Bibliotheken", + "contributedLibraries": "Beigesteuerte Bibliotheken", "include": "Bibliothek einbinden", "installAll": "Alle installieren", - "installMissingDependencies": "Möchten Sie alle fehlenden Ressourcen installieren?", - "installOneMissingDependency": "Möchten Sie die fehlende Ressource installieren?", - "installOnly": "Nur {0} installieren", + "installLibraryDependencies": "Bibliotheksabhängigkeiten installieren", + "installMissingDependencies": "Möchtest du die fehlenden Abhängigkeiten installieren?", + "installOneMissingDependency": "Möchtest du die fehlende Abhängigkeit installieren?", + "installWithoutDependencies": "Ohne Abhängigkeiten installieren", "installedSuccessfully": "Bibliothek {0}:{1} erfolgreich installiert", - "libraryAlreadyExists": "Eine Bibliothek existiert bereits. Möchten sie diese überschreiben?", - "manageLibraries": "Bibliotheken verwalten...", - "namedLibraryAlreadyExists": "Der Bibliothek-Ordner '{0}' existiert bereits. Überschreiben?", - "needsMultipleDependencies": "Die Bibliothek <b>{0}:{1}</b> benötigt ein paar andere Abhängigkeiten, die derzeit nicht installiert sind:", - "needsOneDependency": "Die Bibliothek <b>{0}:{1}</b> benötigt eine andere Abhängigkeit, welche derzeit nicht installiert ist:", + "libraryAlreadyExists": "Die Bibliothek existiert bereits. Möchtest du sie überschreiben?", + "manageLibraries": "Bibliotheken verwalten ...", + "namedLibraryAlreadyExists": "Der Bibliothek-Ordner '{0}' existiert bereits. Möchtest du ihn überschreiben?", + "needsMultipleDependencies": "Die Bibliothek <b>{0}:{1}</b> benötigt ein paar weitere Abhängigkeiten, die derzeit nicht installiert sind:", + "needsOneDependency": "Die Bibliothek <b>{0}:{1}</b> benötigt eine weitere Abhängigkeit, die derzeit nicht installiert ist:", "overwriteExistingLibrary": "Möchtest du die existierende Bibliothek überschreiben?", - "successfullyInstalledZipLibrary": "Bibliothek erfolgreich vom {0} Archiv installiert", + "successfullyInstalledZipLibrary": "Bibliothek erfolgreich vom Archiv {0} installiert", "title": "Bibliotheksverwalter", "uninstalledSuccessfully": "Bibliothek {0}:{1} erfolgreich deinstalliert", "zipLibrary": "Bibliothek" }, "librarySearchProperty": { - "topic": "Topic" + "topic": "Thema" }, "libraryTopic": { - "communication": "Communication", - "dataProcessing": "Data Processing", - "dataStorage": "Data Storage", - "deviceControl": "Device Control", - "display": "Display", - "other": "Other", - "sensors": "Sensors", - "signalInputOutput": "Signal Input/Output", + "communication": "Kommunikation", + "dataProcessing": "Datenverarbeitung", + "dataStorage": "Datenspeicher", + "deviceControl": "Gerätesteuerung", + "display": "Anzeige", + "other": "Weitere", + "sensors": "Sensoren", + "signalInputOutput": "Signal Ein-/Ausgang", "timing": "Timing", - "uncategorized": "Uncategorized" + "uncategorized": "Nicht kategorisiert" }, "libraryType": { - "installed": "Installed" + "installed": "Installiert" }, "menu": { - "advanced": "Advanced", + "advanced": "Fortgeschritten", "sketch": "Sketch", "tools": "Werkzeuge" }, "monitor": { + "alreadyConnectedError": "Konnte nicht mit {0} {1} Port verbinden. Verbindung besteht bereits.", + "baudRate": "{0} Baud", + "connectionFailedError": "Konnte nicht mit {0} {1} Port verbinden.", + "connectionFailedErrorWithDetails": "{0} Konnte nicht mit {1} {2} Port verbinden.", + "connectionTimeout": "Timeout. Die IDE hat keine 'Success'-Nachricht erhalten, nachdem der Monitor erfolgreich verbunden wurde.", + "missingConfigurationError": "Konnte nicht mit {0} {1} Port verbinden. Monitor-Konfiguration fehlt.", + "notConnectedError": "Nicht mit {0} {1} Port verbunden.", "unableToCloseWebSocket": "Websocket wurde nicht geschlossen", "unableToConnectToWebSocket": "Websocket wurde nicht verbunden" }, + "newCloudSketch": { + "newSketchTitle": "Name des neuen Cloud-Sketches" + }, + "portProtocol": { + "network": "Netzwerk", + "serial": "Seriell" + }, "preferences": { "additionalManagerURLs": "Zusätzliche Boardverwalter-URLs", - "auth.audience": "Das The OAuth2 Audience.", - "auth.clientID": "Die OAuth2 client ID.", - "auth.domain": "Die OAuth2 Domain.", - "auth.registerUri": "Das URI hat einen neuen Benutzer registriert.", + "auth.audience": "OAuth2-Audience", + "auth.clientID": "OAuth2-ClientID", + "auth.domain": "OAuth2-Domain", + "auth.registerUri": "Das URI hat einen neuen Nutzer registriert.", "automatic": "Automatisch", - "board.certificates": "Liste der Zertifikate, welche zu den Boards hochgeladen werden können.", + "board.certificates": "Liste der Zertifikate, die zu den Boards hochgeladen werden können.", "browse": "Durchsuchen", - "checkForUpdate": "Receive notifications of available updates for the IDE, boards, and libraries. Requires an IDE restart after change. It's true by default.", + "checkForUpdate": "Benachrichtigungen bei verfügbaren Updates für IDE, Boards und Bibliotheken erhalten. Nach einer Änderung ist ein Neustart der IDE notwendig. Standardmäßig eingeschaltet.", "choose": "Wähle", - "cli.daemonDebug": "Aktivieren Sie die Debug-Protokollierung der gRPC-Aufrufe an das Arduino CLI. Ein Neustart der IDE ist erforderlich, damit diese Einstellung wirksam wird. Standardmäßig ist sie deaktiviert.", - "cloud.enabled": "Wahr, wenn die Sketch-Syncfunctionen aktiv sind. Standardeinstellung ist wahr.", - "cloud.pull.warn": "Wahr, wenn Benutzer vor dem Herunterladen eines Sketches aus der Cloud gewarnt werden sollen. Standardmäßig Wahr.", - "cloud.push.warn": "Wahr, wenn Benutzer vor dem Hochladen eines Cloud-Sketches gewarnt werden sollen. Standardmäßig Wahr.", - "cloud.pushpublic.warn": "Wahr, wenn Benutzer vor dem Hochladen eines öffentlichen Sketches in die Cloud gewarnt werden sollen. Standardmäßig Wahr.", - "cloud.sketchSyncEndpoint": "Der Endpunkt, um Sketches zu/von einem Backend zu laden. Standardeinstellung ist die Arduino Cloud API.", + "cli.daemonDebug": "Debug-Protokoll von gRPC-Aufrufe an das Arduino CLI aktivieren. Nach der Änderung ist ein Neustart der IDE notwendig. Standardmäßig deaktiviert.", + "cloud.enabled": "Wenn diese Option aktiviert ist, sind die Sketch-Syncfunktionen aktiv. Standardmäßig aktiviert.", + "cloud.pull.warn": "Wenn diese Option aktiviert ist, werden Nutzer vor dem Herunterladen eines Sketches aus der Cloud gewarnt. Standardmäßig aktiviert.", + "cloud.push.warn": "Wenn diese Option aktiviert ist, werden Nutzer vor dem Hochladen eines Sketches in die Cloud gewarnt. Standardmäßig aktiviert. ", + "cloud.pushpublic.warn": "Wenn diese Option aktiviert ist, werden Nutzer vor dem Hochladen eines öffentlichen Sketches in die Cloud gewarnt. Standardmäßig aktiviert. ", + "cloud.sharedSpaceId": "Die ID der Arduino-Cloud 'shared space' von welchem die Sketchbooks geladen werden sollen. Wenn leer, wird dein privater Bereich verwendet.", + "cloud.sketchSyncEndpoint": "Endpunkt, um Sketches zu/von einem Backend zu laden. Standardeinstellung ist die Arduino Cloud API.", "compile": "Kompilieren", - "compile.experimental": "True if the IDE should handle multiple compiler errors. False by default", - "compile.revealRange": "Adjusts how compiler errors are revealed in the editor after a failed verify/upload. Possible values: 'auto': Scroll vertically as necessary and reveal a line. 'center': Scroll vertically as necessary and reveal a line centered vertically. 'top': Scroll vertically as necessary and reveal a line close to the top of the viewport, optimized for viewing a code definition. 'centerIfOutsideViewport': Scroll vertically as necessary and reveal a line centered vertically only if it lies outside the viewport. The default value is '{0}'.", - "compile.verbose": "Wahr für ausführliche Compilerausgaben. Standardmäßig Falsch", - "compile.warnings": "Einstellung des Warnlevels für den GCC. Standardeinstellung ist 'None'.", - "compilerWarnings": "Warnungen des Übersetzers", - "editorFontSize": "Editor Schriftgröße", - "editorQuickSuggestions": "Schnelle Editor Vorschläge", - "enterAdditionalURLs": "Füge zusätzliche URLs hinzu, jede Reihe einzeln", + "compile.experimental": "Wenn diese Option aktiviert, werden mehrere Compiler-Fehler in der IDE gleichzeitig behandelt. Standardmäßig deaktiviert.", + "compile.revealRange": "Diese Option steuert, wie Compiler-Fehler im Editor angezeigt werden. Mögliche Werte sind: \n'auto': bei Bedarf vertikal scrollen, um die Zeile anzuzeigen. 'center': bei Bedarf vertikal scrollen und die Zeile zentriert anzeigen. 'top': bei Bedarf vertikal scrollen und die Zeile oben im Textbereich anzeigen, optimiert für das Betrachten einer Codedefinition. 'centerIfOutsideViewport': bei Bedarf vertikal scrollen und die Zeile nur anzeigen, wenn sie außerhalb des Anzeigebereichs liegt. Der Standardwert ist '{0}'.", + "compile.verbose": "Wenn diese Option aktiviert ist, werden ausführliche Compiler-Meldungen angezeigt. Standardgemäß deaktiviert.", + "compile.warnings": "Einstellung der Compiler-Warnungen für den GCC. Standardmäßig 'Keine'. ", + "compilerWarnings": "Compiler-Meldungen", + "editorFontSize": "Schriftgröße im Editor", + "editorQuickSuggestions": "Schnelle Editor-Vorschläge", + "enterAdditionalURLs": "Zusätzliche URLs hinzufügen, jeweils eine pro Zeile.", "files.inside.sketches": "Dateien im Sketch zeigen", - "ide.updateBaseUrl": "Die URL wovon Updates heruntergeladen werden. Standardmäßig bei 'https://downloads.arduino.cc/arduino-ide'", - "ide.updateChannel": "Von welchem Kannal die Updates kommen sollen. 'stabil' ist die stabile Version, 'nächtlich' ist die neueste Entwicklerversion", - "interfaceScale": "Fenster Skalierung", - "invalid.editorFontSize": "Ungültige Editor Schriftgröße. Sie muss eine positive, ganze Zahl sein.", - "invalid.sketchbook.location": "Ungültiger Sketchbook Speicherort: {0}", - "invalid.theme": "Ungültiges Erscheinungsbild", - "language.log": "Wahr, wenn der Arduino Language Server Logfiles in den Sketch-Ordner schreiben soll. Sonst falsch. Standardeinstellung ist falsch.\n ", - "language.realTimeDiagnostics": "If true, the language server provides real-time diagnostics when typing in the editor. It's false by default.", - "manualProxy": "Manuelle Proxy Einstellung", + "ide.updateBaseUrl": "URL für den Download von Updates. Standardmäßig 'https://downloads.arduino.cc/arduino-ide'", + "ide.updateChannel": "Release-Channel, von dem Updates bezogen werden sollen. 'stable' für stabile und getestete Updates. 'nightly' für allerneuste Updates, welche jedoch noch nicht ausreichend getestet wurden.", + "interfaceScale": "Skalierung der Darstellung", + "invalid.editorFontSize": "Ungültige Schriftgröße. Der Wert muss eine positie ganze Zahl sein.", + "invalid.sketchbook.location": "Ungültiger Sketchbook-Pfad: {0}", + "invalid.theme": "Ungültiges Design", + "language.asyncWorkers": "Anzahl der asynchronen Worker, die vom Arduino-Sprachserver (clangd) verwendet werden. Der Hintergrundindex verwendet diese Anzahl an Workern ebenfalls. Der Mindestwert ist 0 und der Höchstwert ist 8. Wenn der Wert 0 ist, verwendet der Sprachserver alle verfügbaren Kerne. Der Standardwert ist 0.", + "language.log": "Wenn diese Option aktiviert ist, schreibt der Arduino-Sprachserver seine Logdateien in den Sketch-Ordner. Standardmäßig deaktivert. ", + "language.realTimeDiagnostics": "Wenn diese Option aktiviert ist, wird bei der Eingabe im Editor eine Echtzeitdiagnose angeboten. Standardmäßig deaktiviert.", + "manualProxy": "Manuelle Proxy-Einstellung", + "monitor": { + "dockPanel": "Der Bereich der Applikations-Shell wo das {0}-Widget angezeigt werden soll. Entweder \"unten\" oder \"rechts\". Standardmäßig \"{1}\"." + }, "network": "Netzwerk", "newSketchbookLocation": "Wähle einen neuen Ort für das Sketchbook ", + "noCliConfig": "CLI-Konfiguration konnte nicht geladen werden.", "noProxy": "Kein Proxy", - "showVerbose": "Debug Informationen während", - "sketchbook.location": "Dateipfad des Sketchbooks", - "sketchbook.showAllFiles": "Wahr, um alle Dateien im Sketch anzuzeigen. Standardmäßig Falsch.", - "survey.notification": "Wahr, wenn Benutzer benachrichtigt werden sollen, wenn eine Umfrage verfügbar ist. Standardeinstellung ist wahr.", - "unofficialBoardSupport": "Klicke hier für eine Liste von inoffiziell unterstützten Boards", + "proxySettings": { + "hostname": "Hostname", + "password": "Kennwort", + "port": "Port", + "username": "Nutzername" + }, + "showVerbose": "Compiler-Meldungen anzeigen beim", + "sketch": { + "inoBlueprint": "Dateipfad zur Standardvorlage '.ino'. Wenn eine Vorlage angegeben ist, wird deren Inhalt für alle mit der IDE erstellten Sketches verwendet. Wenn keine Vorlage angegeben ist, werden Sketches mit dem Standard-Arduino-Inhalt erstellt. Nichtauffindbare Vorlagen werden ignoriert. **Ein Neustart der IDE ist erforderlich**, um diese Einstellung zu übernehmen." + }, + "sketchbook.location": "Pfad für Sketchbook", + "sketchbook.showAllFiles": "Wenn diese Option aktiviert ist, werden alle Sketch-Dateien innerhalb des Sketches angezeigt. Standardmäßig deaktiviert. ", + "unofficialBoardSupport": "Klicke hier, um eine URL-Liste von inoffiziell unterstützten Boards anzuzeigen.", "upload": "Hochladen", - "upload.verbose": "Wahr für ausführliche Ausgaben während dem Hochladen. Standardmäßig Falsch.", + "upload.autoVerify": "Wahr wenn die IDE automatisch den Code vor dem Hochladen verifizieren soll. Standard: Wahr. Wenn der Wert Falsch ist, wird die IDE den Code vor dem Upload der Binärdaten nicht noch einmal Kompilieren . Wirklich nur auf Falsch setzen wenn du genau weißt warum und was du tust!", + "upload.verbose": "Wenn die Option aktiviert ist, werden ausführliche Compiler-Meldungen angezeigt. Standardmäßig deaktiviert.", + "upload.verify": "Verifiziere das hochzuladende Binary nach dem Hochladen im Speicher des Boards identisch ist.", "verifyAfterUpload": "Code nach Hochladen überprüfen ", - "window.autoScale": "Ist wahr, wenn die Benutzeroberfläche automatisch mit der Schriftgröße skaliert wird.", - "window.zoomLevel": "Stelle die Zoomstufe des Fensters ein. Der Standardwert ist 0, jede Vergrößerung (z.B.: 1) oder Verringerung (z.B.: -1) um eins steht für 20% Vergrößerung bzw. Verkleinerung des Fensters. Du kannst auch Kommazahlen eingeben, um die Zoomstufe feiner einzustellen.\n " + "window.autoScale": "Wenn die Option aktiviert ist, skaliert die Nutzeroberfläche automatisch mit der Schriftgröße.", + "window.zoomLevel": { + "deprecationMessage": "Veraltet. Verwende stattdessen 'window.zoomLevel'." + } + }, + "renameCloudSketch": { + "renameSketchTitle": "Neuer Name des Cloud-Sketches" }, "replaceMsg": "Existierende Version von {0} ersetzen?", - "selectZip": "Wähle die ZIP-Datei, welche die hinzuzufügende Bibliothek enthält", + "selectZip": "Wähle die ZIP-Datei mit der Bibliothek, die du hinzufügen möchtest.", "serial": { "autoscroll": "Automatisch scrollen", - "carriageReturn": "Zeilenumbruch", - "message": "Nachricht ({0} + Enter, um Nachricht an '{1}' auf '{2}') zu senden", + "carriageReturn": "Zeilenumbruch (CR)", + "connecting": "Verbindung zu '{0}' auf '{1}'...", + "message": "Nachicht (drücke Enter zum Senden für '{0}' auf '{1}')", "newLine": "Neue Zeile", - "newLineCarriageReturn": "Sowohl NL als auch CR", + "newLineCarriageReturn": "Beides CR/LF", "noLineEndings": "Kein Zeilenende", - "notConnected": "Nicht verbunden. Wählen Sie ein Board und einen Port, um automatisch zu verbinden.", - "openSerialPlotter": "Serial Plotter", + "notConnected": "Keine Verbindung. Wähle ein Board und einen Port, um automatisch zu verbinden.", + "openSerialPlotter": "Serieller Plotter", "timestamp": "Zeitstempel", "toggleTimestamp": "Zeitstempel an/aus" }, "sketch": { "archiveSketch": "Sketch archivieren", "cantOpen": "Ein Ordner mit dem Namen \"{0}\" ist bereits vorhanden. Der Sketch kann nicht geöffnet werden.", - "close": "Sind Sie sicher, dass Sie diesen Sketch schließen möchten?", - "compile": "Compiling sketch...", - "configureAndUpload": "Konfigurieren und hochladen", + "compile": "Kompiliere Sketch ...", + "configureAndUpload": "Konfigurieren und Hochladen", "createdArchive": "Archiv '{0}' erstellt.", - "doneCompiling": "Kompilieren erfolgreich!", - "doneUploading": "Hochladen erfolgreich! ", + "doneCompiling": "Kompilieren erfolgreich.", + "doneUploading": "Hochladen erfolgreich.", + "editInvalidSketchFolderLocationQuestion": "Möchtest du versuchen, den Sketch an einer anderen Stelle abzuspeichern?", + "editInvalidSketchFolderQuestion": "Möchtest du versuchen, den Sketch mit einem anderen Namen abzuspeichern?", "exportBinary": "Kompilierte Binärdatei exportieren", - "moving": "Übertragen...", + "invalidCloudSketchName": "Der Name muss mit einem Buchstaben, einer Ziffer oder einem Unterstrich beginnen. Der Name darf nur Buchstaben, Ziffern, Bindestriche, Punkte und Unterstriche enthalten. Die maximale Länge ist 36 Zeichen.", + "invalidSketchFolderLocationDetails": "Ein Sketch kann nicht innerhalb eines seiner Ordner gespeichert werden.", + "invalidSketchFolderLocationMessage": "Ungültiger Ort für Sketch-Ordner: '{0}'", + "invalidSketchFolderNameMessage": "Ungültiger Name für einen Sketch-Ordner: '{0}'", + "invalidSketchName": "Der Name muss mit einem Buchstaben, einer Ziffer oder einem Unterstrich beginnen und darf Buchstaben, Ziffern, Bindestriche, Punkte und Unterstriche enthalten. Die maximale Länge ist 63 Zeichen.", + "moving": "Verschieben", "movingMsg": "Die Datei \"{0}\" muss sich in einen Sketch Ordner \"{1}\" befinden.\nOrdner erstellen, Datei verschieben und fortfahren?", - "new": "Neu", + "new": "Neuer Sketch", + "noTrailingPeriod": "Ein Dateiname kann nicht mit einem Punkt enden", "openFolder": "Ordner öffnen", "openRecent": "Zuletzt geöffnet", "openSketchInNewWindow": "Sketch in neuen Fenster öffnen", + "reservedFilename": "'{0}' ist ein reservierter Dateiname.", "saveFolderAs": "Sketch Ordner speichern als...", - "saveSketch": "Sketch speichern und später wieder öffnen", + "saveSketch": "Sketch für spätere Verwendung speichern", "saveSketchAs": "Sketch Ordner speichern als...", "showFolder": "Zeige Sketch Ordner", "sketch": "Sketch", + "sketchAlreadyContainsThisFileError": "Der Sketch enthält bereits eine Datei \"{0}\".", + "sketchAlreadyContainsThisFileMessage": "Fehler beim Speichern von \"{0}\" als \"{1}\". {2}", "sketchbook": "Sketchbook", "titleLocalSketchbook": "Lokales Sketchbook", "titleSketchbook": "Sketchbook", "upload": "Hochladen", "uploadUsingProgrammer": "Mit Programmer hochladen", - "uploading": "Uploading...", - "userFieldsNotFoundError": "User Fields für das angeschlossene Board nicht gefunden", + "uploading": "Hochladen ...", + "userFieldsNotFoundError": "Nutzerfelder für das angeschlossene Board nicht gefunden", "verify": "Überprüfen", "verifyOrCompile": "Überprüfen/Kompilieren" }, - "survey": { - "answerSurvey": "Umfrage beantworten", - "dismissSurvey": "Nicht erneut anzeigen", - "surveyMessage": "Helfen Sie uns, uns zu verbessern, indem Sie diese kurze Umfrage ausfüllen. Wir wissen unsere Community wertzuschätzen und möchten unsere Unterstützer gerne ein wenig besser kennenlernen." + "sketchbook": { + "newCloudSketch": "Neuer Cloud-Sketch", + "newSketch": "Neu" + }, + "theme": { + "currentThemeNotFound": "Das aktuell ausgewählte Theme konnte nicht gefunden werden: {0}. Die Arduino IDE hat ein eingebautes Theme ausgewählt, welches kompatibel mit dem fehlenden Theme ist.", + "dark": "Dunkel", + "deprecated": "{0} (veraltet)", + "hc": "Dunkel Hoher Kontrast", + "hcLight": "Hell Hoher Kontrast", + "light": "Hell", + "user": "{0} (Benutzer)" + }, + "title": { + "cloud": "Cloud" + }, + "updateIndexes": { + "updateIndexes": "Indizes aktualisieren", + "updateLibraryIndex": "Bibliotheksverzeichnis aktualisieren", + "updatePackageIndex": "Paketindex aktualisieren" }, "upload": { "error": "{0} Fehler: {1}" }, "userFields": { - "cancel": "abbrechen", - "enterField": "Enter {0}", + "cancel": "Abbrechen", + "enterField": "Eingabe {0}", "upload": "Hochladen" + }, + "validateSketch": { + "abortFixMessage": "Der Sketch ist noch immer ungültig. Möchtest du die verbliebenen Probleme beheben? Beim Klicken auf '{0}' wird ein neuer Sketch geöffnet.", + "abortFixTitle": "Ungültiger Sketch", + "renameSketchFileMessage": "Die Sketch-Datei '{0}' kann nicht verwendet werden. {1} Soll die Sketch-Datei jetzt umbenannt werden?", + "renameSketchFileTitle": "Ungültiger Sketch-Dateiname", + "renameSketchFolderMessage": "Der Sketch '{0}' kann nicht verwendet werden. {1} Um diese Meldung loszuwerden, muss der Sketch umbenannt werden. Möchtest du den Sketch jetzt umbenennen?", + "renameSketchFolderTitle": "Ungültiger Sketch-Name" + }, + "versionWelcome": { + "cancelButton": "Vielleicht später", + "donateButton": "Spende Jetzt", + "donateMessage": "Arduino verpflichtet sich die Software frei und quell-offen für alle zu bewahren. Deine Spende hilft uns neue Funktionalitäten, verbesserte Bibliotheken zu entwickeln, und hilft Millionen Benutzern Welt Weit.", + "donateMessage2": "Bitte denke über einen Unterstützung unserer Arbeit an der freien und quell-offenen Arduino IDE nach.", + "title": "Willkommen zu einer neuen Version der Arduino IDE!", + "titleWithVersion": "Willkommen zur neuen Arduino IDE {0}!" + }, + "workspace": { + "alreadyExists": "'{0}' existiert bereits." } }, - "cloud": { - "GoToCloud": "Zur Cloud gehen" - }, "theia": { "core": { - "cannotConnectBackend": "Keine Verbindung zum Backend.", - "cannotConnectDaemon": "Keine Verbindung zum CLI Daemon.", + "cannotConnectBackend": "Verbindung zum Backend kann nicht hergestellt werden.", + "cannotConnectDaemon": "Verbindung zum CLI Daemon kann nicht hergestellt werden.", "couldNotSave": "Der Sketch konnte nicht gesichert werden. Bitte kopiere deine ungesicherte Arbeit in deinen bevorzugten Texteditor und starte die IDE neu.", "daemonOffline": "CLI Daemon Offline", "offline": "Offline", + "offlineText": "Offline", "quitTitle": "Sind Sie sicher, dass das Fenster schließen möchten?" }, - "debug": { - "start": "Start...", - "startError": "Es gab einen Fehler beim Start der Debug-Session. Überprüfe die Logs für mehr Informationen.", - "typeNotSupported": "Die Debug Session vom Typ \"{0}\" wird nicht unterstützt." - }, "editor": { "unsavedTitle": "Nicht gespeichert – {0}" }, @@ -415,10 +552,10 @@ "expand": "Ausklappen" }, "workspace": { - "deleteCurrentSketch": "Möchtest du den aktuellen Sketch löschen?", + "deleteCloudSketch": " Der Cloud-Sketch '{0}' wird dauerhaft von den Arduino-Servern und den lokalen Caches gelöscht. Diese Aktion ist nicht umkehrbar. Möchtest du den aktuellen Sketch wirklich löschen?", + "deleteCurrentSketch": " Der Sketch '{0}' wird dauerhaft gelöscht. Diese Aktion ist nicht umkehrbar. Möchtest du den aktuellen Sketch wirklich löschen?", "fileNewName": "Name für die neue Datei", "invalidExtension": "\".{0}\" ist keine gültige Dateierweiterung.", - "invalidFilename": "Ungültiger Dateiname. ", "newFileName": "Neuer Name für die Datei" } } diff --git a/i18n/el.json b/i18n/el.json index bb20c1b77..11e3cf9d6 100644 --- a/i18n/el.json +++ b/i18n/el.json @@ -1,305 +1,383 @@ { "arduino": { "about": { - "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}{4} [{5}]\n\n{6}", + "detail": "Έκδοση:{0}\nΗμερομηνία:{1}{2}\nCLI Έκδοση:{3}\n\n{4}", "label": "Σχετικά με {0}" }, + "account": { + "goToCloudEditor": "Μεταβείτε στο Cloud Editor", + "goToIoTCloud": "Μεταβείτε στο IoT Cloud", + "goToProfile": "Πήγαινε στο προφίλ", + "menuTitle": "Arduino Cloud" + }, "board": { "board": "Πλακέτα{0}", - "boardConfigDialogTitle": "Select Other Board and Port", + "boardConfigDialogTitle": "Επιλέξτε Άλλη Πλακέτα & Θύρα", + "boardDataReloaded": "Board data reloaded.", "boardInfo": "Πληροφορίες Πλακέτας", - "configDialog1": "Επίλεξε και Πλακέτα και Θύρα αν θέλεις να ανεβάσεις ένα σχέδιο.", - "configDialog2": "If you only select a Board you will be able to compile, but not to upload your sketch.", + "boards": "Πίνακες - Πλακέτες", + "configDialog1": "Επίλεξε Πλακέτα και Θύρα αν θέλεις να ανεβάσεις ένα έργο.", + "configDialog2": "Αν επιλέξεις μονο Πλακέτα θα μπορείς να κάνεις μόνο μεταγγλώτιση, αλλά οχι να ανεβάσεις το σχέδιο.", "couldNotFindPreviouslySelected": "Δεν έγινε εντοπισμός της προηγουμένως επιλεγμένης πλακέτας '{0}' στην εγκατεστημένη πλατφόρμα '{1}'. Παρακαλώ επίλεξε πάλι χειροκίνητα την πλακέτα που θέλεις να χρησιμοποιήσεις. Θέλεις να την επιλέξεις τώρα;", - "disconnected": "Disconnected", + "editBoardsConfig": "Πλακέτα και θύρα...", "getBoardInfo": "Εμφάνιση Πληροφοριών Πλακέτας", "inSketchbook": "(στα Σχέδια)", "installNow": "Ο πυρήνας \"{0} {1}\" πρέπει να εγκατασταθεί για την επιλεγμένη πλακέτα {2}. Θέλεις να την εγκαταστήσεις τώρα;", - "noFQBN": "The FQBN is not available for the selected board \"{0}\". Do you have the corresponding core installed?", - "noPortsDiscovered": "No ports discovered", - "noPortsSelected": "Δεν επιλέχθηκε θύρα για την πλακέτα: '{0}'.", - "noneSelected": "Δεν επιλέχθηκε πλακέτα", + "noBoardsFound": "Δεν βρέθηκαν πλακέτες για \" {0}\"", + "noNativeSerialPort": "Δεν είναι δυνατή η λήψη πληροφοριών μέσω της ενσωματωμένης σειριακής θύρας", + "noPortsDiscovered": "Δεν βρέθηκαν Θύρες", + "nonSerialPort": "Μη σειριακή θύρα, δεν είναι δυνατή η λήψη πληροφοριών.", "openBoardsConfig": "Επιλογή διαφορετικής πλακέτας και θύρας...", - "platformMissing": "Η πλατφόρμα για την επιλεγμένη πλακέτα '{0}' δεν έχει εγκατασταθεί.", "pleasePickBoard": "Πσρακαλώ επίλεξε μια πλακέτα που συνδέθηκε στην θύρα που έχεις επιλέξει.", "port": "Θύρα{0}", - "portLabel": "Port: {0}", + "ports": "Θύρες", "programmer": "Προγραμματιστής", + "reloadBoardData": "Reload Board Data", "reselectLater": "Επιλογή αργότερα", - "searchBoard": "Search board", + "revertBoardsConfig": "Χρησιμοποιήστε '{0}' που ανακαλύφθηκε στο '{1}'", + "searchBoard": "Αναζήτηση πλακέτας", "selectBoard": "Επιλογή Πλακέτας", - "selectBoardForInfo": "Παρακαλώ επίλεξε μια πλακέτα για εμφάνιση πληροφοριών πλακέτας.", + "selectBoardToReload": "Please select a board first.", "selectPortForInfo": "Παρακαλώ επίλεξε μια θύρα για εμφάνιση πληροφοριών πλακέτας.", "showAllAvailablePorts": "Εμφανίζει όλες τις διαθέσιμες θύρες όταν είναι ενεργοποιημένο.", + "showAllPorts": "Εμφάνιση όλων των θυρών", "succesfullyInstalledPlatform": "Επιτυχής εγκατάσταση πλατφόρμας {0}:{1}", - "succesfullyUninstalledPlatform": "Επιτυχής απεγκατάσταση πλατφόρμας {0}:{1}" + "succesfullyUninstalledPlatform": "Επιτυχής απεγκατάσταση πλατφόρμας {0}:{1}", + "typeOfPorts": "{0}Θύρες", + "unconfirmedBoard": "Μη επιβεβαιωμένη πλακέτα", + "unknownBoard": "Άγνωστη πλακέτα" }, "boardsManager": "Διαχειριστής Πλακετών", "boardsType": { - "arduinoCertified": "Arduino Certified" + "arduinoCertified": "Πιστοποίηση Arduino" }, "bootloader": { - "burnBootloader": "Burn Bootloader", - "burningBootloader": "Burning bootloader...", - "doneBurningBootloader": "Done burning bootloader." + "burnBootloader": "Εγγραφή Bootloader", + "burningBootloader": "Εγγραφή bootloader...", + "doneBurningBootloader": "Ολοκληρώθηκε η εγγραφή του bootloader." }, "burnBootloader": { - "error": "Error while burning the bootloader: {0}" + "error": "Σφάλμα κατά την εγγραφή του bootloader:{0}" }, "certificate": { "addNew": "Προσθήκη Νέου", - "addURL": "Add URL to fetch SSL certificate", - "boardAtPort": "{0} at {1}", - "certificatesUploaded": "Certificates uploaded.", - "enterURL": "Enter URL", - "noSupportedBoardConnected": "No supported board connected", - "openContext": "Open context", + "addURL": "Προσθήκη διεύθυνσης URL για λήψη πιστοποιητικού SSL", + "boardAtPort": "{0} στο {1}", + "certificatesUploaded": "Τα πιστοποιητικά φορτώθηκαν.", + "enterURL": "Εισαγάγετε τη διεύθυνση URL", + "noSupportedBoardConnected": "Δεν έχει συνδεθεί υποστηριζόμενη πλακέτα", + "openContext": "Ανοιχτό πλαίσιο", "remove": "Αφαίρεση", - "selectBoard": "Select a board...", - "selectCertificateToUpload": "1. Select certificate to upload", - "selectDestinationBoardToUpload": "2. Select destination board and upload certificate", + "selectBoard": "Επιλογή Πλακέτας", + "selectCertificateToUpload": "1. Επιλέξτε πιστοποιητικό για φόρτωση", + "selectDestinationBoardToUpload": "2. Επιλέξτε πλακέτα προορισμού και φορτώστε το πιστοποιητικό", "upload": "Ανέβασμα", - "uploadFailed": "Upload failed. Please try again.", - "uploadRootCertificates": "Upload SSL Root Certificates", - "uploadingCertificates": "Uploading certificates." + "uploadFailed": "Η φόρτωση απέτυχε. Παρακαλώ προσπαθήστε ξανά.", + "uploadRootCertificates": "Φορτώστε τα πιστοποιητικά SSL Root", + "uploadingCertificates": "Ανέβασμα πιστοποιητικών." }, "checkForUpdates": { - "checkForUpdates": "Check for Arduino Updates", - "installAll": "Install All", - "noUpdates": "There are no recent updates available.", - "promptUpdateBoards": "Updates are available for some of your boards.", - "promptUpdateLibraries": "Updates are available for some of your libraries.", - "updatingBoards": "Updating boards...", - "updatingLibraries": "Updating libraries..." + "checkForUpdates": "Ελέγξτε το Arduino για ενημερώσεις ", + "installAll": "Εγκατάσταση όλων", + "noUpdates": "Δεν υπάρχουν διαθέσιμες πρόσφατες ενημερώσεις.", + "promptUpdateBoards": "Διατίθενται ενημερώσεις για ορισμένες από τις πλακέτες", + "promptUpdateLibraries": "Υπάρχουν διαθέσιμες ενημερώσεις για ορισμένες από τις βιβλιοθήκες σας.", + "updatingBoards": "Ενημέρωση πλακετών...", + "updatingLibraries": "Ενημέρωση βιβλιοθηκών..." }, "cli-error-parser": { - "keyboardError": "'Keyboard' not found. Does your sketch include the line '#include <Keyboard.h>'?", - "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" + "keyboardError": "Το \"πληκτρολόγιο\" δεν βρέθηκε. Το έργο σας περιλαμβάνει τη γραμμή '#include <Keyboard.h>';", + "mouseError": "Το 'Ποντίκι' δεν βρέθηκε. Περιλαμβάνει το έργο σας τη γραμμή '#include <Mouse.h>'; " }, "cloud": { - "account": "Account", - "chooseSketchVisibility": "Επίλεξε την ορατότητα του Σχεδίου σου:", + "chooseSketchVisibility": "Επιλέξτε την εμφάνιση του έργου σας:", + "cloudSketchbook": "Cloud Άλμπουμ έργων.", "connected": "Συνδέθηκε", "continue": "Συνέχεια", - "donePulling": "Done pulling ‘{0}’.", - "donePushing": "Done pushing ‘{0}’.", + "donePulling": "Τελείωσε το κατέβασμα '{0}'.", + "donePushing": "Τελείωσε το ανέβασμα '{0}'.", "embed": "Ενσωμάτωση:", "emptySketchbook": "Τα Σχέδια σου είναι άδεια.", + "goToCloud": "Μεταβείτε στο Cloud", "learnMore": "Μάθε περισσότερα", "link": "Σύνδεσμος:", - "notYetPulled": "Cannot push to Cloud. It is not yet pulled.", + "notYetPulled": "Δεν είναι δυνατή η προώθηση στο Cloud. Δεν έχει κατέβει ακόμα.", "offline": "Εκτός Σύνδεσης", "openInCloudEditor": "Άνοιγμα σε Συντάκτη Cloud", "options": "Επιλογές...", "privateVisibility": "Ιδιωτικό. Μόνο εσύ μπορείς να δεις το Σχέδιο.", "profilePicture": "Εικόνα προφίλ", "publicVisibility": "Δημόσιο. Οποιόσδηποτε με το σύνδεσμο μπορεί να δει το Σχέδιο.", - "pull": "Pull", - "pullFirst": "You have to pull first to be able to push to the Cloud.", - "pullSketch": "Pull Sketch", - "pullSketchMsg": "Pulling this Sketch from the Cloud will overwrite its local version. Are you sure you want to continue?", - "push": "Push", - "pushSketch": "Push Sketch", - "pushSketchMsg": "This is a Public Sketch. Before pushing, make sure any sensitive information is defined in arduino_secrets.h files. You can make a Sketch private from the Share panel.", + "pull": "Τραβήξτε", + "pullFirst": "Πρώτα πρέπει να τραβήξετε για να μπορέσετε να το ανεβάσετε στο Cloud.", + "pullSketch": "Τραβήξτε το σχέδιο", + "pullSketchMsg": "Αν τραβήξετε αυτό το Σχέδιο από το Cloud, θα αντικατασταθεί η τοπική του έκδοση. Είσαι σίγουρος ότι θέλεις να συνεχίσεις;", + "push": "Πιέστε", + "pushSketch": "Τραβήξτε το σχέδιο", + "pushSketchMsg": "Αυτό είναι ένα Δημόσιο Σχέδιο. Βεβαιωθείτε ότι οποιεσδήποτε ευαίσθητες πληροφορίες έχουν οριστεί στο φάκελο arduino_secrets.h. Μπορείτε να κάνετε ένα Σχέδιο ιδιωτικό από τον πίνακα Κοινή χρήση.", "remote": "Απομακρυνσμένο", - "remoteSketchbook": "Remote Sketchbook", "share": "Κοινοποίηση...", "shareSketch": "Κοινοποίηση Σχεδίου", - "showHideRemoveSketchbook": "Εμφάνιση/Απόκρυψη Απομακρυνσμένων Σχεδίων", + "showHideSketchbook": "Εμφάνιση/Απόκρυψη του βιβλίου σχεδίων του Cloud", "signIn": "ΣΥΥΝΔΕΣΗ", "signInToCloud": "Σύνδεση στο Arduino Cloud", "signOut": "Αποσύνδεση", - "sync": "Sync", + "sync": "Συγχρονισμός", "syncEditSketches": "Συγχρονισμός και τροποποίηση των Arduino Cloud Σχεδίων σου.", "visitArduinoCloud": "Επισκέψου το Arduino Cloud για δημιουργία Σχεδίων Cloud." }, + "cloudSketch": { + "alreadyExists": "Υπάρχει ήδη το σχέδιο '{0}' στο Cloud ", + "creating": "Δημιουργία σχεδίου στο cloud '{0}'...", + "new": "Νέο έργο στο Cloud", + "notFound": "Δεν ήταν δυνατή η ανάκτηση του έργου'{0}'. από το could. Δεν υπάρχει.", + "pulling": "Συγχρονισμός βιβλιοθήκη έργων, τραβώντας '{0}'...", + "pushing": "Synchronizing sketchbook, pushing '{0}'...", + "renaming": "Μετονομασία έργου could από '{0}' σε '{1}'...", + "synchronizingSketchbook": "Synchronizing sketchbook..." + }, "common": { - "all": "All", - "contributed": "Contributed", + "all": "Όλα", + "contributed": "Συνεισέφερε", "installManually": "Χειροκίνητη Εγκατάσταση", "later": "Αργότερα", "noBoardSelected": "Δεν έχει επιλεχθεί πλακέτα", + "noSketchOpened": "No sketch opened", "notConnected": "[μη συνδεμένο]", "offlineIndicator": "Φαίνεται πως είστε εκτός σύνδεσης. Χωρίς σύνδεση στο Internet, το Arduino CLI ίσως να μη μπορεί να κάνει λήψη των απαιτούμενων πόρων και να υπάρξει δυσλειτουργία. Παρακαλώ συνδεθείτε στο Internet και επανεκκινήστε την εφαρμογή.", "oldFormat": "Το '{0}' χρησιμοποιεί ακόμα το παλιό '.pde' στυλ. Θέλετε να αλλάξετε στην νέα κατάληξη '.ino';", - "partner": "Partner", + "partner": "Συνεργάτης", "processing": "Επεξεργασία", - "recommended": "Recommended", - "retired": "Retired", + "recommended": "Συνιστάται", + "retired": "Παλιό ", + "selectManually": "Επιλέξτε Χειροκίνητα", "selectedOn": "στο {0}", "serialMonitor": "Παρακολούθηση Σειριακής", - "type": "Type", + "type": "Τύπος", "unknown": "Άγνωστο", - "updateable": "Updatable" + "updateable": "Με δυνατότητα ενημέρωσης", + "userAbort": "Ακύρωση χρήστη" }, "compile": { "error": "Σφάλμα μεταγλώττισης: {0}" }, "component": { - "boardsIncluded": "Boards included in this package:", + "boardsIncluded": "Πλακέτες που περιλαμβάνονται σε αυτό το πακέτο:", "by": "από", - "filterSearch": "Filter your search...", - "install": "ΕΓΚΑΤΑΣΤΑΣΗ", + "clickToOpen": "Κάντε κλικ για να ανοίξετε στο πρόγραμμα περιήγησης:{0}", + "filterSearch": "Φιλτράρετε την αναζήτησή σας...", + "install": "Εγκατάσταση", + "installLatest": "Εγκαταστήστε το πιο πρόσφατο", + "installVersion": "Εγκατάσταση {0}", + "installed": "{0} εγκατεστημένο", "moreInfo": "Περισσότερες πληροφορίες", + "otherVersions": "Άλλες Εκδόσεις", + "remove": "Αφαίρεση", + "title": "{0} με {1}", "uninstall": "Απεγκατάσταση", - "uninstallMsg": "Do you want to uninstall {0}?", - "version": "Έκδοση {0}" + "uninstallMsg": "Θέλετε να απεγκαταστήσετε το {0};", + "update": "Αναβάθμιση" + }, + "configuration": { + "cli": { + "inaccessibleDirectory": "Δεν ήταν δυνατή η πρόσβαση στη θέση του βιβλίου σχεδίων στο '{0}':{1}" + } + }, + "connectionStatus": { + "connectionLost": "Η σύνδεση χάθηκε. Οι ενέργειες και οι ενημερώσεις σχεδίων στο cloud δεν θα είναι διαθέσιμες." }, "contributions": { "addFile": "Προσθήκη αρχείου", "fileAdded": "Ένα αρχείο προστέθηκε στον κώδικα.", + "plotter": { + "couldNotOpen": "Δεν ήταν δυνατό το άνοιγμα του σειριακού plotter" + }, "replaceTitle": "Αντικατάσταση" }, + "core": { + "compilerWarnings": { + "all": "Όλα ", + "default": "Προκαθορισμένο", + "more": "Περισσότερα ", + "none": "Κανένας" + } + }, "coreContribution": { - "copyError": "Copy error messages", - "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." + "copyError": "Αντιγραφή μηνυμάτων σφάλματος", + "noBoardSelected": "Δεν έχει επιλεγεί πίνακας. Επιλέξτε την πλακέτα Arduino από το μενού Εργαλεία > Πίνακας" }, + "createCloudCopy": "Push Sketch to Cloud", "daemon": { - "restart": "Restart Daemon", - "start": "Start Daemon", + "restart": "Επανεκκινήστε το Daemon", + "start": "Ξεκινήστε το Daemon", "stop": "Stop Daemon" }, "debug": { "debugWithMessage": "Αποσφαλμάτωση - {0}", "debuggingNotSupported": "Δεν υποστιρίζεται αποσφαλμάτωση από '{0}'", + "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "Δεν έχει εγκατασταθεί πλατφόρμα για '{0}'", - "optimizeForDebugging": "Βελτιστοποίηση για Αποσφαλμάτωση" + "optimizeForDebugging": "Βελτιστοποίηση για Αποσφαλμάτωση", + "sketchIsNotCompiled": "Το έργο '{0}' πρέπει να επαληθευτεί πριν από την έναρξη μιας διαδικασίας αποσφαλμάτωσης. Παρακαλώ επαληθεύστε το σκίτσο και ξεκινήστε ξανά την αποσφαλμάτωση. Θέλετε να επαληθεύσετε το έργο τώρα;" + }, + "developer": { + "clearBoardList": "Clear the Board List History", + "clearBoardsConfig": "Διαγράψτε την επιλογή πλακέτας και θύρας", + "dumpBoardList": "Αδειάστε τη λίστα του Πίνακα" }, "dialog": { - "dontAskAgain": "Don't ask again" + "dontAskAgain": "Μην με ξαναρωτήσεις" }, "editor": { - "autoFormat": "Auto Format", - "commentUncomment": "Comment/Uncomment", - "copyForForum": "Copy for Forum (Markdown)", - "decreaseFontSize": "Decrease Font Size", - "decreaseIndent": "Decrease Indent", - "increaseFontSize": "Increase Font Size", - "increaseIndent": "Increase Indent", - "nextError": "Next Error", - "previousError": "Previous Error", - "revealError": "Reveal Error" - }, - "electron": { - "couldNotSave": "Could not save the sketch. Please copy your unsaved work into your favorite text editor, and restart the IDE.", - "unsavedChanges": "Οι μη αποθηκευμένες αλλαγές θα χαθούν." + "autoFormat": "Αυτόματο Format", + "commentUncomment": "Σχόλιο/Μη σχολιασμός", + "copyForForum": "Αντιγραφή για φόρουμ (Markdown)", + "decreaseFontSize": "Μειώστε το μέγεθος γραμματοσειράς", + "decreaseIndent": "Μείωση εσοχής", + "increaseFontSize": "Αυξήστε το μέγεθος γραμματοσειράς", + "increaseIndent": "Αύξηση εσοχής", + "nextError": "Επόμενο Σφάλμα", + "previousError": "Προηγούμενο Σφάλμα", + "revealError": "Αποκάλυψη σφάλματος" }, "examples": { - "builtInExamples": "Built-in examples", - "couldNotInitializeExamples": "Could not initialize built-in examples.", - "customLibrary": "Examples from Custom Libraries", + "builtInExamples": "Ενσωματωμένα παραδείγματα", + "couldNotInitializeExamples": "Δεν ήταν δυνατή η προετοιμασία των ενσωματωμένων παραδειγμάτων.", + "customLibrary": "Παραδείγματα από τις προσαρμοσμένες βιβλιοθήκες", "for": "Παραδείγματα για {0}", - "forAny": "Examples for any board", + "forAny": "Παραδείγματα για οποιαδήποτε πλακέτα", "menu": "Παραδείγματα" }, "firmware": { - "checkUpdates": "Check Updates", - "failedInstall": "Installation failed. Please try again.", + "checkUpdates": "Ελέγξτε τις ενημερώσεις", + "failedInstall": "Η εγκατάσταση απέτυχε. Παρακαλώ προσπαθήστε ξανά.", "install": "Εγκατάσταση", - "installingFirmware": "Installing firmware.", - "overwriteSketch": "Installation will overwrite the Sketch on the board.", + "installingFirmware": "Εγκατάσταση λογισμικού.", + "overwriteSketch": "Η εγκατάσταση θα αντικαταστήσει το σχέδιο στον πίνακα.", "selectBoard": "Επιλογή Πλακέτας", - "selectVersion": "Select firmware version", - "successfullyInstalled": "Firmware successfully installed.", - "updater": "WiFi101 / WiFiNINA Firmware Updater" + "selectVersion": "Επιλέξτε έκδοση λογισμικού", + "successfullyInstalled": "Το λογισμικό εγκαταστάθηκε με επιτυχία.", + "updater": "Ενημέρωση λογισμικού" }, "help": { "environment": "Περιβάλλον", - "faq": "Frequently Asked Questions", - "findInReference": "Find in Reference", - "gettingStarted": "Getting Started", - "keyword": "Type a keyword", - "privacyPolicy": "Privacy Policy", - "reference": "Reference", + "faq": "Συχνές Ερωτήσεις", + "findInReference": "Βρείτε στην Αναφορά", + "gettingStarted": "Ξεκινώντας", + "keyword": "Πληκτρολογήστε μια λέξη-κλειδί", + "privacyPolicy": "Πολιτική Απορρήτου", + "reference": "Αναφορά", "search": "Αναζήτηση στο Arduino.cc", - "troubleshooting": "Troubleshooting", + "troubleshooting": "Αντιμετώπιση προβλημάτων", "visit": "Επίσκεψη Arduino.cc" }, "ide-updater": { - "checkForUpdates": "Check for Arduino IDE Updates", - "closeAndInstallButton": "Close and Install", - "closeToInstallNotice": "Close the software and install the update on your machine.", - "downloadButton": "Download", - "downloadingNotice": "Downloading the latest version of the Arduino IDE.", - "errorCheckingForUpdates": "Error while checking for Arduino IDE updates.\n{0}", - "goToDownloadButton": "Go To Download", - "goToDownloadPage": "An update for the Arduino IDE is available, but we're not able to download and install it automatically. Please go to the download page and download the latest version from there.", - "ideUpdaterDialog": "Software Update", - "newVersionAvailable": "A new version of Arduino IDE ({0}) is available for download.", - "noUpdatesAvailable": "There are no recent updates available for the Arduino IDE", - "notNowButton": "Not now", - "skipVersionButton": "Skip Version", - "updateAvailable": "Update Available", - "versionDownloaded": "Arduino IDE {0} has been downloaded." + "checkForUpdates": "Ελέγξτε για νέες ενημερώσεις Arduino IDE", + "closeAndInstallButton": "Κλείσιμο και εγκατάσταση", + "closeToInstallNotice": "Κλείστε το πρόγραμμα και εγκαταστήστε την ενημέρωση στον υπολογιστή σας.", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", + "downloadButton": "Κατεβάστε", + "downloadingNotice": "Λήψη της πιο πρόσφατης έκδοσης του Arduino IDE.", + "errorCheckingForUpdates": "Σφάλμα κατά τον έλεγχο για ενημερώσεις του Arduino IDE.\n{0}", + "goToDownloadButton": "Μετάβαση στη λήψη", + "goToDownloadPage": "Υπάρχει διαθέσιμη ενημέρωση για το Arduino IDE, αλλά δεν μπορούμε να το κατεβάσουμε και να το εγκαταστήσουμε αυτόματα. Μεταβείτε στη σελίδα λήψης και κατεβάστε την πιο πρόσφατη έκδοση από εκεί. ", + "ideUpdaterDialog": "Ενημέρωση λογισμικού", + "newVersionAvailable": "Μια νέα έκδοση του Arduino IDE ({0}) είναι διαθέσιμη για λήψη.", + "noUpdatesAvailable": "Δεν υπάρχουν διαθέσιμες πρόσφατες ενημερώσεις για το Arduino IDE", + "notNowButton": "Όχι τώρα", + "skipVersionButton": "Παράλειψη έκδοσης", + "updateAvailable": "Διαθέσιμη ενημέρωση", + "versionDownloaded": "Arduino IDE {0} έχει ληφθεί." + }, + "installable": { + "libraryInstallFailed": "Αποτυχία εγκατάστασης βιβλιοθήκης: '{0}{1}'.", + "platformInstallFailed": "Αποτυχία εγκατάστασης πλατφόρμας: '{0}{1}'." }, "library": { "addZip": "Προσθέστε μια βιβλιοθήκη μορφής .ZIP", "arduinoLibraries": "Βιβλιοθήκες Arduino", - "contributedLibraries": "Contributed libraries", - "dependenciesForLibrary": "Dependencies for library {0}:{1}", + "contributedLibraries": "Συνεισφορά βιβλιοθηκών", "include": "Συμπεριλάβετε βιβλιοθήκη", "installAll": "Εγκατάσταση όλων", - "installMissingDependencies": "Would you like to install all the missing dependencies?", - "installOneMissingDependency": "Would you like to install the missing dependency?", - "installOnly": "Εγκατάσταση {0} μόνο", - "installedSuccessfully": "Successfully installed library {0}:{1}", + "installLibraryDependencies": "Εγκαταστήστε τα στοιχεία της βιβλιοθήκης.", + "installMissingDependencies": "Θέλετε να εγκαταστήσετε όλα τα στοιχεία που λείπουν;", + "installOneMissingDependency": "Θέλετε να εγκαταστήσετε το στοιχείο που λείπει; ", + "installWithoutDependencies": "Install without dependencies", + "installedSuccessfully": "Επιτυχής εγκατάσταση Βιβλιοθήκης {0} :{1} ", "libraryAlreadyExists": "Μια βιβλιοθήκη υπάρχει ήδη. Θέλετε να την αντικαταστήσετε;", "manageLibraries": "Διαχείριση βιβλιοθηκών...", "namedLibraryAlreadyExists": "Μια βιβλιοθήκη με όνομα {0} υπάρχει ήδη. Θέλετε να γίνει αντικατάσταση;", - "needsMultipleDependencies": "The library <b>{0}:{1}</b> needs some other dependencies currently not installed:", - "needsOneDependency": "The library <b>{0}:{1}</b> needs another dependency currently not installed:", + "needsMultipleDependencies": "Η βιβλιοθήκη <b>{0}:{1}</b> χρειάζεται κάποιες άλλες εξαρτήσεις που δεν είναι εγκατεστημένες αυτήν τη στιγμή:", + "needsOneDependency": "Η βιβλιοθήκη <b>{0}:{1} </b>χρειάζεται μια άλλη εξάρτηση που δεν έχει εγκατασταθεί αυτήν τη στιγμή:", "overwriteExistingLibrary": "Θέλετε να αντικαταστήσετε αυτή τη βιβλιοθήκη;", "successfullyInstalledZipLibrary": "Επιτυχής εγκατάσταση βιβλιοθήκης απο το αρχείο {0}", "title": "Διαχειριστής βιβλιοθηκών", - "uninstalledSuccessfully": "Successfully uninstalled library {0}:{1}", + "uninstalledSuccessfully": " Επιτυχής απεγκατάστασης Βιβλιοθήκης {0}:{1}", "zipLibrary": "Διαχειριστής βιβλιοθήκης" }, "librarySearchProperty": { - "topic": "Topic" + "topic": "Θέμα" }, "libraryTopic": { - "communication": "Communication", - "dataProcessing": "Data Processing", - "dataStorage": "Data Storage", - "deviceControl": "Device Control", - "display": "Display", - "other": "Other", - "sensors": "Sensors", - "signalInputOutput": "Signal Input/Output", - "timing": "Timing", - "uncategorized": "Uncategorized" + "communication": "Επικοινωνία ", + "dataProcessing": "Επεξεργασία δεδομένων", + "dataStorage": "Αποθήκευση δεδομένων", + "deviceControl": "Έλεγχος συσκευής", + "display": "Εμφάνιση", + "other": "Άλλα", + "sensors": "Αισθητήρες", + "signalInputOutput": "Είσοδος/Έξοδος Σήματος", + "timing": "Συγχρονισμός", + "uncategorized": "Χωρίς κατηγοριοποίηση" }, "libraryType": { - "installed": "Installed" + "installed": "Εγκατεστημένο" }, "menu": { - "advanced": "Advanced", + "advanced": "Προχωρημένος", "sketch": "Σχέδιο", "tools": "Εργαλεία" }, "monitor": { - "unableToCloseWebSocket": "Unable to close websocket", - "unableToConnectToWebSocket": "Unable to connect to websocket" + "alreadyConnectedError": "Δεν ήταν δυνατή η σύνδεση στη θύρα{0}{1}. Είστε ήδη συνδεδεμένος.", + "baudRate": "{0}baud", + "connectionFailedError": "Δεν ήταν δυνατή η σύνδεση στη θύρα {0}{1}.", + "connectionFailedErrorWithDetails": "{0}Δεν ήταν δυνατή η σύνδεση στη θύρα.{1}{2}", + "connectionTimeout": "Τέλος χρόνου. Το IDE δεν έχει λάβει το μήνυμα «επιτυχίας» από την οθόνη μετά την επιτυχή σύνδεση σε αυτό", + "missingConfigurationError": "Δεν ήταν δυνατή η σύνδεση στη θύρα{0} {1}. Λείπει η διαμόρφωση της οθόνης.", + "notConnectedError": "Δεν είναι συνδεδεμένο στη θύρα {0} {1}.", + "unableToCloseWebSocket": "Δεν είναι δυνατό να κλείσει η διαδικτυακή πρίζα", + "unableToConnectToWebSocket": "Δεν είναι δυνατή η σύνδεση με την διαδικτυακή πρίζα" + }, + "newCloudSketch": { + "newSketchTitle": "Όνομα του νέου Cloud Σχεδίου" + }, + "portProtocol": { + "network": "Δίκτυο", + "serial": "Σειριακός" }, "preferences": { "additionalManagerURLs": "Πρόσθετοι Σύνδεσμοι Διαχειριστή Πλακετών", "auth.audience": "The OAuth2 audience.", "auth.clientID": "The OAuth2 client ID.", "auth.domain": "The OAuth2 domain.", - "auth.registerUri": "The URI used to register a new user.", + "auth.registerUri": "Αυτό το URI χρησιμοποιήθηκε για την εγγραφή ενός νέου χρήστη.", "automatic": "Αυτόματο", "board.certificates": "Λίστα πιστοποιητικών που μπορούν να ανέβουν σε πλακέτες", "browse": "Περιήγηση", - "checkForUpdate": "Receive notifications of available updates for the IDE, boards, and libraries. Requires an IDE restart after change. It's true by default.", + "checkForUpdate": "Λάβετε ειδοποιήσεις σχετικά με τις διαθέσιμες ενημερώσεις για το IDE, τις πλακέτες και τις βιβλιοθήκες. Απαιτεί επανεκκίνηση του IDE μετά την αλλαγή. Είναι αλήθεια από προεπιλογή.", "choose": "Επιλογή", - "cli.daemonDebug": "Enable debug logging of the gRPC calls to the Arduino CLI. A restart of the IDE is needed for this setting to take effect. It's false by default.", + "cli.daemonDebug": "Ενεργοποίηση καταγραφής εντοπισμού σφαλμάτων των κλήσεων gRPC προς το Arduino CLI. Απαιτείται επανεκκίνηση του IDE για να εφαρμοστεί αυτή η ρύθμιση. Είναι ψευδές από προεπιλογή.", "cloud.enabled": "Αληθές αν οι λειτουγίες συγχονισμού σχεδίου είναι ενεργοποιημένες. Προεπιλογή ως αληθές.", "cloud.pull.warn": "Αληθές αν οι χρήστες πρέπει προειδοποιηθούν πριν τραβηχτεί ενα σχέδιο σύννεφου. Προεπιλογή ως αληθές.", "cloud.push.warn": "Αληθές αν οι χρήστες πρέπει προειδοποιηθούν πριν σπρωχθεί ενα σχέδιο σύννεφου. Προεπιλογή ως αληθές. ", "cloud.pushpublic.warn": "Αληθές αν οι χρήστες πρέπει προειδοποιηθούν πριν σπρωχθεί ενα δημόσιο σχέδιο σύννεφου. Προεπιλογή ως αληθές. ", - "cloud.sketchSyncEndpoint": "The endpoint used to push and pull sketches from a backend. By default it points to Arduino Cloud API.", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", + "cloud.sketchSyncEndpoint": "Το σημείο που χρησιμοποιείται για την αποστολή και λήψη σκίτσων από ένα πίσω μέρος. Από προεπιλογή δείχνει στο Arduino Cloud API.", "compile": "μεταγλώττιση", - "compile.experimental": "True if the IDE should handle multiple compiler errors. False by default", + "compile.experimental": "Σωστό αν το IDE πρέπει να χειρίζεται πολλαπλά σφάλματα μεταγλωττιστή. Λάθος από προεπιλογή", "compile.revealRange": "Adjusts how compiler errors are revealed in the editor after a failed verify/upload. Possible values: 'auto': Scroll vertically as necessary and reveal a line. 'center': Scroll vertically as necessary and reveal a line centered vertically. 'top': Scroll vertically as necessary and reveal a line close to the top of the viewport, optimized for viewing a code definition. 'centerIfOutsideViewport': Scroll vertically as necessary and reveal a line centered vertically only if it lies outside the viewport. The default value is '{0}'.", "compile.verbose": "Αληθές για λεπτομερή έξοδο μεταγλώττισης. Ψευδές απο προεπιλογή.", "compile.warnings": "Λέει στο gcc ποιο επίπεδο προειδοποίησης να χρησιμοποιήσει. Είναι 'None' απο προεπιλογή", @@ -308,117 +386,176 @@ "editorQuickSuggestions": "Επιμελιτής γρήγορων προτάσεων", "enterAdditionalURLs": "Τοποθετήστε πρόσθετους Συνδέσμους, ένα σε κάθε σειρά", "files.inside.sketches": "Εμφάνιση αρχείων μέσα σε Σχέδια", - "ide.updateBaseUrl": "The base URL where to download updates from. Defaults to 'https://downloads.arduino.cc/arduino-ide'", - "ide.updateChannel": "Release channel to get updated from. 'stable' is the stable release, 'nightly' is the latest development build.", + "ide.updateBaseUrl": "Η βασική διεύθυνση URL από την οποία μπορείτε να πραγματοποιήσετε λήψη ενημερώσεων. Οι προεπιλογές είναι \"https://downloads.arduino.cc/arduino-ide\"", + "ide.updateChannel": "Κυκλοφόρησε το κανάλι για να ενημέρωση. Το \"stable\" είναι η σταθερή έκδοση, το \"nightly\" είναι η τελευταία έκδοση ανάπτυξης.", "interfaceScale": "Κλίμακα διεπαφής", "invalid.editorFontSize": "Μη-έγκυρο μέγεθος γραμματοσειράς συντάκτη. Πρέπει να είναι θετικός ακέραιος.", "invalid.sketchbook.location": "Μη-έγκυρη τοποθεσία σχεδίων: {0}", "invalid.theme": "Μη-έγκυρο θέμα.", - "language.log": "Αληθές αν ο Arduino Language Server πρέπει να παράξει αρχεία κατάστασης στον φάκελο σχεδίου. Διαφορετικά, ψευδές. Είναι ψευδές απο προεπιλογή.", - "language.realTimeDiagnostics": "If true, the language server provides real-time diagnostics when typing in the editor. It's false by default.", - "manualProxy": "Manual proxy configuration", + "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", + "language.log": "Σωστό εάν ο διακομιστής γλώσσας Arduino πρέπει να δημιουργήσει αρχεία καταγραφής στο φάκελο σκίτσου. Διαφορετικά, ψευδής. Είναι ψευδές από προεπιλογή.", + "language.realTimeDiagnostics": "Εάν ισχύει, ο διακομιστής γλώσσας παρέχει διαγνωστικά σε πραγματικό χρόνο όταν πληκτρολογείτε στον επεξεργαστή. Είναι ψευδές από προεπιλογή.", + "manualProxy": "Μη αυτόματη διαμόρφωση proxy διακομιστή μεσολάβησης", + "monitor": { + "dockPanel": "Η περιοχή του περιβλήματος της εφαρμογής όπου θα βρίσκεται το γραφικό στοιχείο _{0}_. Είναι είτε \"κάτω\" είτε \"δεξιά\". Προεπιλέγεται σε \"{1}\"." + }, "network": "Δίκτυο", "newSketchbookLocation": "Επιλογή νέας τοποθεσίας σχεδίων", - "noProxy": "No proxy", + "noCliConfig": "Δεν ήταν δυνατή η φόρτωση της ρύθμισης παραμέτρων CLI", + "noProxy": "Χωρίς πληρεξούσιο", + "proxySettings": { + "hostname": "Όνομα κεντρικού υπολογιστή", + "password": "Κωδικός πρόσβασης", + "port": "Αριθμός θύρας", + "username": "Όνομα χρήστη" + }, "showVerbose": "Εμφάνιση λεπτομερούς εξόδου κατά τη διάρκεια", + "sketch": { + "inoBlueprint": "Απόλυτη διαδρομή συστήματος αρχείων στο προεπιλεγμένο αρχείο σχεδιαγράμματος `.ino`. Εάν έχει καθοριστεί, το περιεχόμενο του αρχείου σχεδιαγράμματος θα χρησιμοποιείται για κάθε νέο σκίτσο που δημιουργείται από το IDE. Τα σκίτσα θα δημιουργηθούν με το προεπιλεγμένο περιεχόμενο Arduino εάν δεν καθοριστεί. Τα μη προσβάσιμα αρχεία σχεδιαγράμματος αγνοούνται. **Απαιτείται επανεκκίνηση του IDE** για να τεθεί σε ισχύ αυτή η ρύθμιση." + }, "sketchbook.location": "Τοποθεσία σχεδίων", "sketchbook.showAllFiles": "Αληθές για εμφάνιση όλων των αρχείων σχεδίου μεσα στο σχέδιο. Είναι ψευδές απο προεπιλογή.", - "survey.notification": "True if users should be notified if a survey is available. True by default.", "unofficialBoardSupport": "Κλικ για λίστα Συνδέσμων ανεπίσημης υποστήριξης πλακετών", "upload": "ανέβασμα", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", "upload.verbose": "Αληθές για λεπτομερή έξοδο ανεβάσματος. Ψευδές απο προεπιλογή.", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "Επιβεβαίωση κώδικα μετά το ανέβασμα", "window.autoScale": "Αληθές αν η διεπαφή χρήστη κλιμακλωνεται αυτόματα μαζί με το μέγεθος γραμματοσειράς.", - "window.zoomLevel": "Ρύθμιση του επιπέδου μεγέθυνσης του παραθύρου. Το αρχικό μέγεθος ειναι 0 και κάθε αύξηση (π.χ. 1) ή μείωση (π.χ. -1) αναπαριστά μεγέθυνση 20% μεγαλύτερη ή μικρότερη. Μπορούν να εισαχθούν και δεκαδικά για προσαρμογή της μεγέθυνσης με μεγαλύτερη λεπτομέρεια." + "window.zoomLevel": { + "deprecationMessage": "Καταργήθηκε. Χρησιμοποιήστε αντί αυτού το 'window.zoomLevel'." + } + }, + "renameCloudSketch": { + "renameSketchTitle": "Νέο όνομα του Cloud Σχεδίου" }, - "replaceMsg": "Replace the existing version of {0}?", - "selectZip": "Select a zip file containing the library you'd like to add", + "replaceMsg": "Αντικατάσταση της υπάρχουσας έκδοσης του {0};", + "selectZip": "Επιλέξτε ένα αρχείο zip που περιέχει τη βιβλιοθήκη που θέλετε να προσθέσετε", "serial": { - "autoscroll": "Autoscroll", - "carriageReturn": "Carriage Return", - "message": "Message ({0} + Enter to send message to '{1}' on '{2}')", + "autoscroll": "Αυτόματη κύλιση", + "carriageReturn": "Μεταφορά Επιστροφή", + "connecting": "Σύνδεση από '{0}' στο '{1}'...", + "message": "Μήνυμα (Εισαγάγετε για να στείλετε μήνυμα από '{0}' στο '{1}')", "newLine": "Νέα γραμμή", - "newLineCarriageReturn": "Both NL & CR", - "noLineEndings": "No Line Ending", - "notConnected": "Not connected. Select a board and a port to connect automatically.", - "openSerialPlotter": "Serial Plotter", - "timestamp": "Timestamp", - "toggleTimestamp": "Toggle Timestamp" + "newLineCarriageReturn": "Και τα δύο NL και CR", + "noLineEndings": "Χωρίς τέλος γραμμής", + "notConnected": "Μη συνδεδεμένο. Επιλέξτε μια πλακέτα και μια θύρα για αυτόματη σύνδεση.", + "openSerialPlotter": "Σειριακός Plotter", + "timestamp": "Χρονική Σήμανση ", + "toggleTimestamp": "Εναλλαγή Χρονική Σήμανσης" }, "sketch": { - "archiveSketch": "Archive Sketch", - "cantOpen": "A folder named \"{0}\" already exists. Can't open sketch.", - "close": "Are you sure you want to close the sketch?", - "compile": "Compiling sketch...", - "configureAndUpload": "Configure And Upload", - "createdArchive": "Created archive '{0}'.", - "doneCompiling": "Done compiling.", + "archiveSketch": "Αρχείο Σχεδίου", + "cantOpen": "Ένας φάκελος με το όνομα \"{0}\" υπάρχει ήδη. Δεν είναι δυνατό το άνοιγμα του σχεδίου.", + "compile": "Σύνταξη σχεδίου...", + "configureAndUpload": "Διαμόρφωση και φόρτωση", + "createdArchive": "Δημιουργήθηκε το αρχείο '{0}'.", + "doneCompiling": "Ολοκληρώθηκε η δημιουργία.", "doneUploading": "Ολοκλήρωση ανεβάσματος", - "exportBinary": "Export Compiled Binary", - "moving": "Moving", - "movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?", - "new": "Νέο", + "editInvalidSketchFolderLocationQuestion": "Θέλετε να δοκιμάσετε να αποθηκεύσετε το σχεδιο σε διαφορετική τοποθεσία;", + "editInvalidSketchFolderQuestion": "Θέλετε να δοκιμάσετε να αποθηκεύσετε το σχέδιο με διαφορετικό όνομα;", + "exportBinary": "Εξαγωγή μεταγλωττισμένου δυαδικού αρχείου", + "invalidCloudSketchName": "Το όνομα πρέπει να ξεκινά με γράμμα, αριθμό ή κάτω παύλα, ακολουθούμενα από γράμματα, αριθμούς, παύλες, τελείες και κάτω παύλες. Το μέγιστο μήκος είναι 36 χαρακτήρες.", + "invalidSketchFolderLocationDetails": "Δεν μπορείτε να αποθηκεύσετε ένα σχέδιο σε έναν φάκελο που βρίσκεται μέσα του.", + "invalidSketchFolderLocationMessage": "Μη έγκυρη θέση φακέλου σχεδίου: '{0}'", + "invalidSketchFolderNameMessage": "Μη έγκυρο όνομα φακέλου σχεδίου: '{0}'", + "invalidSketchName": "Το όνομα πρέπει να ξεκινά με γράμμα, αριθμό ή κάτω παύλα, ακολουθούμενα από γράμματα, αριθμούς, παύλες, τελείες και κάτω παύλες. Το μέγιστο μήκος είναι 63 χαρακτήρες.", + "moving": "Μετακίνηση", + "movingMsg": "Το αρχείο \"{0}\" πρέπει να βρίσκεται μέσα σε έναν φάκελο σχεδίου με το όνομα \"{1}\". \nΔημιουργία φακέλου, μεταφορά του αρχείου και συνέχεια;", + "new": "Νέο έργο", + "noTrailingPeriod": "Ένα όνομα αρχείου δεν μπορεί να τελειώνει με τελεία", "openFolder": "Άνοιγμα φακέλου", "openRecent": "Άνοιγμα πρόσφατου", - "openSketchInNewWindow": "Open Sketch in New Window", - "saveFolderAs": "Save sketch folder as...", - "saveSketch": "Save your sketch to open it again later.", - "saveSketchAs": "Save sketch folder as...", - "showFolder": "Show Sketch Folder", + "openSketchInNewWindow": "Ανοίξτε το Σχέδιο σε νέο παράθυρο", + "reservedFilename": "Το '{0}' είναι δεσμευμένο όνομα αρχείου.", + "saveFolderAs": "Αποθήκευση φακέλου σχεδίου ως ...", + "saveSketch": "Αποθηκεύστε το σχεδιό σας για να το ανοίξετε ξανά αργότερα.", + "saveSketchAs": "Αποθήκευση φακέλου σχεδίου ως...", + "showFolder": "Εμφάνιση φακέλου σχεδίου", "sketch": "Σχέδιο", - "sketchbook": "Sketchbook", - "titleLocalSketchbook": "Local Sketchbook", - "titleSketchbook": "Sketchbook", + "sketchAlreadyContainsThisFileError": "Αυτό το σχέδιο περιέχει ήδη ένα αρχείο με το όνομα '{0}'", + "sketchAlreadyContainsThisFileMessage": "Αποτυχία αποθήκευσης του σχεδίου \"{0}\" ως \"{1}\".{2}", + "sketchbook": "Άλμπουμ", + "titleLocalSketchbook": "Τοπικό Σχέδιο", + "titleSketchbook": "Άλμπουμ ", "upload": "Ανέβασμα", "uploadUsingProgrammer": "Ανέβασμα μέσω προγραμματιστή", - "uploading": "Uploading...", - "userFieldsNotFoundError": "Can't find user fields for connected board", + "uploading": "Φότρωση....", + "userFieldsNotFoundError": "Δεν είναι δυνατή η εύρεση των πεδίων χρήστη για την συνδεδεμένη πλακέτα", "verify": "Επαλήθευση", "verifyOrCompile": "Επικύρωση" }, - "survey": { - "answerSurvey": "Answer survey", - "dismissSurvey": "Don't show again", - "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." + "sketchbook": { + "newCloudSketch": "Νέο σχέδιο Cloud ", + "newSketch": "Νέο Σχέδιο" + }, + "theme": { + "currentThemeNotFound": "Δεν ήταν δυνατή η εύρεση του τρέχοντος επιλεγμένου θέματος:{0} . Το Arduino IDE έχει επιλέξει ένα ενσωματωμένο θέμα συμβατό με αυτό που λείπει.", + "dark": "Σκοτεινό", + "deprecated": "{0}(καταργήθηκε)", + "hc": "Σκούρο Υψηλής Αντίθεσης", + "hcLight": "Φωτεινό Υψηλής Αντίθεσης", + "light": "Φωτεινό", + "user": "{0} (χρήστης)" + }, + "title": { + "cloud": "Cloud" + }, + "updateIndexes": { + "updateIndexes": "Ενημέρωση ευρετηρίων", + "updateLibraryIndex": "Ενημέρωση ευρετηρίου βιβλιοθήκης", + "updatePackageIndex": "Ενημέρωση Ευρετηρίου Πακέτων" }, "upload": { "error": "{0} σφάλμα: {1}" }, "userFields": { "cancel": "Ακύρωση", - "enterField": "Enter {0}", + "enterField": "Enter Εισαγωγή {0}", "upload": "Ανέβασμα" + }, + "validateSketch": { + "abortFixMessage": "Το σκίτσο εξακολουθεί να είναι άκυρο. Θέλετε να διορθώσετε τα προβλήματα που απομένουν; Κάνοντας κλικ στο '{0}', θα ανοίξει ένα νέο σχέδιο.", + "abortFixTitle": "Μη έγκυρο σχέδιο", + "renameSketchFileMessage": "Το αρχείο σχεδίου '{0}' δεν μπορεί να χρησιμοποιηθεί. {1}Θέλετε να μετονομάσετε το αρχείο του σχεδίου τώρα;", + "renameSketchFileTitle": "Μη έγκυρο όνομα αρχείου σχεδίου", + "renameSketchFolderMessage": "Το σχέδιο '{0}' δεν μπορεί να χρησιμοποιηθεί. {1}Για να απαλλαγείτε από αυτό το μήνυμα, μετονομάστε το σχέδιο. Θέλετε να μετονομάσετε το σχέδιο τώρα;", + "renameSketchFolderTitle": "Μη έγκυρο όνομα σκίτσου" + }, + "versionWelcome": { + "cancelButton": "Maybe later", + "donateButton": "Donate now", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Welcome to a new version of the Arduino IDE!", + "titleWithVersion": "Welcome to the new Arduino IDE {0}!" + }, + "workspace": { + "alreadyExists": "'{0}' υπάρχει ήδη." } }, - "cloud": { - "GoToCloud": "GO TO CLOUD" - }, "theia": { "core": { - "cannotConnectBackend": "Cannot connect to the backend.", - "cannotConnectDaemon": "Cannot connect to the CLI daemon.", + "cannotConnectBackend": "Δεν είναι δυνατή η σύνδεση στο σύστημα υποστήριξης.", + "cannotConnectDaemon": "Δεν είναι δυνατή η σύνδεση με το daemon CLI.", "couldNotSave": "Δεν έγινε αποθήκευση του προγράμματος. Παρακαλώ αντιγράψτε ό,τι δεν έχει αποθηκευθεί στον αγαπημένο σας επεξεργαστή κειμένου, και επανεκινήστε το Ολοκληρωμένο Περιβάλλον Ανάπτυξης IDE.", - "daemonOffline": "CLI Daemon Offline", + "daemonOffline": "CLI Daemon Εκτός σύνδεσης", "offline": "Εκτός Σύνδεσης", - "quitTitle": "Are you sure you want to quit?" - }, - "debug": { - "start": "Έναρξη...", - "startError": "There was an error starting the debug session, check the logs for more details.", - "typeNotSupported": "The debug session type \"{0}\" is not supported." + "offlineText": "Εκτός Σύνδεσης", + "quitTitle": "Είστε σίγουροι ότι θέλετε να αποχωρήσετε;" }, "editor": { - "unsavedTitle": "Unsaved – {0}" + "unsavedTitle": "Μη αποθηκευμένο –{0}" }, "messages": { "collapse": "Ελαχιστοποίηση", "expand": "Επαναφορά" }, "workspace": { - "deleteCurrentSketch": "Θέλεις να διαγράψεις το υπάρχον σχέδιο;", + "deleteCloudSketch": "Το έργο του cloud '{0}' θα διαγραφεί οριστικά από τους διακομιστές Arduino και τις τοπικές κρυφές μνήμες. Αυτή η ενέργεια είναι μη αναστρέψιμη. Θέλετε να διαγράψετε το τρέχον έργο;", + "deleteCurrentSketch": "Το έργο '{0}' θα διαγραφεί μόνιμα. Αυτή η ενέργεια είναι ανεπανόρθωτη. Θέλετε να διαγράψετε το τρέχον έργο;", "fileNewName": "Όνομα για το νεό αρχείο", - "invalidExtension": ".{0} is not a valid extension", - "invalidFilename": "Μη-έγκυρο όνομα αρχείου", + "invalidExtension": ". {0}δεν είναι έγκυρη επέκταση", "newFileName": "Νέο όνομα για το αρχείο" } } diff --git a/i18n/en.json b/i18n/en.json index af2a8730b..e6dbab0c0 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -1,38 +1,51 @@ { "arduino": { "about": { - "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}{4} [{5}]\n\n{6}", + "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "About {0}" }, + "account": { + "goToCloudEditor": "Go to Cloud Editor", + "goToIoTCloud": "Go to IoT Cloud", + "goToProfile": "Go to Profile", + "menuTitle": "Arduino Cloud" + }, "board": { "board": "Board{0}", "boardConfigDialogTitle": "Select Other Board and Port", + "boardDataReloaded": "Board data reloaded.", "boardInfo": "Board Info", + "boards": "boards", "configDialog1": "Select both a Board and a Port if you want to upload a sketch.", "configDialog2": "If you only select a Board you will be able to compile, but not to upload your sketch.", "couldNotFindPreviouslySelected": "Could not find previously selected board '{0}' in installed platform '{1}'. Please manually reselect the board you want to use. Do you want to reselect it now?", - "disconnected": "Disconnected", + "editBoardsConfig": "Edit Board and Port...", "getBoardInfo": "Get Board Info", "inSketchbook": " (in Sketchbook)", "installNow": "The \"{0} {1}\" core has to be installed for the currently selected \"{2}\" board. Do you want to install it now?", - "noFQBN": "The FQBN is not available for the selected board \"{0}\". Do you have the corresponding core installed?", + "noBoardsFound": "No boards found for \"{0}\"", + "noNativeSerialPort": "Native serial port, can't obtain info.", "noPortsDiscovered": "No ports discovered", - "noPortsSelected": "No ports selected for board: '{0}'.", - "noneSelected": "No boards selected.", + "nonSerialPort": "Non-serial port, can't obtain info.", "openBoardsConfig": "Select other board and port…", - "platformMissing": "The platform for the selected '{0}' board is not installed.", "pleasePickBoard": "Please pick a board connected to the port you have selected.", "port": "Port{0}", - "portLabel": "Port: {0}", + "ports": "ports", "programmer": "Programmer", + "reloadBoardData": "Reload Board Data", "reselectLater": "Reselect later", + "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "Search board", "selectBoard": "Select Board", - "selectBoardForInfo": "Please select a board to obtain board info.", + "selectBoardToReload": "Please select a board first.", "selectPortForInfo": "Please select a port to obtain board info.", "showAllAvailablePorts": "Shows all available ports when enabled", + "showAllPorts": "Show all ports", "succesfullyInstalledPlatform": "Successfully installed platform {0}:{1}", - "succesfullyUninstalledPlatform": "Successfully uninstalled platform {0}:{1}" + "succesfullyUninstalledPlatform": "Successfully uninstalled platform {0}:{1}", + "typeOfPorts": "{0} ports", + "unconfirmedBoard": "Unconfirmed board", + "unknownBoard": "Unknown board" }, "boardsManager": "Boards Manager", "boardsType": { @@ -77,14 +90,15 @@ "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" }, "cloud": { - "account": "Account", "chooseSketchVisibility": "Choose visibility of your Sketch:", + "cloudSketchbook": "Cloud Sketchbook", "connected": "Connected", "continue": "Continue", - "donePulling": "Done pulling ‘{0}’.", - "donePushing": "Done pushing ‘{0}’.", + "donePulling": "Done pulling '{0}'.", + "donePushing": "Done pushing '{0}'.", "embed": "Embed:", "emptySketchbook": "Your Sketchbook is empty", + "goToCloud": "Go to Cloud", "learnMore": "Learn more", "link": "Link:", "notYetPulled": "Cannot push to Cloud. It is not yet pulled.", @@ -102,10 +116,9 @@ "pushSketch": "Push Sketch", "pushSketchMsg": "This is a Public Sketch. Before pushing, make sure any sensitive information is defined in arduino_secrets.h files. You can make a Sketch private from the Share panel.", "remote": "Remote", - "remoteSketchbook": "Remote Sketchbook", "share": "Share...", "shareSketch": "Share Sketch", - "showHideRemoveSketchbook": "Show/Hide Remote Sketchbook", + "showHideSketchbook": "Show/Hide Cloud Sketchbook", "signIn": "SIGN IN", "signInToCloud": "Sign in to Arduino Cloud", "signOut": "Sign Out", @@ -113,12 +126,23 @@ "syncEditSketches": "Sync and edit your Arduino Cloud Sketches", "visitArduinoCloud": "Visit Arduino Cloud to create Cloud Sketches." }, + "cloudSketch": { + "alreadyExists": "Cloud sketch '{0}' already exists.", + "creating": "Creating cloud sketch '{0}'...", + "new": "New Cloud Sketch", + "notFound": "Could not pull the cloud sketch '{0}'. It does not exist.", + "pulling": "Synchronizing sketchbook, pulling '{0}'...", + "pushing": "Synchronizing sketchbook, pushing '{0}'...", + "renaming": "Renaming cloud sketch from '{0}' to '{1}'...", + "synchronizingSketchbook": "Synchronizing sketchbook..." + }, "common": { "all": "All", "contributed": "Contributed", "installManually": "Install Manually", "later": "Later", "noBoardSelected": "No board selected", + "noSketchOpened": "No sketch opened", "notConnected": "[not connected]", "offlineIndicator": "You appear to be offline. Without an Internet connection, the Arduino CLI might not be able to download the required resources and could cause malfunction. Please connect to the Internet and restart the application.", "oldFormat": "The '{0}' still uses the old `.pde` format. Do you want to switch to the new `.ino` extension?", @@ -126,11 +150,13 @@ "processing": "Processing", "recommended": "Recommended", "retired": "Retired", + "selectManually": "Select Manually", "selectedOn": "on {0}", "serialMonitor": "Serial Monitor", "type": "Type", "unknown": "Unknown", - "updateable": "Updatable" + "updateable": "Updatable", + "userAbort": "User abort" }, "compile": { "error": "Compilation error: {0}" @@ -138,22 +164,49 @@ "component": { "boardsIncluded": "Boards included in this package:", "by": "by", + "clickToOpen": "Click to open in browser: {0}", "filterSearch": "Filter your search...", - "install": "INSTALL", + "install": "Install", + "installLatest": "Install Latest", + "installVersion": "Install {0}", + "installed": "{0} installed", "moreInfo": "More info", + "otherVersions": "Other Versions", + "remove": "Remove", + "title": "{0} by {1}", "uninstall": "Uninstall", "uninstallMsg": "Do you want to uninstall {0}?", - "version": "Version {0}" + "update": "Update" + }, + "configuration": { + "cli": { + "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" + } + }, + "connectionStatus": { + "connectionLost": "Connection lost. Cloud sketch actions and updates won't be available." }, "contributions": { "addFile": "Add File", "fileAdded": "One file added to the sketch.", + "plotter": { + "couldNotOpen": "Couldn't open serial plotter" + }, "replaceTitle": "Replace" }, + "core": { + "compilerWarnings": { + "all": "All", + "default": "Default", + "more": "More", + "none": "None" + } + }, "coreContribution": { "copyError": "Copy error messages", "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." }, + "createCloudCopy": "Push Sketch to Cloud", "daemon": { "restart": "Restart Daemon", "start": "Start Daemon", @@ -162,8 +215,15 @@ "debug": { "debugWithMessage": "Debug - {0}", "debuggingNotSupported": "Debugging is not supported by '{0}'", + "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "Platform is not installed for '{0}'", - "optimizeForDebugging": "Optimize for Debugging" + "optimizeForDebugging": "Optimize for Debugging", + "sketchIsNotCompiled": "Sketch '{0}' must be verified before starting a debug session. Please verify the sketch and start debugging again. Do you want to verify the sketch now?" + }, + "developer": { + "clearBoardList": "Clear the Board List History", + "clearBoardsConfig": "Clear the Board and Port Selection", + "dumpBoardList": "Dump the Board List" }, "dialog": { "dontAskAgain": "Don't ask again" @@ -180,10 +240,6 @@ "previousError": "Previous Error", "revealError": "Reveal Error" }, - "electron": { - "couldNotSave": "Could not save the sketch. Please copy your unsaved work into your favorite text editor, and restart the IDE.", - "unsavedChanges": "Any unsaved changes will not be saved." - }, "examples": { "builtInExamples": "Built-in examples", "couldNotInitializeExamples": "Could not initialize built-in examples.", @@ -201,7 +257,7 @@ "selectBoard": "Select Board", "selectVersion": "Select firmware version", "successfullyInstalled": "Firmware successfully installed.", - "updater": "WiFi101 / WiFiNINA Firmware Updater" + "updater": "Firmware Updater" }, "help": { "environment": "Environment", @@ -219,6 +275,9 @@ "checkForUpdates": "Check for Arduino IDE Updates", "closeAndInstallButton": "Close and Install", "closeToInstallNotice": "Close the software and install the update on your machine.", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", "downloadButton": "Download", "downloadingNotice": "Downloading the latest version of the Arduino IDE.", "errorCheckingForUpdates": "Error while checking for Arduino IDE updates.\n{0}", @@ -232,16 +291,20 @@ "updateAvailable": "Update Available", "versionDownloaded": "Arduino IDE {0} has been downloaded." }, + "installable": { + "libraryInstallFailed": "Failed to install library: '{0}{1}'.", + "platformInstallFailed": "Failed to install platform: '{0}{1}'." + }, "library": { "addZip": "Add .ZIP Library...", "arduinoLibraries": "Arduino libraries", "contributedLibraries": "Contributed libraries", - "dependenciesForLibrary": "Dependencies for library {0}:{1}", "include": "Include Library", - "installAll": "Install all", + "installAll": "Install All", + "installLibraryDependencies": "Install library dependencies", "installMissingDependencies": "Would you like to install all the missing dependencies?", "installOneMissingDependency": "Would you like to install the missing dependency?", - "installOnly": "Install {0} only", + "installWithoutDependencies": "Install without dependencies", "installedSuccessfully": "Successfully installed library {0}:{1}", "libraryAlreadyExists": "A library already exists. Do you want to overwrite it?", "manageLibraries": "Manage Libraries...", @@ -278,9 +341,23 @@ "tools": "Tools" }, "monitor": { + "alreadyConnectedError": "Could not connect to {0} {1} port. Already connected.", + "baudRate": "{0} baud", + "connectionFailedError": "Could not connect to {0} {1} port.", + "connectionFailedErrorWithDetails": "{0} Could not connect to {1} {2} port.", + "connectionTimeout": "Timeout. The IDE has not received the 'success' message from the monitor after successfully connecting to it", + "missingConfigurationError": "Could not connect to {0} {1} port. The monitor configuration is missing.", + "notConnectedError": "Not connected to {0} {1} port.", "unableToCloseWebSocket": "Unable to close websocket", "unableToConnectToWebSocket": "Unable to connect to websocket" }, + "newCloudSketch": { + "newSketchTitle": "Name of the new Cloud Sketch" + }, + "portProtocol": { + "network": "Network", + "serial": "Serial" + }, "preferences": { "additionalManagerURLs": "Additional Boards Manager URLs", "auth.audience": "The OAuth2 audience.", @@ -297,6 +374,7 @@ "cloud.pull.warn": "True if users should be warned before pulling a cloud sketch. Defaults to true.", "cloud.push.warn": "True if users should be warned before pushing a cloud sketch. Defaults to true.", "cloud.pushpublic.warn": "True if users should be warned before pushing a public sketch to the cloud. Defaults to true.", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", "cloud.sketchSyncEndpoint": "The endpoint used to push and pull sketches from a backend. By default it points to Arduino Cloud API.", "compile": "compile", "compile.experimental": "True if the IDE should handle multiple compiler errors. False by default", @@ -314,29 +392,50 @@ "invalid.editorFontSize": "Invalid editor font size. It must be a positive integer.", "invalid.sketchbook.location": "Invalid sketchbook location: {0}", "invalid.theme": "Invalid theme.", + "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", "language.log": "True if the Arduino Language Server should generate log files into the sketch folder. Otherwise, false. It's false by default.", "language.realTimeDiagnostics": "If true, the language server provides real-time diagnostics when typing in the editor. It's false by default.", "manualProxy": "Manual proxy configuration", + "monitor": { + "dockPanel": "The area of the application shell where the _{0}_ widget will reside. It is either \"bottom\" or \"right\". It defaults to \"{1}\"." + }, "network": "Network", "newSketchbookLocation": "Select new sketchbook location", + "noCliConfig": "Could not load the CLI configuration", "noProxy": "No proxy", + "proxySettings": { + "hostname": "Host name", + "password": "Password", + "port": "Port number", + "username": "Username" + }, "showVerbose": "Show verbose output during", + "sketch": { + "inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect." + }, "sketchbook.location": "Sketchbook location", "sketchbook.showAllFiles": "True to show all sketch files inside the sketch. It is false by default.", - "survey.notification": "True if users should be notified if a survey is available. True by default.", "unofficialBoardSupport": "Click for a list of unofficial board support URLs", "upload": "upload", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", "upload.verbose": "True for verbose upload output. False by default.", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "Verify code after upload", "window.autoScale": "True if the user interface automatically scales with the font size.", - "window.zoomLevel": "Adjust the zoom level of the window. The original size is 0 and each increment above (e.g. 1) or below (e.g. -1) represents zooming 20% larger or smaller. You can also enter decimals to adjust the zoom level with a finer granularity." + "window.zoomLevel": { + "deprecationMessage": "Deprecated. Use 'window.zoomLevel' instead." + } + }, + "renameCloudSketch": { + "renameSketchTitle": "New name of the Cloud Sketch" }, "replaceMsg": "Replace the existing version of {0}?", "selectZip": "Select a zip file containing the library you'd like to add", "serial": { "autoscroll": "Autoscroll", "carriageReturn": "Carriage Return", - "message": "Message ({0} + Enter to send message to '{1}' on '{2}')", + "connecting": "Connecting to '{0}' on '{1}'...", + "message": "Message (Enter to send message to '{0}' on '{1}')", "newLine": "New Line", "newLineCarriageReturn": "Both NL & CR", "noLineEndings": "No Line Ending", @@ -348,24 +447,34 @@ "sketch": { "archiveSketch": "Archive Sketch", "cantOpen": "A folder named \"{0}\" already exists. Can't open sketch.", - "close": "Are you sure you want to close the sketch?", "compile": "Compiling sketch...", - "configureAndUpload": "Configure And Upload", + "configureAndUpload": "Configure and Upload", "createdArchive": "Created archive '{0}'.", "doneCompiling": "Done compiling.", "doneUploading": "Done uploading.", + "editInvalidSketchFolderLocationQuestion": "Do you want to try saving the sketch to a different location?", + "editInvalidSketchFolderQuestion": "Do you want to try saving the sketch with a different name?", "exportBinary": "Export Compiled Binary", + "invalidCloudSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", + "invalidSketchFolderLocationDetails": "You cannot save a sketch into a folder inside itself.", + "invalidSketchFolderLocationMessage": "Invalid sketch folder location: '{0}'", + "invalidSketchFolderNameMessage": "Invalid sketch folder name: '{0}'", + "invalidSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", "moving": "Moving", "movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?", - "new": "New", + "new": "New Sketch", + "noTrailingPeriod": "A filename cannot end with a dot", "openFolder": "Open Folder", "openRecent": "Open Recent", "openSketchInNewWindow": "Open Sketch in New Window", + "reservedFilename": "'{0}' is a reserved filename.", "saveFolderAs": "Save sketch folder as...", "saveSketch": "Save your sketch to open it again later.", "saveSketchAs": "Save sketch folder as...", "showFolder": "Show Sketch Folder", "sketch": "Sketch", + "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", + "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", "sketchbook": "Sketchbook", "titleLocalSketchbook": "Local Sketchbook", "titleSketchbook": "Sketchbook", @@ -376,10 +485,26 @@ "verify": "Verify", "verifyOrCompile": "Verify/Compile" }, - "survey": { - "answerSurvey": "Answer survey", - "dismissSurvey": "Don't show again", - "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." + "sketchbook": { + "newCloudSketch": "New Cloud Sketch", + "newSketch": "New Sketch" + }, + "theme": { + "currentThemeNotFound": "Could not find the currently selected theme: {0}. Arduino IDE has picked a built-in theme compatible with the missing one.", + "dark": "Dark", + "deprecated": "{0} (deprecated)", + "hc": "Dark High Contrast", + "hcLight": "Light High Contrast", + "light": "Light", + "user": "{0} (user)" + }, + "title": { + "cloud": "Cloud" + }, + "updateIndexes": { + "updateIndexes": "Update Indexes", + "updateLibraryIndex": "Update Library Index", + "updatePackageIndex": "Update Package Index" }, "upload": { "error": "{0} error: {1}" @@ -388,11 +513,27 @@ "cancel": "Cancel", "enterField": "Enter {0}", "upload": "Upload" + }, + "validateSketch": { + "abortFixMessage": "The sketch is still invalid. Do you want to fix the remaining problems? By clicking '{0}', a new sketch will open.", + "abortFixTitle": "Invalid sketch", + "renameSketchFileMessage": "The sketch file '{0}' cannot be used. {1} Do you want to rename the sketch file now?", + "renameSketchFileTitle": "Invalid sketch filename", + "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", + "renameSketchFolderTitle": "Invalid sketch name" + }, + "versionWelcome": { + "cancelButton": "Maybe later", + "donateButton": "Donate now", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Welcome to a new version of the Arduino IDE!", + "titleWithVersion": "Welcome to the new Arduino IDE {0}!" + }, + "workspace": { + "alreadyExists": "'{0}' already exists." } }, - "cloud": { - "GoToCloud": "GO TO CLOUD" - }, "theia": { "core": { "cannotConnectBackend": "Cannot connect to the backend.", @@ -400,13 +541,9 @@ "couldNotSave": "Could not save the sketch. Please copy your unsaved work into your favorite text editor, and restart the IDE.", "daemonOffline": "CLI Daemon Offline", "offline": "Offline", + "offlineText": "Offline", "quitTitle": "Are you sure you want to quit?" }, - "debug": { - "start": "Start...", - "startError": "There was an error starting the debug session, check the logs for more details.", - "typeNotSupported": "The debug session type \"{0}\" is not supported." - }, "editor": { "unsavedTitle": "Unsaved – {0}" }, @@ -415,10 +552,10 @@ "expand": "Expand" }, "workspace": { - "deleteCurrentSketch": "Do you want to delete the current sketch?", + "deleteCloudSketch": "The cloud sketch '{0}' will be permanently deleted from the Arduino servers and the local caches. This action is irreversible. Do you want to delete the current sketch?", + "deleteCurrentSketch": "The sketch '{0}' will be permanently deleted. This action is irreversible. Do you want to delete the current sketch?", "fileNewName": "Name for new file", "invalidExtension": ".{0} is not a valid extension", - "invalidFilename": "Invalid filename.", "newFileName": "New name for file" } } diff --git a/i18n/es.json b/i18n/es.json index 2e6a6c603..01954663b 100644 --- a/i18n/es.json +++ b/i18n/es.json @@ -1,46 +1,59 @@ { "arduino": { "about": { - "detail": "Versión: {0}\nFecha: {1}{2}\nVersión del CLI: {3}{4} [{5}]\n\n{6}", + "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "Acerca de {0}" }, + "account": { + "goToCloudEditor": "Ir a Arduino Cloud", + "goToIoTCloud": "Go to IoT Cloud", + "goToProfile": "Ir al Perfil", + "menuTitle": "Arduino Cloud" + }, "board": { "board": "Placa{0}", - "boardConfigDialogTitle": "Select Other Board and Port", + "boardConfigDialogTitle": "Seleccionar Otra Placa y Puerto", + "boardDataReloaded": "Board data reloaded.", "boardInfo": "Información de la placa", + "boards": "Placas", "configDialog1": "Selecciona tanto una placa como un puerto si quieres cargar un sketch.", "configDialog2": "Si seleccionas solo una placa podrás compilar, pero no cargar tu sketch.", "couldNotFindPreviouslySelected": "No se ha podido encontrar la placa previamente seleccionada '{0}' en la plataforma instalada '{1}'. Por favor, vuelve a seleccionar manualmente la placa que quieres utilizar. ¿Quieres volver a seleccionarla ahora?", - "disconnected": "Desconectado", + "editBoardsConfig": "Edit Board and Port...", "getBoardInfo": "Obtener información de la placa", "inSketchbook": " (en el Sketchbook)", "installNow": "Hay que instalar el núcleo \"{0} {1} \" para la placa \"{2}\" actualmente seleccionada. ¿Quieres instalarlo ahora?", - "noFQBN": "El FQBN no está disponible para la placa seleccionada \"{0}\". ¿Tienes instalado el núcleo correspondiente?", - "noPortsDiscovered": "No ports discovered", - "noPortsSelected": "No se han seleccionado puertos para la placa: '{0}'.", - "noneSelected": "Ninguna placa seleccionada.", + "noBoardsFound": "No se han encotrado placas para \"{0}\"", + "noNativeSerialPort": "Native serial port, can't obtain info.", + "noPortsDiscovered": "No se ha descubierto ningún puerto", + "nonSerialPort": "Non-serial port, can't obtain info.", "openBoardsConfig": "Seleccione otra placa y puerto...", - "platformMissing": "La plataforma seleccionada para la placa '{0}' no está instalada.", "pleasePickBoard": "Por favor, elija una placa conectada al puerto que haya seleccionado.", "port": "Puerto {0}", - "portLabel": "Puerto: {0}", + "ports": "puertos", "programmer": "Programador", + "reloadBoardData": "Reload Board Data", "reselectLater": "Vuelve a seleccionar más tarde", - "searchBoard": "Search board", + "revertBoardsConfig": "Use '{0}' discovered on '{1}'", + "searchBoard": "Buscar placa", "selectBoard": "Seleccionar Placa", - "selectBoardForInfo": "Por favor, seleccione una placa para obtener información sobre ella.", + "selectBoardToReload": "Please select a board first.", "selectPortForInfo": "Por favor, seleccione un puerto para obtener información sobre la placa.", "showAllAvailablePorts": "Muestra todos los puertos disponibles cuando está activado", + "showAllPorts": "Mostrar todos los puertos", "succesfullyInstalledPlatform": "Plataforma {0}:{1} instalada correctamente", - "succesfullyUninstalledPlatform": "Plataforma {0}:{1} desinstalada correctamente" + "succesfullyUninstalledPlatform": "Plataforma {0}:{1} desinstalada correctamente", + "typeOfPorts": "{0} puertos", + "unconfirmedBoard": "Unconfirmed board", + "unknownBoard": "Placa desconocida" }, "boardsManager": "Gestor de placas", "boardsType": { - "arduinoCertified": "Arduino Certified" + "arduinoCertified": "Certificado Arduino" }, "bootloader": { "burnBootloader": "Grabar Bootloader", - "burningBootloader": "Burning bootloader...", + "burningBootloader": "Grabando bootloader...", "doneBurningBootloader": "Finalizada la grabación del bootloader." }, "burnBootloader": { @@ -64,27 +77,28 @@ "uploadingCertificates": "Cargando certificados." }, "checkForUpdates": { - "checkForUpdates": "Check for Arduino Updates", - "installAll": "Install All", - "noUpdates": "There are no recent updates available.", - "promptUpdateBoards": "Updates are available for some of your boards.", - "promptUpdateLibraries": "Updates are available for some of your libraries.", - "updatingBoards": "Updating boards...", - "updatingLibraries": "Updating libraries..." + "checkForUpdates": "Comprobar Actualizaciones para Arduino", + "installAll": "Instalar todo", + "noUpdates": "No se han encontrado actualizaciones recientes disponibles", + "promptUpdateBoards": "Actualizaciones disponibles para alguna de tus placas", + "promptUpdateLibraries": "Actualizaciones disponibles para algunas de tus bibliotecas.", + "updatingBoards": "Actualizando placas...", + "updatingLibraries": "Actualizando bibliotecas..." }, "cli-error-parser": { "keyboardError": "'Keyboard' no encontrado. ¿Tiene tu proyecto incluida la linea '#include <Keyboard.h>'?", "mouseError": "'Mouse' no encontrado. ¿Tiene tu proyecto incluida la linea '#include <Mouse.h>'?" }, "cloud": { - "account": "Cuenta", "chooseSketchVisibility": "Elige la visibilidad de tu Sketch:", + "cloudSketchbook": "Libro de bocetos en la nube", "connected": "Conectado", "continue": "Continuar", - "donePulling": "Extracción de '{0}' realizada.", - "donePushing": "Envío a '{0}' realizado.", + "donePulling": "Done pulling '{0}'.", + "donePushing": "Done pushing '{0}'.", "embed": "Incrustado:", "emptySketchbook": "Tu Sketchbook está vacío", + "goToCloud": "Ir al Cloud", "learnMore": "Aprender más", "link": "Enlace:", "notYetPulled": "No se puede cargar a las nube. Todavía no ha sido descargado", @@ -102,10 +116,9 @@ "pushSketch": "Pulsa para listar las URLs de la tarjetas no oficiales", "pushSketchMsg": "Este es un Sketch público. Antes de enviarlo, asegúrate de que cualquier información sensible está definida en los archivos arduino_secrets.h. Puedes hacer que un Sketch sea privado desde el panel Compartir.", "remote": "Remoto", - "remoteSketchbook": "Libreria de proyectos remota", "share": "Compartir...", "shareSketch": "Compartir Sketch", - "showHideRemoveSketchbook": "Mostrar/Ocultar Sketchbook Remoto", + "showHideSketchbook": "Mostrar/Ocultar Sketchbook Remoto", "signIn": "Iniciar sesión", "signInToCloud": "Iniciar sesión en Arduino Cloud", "signOut": "Cerrar sesión", @@ -113,47 +126,87 @@ "syncEditSketches": "Sincroniza y edita tus Arduino Cloud Sketches", "visitArduinoCloud": "Visita Arduino Cloud para crear Cloud Sketches. " }, + "cloudSketch": { + "alreadyExists": "El sketch remoto '{0}' ya existe.", + "creating": "Creando sketch remoto '{0}'...", + "new": "Nuevo Sketch en la Nube", + "notFound": "No se pudieron obtener los cambios del sketch remoto '{0}'. No existe.", + "pulling": "Sincronizando sketchbook, extrayendo '{0}'...", + "pushing": "Synchronizing sketchbook, pushing '{0}'...", + "renaming": "Renombrando el sketch remoto de '{0}' a '{1}'...", + "synchronizingSketchbook": "Sincronizando carpeta..." + }, "common": { - "all": "All", - "contributed": "Contributed", + "all": "Todo", + "contributed": "Contribuido", "installManually": "Instalar manualmente", "later": "Más tarde", "noBoardSelected": "Ninguna placa seleccionada.", + "noSketchOpened": "No sketch opened", "notConnected": "[no conectado]", "offlineIndicator": "Al parecer no estás en línea. Sin una conexión a internet, el CLI de Arduino no podrá descargar los recursos necesarios, lo cual puede ocasionar fallos. Por favor, conecte a internet y reinicie la aplicación.", "oldFormat": "La página '{0}' sigue utilizando el formato antiguo `.pde`. ¿Quieres cambiar a la nueva extensión `.ino`?", - "partner": "Partner", + "partner": "Socio", "processing": "Procesando", - "recommended": "Recommended", - "retired": "Retired", - "selectedOn": "on 1{0}\n ", + "recommended": "Recomendado", + "retired": "Retirado", + "selectManually": "Select Manually", + "selectedOn": "en {0}", "serialMonitor": "Monitor Serie", - "type": "Type", + "type": "Tipo", "unknown": "Desconocido", - "updateable": "Updatable" + "updateable": "Actualizable", + "userAbort": "User abort" }, "compile": { "error": "Error de compilación: {0}" }, "component": { - "boardsIncluded": "Boards included in this package:", + "boardsIncluded": "Placas incluidas en este paquete:", "by": "de", + "clickToOpen": "Click to open in browser: {0}", "filterSearch": "Filtre su búsqueda...", "install": "Instalar", + "installLatest": "Install Latest", + "installVersion": "Instalar {0}", + "installed": "{0}instalado", "moreInfo": "Más información", + "otherVersions": "Otras versiones", + "remove": "Eliminar", + "title": "{0} by {1}", "uninstall": "Desinstalar", "uninstallMsg": "¿Quieres desinstalar {0}?", - "version": "Versión {0}" + "update": "Actualizar" + }, + "configuration": { + "cli": { + "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" + } + }, + "connectionStatus": { + "connectionLost": "Conexión perdida. Las acciones y actualizaciones de los sketchs remotos no estarán disponibles." }, "contributions": { "addFile": "Añadir fichero...", "fileAdded": "Un archivo añadido al sketch.", + "plotter": { + "couldNotOpen": "No se puede abrir el plotter serial" + }, "replaceTitle": "Reemplazar" }, + "core": { + "compilerWarnings": { + "all": "Todo", + "default": "Predeterminado", + "more": "Más", + "none": "Niguno" + } + }, "coreContribution": { "copyError": "Copiar mensajes de error", - "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." + "noBoardSelected": "Ninguna placa seleccionada. Por favor selecciona una placa Arduino en el menú Herramientas > Placas" }, + "createCloudCopy": "Push Sketch to Cloud", "daemon": { "restart": "Reiniciar Daemon", "start": "Iniciar Daemon", @@ -162,8 +215,15 @@ "debug": { "debugWithMessage": "Debug - {0}", "debuggingNotSupported": "La depuración no está soportada por '{0}'", + "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "La plataforma no está instalada para '{0}'", - "optimizeForDebugging": "Optimizar para depuración" + "optimizeForDebugging": "Optimizar para depuración", + "sketchIsNotCompiled": "El sketch '{0}' debe ser verificado antes de iniciar una sesión de depuración. Por favor, verifique el sketch e inicia la depuración nuevamente. ¿Deseas verificar el sketch ahora?" + }, + "developer": { + "clearBoardList": "Clear the Board List History", + "clearBoardsConfig": "Clear the Board and Port Selection", + "dumpBoardList": "Dump the Board List" }, "dialog": { "dontAskAgain": "No volver a preguntar" @@ -178,14 +238,10 @@ "increaseIndent": "Aumentar sangría", "nextError": "Siguiente Error", "previousError": "Error Anterior", - "revealError": "Reveal Error" - }, - "electron": { - "couldNotSave": "No se ha podido guardar el sketch. Por favor, copia tu trabajo no guardado en tu editor de texto favorito y reinicia el IDE.", - "unsavedChanges": "Los cambios no guardados no serán guardados." + "revealError": "Revelar Error" }, "examples": { - "builtInExamples": "Ejemplos Construidos ", + "builtInExamples": "Ejemplos Construidos", "couldNotInitializeExamples": "No se han podido inicializar los ejemplos integrados.", "customLibrary": "Ejemplos de bibliotecas personalizadas", "for": "Ejemplos para {0}", @@ -201,7 +257,7 @@ "selectBoard": "Seleccionar Placa", "selectVersion": "Seleccionar la versión del firmware", "successfullyInstalled": "Firmware instalado correctamente.", - "updater": "Actualizador de Firmware de WiFi101 / WiFiNINA" + "updater": "Firmware Updater" }, "help": { "environment": "Entorno de desarrollo (IDE)", @@ -216,9 +272,12 @@ "visit": "Visitar Arduino.cc" }, "ide-updater": { - "checkForUpdates": "Check for Arduino IDE Updates", + "checkForUpdates": "Comprobar actualizaciones para Arduino IDE", "closeAndInstallButton": "Cerrar e instalar", "closeToInstallNotice": "Cierra el programa e instala la actualización en tu máquina.", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", "downloadButton": "Descargar", "downloadingNotice": "Descargando la última versión del Arduino IDE.", "errorCheckingForUpdates": "Error al comprobar las actualizaciones del IDE de Arduino.\n{0}", @@ -230,18 +289,22 @@ "notNowButton": "Ahora no", "skipVersionButton": "Omitir versión", "updateAvailable": "Actualización disponible", - "versionDownloaded": "Arduino IDE 1{0} se ha descargado." + "versionDownloaded": "Arduino IDE {0} se ha descargado." + }, + "installable": { + "libraryInstallFailed": "Failed to install library: '{0}{1}'.", + "platformInstallFailed": "Failed to install platform: '{0}{1}'." }, "library": { "addZip": "Añadir biblioteca .ZIP...", "arduinoLibraries": "Bibliotecas de Arduino", "contributedLibraries": "Bibliotecas aportadas", - "dependenciesForLibrary": "Dependencias para la biblioteca {0}:{1}", "include": "Incluir biblioteca", "installAll": "Instalar todo", + "installLibraryDependencies": "Instalar las dependencias de la biblioteca", "installMissingDependencies": "¿Quieres instalar todas las dependencias faltantes?", "installOneMissingDependency": "¿Quieres instalar la dependencia faltante?", - "installOnly": "Instalar {0} solamente", + "installWithoutDependencies": "Instalar sin dependencias", "installedSuccessfully": "Biblioteca {0}:{1} instalada correctamente", "libraryAlreadyExists": "Ya existe una biblioteca. ¿Quieres sobrescribirla?", "manageLibraries": "Gestionar bibliotecas...", @@ -255,22 +318,22 @@ "zipLibrary": "Biblioteca" }, "librarySearchProperty": { - "topic": "Topic" + "topic": "Tema" }, "libraryTopic": { - "communication": "Communication", - "dataProcessing": "Data Processing", - "dataStorage": "Data Storage", - "deviceControl": "Device Control", - "display": "Display", - "other": "Other", - "sensors": "Sensors", - "signalInputOutput": "Signal Input/Output", - "timing": "Timing", - "uncategorized": "Uncategorized" + "communication": "Comunicación", + "dataProcessing": "Procesando datos", + "dataStorage": "Almacenamiento de datos", + "deviceControl": "Control de dispositivo", + "display": "Pantalla", + "other": "Otro", + "sensors": "Sensores", + "signalInputOutput": "Señal Entrada/Salida", + "timing": "Temporización", + "uncategorized": "Descategorizado" }, "libraryType": { - "installed": "Installed" + "installed": "Instalado" }, "menu": { "advanced": "Avanzado", @@ -278,8 +341,22 @@ "tools": "Herramientas" }, "monitor": { - "unableToCloseWebSocket": " No se puede cerrar websocket", - "unableToConnectToWebSocket": " No se puede conectar al websocket" + "alreadyConnectedError": "Could not connect to {0} {1} port. Already connected.", + "baudRate": "{0} baud", + "connectionFailedError": "Could not connect to {0} {1} port.", + "connectionFailedErrorWithDetails": "{0} Could not connect to {1} {2} port.", + "connectionTimeout": "Timeout. The IDE has not received the 'success' message from the monitor after successfully connecting to it", + "missingConfigurationError": "Could not connect to {0} {1} port. The monitor configuration is missing.", + "notConnectedError": "Not connected to {0} {1} port.", + "unableToCloseWebSocket": "No se puede cerrar websocket", + "unableToConnectToWebSocket": "No se puede conectar al websocket" + }, + "newCloudSketch": { + "newSketchTitle": "Nombre del nuevo Sketch Remoto" + }, + "portProtocol": { + "network": "Red", + "serial": "Serie" }, "preferences": { "additionalManagerURLs": "URLs adicionales de gestor de placas", @@ -290,13 +367,14 @@ "automatic": "Automático", "board.certificates": "Listado de certificados que pueden ser cargados en las placas", "browse": "Explorar", - "checkForUpdate": "Receive notifications of available updates for the IDE, boards, and libraries. Requires an IDE restart after change. It's true by default.", + "checkForUpdate": "Recibe notificaciones sobre actualizaciones disponibles del IDE, placas y bibliotecas. Requiere reiniciar el IDE despues de hacer cambios. Por defecto está habilitado.", "choose": "Elija", "cli.daemonDebug": "Habilitar logueo de depuración de las llamadas gRPC al Arduino CLI. Requiere un reinicio del IDE para tener efecto. Deshabilitado por defecto.", "cloud.enabled": "Verdadero si las funciones de sincronización del sketch están activadas. Verdadero por defecto.", "cloud.pull.warn": "Verdadero si se debe advertir a los usuarios antes de sacar un boceto de la nube. El valor predeterminado es verdadero.", "cloud.push.warn": "Verdadero si se debe advertir a los usuarios antes de enviar un boceto a la nube. El valor predeterminado es verdadero.", "cloud.pushpublic.warn": "Verdadero si se debe advertir a los usuarios antes de enviar un boceto público a la nube. El valor predeterminado es verdadero.", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", "cloud.sketchSyncEndpoint": "El punto final utilizado para empujar y extraer bocetos de un backend. Por defecto, apunta a la API de Arduino Cloud.", "compile": "Compliar", "compile.experimental": "True si el IDE debe manejar multiples errores del compilador. False por defecto", @@ -314,29 +392,50 @@ "invalid.editorFontSize": "Tamaño de fuente del editor no válido. Debe ser un número entero positivo.", "invalid.sketchbook.location": "Ruta del sketchbook no válida: {0}", "invalid.theme": "Tema no válido.", + "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", "language.log": "Verdadero si el Servidor de Lenguaje Arduino debe generar archivos de registro en la carpeta del sketch. En caso contrario, falso. Por defecto es falso.", "language.realTimeDiagnostics": "Si está habilitado, el lenguaje proveerá diagnoticos en tiepo real meintras se teclea en el editor. Deshabilitado por defecto.", "manualProxy": "Configuración manual del proxy", + "monitor": { + "dockPanel": "The area of the application shell where the _{0}_ widget will reside. It is either \"bottom\" or \"right\". It defaults to \"{1}\"." + }, "network": "Red", "newSketchbookLocation": "Selecciona la nueva ruta del sketchbook", + "noCliConfig": "Could not load the CLI configuration", "noProxy": "Sin Proxy", + "proxySettings": { + "hostname": "nombre del host", + "password": "Contraseña", + "port": "Numero del puerto", + "username": "Nombre de usuario" + }, "showVerbose": "Mostrar salida verbosa durante", + "sketch": { + "inoBlueprint": "Ruta absoluta del sistema de archivos al archivo blueprint `.ino` por defecto. Si se especifica, el contenido del archivo blueprint se utilizará para cada nuevo sketch creado por el IDE. Los sketches se generarán con el contenido por defecto de Arduino si no se especifica. Los archivos blueprint no accesibles son ignorados. **Se necesita reiniciar el IDE** para que este ajuste surta efecto." + }, "sketchbook.location": "Ruta del Sketchbook", "sketchbook.showAllFiles": "Verdadero para mostrar todos los archivos de bocetos dentro del boceto. Por defecto es falso.", - "survey.notification": "Verdadero si usuarios deberían ser notificados cuando una encuesta esté disponible. Verdadero es predeterminado.", "unofficialBoardSupport": "Pulsa para listar las URLs de las tarjetas no oficiales", "upload": "Carga", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", "upload.verbose": "Verdadero para una salida verbosa de la carga. Falso por defecto.", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "Verificar el código después de cargarlo", "window.autoScale": "Verdadero si la interfaz de usuario se escala automáticamente con el tamaño de la fuente.", - "window.zoomLevel": "Ajusta el nivel de zoom de la ventana. El tamaño original es 0 y cada incremento por encima (p. ej. 1) o por debajo (p. ej. -1) representa un zoom un 20 % más grande o más pequeño. También puedes introducir decimales para ajustar el nivel de zoom con una granularidad más fina." + "window.zoomLevel": { + "deprecationMessage": "Deprecated. Use 'window.zoomLevel' instead." + } + }, + "renameCloudSketch": { + "renameSketchTitle": "Nuevo nombre del Sketch Remoto" }, "replaceMsg": "¿Sustituir la versión existente de {0}?", "selectZip": "Seleccione un archivo zip que contenga la biblioteca que deseas añadir", "serial": { "autoscroll": "Autoscroll", "carriageReturn": "Retorno de carro", - "message": "Mensaje ({0} + Enter para enviar el mensaje a '{1}' en '{2}')", + "connecting": "Connecting to '{0}' on '{1}'...", + "message": "Mensaje (Intro para mandar el mensaje de '{0}' a '{1}')", "newLine": "Nueva línea", "newLineCarriageReturn": "Ambos NL & CR", "noLineEndings": "Sin ajuste de línea", @@ -348,51 +447,93 @@ "sketch": { "archiveSketch": "Archivo de programa", "cantOpen": "Ya existe una carpeta con el nombre \"{0}\". No se puede abrir.", - "close": "¿Estás seguro de que quieres cerrar el sketch?", - "compile": "Compiling sketch...", - "configureAndUpload": "Configurar y subir", + "compile": "Compilando proyecto...", + "configureAndUpload": "Configura y Subir", "createdArchive": "Archivo '{0}' creado.", "doneCompiling": "Compilación completada.", "doneUploading": "Carga completada.", + "editInvalidSketchFolderLocationQuestion": "¿Quieres intentar guardar el código en una ubicación diferente?", + "editInvalidSketchFolderQuestion": "¿Quieres intentar guardar el código con un nombre diferente?", "exportBinary": "Exportar binario compilado", + "invalidCloudSketchName": "El nombre debe comenzar con una letra, un número, o un guión bajo, seguido de letras, números, guiones, puntos y guiones bajos. El máximo número de caracteres es 36.", + "invalidSketchFolderLocationDetails": "No puedes guardar un sketch dentro de una carpeta dentro de sí misma.", + "invalidSketchFolderLocationMessage": "Invalid sketch folder location: '{0}'", + "invalidSketchFolderNameMessage": "Invalid sketch folder name: '{0}'", + "invalidSketchName": "El nombre debe comenzar con una letra, un número, o un guión bajo, seguido de letras, números, guiones, puntos y guiones bajos. El máximo número de caracteres es 63.", "moving": "Moviendo", "movingMsg": "El archivo \"{0}\" tiene que estar dentro de una carpeta de bocetos llamada \"{1}\".\n¿Crear esta carpeta, mover el archivo y continuar?", - "new": "Nuevo", + "new": "New Sketch", + "noTrailingPeriod": "El nombre del archivo no puede terminar con un punto.", "openFolder": "Abrir carpeta", "openRecent": "Abierto recientemente", "openSketchInNewWindow": "Abrir Sketch en una ventana nueva", + "reservedFilename": "'{0}' is a reserved filename.", "saveFolderAs": "Guardar carpeta de sketch como...", "saveSketch": "Guarde su sketch para abirlo más tarde.", "saveSketchAs": "Guardar carpeta de sketch como...", "showFolder": "Mostrar carpeta de Sketch", "sketch": "Sketch", + "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", + "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", "sketchbook": "Sketchbook", "titleLocalSketchbook": "Sketchbook Local", "titleSketchbook": "Sketchbook", "upload": "Cargar", "uploadUsingProgrammer": "Cargar usando el programador", - "uploading": "Uploading...", + "uploading": "Actualizando...", "userFieldsNotFoundError": "No se pueden encontrar campos de usuario para la placa conectada", "verify": "Verificar", "verifyOrCompile": "Verificar/Compilar" }, - "survey": { - "answerSurvey": "Completar encuesta", - "dismissSurvey": "No volver a mostrar", - "surveyMessage": "Por favor ayudenos mejorar completando esta breve encuesta. Valoramos nuestra comunidad y nos gustaría conocer algo mejor a los que nos apoyan." + "sketchbook": { + "newCloudSketch": "Nuevo Sketch en la Nube", + "newSketch": "New Sketch" + }, + "theme": { + "currentThemeNotFound": "Could not find the currently selected theme: {0}. Arduino IDE has picked a built-in theme compatible with the missing one.", + "dark": "Dark", + "deprecated": "{0} (deprecated)", + "hc": "Dark High Contrast", + "hcLight": "Light High Contrast", + "light": "Light", + "user": "{0} (user)" + }, + "title": { + "cloud": "Nube" + }, + "updateIndexes": { + "updateIndexes": "Actualizar índices", + "updateLibraryIndex": "Actualizar índice de bibliotecas", + "updatePackageIndex": "Actualizar índice de paquete" }, "upload": { - "error": "1{0} error: 2{1}" + "error": "{0} error: {1}" }, "userFields": { "cancel": "Cancelar", - "enterField": "Enter {0}", + "enterField": "Introduce {0}", "upload": "Cargar" + }, + "validateSketch": { + "abortFixMessage": "The sketch is still invalid. Do you want to fix the remaining problems? By clicking '{0}', a new sketch will open.", + "abortFixTitle": "Invalid sketch", + "renameSketchFileMessage": "The sketch file '{0}' cannot be used. {1} Do you want to rename the sketch file now?", + "renameSketchFileTitle": "Invalid sketch filename", + "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", + "renameSketchFolderTitle": "Invalid sketch name" + }, + "versionWelcome": { + "cancelButton": "Maybe later", + "donateButton": "Donate now", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Welcome to a new version of the Arduino IDE!", + "titleWithVersion": "Welcome to the new Arduino IDE {0}!" + }, + "workspace": { + "alreadyExists": "'{0}' ya existe." } }, - "cloud": { - "GoToCloud": "IR AL CLOUD" - }, "theia": { "core": { "cannotConnectBackend": "No se puede conectar al backend.", @@ -400,13 +541,9 @@ "couldNotSave": "No se ha podido guardar el sketch. Por favor, copia tu trabajo no guardado en tu editor de texto favorito y reinicia el IDE.", "daemonOffline": "Demonio del CLI fuera de línea", "offline": "Desconectado", + "offlineText": "Desconectado", "quitTitle": "Seguro que quiere salir ?" }, - "debug": { - "start": "Empezar...", - "startError": "Se ha producido un error al iniciar la sesión de depuración, consulte los logs para obtener más detalles.", - "typeNotSupported": "El tipo de sesión de depuración \"{0}\" no es compatible." - }, "editor": { "unsavedTitle": "Sin guardar – {0}" }, @@ -415,10 +552,10 @@ "expand": "Expandir" }, "workspace": { - "deleteCurrentSketch": "¿Quieres borrar el sketch actual?", + "deleteCloudSketch": "The cloud sketch '{0}' will be permanently deleted from the Arduino servers and the local caches. This action is irreversible. Do you want to delete the current sketch?", + "deleteCurrentSketch": "El código '{0}' será permanentemente eliminado. Esta acción es irreversible. ¿Quieres eliminar el código actual?", "fileNewName": "Nombre del nuevo archivo", "invalidExtension": "\".{0}\" no es una extensión válida", - "invalidFilename": "Nombre de archivo no válido.", "newFileName": "Nuevo nombre para el archivo" } } diff --git a/i18n/eu.json b/i18n/eu.json index f0ec106d6..7b4afcf91 100644 --- a/i18n/eu.json +++ b/i18n/eu.json @@ -1,38 +1,51 @@ { "arduino": { "about": { - "detail": "Bertsioa: {0}\nData: {1}{2}\nCLI bertsioa: {3}{4} [{5}]\n\n{6}", + "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "{0}ri buruz" }, + "account": { + "goToCloudEditor": "Go to Cloud Editor", + "goToIoTCloud": "Go to IoT Cloud", + "goToProfile": "Go to Profile", + "menuTitle": "Arduino Cloud" + }, "board": { "board": "{0} plaka", "boardConfigDialogTitle": "Select Other Board and Port", + "boardDataReloaded": "Board data reloaded.", "boardInfo": "Plakaren informazioa", + "boards": "boards", "configDialog1": "Hautatu plaka bat eta ataka bat programa bat kargatu nahi baduzu.", "configDialog2": "Plaka bakarrik hautatzen baduzu, programa konpilatu ahal izango duzu, baina ez kargatu.", "couldNotFindPreviouslySelected": "Ezin izan da aurkitu aurrez hautatutako '{0}' plaka instalatutako '{1}' plataforman. Hautatu berriz eskuz erabili nahi duzun plaka. Orain berriz hautatu nahi duzu?", - "disconnected": "Disconnected", + "editBoardsConfig": "Edit Board and Port...", "getBoardInfo": "Eskuratu plakaren informazioa", "inSketchbook": "(programa bilduman)", "installNow": "\"{0} {1}\" nukleoa instalatu behar da unean hautatutako \"{2}\" plakarentzat. Orain instalatu nahi duzu?", - "noFQBN": "FQBN ez dago erabilgarri hautatutako \"{0}\" plakarentzat. Dagokion nukleoa instalatuta daukazu?", + "noBoardsFound": "No boards found for \"{0}\"", + "noNativeSerialPort": "Native serial port, can't obtain info.", "noPortsDiscovered": "No ports discovered", - "noPortsSelected": "Ez da atakarik hautatu plakarentzat: '{0}'", - "noneSelected": "Plakarik ez da hautatu", + "nonSerialPort": "Non-serial port, can't obtain info.", "openBoardsConfig": "Hautatu beste plaka eta ataka bat...", - "platformMissing": "Hautatutako '{0}' plakarentzako plataforma ez dago instalatuta.", "pleasePickBoard": "Aukeratu hautatu duzun atakara konektatutako plaka bat.", "port": "{0} ataka", - "portLabel": "Port: {0}", + "ports": "ports", "programmer": "Programatzailea", + "reloadBoardData": "Reload Board Data", "reselectLater": "Hautatu berriz geroago", + "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "Search board", "selectBoard": "Hautatu plaka", - "selectBoardForInfo": "Hautatu plaka bat plakaren informazioa eskuratzeko.", + "selectBoardToReload": "Please select a board first.", "selectPortForInfo": "Hautatu ataka bat plakaren informazioa eskuratzeko.", "showAllAvailablePorts": "Gaituta dagoenean erabilgarri dauden ataka guztiak erakusten ditu", + "showAllPorts": "Show all ports", "succesfullyInstalledPlatform": "{0}:{1} plataforma behar bezala instalatu da", - "succesfullyUninstalledPlatform": "{0}:{1} plataforma behar bezala desinstalatu da" + "succesfullyUninstalledPlatform": "{0}:{1} plataforma behar bezala desinstalatu da", + "typeOfPorts": "{0} ports", + "unconfirmedBoard": "Unconfirmed board", + "unknownBoard": "Unknown board" }, "boardsManager": "Plaka kudeatzailea", "boardsType": { @@ -77,14 +90,15 @@ "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" }, "cloud": { - "account": "Account", "chooseSketchVisibility": "Aukeratu zure programaren ikusgaitasuna:", + "cloudSketchbook": "Hodeiko programa bilduma", "connected": "Konektatuta", "continue": "Jarraitu", - "donePulling": "Hodeitik kargatzea burututa: '{0}'.", - "donePushing": "Hodeian gordetzea burututa: '{0}'.", + "donePulling": "Done pulling '{0}'.", + "donePushing": "Done pushing '{0}'.", "embed": "Kapsulatu:", "emptySketchbook": "Zure programa bilduma hutsik dago", + "goToCloud": "Go to Cloud", "learnMore": "Ikasi gehiago", "link": "Esteka:", "notYetPulled": "Ezin da Hodeian gorde. Ez da Hodeitik kargatu oraindik.", @@ -102,10 +116,9 @@ "pushSketch": "Kargatu hodeitik", "pushSketchMsg": "Hau programa publiko bat da. Hodeian gorde aurretik, ziurtatu isilpeko informazioa arduino_secrets.h fitxategietan definituta dagoela. Programa pribatu bihurtu dezakezu Partekatu paneletik.", "remote": "Urrunekoa", - "remoteSketchbook": "Remote Sketchbook", "share": "Partekatu...", "shareSketch": "Partekatu programa", - "showHideRemoveSketchbook": "Erakutsi/Ezkutatu urruneko programa bilduma", + "showHideSketchbook": "Show/Hide Cloud Sketchbook", "signIn": "HASI SAIOA", "signInToCloud": "Hasi saioa Arduino Cloud-en", "signOut": "Amaitu saioa", @@ -113,12 +126,23 @@ "syncEditSketches": "Sinkronizatu eta editatu zure Arduino Cloud-eko programak", "visitArduinoCloud": "Bisitatu Arduino Cloud hodeiko programak sortzeko." }, + "cloudSketch": { + "alreadyExists": "Cloud sketch '{0}' already exists.", + "creating": "Creating cloud sketch '{0}'...", + "new": "New Cloud Sketch", + "notFound": "Could not pull the cloud sketch '{0}'. It does not exist.", + "pulling": "Synchronizing sketchbook, pulling '{0}'...", + "pushing": "Synchronizing sketchbook, pushing '{0}'...", + "renaming": "Renaming cloud sketch from '{0}' to '{1}'...", + "synchronizingSketchbook": "Synchronizing sketchbook..." + }, "common": { "all": "All", "contributed": "Contributed", "installManually": "Instalatu eskuz", "later": "Gero", "noBoardSelected": "Plakarik ez da hautatu", + "noSketchOpened": "No sketch opened", "notConnected": "[konektatu gabe]", "offlineIndicator": "Deskonektatuta zaudela dirudi. Interneterako konexiorik gabe, baliteke Arduino CLI ez izatea gai beharrezko baliabideak deskargatzeko, eta funtzionamendu txarra eragin lezake. Mesedez, konektatu Internetera eta berrabiarazi aplikazioa.", "oldFormat": "'{0}' programak `.pde` formatu zaharra erabiltzen du oraindik. `.ino` luzapen berrira aldatu nahi duzu?", @@ -126,11 +150,13 @@ "processing": "Prozesatzen", "recommended": "Recommended", "retired": "Retired", + "selectManually": "Select Manually", "selectedOn": "Non: {0}", "serialMonitor": "Serieko monitorea", "type": "Type", "unknown": "Ezezaguna", - "updateable": "Updatable" + "updateable": "Updatable", + "userAbort": "User abort" }, "compile": { "error": "Konpilazio-errorea: {0}" @@ -138,22 +164,49 @@ "component": { "boardsIncluded": "Boards included in this package:", "by": "Egilea:", + "clickToOpen": "Click to open in browser: {0}", "filterSearch": "Iragazi zure bilaketa...", - "install": "INSTALATU", + "install": "Instalatu", + "installLatest": "Install Latest", + "installVersion": "Install {0}", + "installed": "{0} installed", "moreInfo": "Informazio gehiago", + "otherVersions": "Other Versions", + "remove": "Kendu", + "title": "{0} by {1}", "uninstall": "Desinstalatu", "uninstallMsg": "{0} desinstalatu nahi duzu?", - "version": "{0} bertsioa" + "update": "Update" + }, + "configuration": { + "cli": { + "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" + } + }, + "connectionStatus": { + "connectionLost": "Connection lost. Cloud sketch actions and updates won't be available." }, "contributions": { "addFile": "Gehitu fitxategia", "fileAdded": "Fitxategi bat gehitu da programara.", + "plotter": { + "couldNotOpen": "Couldn't open serial plotter" + }, "replaceTitle": "Ordezkatu" }, + "core": { + "compilerWarnings": { + "all": "All", + "default": "Default", + "more": "More", + "none": "None" + } + }, "coreContribution": { "copyError": "Copy error messages", "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." }, + "createCloudCopy": "Push Sketch to Cloud", "daemon": { "restart": "Restart Daemon", "start": "Start Daemon", @@ -162,8 +215,15 @@ "debug": { "debugWithMessage": "Araztu - {0}", "debuggingNotSupported": "Ez dauka arazketarako euskarririk: '{0}'", + "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "Plataforma ez dago instalatuta honentzat: '{0}'", - "optimizeForDebugging": "Optimizatu arazketarako" + "optimizeForDebugging": "Optimizatu arazketarako", + "sketchIsNotCompiled": "Sketch '{0}' must be verified before starting a debug session. Please verify the sketch and start debugging again. Do you want to verify the sketch now?" + }, + "developer": { + "clearBoardList": "Clear the Board List History", + "clearBoardsConfig": "Clear the Board and Port Selection", + "dumpBoardList": "Dump the Board List" }, "dialog": { "dontAskAgain": "Ez galdetu berriro" @@ -180,10 +240,6 @@ "previousError": "Previous Error", "revealError": "Reveal Error" }, - "electron": { - "couldNotSave": "Ezin izan da programa gorde. Kopiatu gorde gabeko zure lana zure testu-editore gogokoenera eta berrabiarazi IDEa.", - "unsavedChanges": "Gorde gabeko aldaketak galduko dira." - }, "examples": { "builtInExamples": "Integratutako adibideak", "couldNotInitializeExamples": "Ezin izan dira hasieratu integratutako adibideak.", @@ -201,7 +257,7 @@ "selectBoard": "Hautatu plaka", "selectVersion": "Hautatu firmware bertsioa", "successfullyInstalled": "Firmwarea behar bezala instalatu da.", - "updater": "WiFi101 / WiFiNINA firmware eguneratzailea" + "updater": "Firmware Updater" }, "help": { "environment": "Ingurunea", @@ -219,6 +275,9 @@ "checkForUpdates": "Check for Arduino IDE Updates", "closeAndInstallButton": "Itxi eta instalatu", "closeToInstallNotice": "Itxi softwarea eta instalatu eguneratzea zure makinan.", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", "downloadButton": "Software eguneratzea", "downloadingNotice": "Arduino IDEren azken bertsioa deskargatzen", "errorCheckingForUpdates": "Errorea Arduino IDE eguneraketak egiaztatzean.\n{0}", @@ -232,16 +291,20 @@ "updateAvailable": "Eguneratzea eskuragarri", "versionDownloaded": "Arduino IDE {0} deskargatu da." }, + "installable": { + "libraryInstallFailed": "Failed to install library: '{0}{1}'.", + "platformInstallFailed": "Failed to install platform: '{0}{1}'." + }, "library": { "addZip": "Gehitu .ZIP liburutegia...", "arduinoLibraries": "Arduino liburutegiak", "contributedLibraries": "Hirugarrengoen liburutegiak", - "dependenciesForLibrary": "{0} liburutegiaren mendekotasunak: {1}", "include": "Hartu barne liburutegia", - "installAll": "Instalatu guztiak", + "installAll": "Install All", + "installLibraryDependencies": "Install library dependencies", "installMissingDependencies": "Falta diren mendekotasun guztiak instalatu nahi dituzu?", "installOneMissingDependency": "Falta den mendekotasuna instalatu nahi duzu?", - "installOnly": "Instalatu {0} bakarrik", + "installWithoutDependencies": "Install without dependencies", "installedSuccessfully": "{0}:{1} liburutegia behar bezala instalatu da", "libraryAlreadyExists": "Liburutegi bat badago dagoeneko. Gainidatzi nahi duzu?", "manageLibraries": "Kudeatu liburutegiak...", @@ -278,9 +341,23 @@ "tools": "Tresnak" }, "monitor": { + "alreadyConnectedError": "Could not connect to {0} {1} port. Already connected.", + "baudRate": "{0} baud", + "connectionFailedError": "Could not connect to {0} {1} port.", + "connectionFailedErrorWithDetails": "{0} Could not connect to {1} {2} port.", + "connectionTimeout": "Timeout. The IDE has not received the 'success' message from the monitor after successfully connecting to it", + "missingConfigurationError": "Could not connect to {0} {1} port. The monitor configuration is missing.", + "notConnectedError": "Not connected to {0} {1} port.", "unableToCloseWebSocket": "Unable to close websocket", "unableToConnectToWebSocket": "Unable to connect to websocket" }, + "newCloudSketch": { + "newSketchTitle": "Name of the new Cloud Sketch" + }, + "portProtocol": { + "network": "Sarea", + "serial": "Serial" + }, "preferences": { "additionalManagerURLs": "Plaka kudeatzaile gehigarrien URLak:", "auth.audience": "OAuth2 audientzia.", @@ -297,6 +374,7 @@ "cloud.pull.warn": "Egia bada erabiltzaileek abisua jasoko dute programa bat hodeitik kargatu aurretik. Lehenetsia egia da.", "cloud.push.warn": "Egia bada erabiltzaileek abisua jasoko dute programa bat hodeian gorde aurretik. Lehenetsia egia da.", "cloud.pushpublic.warn": "Egia bada erabiltzaileek abisua jasoko dute programa publiko bat hodeian gorde aurretik. Lehenetsia egia da.", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", "cloud.sketchSyncEndpoint": "Zerbitzari batean programak gorde eta kargatzeko amaiera-puntua. Lehenetsia Arduino Cloud API da.", "compile": "konpilazioa", "compile.experimental": "True if the IDE should handle multiple compiler errors. False by default", @@ -314,29 +392,50 @@ "invalid.editorFontSize": "Editorearen letra-tamaina baliogabea. Osoko zenbaki positibo bat izan behar du.", "invalid.sketchbook.location": "Programa bildumaren kokaleku baliogabea: {0}", "invalid.theme": "Itxura baliogabea.", + "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", "language.log": "Egia Arduino Language Server-ek egunkari-fitxategiak sortu behar baditu programaren karpetan. Bestela, gezurra. Lehenetsia gezurra da.", "language.realTimeDiagnostics": "If true, the language server provides real-time diagnostics when typing in the editor. It's false by default.", "manualProxy": "Proxyaren eskuzko konfigurazioa", + "monitor": { + "dockPanel": "The area of the application shell where the _{0}_ widget will reside. It is either \"bottom\" or \"right\". It defaults to \"{1}\"." + }, "network": "Sarea", "newSketchbookLocation": "Hautatu programa bilduma berriaren kokalekua", + "noCliConfig": "Could not load the CLI configuration", "noProxy": "Proxyrik ez", + "proxySettings": { + "hostname": "Host name", + "password": "Password", + "port": "Port number", + "username": "Username" + }, "showVerbose": "Erakutsi irteera xehatua honetan zehar:", + "sketch": { + "inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect." + }, "sketchbook.location": "Programa bildumaren kokalekua", "sketchbook.showAllFiles": "Egia programaren barruko programa-fitxategi guztiak erakusteko. Lehenetsia gezurra da.", - "survey.notification": "True if users should be notified if a survey is available. True by default.", "unofficialBoardSupport": "Egin klik ofizialak ez diren plaken laguntza-URL zerrenda ikusteko", "upload": "karga", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", "upload.verbose": "Egia kargaren irteera xehatua izateko. Lehenetsia Gezurra.", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "Egiaztatu kodea kargatu ondoren", "window.autoScale": "Egia erabiltzaile interfazea letra-tamainarekin automatikoki eskalatzen bada.", - "window.zoomLevel": "Doitu leihoaren zoom maila. Jatorrizko tamaina 0 da eta goraka (1) edo beheraka (-1) egindako aldaketa bakoitzak zooma %20 handitzea edo txikiagotzea eragiten du. Zoom maila zehaztasun handiagoarekin doitzeko zenbaki hamartarrak erabili ditzakezu." + "window.zoomLevel": { + "deprecationMessage": "Deprecated. Use 'window.zoomLevel' instead." + } + }, + "renameCloudSketch": { + "renameSketchTitle": "New name of the Cloud Sketch" }, "replaceMsg": "Lehendik dagoen {0} bertsioa ordezkatu?", "selectZip": "Hautatu gehitu nahi duzun liburutegia daukan zip fitxategia", "serial": { "autoscroll": "Korritze automatikoa", "carriageReturn": "Orga-itzulera", - "message": "Mezua ({0} + Enter honi mezua bidaltzeko: '{1}' hemen: '{2}')", + "connecting": "Connecting to '{0}' on '{1}'...", + "message": "Message (Enter to send message to '{0}' on '{1}')", "newLine": "Lerro berria", "newLineCarriageReturn": "NL & CR biak", "noLineEndings": "Lerro amaierarik ez", @@ -348,24 +447,34 @@ "sketch": { "archiveSketch": "Artxibatu programa", "cantOpen": "\"{0}\" izeneko karpeta badago dagoeneko. Ezin da programa ireki.", - "close": "Ziur zaude programa itxi nahi duzula?", "compile": "Compiling sketch...", - "configureAndUpload": "Konfiguratu eta kargatu", + "configureAndUpload": "Configure and Upload", "createdArchive": "'{0}' artxiboa sortu da.", "doneCompiling": "Konpilazioa burutu da.", "doneUploading": "Karga burutu da.", + "editInvalidSketchFolderLocationQuestion": "Do you want to try saving the sketch to a different location?", + "editInvalidSketchFolderQuestion": "Do you want to try saving the sketch with a different name?", "exportBinary": "Esportatu konpilatutako bitarra", + "invalidCloudSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", + "invalidSketchFolderLocationDetails": "You cannot save a sketch into a folder inside itself.", + "invalidSketchFolderLocationMessage": "Invalid sketch folder location: '{0}'", + "invalidSketchFolderNameMessage": "Invalid sketch folder name: '{0}'", + "invalidSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", "moving": "Lekuz aldatzen", "movingMsg": "\"{0}\" fitxategiak \"{1}\" izeneko programa-karpetaren barruan egon behar du.\nSortu karpeta, eraman fitxategia bertara eta jarraitu?", - "new": "Berria", + "new": "New Sketch", + "noTrailingPeriod": "A filename cannot end with a dot", "openFolder": "Ireki karpeta", "openRecent": "Ireki azkenaldikoa", "openSketchInNewWindow": "Ireki programa leiho berrian", + "reservedFilename": "'{0}' is a reserved filename.", "saveFolderAs": "Gorde programen karpeta honela...", "saveSketch": "Save your sketch to open it again later.", "saveSketchAs": "Gorde programen karpeta honela...", "showFolder": "Erakutsi programen karpeta", "sketch": "Programa", + "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", + "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", "sketchbook": "Programa bilduma", "titleLocalSketchbook": "Programa bilduma lokala", "titleSketchbook": "Programa bilduma", @@ -376,10 +485,26 @@ "verify": "Egiaztatu", "verifyOrCompile": "Egiaztatu/Konpilatu" }, - "survey": { - "answerSurvey": "Answer survey", - "dismissSurvey": "Don't show again", - "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." + "sketchbook": { + "newCloudSketch": "New Cloud Sketch", + "newSketch": "New Sketch" + }, + "theme": { + "currentThemeNotFound": "Could not find the currently selected theme: {0}. Arduino IDE has picked a built-in theme compatible with the missing one.", + "dark": "Dark", + "deprecated": "{0} (deprecated)", + "hc": "Dark High Contrast", + "hcLight": "Light High Contrast", + "light": "Light", + "user": "{0} (user)" + }, + "title": { + "cloud": "Cloud" + }, + "updateIndexes": { + "updateIndexes": "Update Indexes", + "updateLibraryIndex": "Update Library Index", + "updatePackageIndex": "Update Package Index" }, "upload": { "error": "{0} errorea: {1}" @@ -388,11 +513,27 @@ "cancel": "Utzi", "enterField": "Enter {0}", "upload": "Kargatu" + }, + "validateSketch": { + "abortFixMessage": "The sketch is still invalid. Do you want to fix the remaining problems? By clicking '{0}', a new sketch will open.", + "abortFixTitle": "Invalid sketch", + "renameSketchFileMessage": "The sketch file '{0}' cannot be used. {1} Do you want to rename the sketch file now?", + "renameSketchFileTitle": "Invalid sketch filename", + "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", + "renameSketchFolderTitle": "Invalid sketch name" + }, + "versionWelcome": { + "cancelButton": "Maybe later", + "donateButton": "Donate now", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Welcome to a new version of the Arduino IDE!", + "titleWithVersion": "Welcome to the new Arduino IDE {0}!" + }, + "workspace": { + "alreadyExists": "'{0}' already exists." } }, - "cloud": { - "GoToCloud": "JOAN HODEIRA" - }, "theia": { "core": { "cannotConnectBackend": "Ezin izan da atzeko aldera konektatu.", @@ -400,13 +541,9 @@ "couldNotSave": "Ezin izan da programa gorde. Kopiatu gorde gabeko zure lana zure testu-editore gogokoenera eta berrabiarazi IDEa.", "daemonOffline": "CLI daemon-a lineaz kanpo", "offline": "Lineaz kanpo", + "offlineText": "Lineaz kanpo", "quitTitle": "Are you sure you want to quit?" }, - "debug": { - "start": "Hasi...", - "startError": "Errore bat gertatu da arazketa saioa hastean. Ikusi egunkariak xehetasun gehiagorako.", - "typeNotSupported": "\"{0}\" motako arazketa saioak ez du euskarririk." - }, "editor": { "unsavedTitle": "Gorde gabe – {0}" }, @@ -415,10 +552,10 @@ "expand": "Zabaldu" }, "workspace": { - "deleteCurrentSketch": "Uneko programa ezabatu nahi duzu?", + "deleteCloudSketch": "The cloud sketch '{0}' will be permanently deleted from the Arduino servers and the local caches. This action is irreversible. Do you want to delete the current sketch?", + "deleteCurrentSketch": "The sketch '{0}' will be permanently deleted. This action is irreversible. Do you want to delete the current sketch?", "fileNewName": "Fitxategi berriaren izena", "invalidExtension": "{0} ez da baliozko luzapen bat.", - "invalidFilename": "Fitxategi-izen baliogabea.", "newFileName": "Fitxategiaren izen berria" } } diff --git a/i18n/fa.json b/i18n/fa.json index e0dfab928..0b6f2e37f 100644 --- a/i18n/fa.json +++ b/i18n/fa.json @@ -1,46 +1,59 @@ { "arduino": { "about": { - "detail": "نسخه :{0}\nتاریخ: {1} {2}\nنسخه CLI : {3}{4} [{5}]\n\n{6}", + "detail": "نسخه: {0}\nتاریخ: {1}{2}\nنسخه CLI: {3}\n\n{4}", "label": "درباره {0}" }, + "account": { + "goToCloudEditor": "به ویرایشگر فضای ابری برو", + "goToIoTCloud": "به فضای ابری اینترنت اشیاء برو", + "goToProfile": "به نمایه برو", + "menuTitle": "فضای ابری آردواینو" + }, "board": { "board": "بورد {0}", - "boardConfigDialogTitle": "Select Other Board and Port", + "boardConfigDialogTitle": "انتخاب یک بورد و پورت دیگر", + "boardDataReloaded": "Board data reloaded.", "boardInfo": "مشخصات برد", + "boards": "بردها", "configDialog1": "اگر می‌خواهید طرحی را آپلود کنید، هم یک تابلو و هم یک پورت انتخاب کنید.", "configDialog2": "اگر فقط تابلو را انتخاب کنید، می توانید کامپایل کنید، اما نمی توانید طرح خود را آپلود کنید.", "couldNotFindPreviouslySelected": "نمی توان برد انتخاب شده قبلی '{0}' در پلتفرم نصب شده '{1}' را پیدا کرد. لطفاً تابلویی را که می‌خواهید استفاده کنید، مجدداً به‌صورت دستی انتخاب کنید. آیا اکنون می خواهید آن را مجدداً انتخاب کنید؟", - "disconnected": "Disconnected", + "editBoardsConfig": "ویرایش بورد و پورت", "getBoardInfo": "دریافت راهنمای برد", "inSketchbook": "(در منبع طرح ها)", "installNow": "هسته \"{0}{1}\" باید برای برد \"{2}\" انتخاب شده فعلی نصب شود. آیا الان می خواهید نصبش کنید؟", - "noFQBN": "FQBN برای برد انتخاب شده \"{0}\" موجود نیست. آیا هسته مربوطه را نصب کرده اید؟", - "noPortsDiscovered": "No ports discovered", - "noPortsSelected": "هیچ پورتی برای برد انتخاب نشده است.{0}", - "noneSelected": "هیچ بردی انتخاب نشده است.", + "noBoardsFound": "هیچ بردی پیدا نشد برای{0}", + "noNativeSerialPort": "سریال پورت داخلی، نمی تواند اطلاعات را بدست آورد.", + "noPortsDiscovered": "هیچ پورتی پیدا نشد", + "nonSerialPort": "سریال پورتی یافت نشد، نمی توان اطلاعاتی را نمایش داد.", "openBoardsConfig": "انتخاب سایر برد ها و پورت ها", - "platformMissing": "پلت فرم برای برد انتخابی '{0}' نصب نشده است.", "pleasePickBoard": "لطفاً یک برد متصل به پورتی که انتخاب کرده اید را انتخاب کنید.", "port": "پورت {0}", - "portLabel": "Port: {0}", - "programmer": "برنامه ریز", + "ports": "پورت ها", + "programmer": "Programmer", + "reloadBoardData": "Reload Board Data", "reselectLater": "بعدا انتخاب کنید", - "searchBoard": "Search board", + "revertBoardsConfig": "استفاده از «{0}» پیدا شده در «{1}»", + "searchBoard": "جستجوی بورد", "selectBoard": "انتخاب برد", - "selectBoardForInfo": "لطفاً یک برد را برای به دست آوردن اطلاعات هیئت مدیره انتخاب کنید.", + "selectBoardToReload": "Please select a board first.", "selectPortForInfo": "لطفاً یک پورت را برای به دست آوردن اطلاعات هیئت مدیره انتخاب کنید.", "showAllAvailablePorts": "نمایش تمام پورت های موجود در صورت فعال بودن", + "showAllPorts": "نمایش تمام پورت ها", "succesfullyInstalledPlatform": "نصب پلتفرم موفقیت آمیز بود {0}:{1}", - "succesfullyUninstalledPlatform": "لغو نصب پلتفرم موفقیت آمیز بود. {0}:{1}" + "succesfullyUninstalledPlatform": "لغو نصب پلتفرم موفقیت آمیز بود. {0}:{1}", + "typeOfPorts": "پورت ها{0}", + "unconfirmedBoard": "بورد تایید نشده است.", + "unknownBoard": "بورد ناشناخته هست." }, "boardsManager": "مدیریت برد ها", "boardsType": { - "arduinoCertified": "Arduino Certified" + "arduinoCertified": "گواهی آردینو" }, "bootloader": { "burnBootloader": "بارگذاری بوت لودر.", - "burningBootloader": "Burning bootloader...", + "burningBootloader": "بارگذاری بوت لودر", "doneBurningBootloader": "اتمام بارگذاری بوت لودر." }, "burnBootloader": { @@ -58,39 +71,40 @@ "selectBoard": "انتخاب یک برد ...", "selectCertificateToUpload": "1. انتخاب سند برای بارگذاری", "selectDestinationBoardToUpload": "2. انتخاب برد مورد نظر و بارگذاری سند", - "upload": "آپلود", - "uploadFailed": "آپلود ناموفق بود. لطفا دوباره سعی کنید.", + "upload": "بارگذاری", + "uploadFailed": "باگذاری ناموفق بود. لطفا دوباره سعی کنید.", "uploadRootCertificates": "بارگذاری سند ریشه SSL", "uploadingCertificates": "در حال بارگذاری سند." }, "checkForUpdates": { - "checkForUpdates": "Check for Arduino Updates", - "installAll": "Install All", - "noUpdates": "There are no recent updates available.", - "promptUpdateBoards": "Updates are available for some of your boards.", - "promptUpdateLibraries": "Updates are available for some of your libraries.", - "updatingBoards": "Updating boards...", - "updatingLibraries": "Updating libraries..." + "checkForUpdates": "بررسی به روزرسانی برای آردینو", + "installAll": "همه را نصب کنید", + "noUpdates": "هیچ به روز رسانی اخیر در دسترس نیست", + "promptUpdateBoards": "به روز رسانی برای برخی از بردها شما در دسترس است.", + "promptUpdateLibraries": "به روز رسانی برای برخی از کتابخانه های شما در دسترس است.", + "updatingBoards": "در حال به روز رسانی بردها ...", + "updatingLibraries": "در حال به روز رسانی کتابخانه ها..." }, "cli-error-parser": { - "keyboardError": "'Keyboard' not found. Does your sketch include the line '#include <Keyboard.h>'?", - "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" + "keyboardError": "صفحه کلید پیدا نشد. آیا طرح شما شامل خط \"#include <Keyboard.h>\" است؟", + "mouseError": "\"موس\" پیدا نشد. آیا طرح شما شامل خط \"#include <Mouse.h>\" است؟" }, "cloud": { - "account": "Account", "chooseSketchVisibility": "قابلیت مشاهده طرح خود را انتخاب کنید:", - "connected": "متصل", + "cloudSketchbook": "منبع ابری طرح ها", + "connected": "متصل است.", "continue": "ادامه", "donePulling": "پایان دریافت {0}", "donePushing": "پایان ارسال {0}", "embed": "قرار دادن:", "emptySketchbook": "طرح شما خالی است", + "goToCloud": "به فضای ابری بروید", "learnMore": "یادگیری بیشتر", "link": "لینک:", "notYetPulled": "نمی توان به ابر ارسال کرد. هنوز دریافت نشده است.", "offline": "آفلاین", "openInCloudEditor": "در ویرایشگر ابری باز کن", - "options": "تنظیمات...", + "options": "گزینه‌ها", "privateVisibility": "خصوصی است. فقط شما می توانید طرح را مشاهده کنید.", "profilePicture": "عکس پروفایل", "publicVisibility": "عمومی است. هر کسی که پیوند را داشته باشد می تواند طرح را مشاهده کند.", @@ -102,68 +116,114 @@ "pushSketch": "ارسال طرح", "pushSketchMsg": "این یک طرح عمومی است. قبل از ارسال، مطمئن شوید که اطلاعات حساس در فایل‌های arduino_secrets.h تعریف شده است. می‌توانید از پانل اشتراک‌گذاری یک طرح را خصوصی کنید.", "remote": "از راه دور", - "remoteSketchbook": "Remote Sketchbook", "share": "اشتراک گذاری...", "shareSketch": "اشتراک طرح", - "showHideRemoveSketchbook": "نمایش/پنهان کردن از راه دور منبع طرح ها", - "signIn": "ورود کاربر", + "showHideSketchbook": "نمایش/پنهان کردن طرح‌های روی فضای ابری", + "signIn": "ورود", "signInToCloud": "ورود به ابر آردوینو", - "signOut": "خروج کاربر", - "sync": "Sync", + "signOut": "خروج", + "sync": "همگام سازی", "syncEditSketches": "طرح های ابر آردوینو خود را همگام سازی و ویرایش کنید", "visitArduinoCloud": "بازدید از ابر آردوینو برای ساخت ابر طرح ها" }, + "cloudSketch": { + "alreadyExists": "طرح روی فضای ابری «{0}» از قبل وجود دارد.", + "creating": "در حال ایجاد طرح رو فضای ابری «{0}»...", + "new": "طرح جدید روی فضای ابری", + "notFound": "نمی توان طرح ابری «{0}» را دریافت کرد. چنین طرحی وجود ندارد.", + "pulling": "همگام سازی طرح، در حالت دریافت «{0}» ...", + "pushing": "همگام سازی طرح، در حالت ارسال «{0}» ...", + "renaming": "تغییر نام طرح فضای ابری از «{0}» به «{1}»...", + "synchronizingSketchbook": "همگام سازی طرح..." + }, "common": { - "all": "All", - "contributed": "Contributed", + "all": "همه", + "contributed": "کمک کرد", "installManually": "دستی نصب کن", "later": "بعدا", "noBoardSelected": "بردی انتخاب نشده", + "noSketchOpened": "هیچ طرحی باز نشده است", "notConnected": "[متصل نشد]", "offlineIndicator": "به نظر می رسد آفلاین هستید. بدون اتصال به اینترنت، رابط ترمینال آردوینو ممکن است نتواند منابع مورد نیاز را دانلود کند و باعث اختلال در عملکرد شود. لطفاً به اینترنت متصل شوید و برنامه را مجدداً راه اندازی کنید.", "oldFormat": "'{0}' هنوز از قالب قدیمی `.pde` استفاده می کند. آیا می‌خواهید به برنامه افزودنی «.ino» جدید بروید؟", - "partner": "Partner", - "processing": "در حال محاسبه", - "recommended": "Recommended", - "retired": "Retired", + "partner": "شریک", + "processing": "در حال پردازش", + "recommended": "توصیه شده", + "retired": "بازنشسته", + "selectManually": "به صورت دستی انتخاب کنید", "selectedOn": "روشن {0}", "serialMonitor": "نمایشگر ترمینال سریال", - "type": "Type", + "type": "نوع", "unknown": "نامعلوم", - "updateable": "Updatable" + "updateable": "قابل به روز رسانی", + "userAbort": "User abort" }, "compile": { "error": "خطای کامپایل : {0}" }, "component": { - "boardsIncluded": "Boards included in this package:", + "boardsIncluded": "بردهای موجود در این بسته :", "by": "توسط", + "clickToOpen": "برای باز کردن در مرورگر کلیک کنید:{0}", "filterSearch": "محدود کردن جستجوی شما ...", "install": "نصب", + "installLatest": "آخرین نسخه را نصب کنید", + "installVersion": "نصب {0}", + "installed": "نصب شده {0}", "moreInfo": "اطلاعات بیشتر", + "otherVersions": "نسخه‌های دیگر", + "remove": "حذف", + "title": "{0} با {1}", "uninstall": "لغو نصب", "uninstallMsg": "آیا شما می خواهید {0} را لغو نصب کنید؟", - "version": "ورژن {0}" + "update": "به روز رسانی" + }, + "configuration": { + "cli": { + "inaccessibleDirectory": "دسترسی به مکان طرح در «{0}» امکان پذیر نیست: «{1}»" + } + }, + "connectionStatus": { + "connectionLost": "اتصال قطع شد. اقدامات و به‌روزرسانی‌های طرح برای فضای ابری در دسترس نخواهند بود." }, "contributions": { - "addFile": "فایل اظافه کن", + "addFile": "اضافه کردن فایل", "fileAdded": "یک فایل به طرح افزوده شد.", + "plotter": { + "couldNotOpen": "پلاتر سریال باز نشد" + }, "replaceTitle": "جایگذاری" }, + "core": { + "compilerWarnings": { + "all": "همه", + "default": "پیش فرض", + "more": "بیشتر", + "none": "هیچ یک" + } + }, "coreContribution": { - "copyError": "Copy error messages", - "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." + "copyError": "کپی پیام های خطا", + "noBoardSelected": "هیچ بردی انتخاب نشده است. لطفاً برد آردوینو خود را از منوی Tools > Board انتخاب کنید" }, + "createCloudCopy": "طرح را به فضای ابری منتقل کنید", "daemon": { - "restart": "Restart Daemon", - "start": "Start Daemon", - "stop": "Stop Daemon" + "restart": "راه اندازی مجدد Daemon", + "start": "شروع Daemon", + "stop": " متوقف کردن Daemon" }, "debug": { "debugWithMessage": "رفع خطا {0}", "debuggingNotSupported": "رفع خطا توسط {0} پشتیبانی نمی شود.", + "getDebugInfo": "در حال دریافت اطلاعات اشکال زدایی...", "noPlatformInstalledFor": "دستگاه مورد نظر برای {0} نصب نشده است", - "optimizeForDebugging": "بهینه کردن برای رفع خطا" + "optimizeForDebugging": "بهینه کردن برای رفع خطا", + "sketchIsNotCompiled": "طرح «{0}» باید قبل از شروع برای اشکال‌زدایی بازبینی شود. لطفاً طرح را بازبینی کنید و دوباره اشکال زدایی را شروع کنید. آیا می خواهید اکنون طرح را تأیید کنید؟" + }, + "developer": { + "clearBoardList": "تاریخچه فهرست بورد را پاک کنید", + "clearBoardsConfig": "بورد و پورت انتخاب شده را پاک کنید", + "dumpBoardList": "روبرداری از لیست بردارها" }, "dialog": { "dontAskAgain": "نمی تواند بپرسد." @@ -176,13 +236,9 @@ "decreaseIndent": "برداشتن دندانه", "increaseFontSize": "افزایش اندازه فونت", "increaseIndent": "افزودن دندانه", - "nextError": "Next Error", - "previousError": "Previous Error", - "revealError": "Reveal Error" - }, - "electron": { - "couldNotSave": "ابر طرح را ذخیره نکرد. لطفا کار ذخیره نشده خود را به ویرایشگر متن مورد علاقه خود کپی کنید، و آردوینو را دوباره راه اندازی کنید.", - "unsavedChanges": "هر تغییری که انجام می دهید ذخیره نمی شود." + "nextError": "خطای بعدی", + "previousError": "خطای قبلی", + "revealError": "فاش کردن خطا" }, "examples": { "builtInExamples": "نمونه های داخلی", @@ -201,7 +257,7 @@ "selectBoard": "انتخاب برد", "selectVersion": "انتخاب نسخه درایور", "successfullyInstalled": "نصب درایور موفقیت آمیز بود.", - "updater": "بروزرسان درایور WiFi101 / WiFiNINA" + "updater": "بروز رسانی میان‌افزار" }, "help": { "environment": "محیط", @@ -216,9 +272,12 @@ "visit": "بازدید از Arduino.cc" }, "ide-updater": { - "checkForUpdates": "Check for Arduino IDE Updates", + "checkForUpdates": "به روز رسانی آردوینو IDE را بررسی کنید", "closeAndInstallButton": "بستن و نصب", "closeToInstallNotice": "نرم افزار را ببندید و به روز رسانی را روی دستگاه خود نصب کنید.", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", "downloadButton": "دانلود", "downloadingNotice": "در حال بارگیری آخرین نسخه از آردوینو", "errorCheckingForUpdates": "خطا در حلقه بررسی برای وجود بروزرسانی برای آردوینو رخ داد. {0}", @@ -232,16 +291,20 @@ "updateAvailable": "به روز رسانی موجود است", "versionDownloaded": "آردوینو {0} دانلود شده بوده است." }, + "installable": { + "libraryInstallFailed": "کتابخانه نصب نشد: '{0}{1}'.", + "platformInstallFailed": "پلتفرم نصب نشد: '{0}{1}'" + }, "library": { - "addZip": "اضافه کتابخانه ی .zip شده", + "addZip": "اضافه کتابخانه‌ی .ZIP شده", "arduinoLibraries": "کتابخانه های آردوینو", "contributedLibraries": "کتابخانه های اشتراکی", - "dependenciesForLibrary": "وابستگی های کتابخانه {0}:{1}", "include": "اضافه کتابخانه", - "installAll": "نصب همه", + "installAll": "همه را نصب کنید", + "installLibraryDependencies": "وابستگی های کتابخانه را نصب کنید", "installMissingDependencies": "آیا می خواهید تمام وابستگی های از دست رفته را نصب کنید؟", "installOneMissingDependency": "آیا می خواهید وابستگی از دست رفته را نصب کنید؟", - "installOnly": "فقط {0} را نصب کن", + "installWithoutDependencies": "بدون وابستگی نصب کنید", "installedSuccessfully": "نصب کتابخانه {0}:{1} موفقیت آمیز بود.", "libraryAlreadyExists": "یک کتابخانه از قبل وجود دارد. آیا میخواهید آن را بازنویسی کنید؟", "manageLibraries": "مدیریت کتابخانه ها...", @@ -255,31 +318,45 @@ "zipLibrary": "کتابخانه" }, "librarySearchProperty": { - "topic": "Topic" + "topic": "موضوع" }, "libraryTopic": { - "communication": "Communication", - "dataProcessing": "Data Processing", - "dataStorage": "Data Storage", - "deviceControl": "Device Control", - "display": "Display", - "other": "Other", - "sensors": "Sensors", - "signalInputOutput": "Signal Input/Output", - "timing": "Timing", - "uncategorized": "Uncategorized" + "communication": "ارتباط", + "dataProcessing": "پردازش داده ها", + "dataStorage": "ذخیره سازی داده ها", + "deviceControl": "کنترل دستگاه", + "display": "نمایش دادن", + "other": "دیگر", + "sensors": "سنسورها", + "signalInputOutput": "سیگنال ورودی/خروجی", + "timing": "زمان سنجی", + "uncategorized": "دسته بندی نشده" }, "libraryType": { - "installed": "Installed" + "installed": "نصب شده است" }, "menu": { - "advanced": "Advanced", + "advanced": "پیشرفته", "sketch": "طرح", - "tools": "ابزار ها" + "tools": "ابزارها" }, "monitor": { - "unableToCloseWebSocket": "Unable to close websocket", - "unableToConnectToWebSocket": "Unable to connect to websocket" + "alreadyConnectedError": "به پورت «{0}{1}» متصل نشد. از قبل متصل است.", + "baudRate": "baud {0}", + "connectionFailedError": "به پورت«{0}{1}» متصل نشد.", + "connectionFailedErrorWithDetails": "متاسفانه، «{0}» به پورت «{1}{2}» متصل نشد.", + "connectionTimeout": "تایم اوت، IDE پس از اتصال موفقیت آمیز، پیام 'موفقیت' را از نظارت کننده دریافت نکرده است", + "missingConfigurationError": "به پورت «{0} {1}» متصل نشد. پیکربندی مانیتور وجود ندارد.", + "notConnectedError": "به پورت «{0} {1} » متصل نیست.", + "unableToCloseWebSocket": "بسته شدن وب سوکت ممکن نیست", + "unableToConnectToWebSocket": "اتصال به وب سوکت امکان پذیر نیست" + }, + "newCloudSketch": { + "newSketchTitle": "نام جدید برای طرح روی فضای ابری" + }, + "portProtocol": { + "network": "نتورک", + "serial": "سریال" }, "preferences": { "additionalManagerURLs": "نشانی‌های اینترنتی مدیر تابلوهای افزوده", @@ -287,20 +364,21 @@ "auth.clientID": "شناسه مشتری OAuth2(احراز هویت اینترنتی).", "auth.domain": "دامنه OAuth2(احراز هویت اینترنتی).", "auth.registerUri": "لینک برای ثبت یک کاربر جدید استفاده می شود.", - "automatic": "اتوماتیک", + "automatic": "خودکار", "board.certificates": "فهرست گواهی‌هایی که می‌توان در تابلوها بارگذاری کرد", "browse": "مرور کردن", - "checkForUpdate": "Receive notifications of available updates for the IDE, boards, and libraries. Requires an IDE restart after change. It's true by default.", + "checkForUpdate": "اعلان‌های به‌روزرسانی‌های موجود برای IDE، بردها و کتابخانه‌ها را دریافت کنید. پس از تغییر نیاز به راه اندازی مجدد IDE دارد. به طور پیش فرض درست است.", "choose": "انتخاب", - "cli.daemonDebug": "Enable debug logging of the gRPC calls to the Arduino CLI. A restart of the IDE is needed for this setting to take effect. It's false by default.", + "cli.daemonDebug": "ثبت اشکال زدایی تماس های gRPC به Arduino CLI را فعال کنید. برای اعمال این تنظیم به راه اندازی مجدد IDE نیاز است. به طور پیش فرض نادرست است", "cloud.enabled": "اگر فعال بودن توابع همگام سازی طرح درست می باشد ، پیش فرض ها درست است", "cloud.pull.warn": "اگر هشدار دادن به کاربران قبل از کشیدن یک طرح ابری درست می باشد ، پیش فرض ها صحیح است.", "cloud.push.warn": "اگر هشدار دادن به کاربران قبل از ارسال یک طرح ابری درست است پیش فرض ها درست می باشد", "cloud.pushpublic.warn": "اگر هشدار دادن به کاربران قبل از ارسال یک طرح عمومی به فضای درست می باشد پیش فرض ها درست است.", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", "cloud.sketchSyncEndpoint": "نقطه ای برای ارسال و دریافت طرح ها استفاده می شود . به طور پیش فرض به رابط ابر آردوینو استفاده می کند.", "compile": "کامپایل", - "compile.experimental": "True if the IDE should handle multiple compiler errors. False by default", - "compile.revealRange": "Adjusts how compiler errors are revealed in the editor after a failed verify/upload. Possible values: 'auto': Scroll vertically as necessary and reveal a line. 'center': Scroll vertically as necessary and reveal a line centered vertically. 'top': Scroll vertically as necessary and reveal a line close to the top of the viewport, optimized for viewing a code definition. 'centerIfOutsideViewport': Scroll vertically as necessary and reveal a line centered vertically only if it lies outside the viewport. The default value is '{0}'.", + "compile.experimental": "درست است اگر IDE باید چندین خطای کامپایلر را مدیریت کند. به طور پیش فرض نادرست است", + "compile.revealRange": "نحوه آشکار شدن خطاهای کامپایلر در ویرایشگر پس از تأیید/آپلود ناموفق را تنظیم می کند. مقادیر ممکن: 'auto': در صورت لزوم به صورت عمودی اسکرول کنید و یک خط را نشان دهید. 'مرکز': در صورت لزوم به صورت عمودی اسکرول کنید و یک خط را در مرکز عمودی نشان دهید. 'بالا': در صورت لزوم به صورت عمودی اسکرول کنید و یک خط نزدیک به بالای نمای درگاه را نشان دهید که برای مشاهده تعریف کد بهینه شده است. 'centerIfOutsideViewport': در صورت لزوم به صورت عمودی اسکرول کنید و یک خط در مرکز عمودی را فقط در صورتی نشان دهید که خارج از درگاه دید قرار داشته باشد. مقدار پیش فرض است{0}", "compile.verbose": "برای خروجی کامپایل پرمخاطب درست است. به طور پیش فرض نادرست است", "compile.warnings": "به gcc می گوید از کدام سطح هشدار استفاده کند. به طور پیش فرض \"هیچ\" است", "compilerWarnings": "هشدار های کامپایلر", @@ -308,91 +386,154 @@ "editorQuickSuggestions": "پیشنهادات سریع ویرایشگر", "enterAdditionalURLs": "نشانی‌های وب اضافی، یکی برای هر ردیف وارد کنید", "files.inside.sketches": "نمایش فایل ها در داخل طرح ها", - "ide.updateBaseUrl": "The base URL where to download updates from. Defaults to 'https://downloads.arduino.cc/arduino-ide'", + "ide.updateBaseUrl": "نشانی وب سایت که از آن برای به‌روزرسانی‌ها را دانلود کنیم. پیش‌فرض «https://downloads.arduino.cc/arduino-ide» است", "ide.updateChannel": "برای به روز رسانی کانال را منتشر کنید 'stable' نسخه پایدار است، 'nightly' جدیدترین ساخت توسعه است.", "interfaceScale": "مقیاس رابط", "invalid.editorFontSize": "اندازه فونت ویرایشگر نامعتبر است. باید یک عدد صحیح مثبت باشد.", "invalid.sketchbook.location": "مکان نامعتبر منبع طرح ها: {0}", "invalid.theme": "طرح زمینه موجود نیست", + "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", "language.log": "اگر سرور زبان آردوینو باید فایل های گزارش را در پوشه طرح ایجاد کند درست می باشد. در غیر این صورت، نادرست است. به طور پیش فرض نادرست است.", - "language.realTimeDiagnostics": "If true, the language server provides real-time diagnostics when typing in the editor. It's false by default.", + "language.realTimeDiagnostics": "اگر درست باشد، سرور زبان هنگام تایپ در ویرایشگر، عیب‌یابی بی‌درنگ ارائه می‌کند. به طور پیش فرض نادرست است.", "manualProxy": "پیکربندی دستی پروکسی", - "network": "نتورک", + "monitor": { + "dockPanel": "ناحیه ای از پوسته برنامه که ویجت _«{0} »_ در آن قرار دارد. یا «پایین» است یا در «راست». پیش‌فرض روی «{1}» است." + }, + "network": "شبکه", "newSketchbookLocation": "مکان جدید منبع طرح ها را مشخص کنید", + "noCliConfig": "تنظیمات CLI بارگیری نشد\n ", "noProxy": "بدون پروکسی", + "proxySettings": { + "hostname": "نام میزبان", + "password": "رمز عبور", + "port": "شماره پورت", + "username": "نام کاربری" + }, "showVerbose": "نمایش خروجی پرمخاطب در طول", + "sketch": { + "inoBlueprint": "مسیر سیستم فایل مطلق به فایل طرح اولیه «.ino». در صورت مشخص شدن، محتوای فایل طرح اولیه برای هر طرح جدید ایجاد شده توسط IDE استفاده خواهد شد. اسکچ ها با محتوای پیش فرض آردوینو در صورتی که مشخص نشده باشند تولید می شوند. فایل های طرح اولیه غیرقابل دسترسی نادیده گرفته می شوند. **برای اعمال این تنظیم به راه اندازی مجدد IDE نیاز است**." + }, "sketchbook.location": "مکان منبع طرح ها", "sketchbook.showAllFiles": "همه فایل‌های طرح را در داخل طرح نشان دهد درست است. به طور پیش فرض نادرست است.", - "survey.notification": "True if users should be notified if a survey is available. True by default.", "unofficialBoardSupport": "برای لیستی از آدرس های اینترنتی پشتیبانی هیئت مدیره غیررسمی کلیک کنید", - "upload": "آپلود", + "upload": "بارگذاری", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", "upload.verbose": "برای خروجی آپلود پرمخاطب درست است. به طور پیش فرض نادرست است.", - "verifyAfterUpload": "تائید کد بعد از آپلود", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", + "verifyAfterUpload": "تائید کد بعد از بارگذاری", "window.autoScale": "اگر رابط کاربری به طور خودکار با اندازه فونت تغییر کند درست است.", - "window.zoomLevel": "سطح بزرگنمایی پنجره را تنظیم کنید. اندازه اصلی 0 است و هر افزایش به بالاتر (مثلاً 1) یا پایین تر (مثلاً -1) نشان دهنده بزرگنمایی 20٪ بزرگتر یا کوچکتر است. همچنین می توانید اعداد اعشاری را وارد کنید تا سطح زوم را با دقت دقیق تر تنظیم کنید." + "window.zoomLevel": { + "deprecationMessage": "منسوخ شده است. به جای آن از «window.zoomLevel» استفاده کنید." + } + }, + "renameCloudSketch": { + "renameSketchTitle": "نام جدید برای طرح روی ابر\n " }, "replaceMsg": "آیا می خواهید نسخه موجود را با {0} جایگزین کنید؟", "selectZip": "یک فایل فشرده حاوی کتابخانه ای را که می خواهید اضافه کنید انتخاب کنید", "serial": { "autoscroll": "پیمایش خودکار", "carriageReturn": "رفتن به سر سطر", - "message": "پیام ( {0} + بزنید تا پیام به '{1}' بر '{2}' ارسال شود)", + "connecting": "برقراری ارتباط '{0}' روی '{1}'", + "message": "پیام (برای ارسال پیام به '' د{0}ر '' وارد شوید{1})", "newLine": "خط جدید", "newLineCarriageReturn": "هم NL و هم CR", "noLineEndings": "بدون پایان خط", "notConnected": "متصل نشد. برد و پورت را انتخاب کنید تا بطور خودکار متصل شود.", - "openSerialPlotter": "Serial Plotter", + "openSerialPlotter": "سریال رسام", "timestamp": "برچسب زمانی", "toggleTimestamp": "اتصال برچسب زمان" }, "sketch": { "archiveSketch": "آرشیو طرح", "cantOpen": "پوشه ای با نام \"{0}\" از قبل وجود دارد. طرح را نمی توان باز کرد", - "close": "آیا شما می خواهید این طرح را ببندید؟", - "compile": "Compiling sketch...", - "configureAndUpload": "پیکربندی و بارگذاری", + "compile": "تدوین طرح...", + "configureAndUpload": "پیکری بندی و بارگذاری", "createdArchive": "آرشیو {0} ایجاد شد.", "doneCompiling": "پایان کامپایل کردن", "doneUploading": "پایان بارگذاری", + "editInvalidSketchFolderLocationQuestion": "آیا می خواهید طرح را در مکان دیگری ذخیره کنید؟", + "editInvalidSketchFolderQuestion": "آیا می خواهید طرح را با نام دیگری ذخیره کنید؟", "exportBinary": "دریافت خروجی باینری کامپایل شده", + "invalidCloudSketchName": "نام باید با حرف، عدد یا زیرخط شروع شود و سپس حروف، اعداد، خط تیره، نقطه و زیرخط قرار گیرد. حداکثر طول 36 کاراکتر است.", + "invalidSketchFolderLocationDetails": "شما نمی توانید یک طرح را در یک پوشه درون خودش ذخیره کنید.", + "invalidSketchFolderLocationMessage": "مکان پوشه مربوط به طرح نامعتبر است: «{0}»", + "invalidSketchFolderNameMessage": "نام پوشه مربوط به طرح نامعتبر: «{0}»", + "invalidSketchName": "نام باید با حرف، عدد یا زیرخط شروع شود و سپس حروف، اعداد، خط تیره، نقطه و زیرخط قرار گیرد. حداکثر طول 63 کاراکتر است.", "moving": "جابجا کردن", "movingMsg": "فایل \"{0}\" باید داخل یک پوشه طرح به نام \"{1}\" باشد.\nاین پوشه را ایجاد کنید، فایل را منتقل کنید و ادامه دهید؟", - "new": "جدید", + "new": "طرح جدید", + "noTrailingPeriod": "نام فایل نیاد با نقطه تمام شود.", "openFolder": "بازکردن پوشه", "openRecent": "باز کردن آخرین ها", "openSketchInNewWindow": "باز کردن طرح در پنجره جدید.", + "reservedFilename": "«{0}» یک نام فایل رزرو شده است.", "saveFolderAs": "ذخیره پوشه طرح در ...", - "saveSketch": "Save your sketch to open it again later.", + "saveSketch": "طرح خود را ذخیره کنید تا بعداً دوباره باز شود.", "saveSketchAs": "ذخیره پوشه طرح در ...", "showFolder": "نمایش پوشه ظرح", "sketch": "طرح", + "sketchAlreadyContainsThisFileError": "طرح از قبل حاوی یک پرونده با نام '{0}' می باشد.", + "sketchAlreadyContainsThisFileMessage": "عدم موفقیت در ذخیره سازی \"{0}\" به عنوان \"{1}\". {2}", "sketchbook": "منبع طرح ها", "titleLocalSketchbook": "منبع طرح محلی", "titleSketchbook": "منبع طرح ها", - "upload": "آپلود", + "upload": "بارگذاری", "uploadUsingProgrammer": "بارگذاری با استفاده از پروگرامر", - "uploading": "Uploading...", + "uploading": "درحال بارگذاری...", "userFieldsNotFoundError": "عدم یافت شدن فیلد های کاربر برای برد متصل", "verify": "تائید", "verifyOrCompile": "تائید / کامپایل" }, - "survey": { - "answerSurvey": "Answer survey", - "dismissSurvey": "Don't show again", - "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." + "sketchbook": { + "newCloudSketch": "طرح جدید روی فضای ابری", + "newSketch": "طرح جدید" + }, + "theme": { + "currentThemeNotFound": "طرح زمینه انتخابی فعلی یافت نشد:«{0}». پس Arduino IDE یک طرح زمینه داخلی سازگار با طرح زمینه یافت نشده انتخاب کرده است.", + "dark": "تاریک", + "deprecated": "{0}(منسوخ شده)", + "hc": "تاریک با کنتراست بالا", + "hcLight": "روشن با کنتراست بالا", + "light": "روشن", + "user": "(کاربر) {0}" + }, + "title": { + "cloud": "ابری" + }, + "updateIndexes": { + "updateIndexes": "به روز رسانی شاخص ها", + "updateLibraryIndex": "به روز رسانی فهرست کتابخانه", + "updatePackageIndex": "به روز رسانی فهرست بسته" }, "upload": { "error": "خطا {0} : {1}" }, "userFields": { "cancel": "لغو", - "enterField": "Enter {0}", + "enterField": "ورود{0}", "upload": "بارگذاری" + }, + "validateSketch": { + "abortFixMessage": "طرح هنوز معتبر نیست. آیا می خواهید مشکلات باقی مانده را برطرف کنید؟ با کلیک بر روی «{0}» یک طرح جدید باز می شود.", + "abortFixTitle": "طرح نامعتبر است.", + "renameSketchFileMessage": "فایل طرح «{0}» قابل استفاده نیست. «{1}» آیا می خواهید اکنون نام فایل طرح را تغییر دهید؟", + "renameSketchFileTitle": "نام فایل طرح نامعتبر است", + "renameSketchFolderMessage": "طرح«{0}» قابل استفاده نیست. «{1}» برای خلاص شدن از این پیام، نام طرح را تغییر دهید. اکنون می خواهید نام طرح را تغییر دهید؟", + "renameSketchFolderTitle": "نام طرح بی‌اعتبار است" + }, + "versionWelcome": { + "cancelButton": "Maybe later", + "donateButton": "Donate now", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Welcome to a new version of the Arduino IDE!", + "titleWithVersion": "Welcome to the new Arduino IDE {0}!" + }, + "workspace": { + "alreadyExists": "'{0}' از قبل وجود دارد." } }, - "cloud": { - "GoToCloud": "برو به ابر" - }, "theia": { "core": { "cannotConnectBackend": "اتصال به سرور ناموفق بود.", @@ -400,12 +541,8 @@ "couldNotSave": "ابر طرح را ذخیره نکرد. لطفا کار ذخیره نشده خود را به ویرایشگر متن مورد علاقه خود کپی کنید، و آردوینو را دوباره راه اندازی کنید.", "daemonOffline": "CLI آفلاین پس زمینه", "offline": "آفلاین", - "quitTitle": "Are you sure you want to quit?" - }, - "debug": { - "start": "شروع...", - "startError": "یک خطا در آغاز جلسه رفع خطا بود، تاریخچه بقیه جزئیات را بررسی کنید.", - "typeNotSupported": "جلسه رفع خطا \"{0}\" پشتیبانی نمی شود." + "offlineText": "آفلاین", + "quitTitle": "آیا مطمئن هستید که می خواهید خارج شوید؟" }, "editor": { "unsavedTitle": "ذخیره نشده – {0}" @@ -415,10 +552,10 @@ "expand": "باز کردن." }, "workspace": { - "deleteCurrentSketch": "آیا می خواهید طرح کنونی را حذف کنید؟", + "deleteCloudSketch": "طرح ابری '{0}' برای همیشه از سرورهای آردوینو و حافظه پنهان محلی حذف خواهد شد. این عمل برگشت ناپذیر است. آیا می خواهید طرح فعلی را حذف کنید؟", + "deleteCurrentSketch": "طرح '{0}' برای همیشه حذف خواهد شد. این عمل برگشت ناپذیر است. آیا می خواهید طرح فعلی را حذف کنید؟", "fileNewName": "نام برای فایل جدید", "invalidExtension": "افزونه {0} نادرست است.", - "invalidFilename": "عدم وجود نام برای فایل", "newFileName": "نام جدید برای فایل" } } diff --git a/i18n/fil.json b/i18n/fil.json index 60f0114b1..266f8846d 100644 --- a/i18n/fil.json +++ b/i18n/fil.json @@ -1,38 +1,51 @@ { "arduino": { "about": { - "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}{4} [{5}]\n\n{6}", + "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "About {0}" }, + "account": { + "goToCloudEditor": "Go to Cloud Editor", + "goToIoTCloud": "Go to IoT Cloud", + "goToProfile": "Go to Profile", + "menuTitle": "Arduino Cloud" + }, "board": { "board": "Board{0}", "boardConfigDialogTitle": "Select Other Board and Port", + "boardDataReloaded": "Board data reloaded.", "boardInfo": "Board Info", + "boards": "boards", "configDialog1": "Select both a Board and a Port if you want to upload a sketch.", "configDialog2": "If you only select a Board you will be able to compile, but not to upload your sketch.", "couldNotFindPreviouslySelected": "Could not find previously selected board '{0}' in installed platform '{1}'. Please manually reselect the board you want to use. Do you want to reselect it now?", - "disconnected": "Disconnected", + "editBoardsConfig": "Edit Board and Port...", "getBoardInfo": "Get Board Info", "inSketchbook": " (in Sketchbook)", "installNow": "The \"{0} {1}\" core has to be installed for the currently selected \"{2}\" board. Do you want to install it now?", - "noFQBN": "The FQBN is not available for the selected board \"{0}\". Do you have the corresponding core installed?", + "noBoardsFound": "No boards found for \"{0}\"", + "noNativeSerialPort": "Native serial port, can't obtain info.", "noPortsDiscovered": "No ports discovered", - "noPortsSelected": "No ports selected for board: '{0}'.", - "noneSelected": "No boards selected.", + "nonSerialPort": "Non-serial port, can't obtain info.", "openBoardsConfig": "Select other board and port…", - "platformMissing": "The platform for the selected '{0}' board is not installed.", "pleasePickBoard": "Please pick a board connected to the port you have selected.", "port": "Port{0}", - "portLabel": "Port: {0}", + "ports": "ports", "programmer": "Programmer", + "reloadBoardData": "Reload Board Data", "reselectLater": "Reselect later", + "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "Search board", "selectBoard": "Pumili ng board", - "selectBoardForInfo": "Please select a board to obtain board info.", + "selectBoardToReload": "Please select a board first.", "selectPortForInfo": "Please select a port to obtain board info.", "showAllAvailablePorts": "Shows all available ports when enabled", + "showAllPorts": "Show all ports", "succesfullyInstalledPlatform": "Successfully installed platform {0}:{1}", - "succesfullyUninstalledPlatform": "Successfully uninstalled platform {0}:{1}" + "succesfullyUninstalledPlatform": "Successfully uninstalled platform {0}:{1}", + "typeOfPorts": "{0} ports", + "unconfirmedBoard": "Unconfirmed board", + "unknownBoard": "Unknown board" }, "boardsManager": "Boards Manager", "boardsType": { @@ -77,14 +90,15 @@ "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" }, "cloud": { - "account": "Account", "chooseSketchVisibility": "Choose visibility of your Sketch:", + "cloudSketchbook": "Cloud Sketchbook", "connected": "Connected", "continue": "Continue", - "donePulling": "Done pulling ‘{0}’.", - "donePushing": "Done pushing ‘{0}’.", + "donePulling": "Done pulling '{0}'.", + "donePushing": "Done pushing '{0}'.", "embed": "Embed:", "emptySketchbook": "Your Sketchbook is empty", + "goToCloud": "Go to Cloud", "learnMore": "Learn more", "link": "Link:", "notYetPulled": "Cannot push to Cloud. It is not yet pulled.", @@ -102,10 +116,9 @@ "pushSketch": "Push Sketch", "pushSketchMsg": "This is a Public Sketch. Before pushing, make sure any sensitive information is defined in arduino_secrets.h files. You can make a Sketch private from the Share panel.", "remote": "Remote", - "remoteSketchbook": "Remote Sketchbook", "share": "Share...", "shareSketch": "Share Sketch", - "showHideRemoveSketchbook": "Show/Hide Remote Sketchbook", + "showHideSketchbook": "Show/Hide Cloud Sketchbook", "signIn": "SIGN IN", "signInToCloud": "Sign in to Arduino Cloud", "signOut": "Sign Out", @@ -113,12 +126,23 @@ "syncEditSketches": "Sync and edit your Arduino Cloud Sketches", "visitArduinoCloud": "Visit Arduino Cloud to create Cloud Sketches." }, + "cloudSketch": { + "alreadyExists": "Cloud sketch '{0}' already exists.", + "creating": "Creating cloud sketch '{0}'...", + "new": "New Cloud Sketch", + "notFound": "Could not pull the cloud sketch '{0}'. It does not exist.", + "pulling": "Synchronizing sketchbook, pulling '{0}'...", + "pushing": "Synchronizing sketchbook, pushing '{0}'...", + "renaming": "Renaming cloud sketch from '{0}' to '{1}'...", + "synchronizingSketchbook": "Synchronizing sketchbook..." + }, "common": { "all": "All", "contributed": "Contributed", "installManually": "Install Manually", "later": "Mamaya", "noBoardSelected": "Walang board na pinili. ", + "noSketchOpened": "No sketch opened", "notConnected": "[hindi konektado] ", "offlineIndicator": "Mukhang ikaw ay offline. Kung walang internet, maaaring hindi madownload ng Arduino CLI ang mga kakailanganin nitong resources at mag-malfunction. Kumonekta sa internet at i-restart ang application. ", "oldFormat": "Ang '{0}' ay gumagamit pa ng lumang `.pde` format. Gusto mo bang gamitin ang bagong `.ino` extension?", @@ -126,11 +150,13 @@ "processing": "Pinoproseso", "recommended": "Recommended", "retired": "Retired", + "selectManually": "Select Manually", "selectedOn": "on {0}", "serialMonitor": "Serial Monitor", "type": "Type", "unknown": "Hindi alam", - "updateable": "Updatable" + "updateable": "Updatable", + "userAbort": "User abort" }, "compile": { "error": "Compilation error: {0}" @@ -138,22 +164,49 @@ "component": { "boardsIncluded": "Boards included in this package:", "by": "by", + "clickToOpen": "Click to open in browser: {0}", "filterSearch": "Filter your search...", - "install": "INSTALL", + "install": "Install", + "installLatest": "Install Latest", + "installVersion": "Install {0}", + "installed": "{0} installed", "moreInfo": "More info", + "otherVersions": "Other Versions", + "remove": "Remove", + "title": "{0} by {1}", "uninstall": "Uninstall", "uninstallMsg": "Do you want to uninstall {0}?", - "version": "Version {0}" + "update": "Update" + }, + "configuration": { + "cli": { + "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" + } + }, + "connectionStatus": { + "connectionLost": "Connection lost. Cloud sketch actions and updates won't be available." }, "contributions": { "addFile": "Add File", "fileAdded": "One file added to the sketch.", + "plotter": { + "couldNotOpen": "Couldn't open serial plotter" + }, "replaceTitle": "Replace" }, + "core": { + "compilerWarnings": { + "all": "All", + "default": "Default", + "more": "More", + "none": "None" + } + }, "coreContribution": { "copyError": "Copy error messages", "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." }, + "createCloudCopy": "Push Sketch to Cloud", "daemon": { "restart": "Restart Daemon", "start": "Start Daemon", @@ -162,8 +215,15 @@ "debug": { "debugWithMessage": "Debug - {0}", "debuggingNotSupported": "Ang debugging ay hindi suportado ng '{0}'", + "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "Ang platform ay hindi naka-install para sa '{0}'", - "optimizeForDebugging": "Pinahusay para sa Debugging" + "optimizeForDebugging": "Pinahusay para sa Debugging", + "sketchIsNotCompiled": "Sketch '{0}' must be verified before starting a debug session. Please verify the sketch and start debugging again. Do you want to verify the sketch now?" + }, + "developer": { + "clearBoardList": "Clear the Board List History", + "clearBoardsConfig": "Clear the Board and Port Selection", + "dumpBoardList": "Dump the Board List" }, "dialog": { "dontAskAgain": "Don't ask again" @@ -180,10 +240,6 @@ "previousError": "Previous Error", "revealError": "Reveal Error" }, - "electron": { - "couldNotSave": "Could not save the sketch. Please copy your unsaved work into your favorite text editor, and restart the IDE.", - "unsavedChanges": "Any unsaved changes will not be saved." - }, "examples": { "builtInExamples": "Built-in examples", "couldNotInitializeExamples": "Could not initialize built-in examples.", @@ -198,10 +254,10 @@ "install": "Install", "installingFirmware": "Installing firmware.", "overwriteSketch": "Installation will overwrite the Sketch on the board.", - "selectBoard": "Select Board", + "selectBoard": "Pumili ng board", "selectVersion": "Select firmware version", "successfullyInstalled": "Firmware successfully installed.", - "updater": "WiFi101 / WiFiNINA Firmware Updater" + "updater": "Firmware Updater" }, "help": { "environment": "Environment", @@ -219,6 +275,9 @@ "checkForUpdates": "Check for Arduino IDE Updates", "closeAndInstallButton": "Close and Install", "closeToInstallNotice": "Close the software and install the update on your machine.", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", "downloadButton": "Download", "downloadingNotice": "Downloading the latest version of the Arduino IDE.", "errorCheckingForUpdates": "Error while checking for Arduino IDE updates.\n{0}", @@ -232,16 +291,20 @@ "updateAvailable": "Update Available", "versionDownloaded": "Arduino IDE {0} has been downloaded." }, + "installable": { + "libraryInstallFailed": "Failed to install library: '{0}{1}'.", + "platformInstallFailed": "Failed to install platform: '{0}{1}'." + }, "library": { "addZip": "Add .ZIP Library...", "arduinoLibraries": "Arduino libraries", "contributedLibraries": "Contributed libraries", - "dependenciesForLibrary": "Dependencies for library {0}:{1}", "include": "Include Library", - "installAll": "Install all", + "installAll": "Install All", + "installLibraryDependencies": "Install library dependencies", "installMissingDependencies": "Would you like to install all the missing dependencies?", "installOneMissingDependency": "Would you like to install the missing dependency?", - "installOnly": "Install {0} only", + "installWithoutDependencies": "Install without dependencies", "installedSuccessfully": "Successfully installed library {0}:{1}", "libraryAlreadyExists": "A library already exists. Do you want to overwrite it?", "manageLibraries": "Manage Libraries...", @@ -278,9 +341,23 @@ "tools": "Mga Tools" }, "monitor": { + "alreadyConnectedError": "Could not connect to {0} {1} port. Already connected.", + "baudRate": "{0} baud", + "connectionFailedError": "Could not connect to {0} {1} port.", + "connectionFailedErrorWithDetails": "{0} Could not connect to {1} {2} port.", + "connectionTimeout": "Timeout. The IDE has not received the 'success' message from the monitor after successfully connecting to it", + "missingConfigurationError": "Could not connect to {0} {1} port. The monitor configuration is missing.", + "notConnectedError": "Not connected to {0} {1} port.", "unableToCloseWebSocket": "Unable to close websocket", "unableToConnectToWebSocket": "Unable to connect to websocket" }, + "newCloudSketch": { + "newSketchTitle": "Name of the new Cloud Sketch" + }, + "portProtocol": { + "network": "Network", + "serial": "Serial" + }, "preferences": { "additionalManagerURLs": "Additional Boards Manager URLs", "auth.audience": "The OAuth2 audience.", @@ -297,6 +374,7 @@ "cloud.pull.warn": "True if users should be warned before pulling a cloud sketch. Defaults to true.", "cloud.push.warn": "True if users should be warned before pushing a cloud sketch. Defaults to true.", "cloud.pushpublic.warn": "True if users should be warned before pushing a public sketch to the cloud. Defaults to true.", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", "cloud.sketchSyncEndpoint": "The endpoint used to push and pull sketches from a backend. By default it points to Arduino Cloud API.", "compile": "compile", "compile.experimental": "True if the IDE should handle multiple compiler errors. False by default", @@ -314,29 +392,50 @@ "invalid.editorFontSize": "Invalid editor font size. It must be a positive integer.", "invalid.sketchbook.location": "Invalid sketchbook location: {0}", "invalid.theme": "Invalid theme.", + "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", "language.log": "True, kung dapat na gumawa ng log files ang Arduino Language Server sa mismong sketch folder. False naman kung hindi. Ito ay false, by default. ", "language.realTimeDiagnostics": "If true, the language server provides real-time diagnostics when typing in the editor. It's false by default.", "manualProxy": "Manual proxy configuration", + "monitor": { + "dockPanel": "The area of the application shell where the _{0}_ widget will reside. It is either \"bottom\" or \"right\". It defaults to \"{1}\"." + }, "network": "Network", "newSketchbookLocation": "Select new sketchbook location", + "noCliConfig": "Could not load the CLI configuration", "noProxy": "No proxy", + "proxySettings": { + "hostname": "Host name", + "password": "Password", + "port": "Port number", + "username": "Username" + }, "showVerbose": "Show verbose output during", + "sketch": { + "inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect." + }, "sketchbook.location": "Sketchbook location", "sketchbook.showAllFiles": "True para ipakita lahat ng sketch files sa loob ng isang sketch. Ito ay false by default.", - "survey.notification": "True if users should be notified if a survey is available. True by default.", "unofficialBoardSupport": "Click for a list of unofficial board support URLs", "upload": "upload", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", "upload.verbose": "True para sa verbose upload output. Ito ay naka-false by default.", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "Verify code after upload", "window.autoScale": "True kung nais mong awtomatikong mag-adjust ang scaling ng user interface depende sa laki ng font o letra sa screen.", - "window.zoomLevel": "Baguhin ang lebel ng pagka-zoom ng window. Ang orihinal na laki ay 0 at bawat dagdag (halimbawa +1) o bawas (halimbawa -1) ay katumbas ng 20% na pagtaas o pagbaba sa zoom. Pwede kang mag-enter ng decimals para mas makontrol mo ang pag-adjust ng lebel ng zoom. " + "window.zoomLevel": { + "deprecationMessage": "Deprecated. Use 'window.zoomLevel' instead." + } + }, + "renameCloudSketch": { + "renameSketchTitle": "New name of the Cloud Sketch" }, "replaceMsg": "Replace the existing version of {0}?", "selectZip": "Select a zip file containing the library you'd like to add", "serial": { "autoscroll": "Autoscroll", "carriageReturn": "Carriage Return", - "message": "Message ({0} + Enter to send message to '{1}' on '{2}')", + "connecting": "Connecting to '{0}' on '{1}'...", + "message": "Message (Enter to send message to '{0}' on '{1}')", "newLine": "New Line", "newLineCarriageReturn": "Both NL & CR", "noLineEndings": "No Line Ending", @@ -348,24 +447,34 @@ "sketch": { "archiveSketch": "Archive Sketch", "cantOpen": "A folder named \"{0}\" already exists. Can't open sketch.", - "close": "Are you sure you want to close the sketch?", "compile": "Compiling sketch...", - "configureAndUpload": "Configure And Upload", + "configureAndUpload": "Configure and Upload", "createdArchive": "Created archive '{0}'.", "doneCompiling": "Done compiling.", "doneUploading": "Done uploading.", + "editInvalidSketchFolderLocationQuestion": "Do you want to try saving the sketch to a different location?", + "editInvalidSketchFolderQuestion": "Do you want to try saving the sketch with a different name?", "exportBinary": "Export Compiled Binary", + "invalidCloudSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", + "invalidSketchFolderLocationDetails": "You cannot save a sketch into a folder inside itself.", + "invalidSketchFolderLocationMessage": "Invalid sketch folder location: '{0}'", + "invalidSketchFolderNameMessage": "Invalid sketch folder name: '{0}'", + "invalidSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", "moving": "Moving", "movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?", - "new": "New", + "new": "New Sketch", + "noTrailingPeriod": "A filename cannot end with a dot", "openFolder": "Open Folder", "openRecent": "Open Recent", "openSketchInNewWindow": "Open Sketch in New Window", + "reservedFilename": "'{0}' is a reserved filename.", "saveFolderAs": "Save sketch folder as...", "saveSketch": "Save your sketch to open it again later.", "saveSketchAs": "Save sketch folder as...", "showFolder": "Show Sketch Folder", "sketch": "Sketch", + "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", + "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", "sketchbook": "Sketchbook", "titleLocalSketchbook": "Local Sketchbook", "titleSketchbook": "Sketchbook", @@ -376,10 +485,26 @@ "verify": "Verify", "verifyOrCompile": "Verify/Compile" }, - "survey": { - "answerSurvey": "Answer survey", - "dismissSurvey": "Don't show again", - "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." + "sketchbook": { + "newCloudSketch": "New Cloud Sketch", + "newSketch": "New Sketch" + }, + "theme": { + "currentThemeNotFound": "Could not find the currently selected theme: {0}. Arduino IDE has picked a built-in theme compatible with the missing one.", + "dark": "Dark", + "deprecated": "{0} (deprecated)", + "hc": "Dark High Contrast", + "hcLight": "Light High Contrast", + "light": "Light", + "user": "{0} (user)" + }, + "title": { + "cloud": "Cloud" + }, + "updateIndexes": { + "updateIndexes": "Update Indexes", + "updateLibraryIndex": "Update Library Index", + "updatePackageIndex": "Update Package Index" }, "upload": { "error": "{0} error: {1}" @@ -388,11 +513,27 @@ "cancel": "Cancel", "enterField": "Enter {0}", "upload": "Upload" + }, + "validateSketch": { + "abortFixMessage": "The sketch is still invalid. Do you want to fix the remaining problems? By clicking '{0}', a new sketch will open.", + "abortFixTitle": "Invalid sketch", + "renameSketchFileMessage": "The sketch file '{0}' cannot be used. {1} Do you want to rename the sketch file now?", + "renameSketchFileTitle": "Invalid sketch filename", + "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", + "renameSketchFolderTitle": "Invalid sketch name" + }, + "versionWelcome": { + "cancelButton": "Maybe later", + "donateButton": "Donate now", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Welcome to a new version of the Arduino IDE!", + "titleWithVersion": "Welcome to the new Arduino IDE {0}!" + }, + "workspace": { + "alreadyExists": "'{0}' already exists." } }, - "cloud": { - "GoToCloud": "GO TO CLOUD" - }, "theia": { "core": { "cannotConnectBackend": "Cannot connect to the backend.", @@ -400,13 +541,9 @@ "couldNotSave": "Could not save the sketch. Please copy your unsaved work into your favorite text editor, and restart the IDE.", "daemonOffline": "CLI Daemon Offline", "offline": "Offline", + "offlineText": "Offline", "quitTitle": "Are you sure you want to quit?" }, - "debug": { - "start": "Start...", - "startError": "There was an error starting the debug session, check the logs for more details.", - "typeNotSupported": "The debug session type \"{0}\" is not supported." - }, "editor": { "unsavedTitle": "Unsaved – {0}" }, @@ -415,10 +552,10 @@ "expand": "Expand" }, "workspace": { - "deleteCurrentSketch": "Do you want to delete the current sketch?", + "deleteCloudSketch": "The cloud sketch '{0}' will be permanently deleted from the Arduino servers and the local caches. This action is irreversible. Do you want to delete the current sketch?", + "deleteCurrentSketch": "The sketch '{0}' will be permanently deleted. This action is irreversible. Do you want to delete the current sketch?", "fileNewName": "Name for new file", "invalidExtension": ".{0} is not a valid extension", - "invalidFilename": "Invalid filename.", "newFileName": "New name for file" } } diff --git a/i18n/fr.json b/i18n/fr.json index 1585cb01c..916a94f4e 100644 --- a/i18n/fr.json +++ b/i18n/fr.json @@ -1,42 +1,55 @@ { "arduino": { "about": { - "detail": "Version: {0}Date: {1}{2} Version CLI: {3}{4} [{5}]{6}", + "detail": "Version : {0}\nDate : {1}{2}\nVersion du CLI : {3}\n\n{4}", "label": "A propos de {0}" }, + "account": { + "goToCloudEditor": "Aller à l'éditeur du cloud", + "goToIoTCloud": "Go to IoT Cloud", + "goToProfile": "Aller au profil", + "menuTitle": "Arduino Cloud" + }, "board": { "board": "Carte{0}", - "boardConfigDialogTitle": "Select Other Board and Port", + "boardConfigDialogTitle": "Sélectionner une autre carte et un autre port", + "boardDataReloaded": "Données de la carte rechargées.", "boardInfo": "Information de la carte", + "boards": "cartes", "configDialog1": "Sélectionnez une carte et un port si vous souhaitez téléverser un croquis.", "configDialog2": "Si vous sélectionnez seulement une carte, vous pourrez compiler votre croquis, mais pas le téléverser.", "couldNotFindPreviouslySelected": "Impossible de trouver la carte précédente sélectionnée \"{0}\" dans les plateformes installées \"{1}\". Merci de re-sélectionner manuellement la carte que vous souhaitez utiliser. Souhaitez vous la re-sélectionner maintenant ?", - "disconnected": "Déconnecté", + "editBoardsConfig": "Modifier la carte et le port...", "getBoardInfo": "Obtenir les informations sur la carte", "inSketchbook": "(dans le Croquis)", "installNow": "Le \"{0} {1}\" core doit être installé pour la carte sélectionnée \"{2}\". Souhaitez vous l'installer maintenant ?", - "noFQBN": "Le FQBN n'est pas disponible pour la carte sélectionnée \"{0}\". Avez installé le cœur correspondant ?", - "noPortsDiscovered": "No ports discovered", - "noPortsSelected": "Aucun porte sélectionné pour la carte : '{0}'", - "noneSelected": "Aucune carte sélectionnée.", + "noBoardsFound": "Aucunes cartes trouvées pour \"{0}\"", + "noNativeSerialPort": "Native serial port, can't obtain info.", + "noPortsDiscovered": "Aucun ports découverts", + "nonSerialPort": "Non-serial port, can't obtain info.", "openBoardsConfig": "Sélectionner une autre carte et un autre port ...", - "platformMissing": "La plateforme pour la carte '{0}' sélectionnée n'est pas installée.", "pleasePickBoard": "Merci de sélectionner une carte connecté au port que vous avez sélectionné.", "port": "Port{0}", - "portLabel": "Port : {0}", + "ports": "ports", "programmer": "Programmeur", + "reloadBoardData": "Recharger les données de la carte", "reselectLater": "Re-sélectionner plus tard", - "searchBoard": "Search board", + "revertBoardsConfig": "Utiliser '{0}' découvert sur '{1}'", + "searchBoard": "Rechercher une carte", "selectBoard": "Selectionner une carte", - "selectBoardForInfo": "Merci de choisir une carte pour obtenir ses informations.", + "selectBoardToReload": "Merci de sélectionner une carte d’abord.", "selectPortForInfo": "Merci de choisir un port pour obtenir des informations sur la carte.", "showAllAvailablePorts": "Affiche les ports disponibles quand activer.", + "showAllPorts": "Afficher tous les ports", "succesfullyInstalledPlatform": "Plateforme installé avec succès {0}:{1}", - "succesfullyUninstalledPlatform": "Plateforme désinstallée avec succès {0}:{1}" + "succesfullyUninstalledPlatform": "Plateforme désinstallée avec succès {0}:{1}", + "typeOfPorts": "{0} ports", + "unconfirmedBoard": "Carte non confirmée", + "unknownBoard": "Carte inconnue" }, - "boardsManager": "Gestionnaire de carte", + "boardsManager": "Gestionnaire de cartes", "boardsType": { - "arduinoCertified": "Arduino Certified" + "arduinoCertified": "Arduino certifié" }, "bootloader": { "burnBootloader": "Graver la séquence d'initialisation", @@ -64,27 +77,28 @@ "uploadingCertificates": "Transfert des certificats" }, "checkForUpdates": { - "checkForUpdates": "Check for Arduino Updates", - "installAll": "Install All", - "noUpdates": "There are no recent updates available.", - "promptUpdateBoards": "Updates are available for some of your boards.", - "promptUpdateLibraries": "Updates are available for some of your libraries.", - "updatingBoards": "Updating boards...", - "updatingLibraries": "Updating libraries..." + "checkForUpdates": "Vérifier les mises à jour d’Arduino", + "installAll": "Tout installer", + "noUpdates": "Il n'y a pas de mises à jour récentes disponibles.", + "promptUpdateBoards": "Des mises à jour sont disponibles pour certaines de vos cartes.", + "promptUpdateLibraries": "Des mises à jour sont disponibles pour certaines de vos bibliothèques.", + "updatingBoards": "Mise à jour des cartes...", + "updatingLibraries": "Mise à jour des bibliothèques..." }, "cli-error-parser": { - "keyboardError": "'Keyboard' not found. Does your sketch include the line '#include <Keyboard.h>'?", - "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" + "keyboardError": "Clavier non trouvé. Votre croquis inclut-il la ligne '#include <Keyboard.h>' ?", + "mouseError": "'Mouse' non trouvé. Votre croquis inclut-il la ligne '#include <Mouse.h>' ?" }, "cloud": { - "account": "Compte", "chooseSketchVisibility": "Choisissez la visibilité du croquis :", + "cloudSketchbook": "Carnet de Croquis Cloud", "connected": "Connecté", "continue": "Continuer", - "donePulling": "Récupération de '{0}' terminée.", - "donePushing": "Téléchargement terminé pour '{0}'", + "donePulling": "Done pulling '{0}'.", + "donePushing": "Done pushing '{0}'.", "embed": "Embarqué : ", "emptySketchbook": "Votre carnet de croquis est vide", + "goToCloud": "Aller au cloud", "learnMore": "En savoir plus", "link": "Lien :", "notYetPulled": "Impossible de push sur le Cloud. Rien n'a été pull jusque la.", @@ -102,10 +116,9 @@ "pushSketch": "Push le croquis", "pushSketchMsg": "Ceci est un croquis public. Avant de le publier, assurez-vous que les informations sensibles sont bien définies dans le fichier arduino_secrets.h. Vous pouvez rendre priver le croquis à partir du panneau de Partage.", "remote": "A distance", - "remoteSketchbook": "Carnet de croquis à distance", "share": "Partager...", "shareSketch": "Partager le croquis", - "showHideRemoveSketchbook": "Montrer / Cacher le carnet de croquis distant.", + "showHideSketchbook": "Montrer / Cacher le carnet de croquis du cloud.", "signIn": "Se connecter", "signInToCloud": "Se connecter à Arduino Cloud", "signOut": "Deconnexion", @@ -113,47 +126,87 @@ "syncEditSketches": "Synchroniser et éditer vos croquis Arduino Cloud.", "visitArduinoCloud": "Visitez Arduino Cloud pour créer des croquis sut le cloud." }, + "cloudSketch": { + "alreadyExists": "Cloud sketch '{0}' already exists.", + "creating": "Creating cloud sketch '{0}'...", + "new": "New Cloud Sketch", + "notFound": "Could not pull the cloud sketch '{0}'. It does not exist.", + "pulling": "Synchronizing sketchbook, pulling '{0}'...", + "pushing": "Synchronizing sketchbook, pushing '{0}'...", + "renaming": "Renaming cloud sketch from '{0}' to '{1}'...", + "synchronizingSketchbook": "Synchroniser le carnet de croquis..." + }, "common": { - "all": "All", + "all": "Tout", "contributed": "Contributed", "installManually": "Installer manuellement.", "later": "Plus tard", "noBoardSelected": "Aucune carte sélectionnée.", + "noSketchOpened": "Aucun croquis ouvert", "notConnected": "[hors ligne]", "offlineIndicator": "Il semblerait que vous êtes déconnecté. Sans connexion internet la CLI d'Arduino pourrait ne pas être en mesure de télécharger les resources requises, ce qui pourrait provoquer des dysfonctionnements. Merci de vous connecter à Internet et de redémarrer l'application.", "oldFormat": "Le '{0}' utilise toujours l'ancien format `.pde`. Souhaitez-vous utiliser le nouveau format `.ino`?", - "partner": "Partner", + "partner": "Partenaire", "processing": "Traitement en cours", - "recommended": "Recommended", - "retired": "Retired", + "recommended": "Recommandé", + "retired": "Retiré", + "selectManually": "Sélectionner manuellement", "selectedOn": "sur {0}", "serialMonitor": "Moniteur série", "type": "Type", "unknown": "Inconnu", - "updateable": "Updatable" + "updateable": "Pouvant être mis à jour", + "userAbort": "Abandon par l'utilisateur" }, "compile": { "error": "Erreur de compilation : {0}" }, "component": { - "boardsIncluded": "Boards included in this package:", + "boardsIncluded": "Cartes incluses dans ce paquet :", "by": "par", + "clickToOpen": "Cliquez pour ouvrir dans le navigateur : {0}", "filterSearch": "Filtrez votre recherche...", - "install": "INSTALLER", + "install": "Installer", + "installLatest": "Installer la dernière", + "installVersion": "Installer {0}", + "installed": "{0} installé", "moreInfo": "Plus d'information", + "otherVersions": "Autres versions", + "remove": "Supprimer ", + "title": "{0} par {1}", "uninstall": "Désinstaller", "uninstallMsg": "Voulez vous désinstaller {0}?", - "version": "Version {0}" + "update": "Mettre à jour" + }, + "configuration": { + "cli": { + "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" + } + }, + "connectionStatus": { + "connectionLost": "Connection lost. Cloud sketch actions and updates won't be available." }, "contributions": { "addFile": "Ajouter un fichier", "fileAdded": "Un fichier a été ajouté au croquis", + "plotter": { + "couldNotOpen": "Couldn't open serial plotter" + }, "replaceTitle": "Remplacer" }, + "core": { + "compilerWarnings": { + "all": "Tout", + "default": "Par défaut", + "more": "Plus", + "none": "Aucun" + } + }, "coreContribution": { "copyError": "Copier les messages d'erreur", - "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." + "noBoardSelected": "Aucune carte sélectionnée. Merci de sélectionner votre carte Arduino dans le menu Outils > Carte." }, + "createCloudCopy": "Push Sketch to Cloud", "daemon": { "restart": "Redémarrer Daemon", "start": "Démarrer Daemon", @@ -162,8 +215,15 @@ "debug": { "debugWithMessage": "Débogage - {0}", "debuggingNotSupported": "Le débogage n'est pas supporté pour '{0}'", + "getDebugInfo": "Obtenir des informations de débogage...", "noPlatformInstalledFor": "La plateforme n'est pas installée pour '{0}'", - "optimizeForDebugging": "Optimisé pour le déboggage." + "optimizeForDebugging": "Optimisé pour le déboggage.", + "sketchIsNotCompiled": "Sketch '{0}' must be verified before starting a debug session. Please verify the sketch and start debugging again. Do you want to verify the sketch now?" + }, + "developer": { + "clearBoardList": "Clear the Board List History", + "clearBoardsConfig": "Effacer la carte et la sélection du port ", + "dumpBoardList": "Dump the Board List" }, "dialog": { "dontAskAgain": "Ne plus demander." @@ -180,10 +240,6 @@ "previousError": "Erreur précédente", "revealError": "Reveal Error" }, - "electron": { - "couldNotSave": "Impossible d'enregistrer le croquis. Veuillez copier votre travail non enregistré dans votre éditeur de texte favori et redémarrer l'IDE.", - "unsavedChanges": "Les modifications non enregistrées seront perdues." - }, "examples": { "builtInExamples": "Exemples inclus", "couldNotInitializeExamples": "Impossible d'initialiser les exemples inclus.", @@ -201,7 +257,7 @@ "selectBoard": "Selectionner une carte", "selectVersion": "Choisir la version du firmware", "successfullyInstalled": "Firmware installé correctement.", - "updater": "Mise à jour du Firmware WiFi101 / WiFiNINA" + "updater": "Firmware Updater" }, "help": { "environment": "Environnement", @@ -219,6 +275,9 @@ "checkForUpdates": "Check for Arduino IDE Updates", "closeAndInstallButton": "Fermer et installer", "closeToInstallNotice": "Fermez le logiciel et installez la mise à jour sur votre machine.", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "Faites un don pour nous soutenir", + "donateText": "Open source is love, {0}", "downloadButton": "Télécharger", "downloadingNotice": "Téléchargement de la dernière version de l'IDE Arduino.", "errorCheckingForUpdates": "Erreur lors de la vérification de la mise à jour de l'IDE Arduino.\n{0}", @@ -232,16 +291,20 @@ "updateAvailable": "Mise à jour disponible", "versionDownloaded": "L'IDE Arduino {0} a été téléchargé." }, + "installable": { + "libraryInstallFailed": "Failed to install library: '{0}{1}'.", + "platformInstallFailed": "Failed to install platform: '{0}{1}'." + }, "library": { "addZip": "Ajouter la bibliothèque .ZIP...", "arduinoLibraries": "Bibliothèques Arduino", "contributedLibraries": "Bibliothèques tierce-partie", - "dependenciesForLibrary": "Ressources liées pour la libraire {0}:{1}", "include": "Importer une bibliothèque", "installAll": "Tout installer", + "installLibraryDependencies": "Installer les dépendances de la bibliothèque", "installMissingDependencies": "Souhaitez vous installer toutes les ressources liées manquantes ?", "installOneMissingDependency": "Souhaitez-vous installer la ressource liée manquante?", - "installOnly": "Installer {0} seulement", + "installWithoutDependencies": "Installer sans les dépendances", "installedSuccessfully": "Librairie installée avec succès {0}:{1}", "libraryAlreadyExists": "Cette librairie existe déjà. Souhaitez-vous l'écraser ?", "manageLibraries": "Gérer les bibliothèques...", @@ -255,22 +318,22 @@ "zipLibrary": "Bibliothèque" }, "librarySearchProperty": { - "topic": "Topic" + "topic": "Sujet" }, "libraryTopic": { "communication": "Communication", - "dataProcessing": "Data Processing", - "dataStorage": "Data Storage", - "deviceControl": "Device Control", - "display": "Display", - "other": "Other", - "sensors": "Sensors", - "signalInputOutput": "Signal Input/Output", - "timing": "Timing", - "uncategorized": "Uncategorized" + "dataProcessing": "Traitement de données", + "dataStorage": "Stockage de données", + "deviceControl": "Contrôle d'appareil", + "display": "Affichage", + "other": "Autre", + "sensors": "Capteurs", + "signalInputOutput": "Signaux entrants/sortants", + "timing": "Synchronisation", + "uncategorized": "Non classé" }, "libraryType": { - "installed": "Installed" + "installed": "Installé" }, "menu": { "advanced": "Avancé", @@ -278,9 +341,23 @@ "tools": "Outils" }, "monitor": { + "alreadyConnectedError": "Could not connect to {0} {1} port. Already connected.", + "baudRate": "{0} baud", + "connectionFailedError": "Impossible de se connecter au ports {0} {1}.", + "connectionFailedErrorWithDetails": "{0} Could not connect to {1} {2} port.", + "connectionTimeout": "Délai d’attente dépassé. L’IDE n’a pas reçu le message de réussite du moniteur après s’être connecté avec succès", + "missingConfigurationError": "Could not connect to {0} {1} port. The monitor configuration is missing.", + "notConnectedError": "Not connected to {0} {1} port.", "unableToCloseWebSocket": "Impossible de fermer le web socket", "unableToConnectToWebSocket": "Impossible de se connecter au web socket" }, + "newCloudSketch": { + "newSketchTitle": "Non du nouveau croquis Cloud" + }, + "portProtocol": { + "network": "Réseau", + "serial": "Série" + }, "preferences": { "additionalManagerURLs": "URL de gestionnaire de cartes supplémentaires", "auth.audience": "L'audience OAuth2.", @@ -290,13 +367,14 @@ "automatic": "Automatique", "board.certificates": "Liste des certificats pouvant être téléversé vers les cartes.", "browse": "Parcourir", - "checkForUpdate": "Receive notifications of available updates for the IDE, boards, and libraries. Requires an IDE restart after change. It's true by default.", + "checkForUpdate": "Recevoir les notifications de mises à jour disponibles pour l’IDE, les cartes et les bibliothèques. Nécessite un redémarrage de l’IE après la modification. Activé par défaut.", "choose": "Choisir", - "cli.daemonDebug": "Enable debug logging of the gRPC calls to the Arduino CLI. A restart of the IDE is needed for this setting to take effect. It's false by default.", + "cli.daemonDebug": "Activer la journalisation de débogage des appels gRPC vers le CLI Arduino. Un redémarrage de l’IDE est nécessaire pour que ce paramètre prenne effet. Désactivé par défaut.", "cloud.enabled": "Vrai si les fonctions de synchronisation de croquis est activé. Par défaut, la valeur est vrai.", "cloud.pull.warn": "Vrai si les utilisateurs devrait être averti avant de pull un croquis sur le cloud. Par défaut, la valeur est vrai.", "cloud.push.warn": "Vrai, si les utilisateurs devrait être averti avant de push un croquis sur le cloud. Par défaut, la valeur est vrai.", "cloud.pushpublic.warn": "Vrai si les utilisateurs devrait être avertit avant de publier un croquis public sur le cloud. Vrai par défaut.", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", "cloud.sketchSyncEndpoint": "L'endpoint est utilisé pour pousser et tirer des croquis à partir du backend. Par défault, il pointe vers l'Arduino Cloud API.", "compile": "compiler", "compile.experimental": "Vrai si l'IDE doit gérer les multiples erreurs du compilateur. Faux par défaut", @@ -314,29 +392,50 @@ "invalid.editorFontSize": "Police de l'éditeur invalide. La taille doit être un entier positif.", "invalid.sketchbook.location": "Localisation invalide du croquis : {0}", "invalid.theme": "Thème invalide.", + "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", "language.log": "Vrai si le serveur de langage Arduino devrait générer des fichiers logs dans le dossier du croquis. Si non faux. La valeur par défaut est faux.", "language.realTimeDiagnostics": "Si c'est vrai, le serveur de langue fournit des diagnostics en temps réel lors de la saisie dans l'éditeur. C'est faux par défaut.", "manualProxy": "Configuration manuelle du proxy", + "monitor": { + "dockPanel": "The area of the application shell where the _{0}_ widget will reside. It is either \"bottom\" or \"right\". It defaults to \"{1}\"." + }, "network": "Réseau", "newSketchbookLocation": "Sélectionner la localisation du nouveau croquis.", + "noCliConfig": "Impossible de charger la configuration du CLI", "noProxy": "Aucun proxy", + "proxySettings": { + "hostname": "Nom d'hôte", + "password": "Mot de passe", + "port": "Numéro de port", + "username": "Nom d'utilisateur" + }, "showVerbose": "Afficher la sortie de débogage verbeuse pendant", + "sketch": { + "inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect." + }, "sketchbook.location": "Localisation du croquis.", "sketchbook.showAllFiles": "Vrai pour montrer tous les fichiers croquis à l'intérieur du croquis. La valeur par défaut est faux.", - "survey.notification": "Vrai si les utilisateurs doivent être avertis si une enquête est disponible. Vrai par défaut.", "unofficialBoardSupport": "Cliquer pour la liste non-officielle des URLs des support de cartes", "upload": "téléverser", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", "upload.verbose": "Vrai si le téléchargement en mode verbose. Faux par défaut.", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "Vérifier le code après le téléversement", "window.autoScale": "Vrai si l'interface utilisateur s'ajuste avec la taille de la police.", - "window.zoomLevel": "Ajuste le zoom de la fenêtre. La taille originale est 0 et chaque augmentation (par exemple 1) ou diminution (par exemple -1) représentent un zoom de plus ou moins 20 %. Vous pouvez également entrer des décimales pour ajuster plus finement le zoom. " + "window.zoomLevel": { + "deprecationMessage": "Deprecated. Use 'window.zoomLevel' instead." + } + }, + "renameCloudSketch": { + "renameSketchTitle": "New name of the Cloud Sketch" }, "replaceMsg": "Remplacer la version existante de {0} ?", "selectZip": "Sélectionnez un fichier zip contenant la bibliothèque que vous souhaitez ajouter", "serial": { "autoscroll": "Défilement automatique", "carriageReturn": "Retour chariot", - "message": "Message ({0} + Entrée pour envoyer le message à '{1}' sur '{2}'", + "connecting": "Connecting to '{0}' on '{1}'...", + "message": "Message (Enter to send message to '{0}' on '{1}')", "newLine": "Nouvelle ligne", "newLineCarriageReturn": "Les deux, NL et CR", "noLineEndings": "Pas de fin de ligne", @@ -348,24 +447,34 @@ "sketch": { "archiveSketch": "Archiver le croquis", "cantOpen": "Un dossier nommé « {0} » existe déjà. Impossible d''ouvrir le croquis.", - "close": "Êtes-vous sûr de vouloir fermer ce croquis ?", "compile": "Compilation du programme...", - "configureAndUpload": "Configurer et téléverser", + "configureAndUpload": "Configure and Upload", "createdArchive": "Archive créer '{0}'", "doneCompiling": "Compilation terminée.", "doneUploading": "Téléversement fait.", + "editInvalidSketchFolderLocationQuestion": "Do you want to try saving the sketch to a different location?", + "editInvalidSketchFolderQuestion": "Voulez-vous essayer d'enregistrer le croquis sous un autre nom?", "exportBinary": "Exporter les binaires compilés", + "invalidCloudSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", + "invalidSketchFolderLocationDetails": "Vous ne pouvez pas enregistrer un croquis dans un dossier qui lui est interne", + "invalidSketchFolderLocationMessage": "Invalid sketch folder location: '{0}'", + "invalidSketchFolderNameMessage": "Nom de dossier de croquis invalide: '{0}'", + "invalidSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", "moving": "Déplacement", "movingMsg": "Le fichier \"{0}\" à besoin d'être à l'intérieur d'un dossier de croquis appelé \"{1}\".\nCréer ce dossier, déplacer le fichier et continuer ?", - "new": "Nouveau", + "new": "Nouveau croquis", + "noTrailingPeriod": "Un nom de fichier ne peut pas se terminer par un point", "openFolder": "Ouvrir le dossier", "openRecent": "Ouvrir les récents", "openSketchInNewWindow": "Ouvrir le croquis dans une nouvelle fenêtre", + "reservedFilename": "'{0}' est un nom de fichier réservé.", "saveFolderAs": "Sauvegarder le dossier de croquis en tant que ...", "saveSketch": "Enregistrer son programme pour le rouvrir plus tard.", "saveSketchAs": "Sauvegarder un dossier de croquis comme ...", "showFolder": "Ouvrir le dossier de croquis", "sketch": "Croquis", + "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", + "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", "sketchbook": "Carnet de croquis", "titleLocalSketchbook": "Localiser le carnet de croquis", "titleSketchbook": "Carnet de croquis", @@ -376,23 +485,55 @@ "verify": "Vérifier", "verifyOrCompile": "Vérifier / Compiler" }, - "survey": { - "answerSurvey": "Enquête sur les réponses", - "dismissSurvey": "Ne pas montrer de nouveau", - "surveyMessage": "Aide-nous à nous améliorer en répondant à cette enquête très courte. Nous apprécions notre communauté et nous aimerions connaître un peu mieux nos supporters." + "sketchbook": { + "newCloudSketch": "New Cloud Sketch", + "newSketch": "Nouveau croquis" + }, + "theme": { + "currentThemeNotFound": "Impossible de trouver le thème actuellement sélectionné : {0}. L'IDE Arduino a choisi un thème intégré compatible avec celui qui manque.", + "dark": "Sombre", + "deprecated": "{0} (deprecated)", + "hc": "Sombre avec contraste élevé", + "hcLight": "Clair avec contraste élevé", + "light": "Clair", + "user": "{0} (user)" + }, + "title": { + "cloud": "Cloud" + }, + "updateIndexes": { + "updateIndexes": "Mettre à jour les index", + "updateLibraryIndex": "Mettre à jour l’index des bibliothèques", + "updatePackageIndex": "Mettre à jour l’index des paquets" }, "upload": { "error": "{0} erreur : {1}" }, "userFields": { "cancel": "Annuler", - "enterField": "Enter {0}", + "enterField": "Saisir {0}", "upload": "Téléverser" + }, + "validateSketch": { + "abortFixMessage": "Le croquis n’est toujours pas valide. Voulez -vous corriger les problèmes restants ? En cliquant sur '{0}', un nouveau croquis s’ouvrira.", + "abortFixTitle": "Croquis invalide", + "renameSketchFileMessage": "Le fichier de croquis '{0}' ne peut pas être utilisé. {1} Voulez-vous renommer le fichier de croquis maintenant ?", + "renameSketchFileTitle": "Nom de fichier du croquis invalide", + "renameSketchFolderMessage": "Le croquis '{0}' ne peut pas être utilisé. {1} Pour supprimer ce message, renommez le croquis. Voulez-vous renommer le croquis maintenant ?", + "renameSketchFolderTitle": "Nom de croquis invalide" + }, + "versionWelcome": { + "cancelButton": "Peut-être plus tard", + "donateButton": "Faire un don maintenant", + "donateMessage": "Arduino s’engage à garder les logiciels libres et gratuits pour tous. Votre don nous aide à développer de nouvelles fonctionnalités, à améliorer les bibliothèques et à soutenir des millions d’utilisateurs dans le monde entier.", + "donateMessage2": "Veuillez envisager de soutenir notre travail sur l’IDE Arduino gratuit et libre.", + "title": "Bienvenue dans une nouvelle version de l’IDE Arduino !", + "titleWithVersion": "Bienvenue dans le nouvel IDE Arduino {0}!" + }, + "workspace": { + "alreadyExists": "'{0}' existe déjà." } }, - "cloud": { - "GoToCloud": "ALLER AU CLOUD" - }, "theia": { "core": { "cannotConnectBackend": "Impossible de se connecter au backend.", @@ -400,13 +541,9 @@ "couldNotSave": "Impossible d'enregistrer le croquis. Veuillez copier votre travail non enregistré dans votre éditeur de texte favori et redémarrer l'IDE.", "daemonOffline": "CLI Deamon hors ligne", "offline": "Hors-ligne", + "offlineText": "Hors-ligne", "quitTitle": "Est que-vous sur vous voulez quitter? " }, - "debug": { - "start": "Commencer...", - "startError": "Une erreur est survenue lors du démarrage du débogage, consultez les logs pour plus de détails.", - "typeNotSupported": "Le type de session de débogage \"{0}\" n'est pas pris en charge." - }, "editor": { "unsavedTitle": "Non enregistré – {0}" }, @@ -415,10 +552,10 @@ "expand": "Replier" }, "workspace": { - "deleteCurrentSketch": "Voulez-vous supprimer le croquis en cours ?", + "deleteCloudSketch": "Le croquis du cloud '{0}' sera définitivement supprimé des serveurs Arduino et des caches locaux. Cette action est irréversible. Voulez-vous supprimer le croquis actuel ?", + "deleteCurrentSketch": "Le croquis '{0}' sera définitivement supprimé. Cette action est irréversible. Voulez-vous supprimer le croquis actuel ?", "fileNewName": "Nouveau nom pour le fichier", "invalidExtension": "« .{0} » n''est pas une extension valide.", - "invalidFilename": "Nom de fichier non valide", "newFileName": "Nouveau nom pour le fichier" } } diff --git a/i18n/he.json b/i18n/he.json index d2b9f1cef..9b6c413cd 100644 --- a/i18n/he.json +++ b/i18n/he.json @@ -1,38 +1,51 @@ { "arduino": { "about": { - "detail": "גרסה: {0}\nתאריך: {1} {2}\nגרסאת ממשק שורת הפקודה: {3}{4} [{5}]\n\n{6}", + "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "פרטים על {0}" }, + "account": { + "goToCloudEditor": "Go to Cloud Editor", + "goToIoTCloud": "Go to IoT Cloud", + "goToProfile": "Go to Profile", + "menuTitle": "Arduino Cloud" + }, "board": { "board": "לוח{0}", "boardConfigDialogTitle": "יש לבחור לוח ופורט אחר", + "boardDataReloaded": "Board data reloaded.", "boardInfo": "פרטי הלוח", + "boards": "boards", "configDialog1": "נא לבחור סוג לוח ופורט כדי להעלות את הסקיצה.", "configDialog2": "אם נבחר לוח ניתן יהיה לקמפל, אבל לא להעלות את הסקיצה.", "couldNotFindPreviouslySelected": "Could not find previously selected board '{0}' in installed platform '{1}'. Please manually reselect the board you want to use. Do you want to reselect it now?", - "disconnected": "מנותק", + "editBoardsConfig": "Edit Board and Port...", "getBoardInfo": "פרטי הלוח", "inSketchbook": "(בסקיצה)", "installNow": "The \"{0} {1}\" core has to be installed for the currently selected \"{2}\" board. Do you want to install it now?", - "noFQBN": "The FQBN is not available for the selected board \"{0}\". Do you have the corresponding core installed?", + "noBoardsFound": "No boards found for \"{0}\"", + "noNativeSerialPort": "Native serial port, can't obtain info.", "noPortsDiscovered": "לא נמצאו פורטים", - "noPortsSelected": "לא נבחרו פורטים ללוחות '{0}'.", - "noneSelected": "לא נבחרו לוחות.", + "nonSerialPort": "Non-serial port, can't obtain info.", "openBoardsConfig": "בחר לוח ופורט אחר...", - "platformMissing": "הפלטפורמה ל'{0}' בלוח הנבחר לא הותקן.", "pleasePickBoard": "יש לבחור את הלוח המחובר לפורט הנבחר.", "port": "פורט{0}", - "portLabel": "פורט: {0}", + "ports": "ports", "programmer": "תכנת", + "reloadBoardData": "Reload Board Data", "reselectLater": "בחר מחדש מאוחר יותר", + "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "חפש לוח", "selectBoard": "בחר לוח", - "selectBoardForInfo": "אנא בחר לוח לקבל מידע אודותיו.", + "selectBoardToReload": "Please select a board first.", "selectPortForInfo": "אנא בחר פורט לקבלת מידע אודותיו.", "showAllAvailablePorts": "הצג את כל הפורטים הזמינים כשמופעל", + "showAllPorts": "Show all ports", "succesfullyInstalledPlatform": "פלטפורמה הותקנה בהצלחה {0}:{1}", - "succesfullyUninstalledPlatform": "פלטפורמה הוסרה בהצלחה {0}:{1}" + "succesfullyUninstalledPlatform": "פלטפורמה הוסרה בהצלחה {0}:{1}", + "typeOfPorts": "{0} ports", + "unconfirmedBoard": "Unconfirmed board", + "unknownBoard": "Unknown board" }, "boardsManager": "מנהל לוחות", "boardsType": { @@ -77,14 +90,15 @@ "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" }, "cloud": { - "account": "חשבון", "chooseSketchVisibility": "בחר.י נראות של הסקיצה שלך:", + "cloudSketchbook": "Cloud Sketchbook", "connected": "מחובר", "continue": "המשך", - "donePulling": "סיים למשוך '{0}'.", - "donePushing": "סיים לדחוף '{0}'.", + "donePulling": "Done pulling '{0}'.", + "donePushing": "Done pushing '{0}'.", "embed": "הטמע:", "emptySketchbook": "הסקיצה ריקה.", + "goToCloud": "Go to Cloud", "learnMore": "למדו עוד", "link": "קישור:", "notYetPulled": "לא ניתן לדחוף לענן. עדיין לא נמשך.", @@ -102,35 +116,47 @@ "pushSketch": "דחיפת הסקיצה.", "pushSketchMsg": "This is a Public Sketch. Before pushing, make sure any sensitive information is defined in arduino_secrets.h files. You can make a Sketch private from the Share panel.", "remote": "מרוחק", - "remoteSketchbook": "סקיצה מרוחקת", "share": "שיתוף...", "shareSketch": "שיתוף הסקיצה", - "showHideRemoveSketchbook": "הצג\\הסתר סקיצה מרוחקת", + "showHideSketchbook": "Show/Hide Cloud Sketchbook", "signIn": "התחברות", "signInToCloud": "התחברות לענן של ארדואינו Arduino Cloud", "signOut": "התנתק", "sync": "סנכרון", - "syncEditSketches": "Sync and edit your Arduino Cloud Sketches", + "syncEditSketches": "סנכרון ועריכת הסקיצה בענן של ארדואינו", "visitArduinoCloud": "כנס.י לענן של ארדואינו ליצור סקיצה בענן" }, + "cloudSketch": { + "alreadyExists": "Cloud sketch '{0}' already exists.", + "creating": "Creating cloud sketch '{0}'...", + "new": "New Cloud Sketch", + "notFound": "Could not pull the cloud sketch '{0}'. It does not exist.", + "pulling": "Synchronizing sketchbook, pulling '{0}'...", + "pushing": "Synchronizing sketchbook, pushing '{0}'...", + "renaming": "Renaming cloud sketch from '{0}' to '{1}'...", + "synchronizingSketchbook": "Synchronizing sketchbook..." + }, "common": { "all": "הכל", "contributed": "נתרם", "installManually": "התקן ידנית", "later": "אחר כך", "noBoardSelected": "לא נבחר לוח", + "noSketchOpened": "No sketch opened", "notConnected": "[לא מחובר]", "offlineIndicator": "You appear to be offline. Without an Internet connection, the Arduino CLI might not be able to download the required resources and could cause malfunction. Please connect to the Internet and restart the application.", "oldFormat": "ה'{0}' עדיין משתמש בפורמט הישן `.pde`. האם תרצה להחליף לסיומת החדשה `.ino` ? ", "partner": "שותף", "processing": "מעבד", "recommended": "מומלץ", - "retired": "Retired", + "retired": "פרש", + "selectManually": "Select Manually", "selectedOn": "ב {0}", "serialMonitor": "מוניטור סיריאלי", "type": "סוג", "unknown": "לא ידוע", - "updateable": "ניתן לעדכון" + "updateable": "ניתן לעדכון", + "userAbort": "User abort" }, "compile": { "error": "שגיאת קומפילציה: {0}" @@ -138,22 +164,49 @@ "component": { "boardsIncluded": "לוחות המוכלים בחבילות הבאות:", "by": "על ידי", + "clickToOpen": "Click to open in browser: {0}", "filterSearch": "סנן את החיפוש...", "install": "התקן", + "installLatest": "Install Latest", + "installVersion": "Install {0}", + "installed": "{0} installed", "moreInfo": "מידע נוסף", + "otherVersions": "Other Versions", + "remove": "הסר", + "title": "{0} by {1}", "uninstall": "הסרה", "uninstallMsg": "האם ברצונך להסיר את {0}?", - "version": "גירסה {0}" + "update": "Update" + }, + "configuration": { + "cli": { + "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" + } + }, + "connectionStatus": { + "connectionLost": "Connection lost. Cloud sketch actions and updates won't be available." }, "contributions": { "addFile": "הוסף קובץ", "fileAdded": "קובץ אחד נוסף לסקיצה.", + "plotter": { + "couldNotOpen": "Couldn't open serial plotter" + }, "replaceTitle": "החלף" }, + "core": { + "compilerWarnings": { + "all": "הכל", + "default": "Default", + "more": "More", + "none": "None" + } + }, "coreContribution": { "copyError": "העתקת הודעת שגיאה", "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." }, + "createCloudCopy": "Push Sketch to Cloud", "daemon": { "restart": "איתחול מחדש של Daemon", "start": "התחל Daemon", @@ -162,8 +215,15 @@ "debug": { "debugWithMessage": "דיבאג - {0}", "debuggingNotSupported": "דיבאג לא נתמך על ידי '{0}'", + "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "פלטפורמה אינה מותקנת עבור ׳{0}׳", - "optimizeForDebugging": "אופטימיזציה לדיבאג" + "optimizeForDebugging": "אופטימיזציה לדיבאג", + "sketchIsNotCompiled": "Sketch '{0}' must be verified before starting a debug session. Please verify the sketch and start debugging again. Do you want to verify the sketch now?" + }, + "developer": { + "clearBoardList": "Clear the Board List History", + "clearBoardsConfig": "Clear the Board and Port Selection", + "dumpBoardList": "Dump the Board List" }, "dialog": { "dontAskAgain": "אל תשאל שוב" @@ -180,10 +240,6 @@ "previousError": "שגיאה קודמת.", "revealError": "הראה שגיאה" }, - "electron": { - "couldNotSave": "לא ניתן לשמור את הסקיצה. נא להעתיק את העבודה הלא שמורה לתוך עורך טקסט חיצוני, ולהפעיל מחדש את הIDE.", - "unsavedChanges": "כל השינויים שלא נשמרו לא ישמרו." - }, "examples": { "builtInExamples": "דוגמאות מובנות", "couldNotInitializeExamples": "לא ניתן להפעיל את הדוגמאות מובנות מראש.", @@ -201,7 +257,7 @@ "selectBoard": "בחר לוח", "selectVersion": "בחירות גרסת קושחה", "successfullyInstalled": "הקושחה הותקנה בהצלחה.", - "updater": "לעדכון הקושחה WiFi101 / WiFiNINA " + "updater": "Firmware Updater" }, "help": { "environment": "סביבה", @@ -219,6 +275,9 @@ "checkForUpdates": "בדיקת עדכונים לArduino IDE", "closeAndInstallButton": "סגור והתקן", "closeToInstallNotice": "סגור את התוכנה והתקן את העדכון על המכונה שלך.", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", "downloadButton": "הורד", "downloadingNotice": "מוריד את הגרסה המעודכנת האחרונה של Arduino IDE.", "errorCheckingForUpdates": "שגיאה בעת בדיקת עדכונים ל Arduino IDE.\n{0}", @@ -232,16 +291,20 @@ "updateAvailable": "נמצא עדכון", "versionDownloaded": "Arduino IDE {0} ירד בהצלחה" }, + "installable": { + "libraryInstallFailed": "Failed to install library: '{0}{1}'.", + "platformInstallFailed": "Failed to install platform: '{0}{1}'." + }, "library": { "addZip": "הוספת ספריית .zip", "arduinoLibraries": "ספריות ארדואינו", "contributedLibraries": "ספריות שנתרמו", - "dependenciesForLibrary": "תלויות בספריה {0}:{1}", "include": "השתמש בספריה", - "installAll": "התקן הכל", + "installAll": "להתקין הכל", + "installLibraryDependencies": "Install library dependencies", "installMissingDependencies": "Would you like to install all the missing dependencies?", "installOneMissingDependency": "Would you like to install the missing dependency?", - "installOnly": "התקן רק את {0}", + "installWithoutDependencies": "Install without dependencies", "installedSuccessfully": "ספריה הותקנה בהצלחה {0}:{1}", "libraryAlreadyExists": "הספריה כבר קיימת. האם תרצ.י להחליץ אותה?", "manageLibraries": "נהל ספריות...", @@ -278,9 +341,23 @@ "tools": "כלים" }, "monitor": { + "alreadyConnectedError": "Could not connect to {0} {1} port. Already connected.", + "baudRate": "{0} baud", + "connectionFailedError": "Could not connect to {0} {1} port.", + "connectionFailedErrorWithDetails": "{0} Could not connect to {1} {2} port.", + "connectionTimeout": "Timeout. The IDE has not received the 'success' message from the monitor after successfully connecting to it", + "missingConfigurationError": "Could not connect to {0} {1} port. The monitor configuration is missing.", + "notConnectedError": "Not connected to {0} {1} port.", "unableToCloseWebSocket": "Unable to close websocket", "unableToConnectToWebSocket": "Unable to connect to websocket" }, + "newCloudSketch": { + "newSketchTitle": "Name of the new Cloud Sketch" + }, + "portProtocol": { + "network": "רשת", + "serial": "Serial" + }, "preferences": { "additionalManagerURLs": "Additional Boards Manager URLs", "auth.audience": "The OAuth2 audience.", @@ -297,6 +374,7 @@ "cloud.pull.warn": "True if users should be warned before pulling a cloud sketch. Defaults to true.", "cloud.push.warn": "True if users should be warned before pushing a cloud sketch. Defaults to true.", "cloud.pushpublic.warn": "True if users should be warned before pushing a public sketch to the cloud. Defaults to true.", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", "cloud.sketchSyncEndpoint": "The endpoint used to push and pull sketches from a backend. By default it points to Arduino Cloud API.", "compile": "קומפילציה", "compile.experimental": "True if the IDE should handle multiple compiler errors. False by default", @@ -314,29 +392,50 @@ "invalid.editorFontSize": "גודל גופן לא חוקי. חייב להיות מספר חיובי.", "invalid.sketchbook.location": "מיקום סקיצה לא חוקי: {0}", "invalid.theme": "ערכת נושא לא חוקית.", + "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", "language.log": "True if the Arduino Language Server should generate log files into the sketch folder. Otherwise, false. It's false by default.", "language.realTimeDiagnostics": "If true, the language server provides real-time diagnostics when typing in the editor. It's false by default.", "manualProxy": "הגדרת פרוקסי ידנית", + "monitor": { + "dockPanel": "The area of the application shell where the _{0}_ widget will reside. It is either \"bottom\" or \"right\". It defaults to \"{1}\"." + }, "network": "רשת", "newSketchbookLocation": "Select new sketchbook location", + "noCliConfig": "Could not load the CLI configuration", "noProxy": "ללא פרוקסי", + "proxySettings": { + "hostname": "Host name", + "password": "Password", + "port": "Port number", + "username": "Username" + }, "showVerbose": "Show verbose output during", + "sketch": { + "inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect." + }, "sketchbook.location": "Sketchbook location", "sketchbook.showAllFiles": "True to show all sketch files inside the sketch. It is false by default.", - "survey.notification": "True if users should be notified if a survey is available. True by default.", "unofficialBoardSupport": "Click for a list of unofficial board support URLs", "upload": "upload", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", "upload.verbose": "True for verbose upload output. False by default.", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "Verify code after upload", "window.autoScale": "True if the user interface automatically scales with the font size.", - "window.zoomLevel": "Adjust the zoom level of the window. The original size is 0 and each increment above (e.g. 1) or below (e.g. -1) represents zooming 20% larger or smaller. You can also enter decimals to adjust the zoom level with a finer granularity." + "window.zoomLevel": { + "deprecationMessage": "Deprecated. Use 'window.zoomLevel' instead." + } + }, + "renameCloudSketch": { + "renameSketchTitle": "New name of the Cloud Sketch" }, "replaceMsg": "Replace the existing version of {0}?", "selectZip": "Select a zip file containing the library you'd like to add", "serial": { "autoscroll": "גלילה אוטומטית", "carriageReturn": "Carriage Return", - "message": "Message ({0} + Enter to send message to '{1}' on '{2}')", + "connecting": "Connecting to '{0}' on '{1}'...", + "message": "Message (Enter to send message to '{0}' on '{1}')", "newLine": "שורה חדשה", "newLineCarriageReturn": "Both NL & CR", "noLineEndings": "ללא סיום שורה", @@ -348,24 +447,34 @@ "sketch": { "archiveSketch": "Archive Sketch", "cantOpen": "A folder named \"{0}\" already exists. Can't open sketch.", - "close": "בטוח.ה שתרצה.י לסגור את הסקיצה?", "compile": "מקמפל סקיצה...", - "configureAndUpload": "הגדר והעלה ", + "configureAndUpload": "Configure and Upload", "createdArchive": "ארכיון ׳{0}׳ נוצר.", "doneCompiling": "קומפילציה הסתיימה.", "doneUploading": "העלאה הסתיימה.", + "editInvalidSketchFolderLocationQuestion": "Do you want to try saving the sketch to a different location?", + "editInvalidSketchFolderQuestion": "Do you want to try saving the sketch with a different name?", "exportBinary": "ייצוא בינארי מקומפל.", + "invalidCloudSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", + "invalidSketchFolderLocationDetails": "You cannot save a sketch into a folder inside itself.", + "invalidSketchFolderLocationMessage": "Invalid sketch folder location: '{0}'", + "invalidSketchFolderNameMessage": "Invalid sketch folder name: '{0}'", + "invalidSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", "moving": "מעביר", "movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?", - "new": "חדש", + "new": "New Sketch", + "noTrailingPeriod": "A filename cannot end with a dot", "openFolder": "פתח תיקיה", "openRecent": "נפתח לאחרונה", "openSketchInNewWindow": "Open Sketch in New Window", + "reservedFilename": "'{0}' is a reserved filename.", "saveFolderAs": "שמירת תיקיית הסקיצה כ...", "saveSketch": "שמירת הסקיצה לפתיחה מאוחרת יותר.", "saveSketchAs": "שמירת תיקיית הסקיצה כ...", "showFolder": "הראה תיקית הסקיצה", "sketch": "סקיצה", + "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", + "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", "sketchbook": "ספר סקיצות", "titleLocalSketchbook": "ספר סקיצות מקומי", "titleSketchbook": "ספר סקיצות", @@ -376,10 +485,26 @@ "verify": "בדיקה", "verifyOrCompile": "בדיקה\\קומפילציה" }, - "survey": { - "answerSurvey": "ענה על סקר", - "dismissSurvey": "אל תראה שוב.", - "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." + "sketchbook": { + "newCloudSketch": "New Cloud Sketch", + "newSketch": "New Sketch" + }, + "theme": { + "currentThemeNotFound": "Could not find the currently selected theme: {0}. Arduino IDE has picked a built-in theme compatible with the missing one.", + "dark": "Dark", + "deprecated": "{0} (deprecated)", + "hc": "Dark High Contrast", + "hcLight": "Light High Contrast", + "light": "Light", + "user": "{0} (user)" + }, + "title": { + "cloud": "Cloud" + }, + "updateIndexes": { + "updateIndexes": "Update Indexes", + "updateLibraryIndex": "Update Library Index", + "updatePackageIndex": "Update Package Index" }, "upload": { "error": "{0} שגיאה: {1}" @@ -388,11 +513,27 @@ "cancel": "ביטול", "enterField": "יש להקליד {0}", "upload": "העלאה" + }, + "validateSketch": { + "abortFixMessage": "The sketch is still invalid. Do you want to fix the remaining problems? By clicking '{0}', a new sketch will open.", + "abortFixTitle": "Invalid sketch", + "renameSketchFileMessage": "The sketch file '{0}' cannot be used. {1} Do you want to rename the sketch file now?", + "renameSketchFileTitle": "Invalid sketch filename", + "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", + "renameSketchFolderTitle": "Invalid sketch name" + }, + "versionWelcome": { + "cancelButton": "Maybe later", + "donateButton": "Donate now", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Welcome to a new version of the Arduino IDE!", + "titleWithVersion": "Welcome to the new Arduino IDE {0}!" + }, + "workspace": { + "alreadyExists": "'{0}' already exists." } }, - "cloud": { - "GoToCloud": "לך לענן" - }, "theia": { "core": { "cannotConnectBackend": "אינו יכול להתחבר לצד שרת.", @@ -400,13 +541,9 @@ "couldNotSave": "לא ניתן לשמור את הסקיצה. נא להעתיק את העבודה הלא שמורה לתוך עורך טקסט חיצוני, ולהפעיל מחדש את הIDE.", "daemonOffline": "CLI daemon במצב לא מקוון", "offline": "מנותק", + "offlineText": "מנותק", "quitTitle": "בטוח.ה שתרצה.י לצאת?" }, - "debug": { - "start": "התחל...", - "startError": "There was an error starting the debug session, check the logs for more details.", - "typeNotSupported": "הפעלת ניפוי באגים מסוג \"{0}\" אינה נתמכת." - }, "editor": { "unsavedTitle": "לא שמור – {0}" }, @@ -415,10 +552,10 @@ "expand": "הרחב" }, "workspace": { - "deleteCurrentSketch": "האם את.ה רוצה למחוק את הסקיצה הנוכחית? ", + "deleteCloudSketch": "The cloud sketch '{0}' will be permanently deleted from the Arduino servers and the local caches. This action is irreversible. Do you want to delete the current sketch?", + "deleteCurrentSketch": "The sketch '{0}' will be permanently deleted. This action is irreversible. Do you want to delete the current sketch?", "fileNewName": "שם הקובץ החדש", "invalidExtension": "{0} אינה סיומת תקנית.", - "invalidFilename": "שם קובץ לא חוקי.", "newFileName": "שם חדש לקובץ" } } diff --git a/i18n/hu.json b/i18n/hu.json index 7899d3fc1..d8ae57f3a 100644 --- a/i18n/hu.json +++ b/i18n/hu.json @@ -1,38 +1,51 @@ { "arduino": { "about": { - "detail": "Verziószám: {0}\nDátum: {1}{2}\nCLI Verziószám: {3}{4} [{5}]\n\n{6}", + "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "About {0}" }, + "account": { + "goToCloudEditor": "Go to Cloud Editor", + "goToIoTCloud": "Go to IoT Cloud", + "goToProfile": "Go to Profile", + "menuTitle": "Arduino Cloud" + }, "board": { "board": "Alaplap {0}", "boardConfigDialogTitle": "Select Other Board and Port", + "boardDataReloaded": "Board data reloaded.", "boardInfo": "Alaplapi információk", + "boards": "boards", "configDialog1": "Válassz ki egy alaplapot és egy portot is - csak ekkor lehetséges a feltöltés. ", "configDialog2": "If you only select a Board you will be able to compile, but not to upload your sketch.", "couldNotFindPreviouslySelected": "Nem található a korábban kiválasztott '{0}' alaplap a/az '{1}' telepített platformon. Válaszd ki újra a használni kívánt alaplapot. Szeretnéd most újra megadni?", - "disconnected": "Disconnected", + "editBoardsConfig": "Edit Board and Port...", "getBoardInfo": "Alaplap információk beszerzése", "inSketchbook": "(a vázlatfüzetben/sketchbook-ban) ", "installNow": "A \"{0} {1}\" támogatást telepíteni kell az aktuálisan kiválasztott \"{2}\" alaplaphoz. Most szeretnéd telepíteni? ", - "noFQBN": "Az FQBN nem érhető el a kiválasztott „{0}” alaplapon. A megfelelő mag/core telepítve van? ", - "noPortsDiscovered": "No ports discovered", - "noPortsSelected": "Nincsen port kiválasztva a alaplaphoz: '{0}'. ", - "noneSelected": "Nincs alaplap kiválasztva", + "noBoardsFound": "No boards found for \"{0}\"", + "noNativeSerialPort": "Native serial port, can't obtain info.", + "noPortsDiscovered": "Nincs észlelt port", + "nonSerialPort": "Non-serial port, can't obtain info.", "openBoardsConfig": "Válassz másik alaplapot és portot… ", - "platformMissing": "A kiválasztott '{0}' alaplap platformja nincs telepítve. ", "pleasePickBoard": "Válassz alaplapot, amely a kiválasztott porthoz csatlakozik. ", "port": "Port {0}", - "portLabel": "Port: {0}", + "ports": "ports", "programmer": "Programozó", + "reloadBoardData": "Reload Board Data", "reselectLater": "Később újra válaszd ki", + "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "Search board", "selectBoard": "Alaplap választás", - "selectBoardForInfo": "Válassz egy alaplapot az információinak megtekintéséhez. ", + "selectBoardToReload": "Please select a board first.", "selectPortForInfo": "Válassz egy portot az alaplap információinak megtekintéséhez. ", "showAllAvailablePorts": "Elérhető portok mutatása - ha engedélyezett", + "showAllPorts": "Show all ports", "succesfullyInstalledPlatform": "Sikeresen telepített platform {0}:{1}", - "succesfullyUninstalledPlatform": "A platform sikeresen eltávolítva: {0}:{1} " + "succesfullyUninstalledPlatform": "A platform sikeresen eltávolítva: {0}:{1} ", + "typeOfPorts": "{0} ports", + "unconfirmedBoard": "Unconfirmed board", + "unknownBoard": "Unknown board" }, "boardsManager": "Alaplap-kezelő", "boardsType": { @@ -64,9 +77,9 @@ "uploadingCertificates": "Tanúsítványok feltöltése " }, "checkForUpdates": { - "checkForUpdates": "Check for Arduino Updates", + "checkForUpdates": "Arduino frissítések keresése", "installAll": "Install All", - "noUpdates": "There are no recent updates available.", + "noUpdates": "Nem állnak rendelkezésre új frissítések.", "promptUpdateBoards": "Updates are available for some of your boards.", "promptUpdateLibraries": "Updates are available for some of your libraries.", "updatingBoards": "Updating boards...", @@ -77,14 +90,15 @@ "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" }, "cloud": { - "account": "Account", "chooseSketchVisibility": "Válaszd ki a vázlat/sketch láthatóságát: ", + "cloudSketchbook": "Felhő vázlatfüzet/sketchbook ", "connected": "Kapcsolódva", "continue": "Tovább", - "donePulling": "Letöltés kész: '{0}'.", - "donePushing": "Feltöltés kész: '{0}'.", + "donePulling": "Done pulling '{0}'.", + "donePushing": "Done pushing '{0}'.", "embed": "Beágyazva:", "emptySketchbook": "A vázlatfüzeted/Sketchbook-od üres ", + "goToCloud": "Go to Cloud", "learnMore": "Tudj meg többet", "link": "Link:", "notYetPulled": "Nem küldhető a felhőbe. Még nem lett letöltve. ", @@ -102,10 +116,9 @@ "pushSketch": "Vázlat/sketch feltöltése", "pushSketchMsg": "Ez egy nyilvános vázlat/sketch. A beküldés előtt győződj meg arról, hogy minden érzékeny információ definiálva van az arduino_secrets.h fájlokban. A vázlatot priváttá tehet tenni a Megosztás panelen. ", "remote": "Távoli", - "remoteSketchbook": "Remote Sketchbook", "share": "Megosztás...", "shareSketch": "Vázlat/sketch megosztása", - "showHideRemoveSketchbook": "Távoli vázlatfüzet/sketch megjelenítése/elrejtése ", + "showHideSketchbook": "Show/Hide Cloud Sketchbook", "signIn": "BEJELENTKEZÉS", "signInToCloud": "Bejelentkezés az Arduino Cloudba ", "signOut": "Kijelentkezés", @@ -113,12 +126,23 @@ "syncEditSketches": "Arduino felhővázlatok szinkronizálása és szerkesztése", "visitArduinoCloud": "Látogasd meg az Arduino Cloud webhelyet, hogy a felhőben vázlatokat hozhass létre. " }, + "cloudSketch": { + "alreadyExists": "Cloud sketch '{0}' already exists.", + "creating": "Creating cloud sketch '{0}'...", + "new": "New Cloud Sketch", + "notFound": "Could not pull the cloud sketch '{0}'. It does not exist.", + "pulling": "Synchronizing sketchbook, pulling '{0}'...", + "pushing": "Synchronizing sketchbook, pushing '{0}'...", + "renaming": "Renaming cloud sketch from '{0}' to '{1}'...", + "synchronizingSketchbook": "Synchronizing sketchbook..." + }, "common": { "all": "All", "contributed": "Contributed", "installManually": "Kézi telepítés", "later": "később", "noBoardSelected": "Nincsen alappanel kiválasztva", + "noSketchOpened": "No sketch opened", "notConnected": "[nem csatlakozik]", "offlineIndicator": "Az internet nem érhető el. Internetkapcsolat nélkül előfordulhat, hogy az Arduino CLI nem tudja letölteni a szükséges erőforrásokat, és hibás működést okozhat. Csatlakozz az internethez és indítsd újra az alkalmazást. ", "oldFormat": "A „{0}” továbbra is a régi „.pde” formátumot használja. Szeretnéd átírni az új `.ino` kiterjesztésre? ", @@ -126,11 +150,13 @@ "processing": "Feldolgozás", "recommended": "Recommended", "retired": "Retired", + "selectManually": "Select Manually", "selectedOn": "{0}-n", "serialMonitor": "Soros monitor", "type": "Type", "unknown": "ismeretlen", - "updateable": "Updatable" + "updateable": "Updatable", + "userAbort": "User abort" }, "compile": { "error": "Összeállítási hiba: {0} " @@ -138,22 +164,49 @@ "component": { "boardsIncluded": "Boards included in this package:", "by": "által", + "clickToOpen": "Click to open in browser: {0}", "filterSearch": "Keresési eredmény szűrése... ", - "install": "TELEPÍTÉS", + "install": "Telepítés", + "installLatest": "Install Latest", + "installVersion": "Install {0}", + "installed": "{0} installed", "moreInfo": "Több info", + "otherVersions": "Other Versions", + "remove": "Eltávolítás", + "title": "{0} by {1}", "uninstall": "Eltávolítás", "uninstallMsg": "El szeretnéd távolítani a következőt: {0}? ", - "version": "Verzió: {0}" + "update": "Update" + }, + "configuration": { + "cli": { + "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" + } + }, + "connectionStatus": { + "connectionLost": "Connection lost. Cloud sketch actions and updates won't be available." }, "contributions": { "addFile": "Fájl hozzáadása", "fileAdded": "Egy fájl hozzáadása megtörtént a vázlathoz/sketch-hez. ", + "plotter": { + "couldNotOpen": "Couldn't open serial plotter" + }, "replaceTitle": "Csere" }, + "core": { + "compilerWarnings": { + "all": "All", + "default": "Default", + "more": "More", + "none": "None" + } + }, "coreContribution": { "copyError": "Copy error messages", "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." }, + "createCloudCopy": "Push Sketch to Cloud", "daemon": { "restart": "Restart Daemon", "start": "Start Daemon", @@ -162,8 +215,15 @@ "debug": { "debugWithMessage": "Hibakeresés/Debug - {0}", "debuggingNotSupported": "A hibakeresést a '{0}' nem támogatja ", + "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "A platform nincs telepítve a következőhöz: „{0}” ", - "optimizeForDebugging": "Optimalizálás hibakereséséhez" + "optimizeForDebugging": "Optimalizálás hibakereséséhez", + "sketchIsNotCompiled": "Sketch '{0}' must be verified before starting a debug session. Please verify the sketch and start debugging again. Do you want to verify the sketch now?" + }, + "developer": { + "clearBoardList": "Clear the Board List History", + "clearBoardsConfig": "Clear the Board and Port Selection", + "dumpBoardList": "Dump the Board List" }, "dialog": { "dontAskAgain": "Ne kérdezd meg még egyszer" @@ -180,10 +240,6 @@ "previousError": "Previous Error", "revealError": "Reveal Error" }, - "electron": { - "couldNotSave": "Nem sikerült menteni a vázlatot/sketch-et. Másold át a nem mentett munkát kedvenc szövegszerkesztődbe és indítsd újra az IDE-t. ", - "unsavedChanges": "A nem mentett módosítások nem kerülnek mentésre. " - }, "examples": { "builtInExamples": "Beépített példák", "couldNotInitializeExamples": "Nem sikerült inicializálni/előhívni a beépített példákat. ", @@ -201,7 +257,7 @@ "selectBoard": "Alaplap választás", "selectVersion": "Firmware verzió kiválasztása", "successfullyInstalled": "Firmware telepítése sikeres.", - "updater": "WiFi101 / WiFiNINA Firmware feltöltés" + "updater": "Firmware Updater" }, "help": { "environment": "Környezet", @@ -219,6 +275,9 @@ "checkForUpdates": "Check for Arduino IDE Updates", "closeAndInstallButton": "Close and Install", "closeToInstallNotice": "Close the software and install the update on your machine.", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", "downloadButton": "Download", "downloadingNotice": "Downloading the latest version of the Arduino IDE.", "errorCheckingForUpdates": "Error while checking for Arduino IDE updates.\n{0}", @@ -232,16 +291,20 @@ "updateAvailable": "Update Available", "versionDownloaded": "Arduino IDE {0} has been downloaded." }, + "installable": { + "libraryInstallFailed": "Failed to install library: '{0}{1}'.", + "platformInstallFailed": "Failed to install platform: '{0}{1}'." + }, "library": { "addZip": "ZIP könyvtár hozzáadása...", "arduinoLibraries": "Arduino könyvtárak", "contributedLibraries": "Közreműködő könyvtárak ", - "dependenciesForLibrary": "A/az {0} könyvtár függőségei: {1}", "include": "Tartalmazza a könyvtárat", - "installAll": "Minden telepítése", + "installAll": "Install All", + "installLibraryDependencies": "Install library dependencies", "installMissingDependencies": "Szeretnéd telepíteni az összes hiányzó függőséget?", "installOneMissingDependency": "Szeretnéd telepíteni a hiányzó függőséget? ", - "installOnly": "Csak {0} telepítése", + "installWithoutDependencies": "Install without dependencies", "installedSuccessfully": "Sikeresen telepített könyvtár {0}:{1}", "libraryAlreadyExists": "Már létezik a könyvtár. Felül akarod írni? ", "manageLibraries": "Könyvtárak kezelése... ", @@ -278,9 +341,23 @@ "tools": "Eszközök" }, "monitor": { + "alreadyConnectedError": "Could not connect to {0} {1} port. Already connected.", + "baudRate": "{0} baud", + "connectionFailedError": "Could not connect to {0} {1} port.", + "connectionFailedErrorWithDetails": "{0} Could not connect to {1} {2} port.", + "connectionTimeout": "Timeout. The IDE has not received the 'success' message from the monitor after successfully connecting to it", + "missingConfigurationError": "Could not connect to {0} {1} port. The monitor configuration is missing.", + "notConnectedError": "Not connected to {0} {1} port.", "unableToCloseWebSocket": "Unable to close websocket", "unableToConnectToWebSocket": "Unable to connect to websocket" }, + "newCloudSketch": { + "newSketchTitle": "Name of the new Cloud Sketch" + }, + "portProtocol": { + "network": "Hálózat", + "serial": "Serial" + }, "preferences": { "additionalManagerURLs": "Kiegészítő alaplapok URL-jei", "auth.audience": "Az OAuth2 közönség/audience. ", @@ -297,6 +374,7 @@ "cloud.pull.warn": "Kipipálva: figyelmeztetés megjelenítése a vázlat/sketch felhőből letöltése előtt. Alapértelmezés szerint: kipipálva.", "cloud.push.warn": "Kipipálva: figyelmeztetés megjelenítése a vázlat/sketch felhőből való letöltése előtt. Alapértelmezés: kipipálva. ", "cloud.pushpublic.warn": "Kipipálva: figyelmeztetés megjelenítése a nyilvános vázlat/sketch felhőbe küldése előtt. Alapértelmezés szerint: kipipálva.", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", "cloud.sketchSyncEndpoint": "A végpont/endpoint a vázlatok/sketch-ek háttéből történő letöltésére illetve publikálására szolgál. Alapértelmezés szerint az Arduino Cloud API-ra mutat. ", "compile": "fordítás", "compile.experimental": "True if the IDE should handle multiple compiler errors. False by default", @@ -314,29 +392,50 @@ "invalid.editorFontSize": "A szerkesztő betűmérete érvénytelen. Pozitív egész számnak kell lennie. ", "invalid.sketchbook.location": "Érvénytelen elérési út a vázlatfüzethez/sketchbook-hoz: {0} ", "invalid.theme": "Érvénytelen megjelenési felület/téma. ", + "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", "language.log": "Igaz/kipipálva/, ha az Arduino Language Server naplófájlokat generál a vázlat mappába. Ellenkező esetben hamis/nincs kipipálva. Alapértelmezés szerint: hamis. ", "language.realTimeDiagnostics": "If true, the language server provides real-time diagnostics when typing in the editor. It's false by default.", "manualProxy": "Kézi proxy konfiguráció", + "monitor": { + "dockPanel": "The area of the application shell where the _{0}_ widget will reside. It is either \"bottom\" or \"right\". It defaults to \"{1}\"." + }, "network": "Hálózat", "newSketchbookLocation": "Új Vázlatfüzet/Sketchbook elérési út", + "noCliConfig": "Could not load the CLI configuration", "noProxy": "Nincs proxy", + "proxySettings": { + "hostname": "Host name", + "password": "Password", + "port": "Port number", + "username": "Username" + }, "showVerbose": "Részletes kimenet megjelenítése eközben: ", + "sketch": { + "inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect." + }, "sketchbook.location": "SketchBook elérési helye ", "sketchbook.showAllFiles": "Kipipálva: az összes vázlatfájl/sketch megjelenítése a vázlaton/sketch-en belül. Alapértelmezés szerint: nincs kipipálva.", - "survey.notification": "True if users should be notified if a survey is available. True by default.", "unofficialBoardSupport": "Kattints ide a nem hivatalos alaplapok fordítási URL-jeinek listájához ", "upload": "feltöltés", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", "upload.verbose": "Kipipálva: a részletes feltöltési üzenetek kiírása a képernyőre. Alapértelmezés szerint hamis/nincs kipipálva.", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "Kód ellenőrzése feltöltés után", "window.autoScale": "Kipipálva, ha a felhasználói felület automatikusan méreteződik a betűmérettel együtt. ", - "window.zoomLevel": "Ablak nagyítási szintjének megadása. Az eredeti méret: 0, és minden lépés növelése (pl. 1) vagy csökkentése (pl. -1) 20%-kal nagyobb vagy kisebb nagyítást jelent. Tizedesjegyeket is meg lehet adni a nagyítási szint finomabb beállításához. " + "window.zoomLevel": { + "deprecationMessage": "Deprecated. Use 'window.zoomLevel' instead." + } + }, + "renameCloudSketch": { + "renameSketchTitle": "New name of the Cloud Sketch" }, "replaceMsg": "Lecseréled a/az {0} meglévő verzióját? ", "selectZip": "Válaszd ki a hozzáadni kívánt könyvtárat tartalmazó ZIP-fájlt ", "serial": { "autoscroll": "Automatikus görgetés", "carriageReturn": "Kocsi vissza", - "message": "Üzenet ({0} + Enter az üzenet elküldéséhez az {1} itt: {2})", + "connecting": "Connecting to '{0}' on '{1}'...", + "message": "Message (Enter to send message to '{0}' on '{1}')", "newLine": "Új sor", "newLineCarriageReturn": "Mindkettő: Új sor és Kocsi vissza - NL&CR", "noLineEndings": "Nincs sorvége ", @@ -348,24 +447,34 @@ "sketch": { "archiveSketch": "Vázlat/sketch archiválása", "cantOpen": "Már létezik a/az {0} nevű mappa. A vázlat/sketch nem nyitható meg. ", - "close": "Biztosan bezárod a vázlatot/sketch-et? ", "compile": "Compiling sketch...", - "configureAndUpload": "Konfigurálás és feltöltés", + "configureAndUpload": "Configure and Upload", "createdArchive": "Archívum létrehozva: {0}. ", "doneCompiling": "Fordítás kész.", "doneUploading": "Feltöltés kész.", + "editInvalidSketchFolderLocationQuestion": "Do you want to try saving the sketch to a different location?", + "editInvalidSketchFolderQuestion": "Do you want to try saving the sketch with a different name?", "exportBinary": "Összeállított bináris exportálása", + "invalidCloudSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", + "invalidSketchFolderLocationDetails": "You cannot save a sketch into a folder inside itself.", + "invalidSketchFolderLocationMessage": "Invalid sketch folder location: '{0}'", + "invalidSketchFolderNameMessage": "Invalid sketch folder name: '{0}'", + "invalidSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", "moving": "Mozgatás", "movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?", - "new": "Új", + "new": "New Sketch", + "noTrailingPeriod": "A filename cannot end with a dot", "openFolder": "Mappa megnyitása", "openRecent": "Legutóbbi megnyitása", "openSketchInNewWindow": "Vázlat/sketch megnyitása új ablakban", + "reservedFilename": "'{0}' is a reserved filename.", "saveFolderAs": "Vázlat-/sketch-mappa mentése másként... ", "saveSketch": "Save your sketch to open it again later.", "saveSketchAs": "Vázlat-/sketch-mappa mentése másként... ", "showFolder": "Vázlat-/sketch-mappa megjelenítése", "sketch": "Vázlat/sketch", + "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", + "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", "sketchbook": "Vázlatfüzet/sketchbook ", "titleLocalSketchbook": "Helyi vázlatfüzet/sketchbook ", "titleSketchbook": "Vázlatfüzet/sketchbook ", @@ -376,10 +485,26 @@ "verify": "Ellenőrzés", "verifyOrCompile": "Ellenőrzés/fordítás" }, - "survey": { - "answerSurvey": "Answer survey", - "dismissSurvey": "Don't show again", - "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." + "sketchbook": { + "newCloudSketch": "New Cloud Sketch", + "newSketch": "New Sketch" + }, + "theme": { + "currentThemeNotFound": "Could not find the currently selected theme: {0}. Arduino IDE has picked a built-in theme compatible with the missing one.", + "dark": "Dark", + "deprecated": "{0} (deprecated)", + "hc": "Dark High Contrast", + "hcLight": "Light High Contrast", + "light": "Light", + "user": "{0} (user)" + }, + "title": { + "cloud": "Cloud" + }, + "updateIndexes": { + "updateIndexes": "Update Indexes", + "updateLibraryIndex": "Update Library Index", + "updatePackageIndex": "Update Package Index" }, "upload": { "error": "{0} hiba: {1}" @@ -388,11 +513,27 @@ "cancel": "Mégsem", "enterField": "Enter {0}", "upload": "Feltöltés" + }, + "validateSketch": { + "abortFixMessage": "The sketch is still invalid. Do you want to fix the remaining problems? By clicking '{0}', a new sketch will open.", + "abortFixTitle": "Invalid sketch", + "renameSketchFileMessage": "The sketch file '{0}' cannot be used. {1} Do you want to rename the sketch file now?", + "renameSketchFileTitle": "Invalid sketch filename", + "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", + "renameSketchFolderTitle": "Invalid sketch name" + }, + "versionWelcome": { + "cancelButton": "Maybe later", + "donateButton": "Donate now", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Welcome to a new version of the Arduino IDE!", + "titleWithVersion": "Welcome to the new Arduino IDE {0}!" + }, + "workspace": { + "alreadyExists": "'{0}' already exists." } }, - "cloud": { - "GoToCloud": "UGRÁS A FELHŐHÖZ " - }, "theia": { "core": { "cannotConnectBackend": "Nem lehet csatlakozni a háttérrendszerhez/backend-hez. ", @@ -400,13 +541,9 @@ "couldNotSave": "Nem sikerült menteni a vázlatot/sketch-et. Másold át a nem mentett munkát kedvenc szövegszerkesztődbe és indítsd újra az IDE-t. ", "daemonOffline": "CLI Daemon offline/elérhetetlen ", "offline": "Offline / nincs hálózat", + "offlineText": "Offline / nincs hálózat", "quitTitle": "Are you sure you want to quit?" }, - "debug": { - "start": "Start...", - "startError": "Hiba történt a hibakeresési munkamenet indításakor. További részletekért ellenőrizd a naplókat. ", - "typeNotSupported": "A {0} hibakeresési munkamenet típusa nem támogatott. " - }, "editor": { "unsavedTitle": "Nincs mentve – {0}" }, @@ -415,10 +552,10 @@ "expand": "Bővebb" }, "workspace": { - "deleteCurrentSketch": "Törlöd az aktuális vázlatot/sketch-et? ", + "deleteCloudSketch": "The cloud sketch '{0}' will be permanently deleted from the Arduino servers and the local caches. This action is irreversible. Do you want to delete the current sketch?", + "deleteCurrentSketch": "The sketch '{0}' will be permanently deleted. This action is irreversible. Do you want to delete the current sketch?", "fileNewName": "Az új fájl neve", "invalidExtension": "A .{0} nem érvényes kiterjesztés", - "invalidFilename": "Hibás fájlnév.", "newFileName": "A fájl új neve" } } diff --git a/i18n/hy.json b/i18n/hy.json deleted file mode 100644 index 3bd7251da..000000000 --- a/i18n/hy.json +++ /dev/null @@ -1,352 +0,0 @@ -{ - "arduino": { - "about": { - "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}{4} [{5}]\n\n{6}", - "label": "About {0}" - }, - "board": { - "board": "Board{0}", - "boardInfo": "Board Info", - "boardListItem": "{0} at {1}", - "configDialog1": "Select both a Board and a Port if you want to upload a sketch.", - "configDialog2": "If you only select a Board you will be able to compile, but not to upload your sketch.", - "configDialogTitle": "Select Other Board & Port", - "couldNotFindPreviouslySelected": "Could not find previously selected board '{0}' in installed platform '{1}'. Please manually reselect the board you want to use. Do you want to reselect it now?", - "getBoardInfo": "Get Board Info", - "inSketchbook": " (in Sketchbook)", - "installManually": "Install Manually", - "installNow": "The \"{0} {1}\" core has to be installed for the currently selected \"{2}\" board. Do you want to install it now?", - "noFQBN": "The FQBN is not available for the selected board \"{0}\". Do you have the corresponding core installed?", - "noPortsSelected": "No ports selected for board: '{0}'.", - "noneSelected": "No boards selected.", - "openBoardsConfig": "Select other board and port…", - "platformMissing": "The platform for the selected '{0}' board is not installed.", - "pleasePickBoard": "Please pick a board connected to the port you have selected.", - "port": "Port{0}", - "programmer": "Programmer", - "reselectLater": "Reselect later", - "selectBoardForInfo": "Please select a board to obtain board info.", - "selectPortForInfo": "Please select a port to obtain board info.", - "showAllAvailablePorts": "Shows all available ports when enabled", - "succesfullyInstalledPlatform": "Successfully installed platform {0}:{1}", - "succesfullyUninstalledPlatform": "Successfully uninstalled platform {0}:{1}" - }, - "boardsManager": "Boards Manager", - "bootloader": { - "burnBootloader": "Burn Bootloader", - "doneBurningBootloader": "Done burning bootloader." - }, - "burnBootloader": { - "error": "Error while burning the bootloader: {0}" - }, - "certificate": { - "addNew": "Add New", - "addURL": "Add URL to fetch SSL certificate", - "boardAtPort": "{0} at {1}", - "certificatesUploaded": "Certificates uploaded.", - "enterURL": "Enter URL", - "noSupportedBoardConnected": "No supported board connected", - "openContext": "Open context", - "remove": "Remove", - "selectBoard": "Select a board...", - "selectCertificateToUpload": "1. Select certificate to upload", - "selectDestinationBoardToUpload": "2. Select destination board and upload certificate", - "upload": "Upload", - "uploadFailed": "Upload failed. Please try again.", - "uploadRootCertificates": "Upload SSL Root Certificates", - "uploadingCertificates": "Uploading certificates." - }, - "cloud": { - "chooseSketchVisibility": "Choose visibility of your Sketch:", - "cloudSketchbook": "Cloud Sketchbook", - "connected": "Connected", - "continue": "Continue", - "donePulling": "Done pulling ‘{0}’.", - "donePushing": "Done pushing ‘{0}’.", - "embed": "Embed:", - "emptySketchbook": "Your Sketchbook is empty", - "learnMore": "Learn more", - "link": "Link:", - "notYetPulled": "Cannot push to Cloud. It is not yet pulled.", - "offline": "Offline", - "openInCloudEditor": "Open in Cloud Editor", - "options": "Options...", - "privateVisibility": "Private. Only you can view the Sketch.", - "profilePicture": "Profile picture", - "publicVisibility": "Public. Anyone with the link can view the Sketch.", - "pull": "Pull", - "pullFirst": "You have to pull first to be able to push to the Cloud.", - "pullSketch": "Pull Sketch", - "pullSketchMsg": "Pulling this Sketch from the Cloud will overwrite its local version. Are you sure you want to continue?", - "push": "Push", - "pushSketch": "Push Sketch", - "pushSketchMsg": "This is a Public Sketch. Before pushing, make sure any sensitive information is defined in arduino_secrets.h files. You can make a Sketch private from the Share panel.", - "remote": "Remote", - "share": "Share...", - "shareSketch": "Share Sketch", - "showHideRemoveSketchbook": "Show/Hide Remote Sketchbook", - "signIn": "SIGN IN", - "signInToCloud": "Sign in to Arduino Cloud", - "signOut": "Sign Out", - "syncEditSketches": "Sync and edit your Arduino Cloud Sketches", - "visitArduinoCloud": "Visit Arduino Cloud to create Cloud Sketches." - }, - "common": { - "later": "Later", - "noBoardSelected": "No board selected", - "notConnected": "[not connected]", - "offlineIndicator": "You appear to be offline. Without an Internet connection, the Arduino CLI might not be able to download the required resources and could cause malfunction. Please connect to the Internet and restart the application.", - "oldFormat": "The '{0}' still uses the old `.pde` format. Do you want to switch to the new `.ino` extension?", - "processing": "Processing", - "selectBoard": "Select Board", - "selectedOn": "on {0}", - "serialMonitor": "Serial Monitor", - "unknown": "Unknown" - }, - "compile": { - "error": "Compilation error: {0}" - }, - "component": { - "by": "by", - "filterSearch": "Filter your search...", - "install": "INSTALL", - "moreInfo": "More info", - "uninstall": "Uninstall", - "uninstallMsg": "Do you want to uninstall {0}?", - "version": "Version {0}" - }, - "contributions": { - "addFile": "Add File", - "fileAdded": "One file added to the sketch.", - "replaceTitle": "Replace" - }, - "debug": { - "debugWithMessage": "Debug - {0}", - "debuggingNotSupported": "Debugging is not supported by '{0}'", - "noPlatformInstalledFor": "Platform is not installed for '{0}'", - "optimizeForDebugging": "Optimize for Debugging" - }, - "dialog": { - "dontAskAgain": "Don't ask again" - }, - "editor": { - "autoFormat": "Auto Format", - "commentUncomment": "Comment/Uncomment", - "copyForForum": "Copy for Forum (Markdown)", - "decreaseFontSize": "Decrease Font Size", - "decreaseIndent": "Decrease Indent", - "increaseFontSize": "Increase Font Size", - "increaseIndent": "Increase Indent" - }, - "electron": { - "couldNotSave": "Could not save the sketch. Please copy your unsaved work into your favorite text editor, and restart the IDE.", - "unsavedChanges": "Any unsaved changes will not be saved." - }, - "examples": { - "builtInExamples": "Built-in examples", - "couldNotInitializeExamples": "Could not initialize built-in examples.", - "customLibrary": "Examples from Custom Libraries", - "for": "Examples for {0}", - "forAny": "Examples for any board", - "menu": "Examples" - }, - "firmware": { - "checkUpdates": "Check Updates", - "failedInstall": "Installation failed. Please try again.", - "install": "Install", - "installingFirmware": "Installing firmware.", - "overwriteSketch": "Installation will overwrite the Sketch on the board.", - "selectBoard": "Select Board", - "selectVersion": "Select firmware version", - "successfullyInstalled": "Firmware successfully installed.", - "updater": "WiFi101 / WiFiNINA Firmware Updater" - }, - "help": { - "environment": "Environment", - "faq": "Frequently Asked Questions", - "findInReference": "Find in Reference", - "gettingStarted": "Getting Started", - "keyword": "Type a keyword", - "privacyPolicy": "Privacy Policy", - "reference": "Reference", - "search": "Search on Arduino.cc", - "troubleshooting": "Troubleshooting", - "visit": "Visit Arduino.cc" - }, - "ide-updater": { - "closeAndInstallButton": "Close and Install", - "closeToInstallNotice": "Close the software and install the update on your machine.", - "downloadButton": "Download", - "downloadingNotice": "Downloading the latest version of the Arduino IDE.", - "errorCheckingForUpdates": "Error while checking for Arduino IDE updates.\n{0}", - "goToDownloadButton": "Go To Download", - "goToDownloadPage": "An update for the Arduino IDE is available, but we're not able to download and install it automatically. Please go to the download page and download the latest version from there.", - "ideUpdaterDialog": "Software Update", - "newVersionAvailable": "A new version of Arduino IDE ({0}) is available for download.", - "noUpdatesAvailable": "There are no recent updates available for the Arduino IDE", - "notNowButton": "Not now", - "skipVersionButton": "Skip Version", - "updateAvailable": "Update Available", - "versionDownloaded": "Arduino IDE {0} has been downloaded." - }, - "library": { - "addZip": "Add .ZIP Library...", - "arduinoLibraries": "Arduino libraries", - "contributedLibraries": "Contributed libraries", - "dependenciesForLibrary": "Dependencies for library {0}:{1}", - "include": "Include Library", - "installAll": "Install all", - "installMissingDependencies": "Would you like to install all the missing dependencies?", - "installOneMissingDependency": "Would you like to install the missing dependency?", - "installOnly": "Install {0} only", - "installedSuccessfully": "Successfully installed library {0}:{1}", - "libraryAlreadyExists": "A library already exists. Do you want to overwrite it?", - "manageLibraries": "Manage Libraries...", - "namedLibraryAlreadyExists": "A library folder named {0} already exists. Do you want to overwrite it?", - "needsMultipleDependencies": "The library <b>{0}:{1}</b> needs some other dependencies currently not installed:", - "needsOneDependency": "The library <b>{0}:{1}</b> needs another dependency currently not installed:", - "overwriteExistingLibrary": "Do you want to overwrite the existing library?", - "successfullyInstalledZipLibrary": "Successfully installed library from {0} archive", - "title": "Library Manager", - "uninstalledSuccessfully": "Successfully uninstalled library {0}:{1}", - "zipLibrary": "Library" - }, - "menu": { - "sketch": "Sketch", - "tools": "Tools" - }, - "preferences": { - "additionalManagerURLs": "Additional Boards Manager URLs", - "auth.audience": "The OAuth2 audience.", - "auth.clientID": "The OAuth2 client ID.", - "auth.domain": "The OAuth2 domain.", - "auth.registerUri": "The URI used to register a new user.", - "automatic": "Automatic", - "board.certificates": "List of certificates that can be uploaded to boards", - "browse": "Browse", - "choose": "Choose", - "cloud.enabled": "True if the sketch sync functions are enabled. Defaults to true.", - "cloud.pull.warn": "True if users should be warned before pulling a cloud sketch. Defaults to true.", - "cloud.push.warn": "True if users should be warned before pushing a cloud sketch. Defaults to true.", - "cloud.pushpublic.warn": "True if users should be warned before pushing a public sketch to the cloud. Defaults to true.", - "cloud.sketchSyncEnpoint": "The endpoint used to push and pull sketches from a backend. By default it points to Arduino Cloud API.", - "compile": "compile", - "compile.verbose": "True for verbose compile output. False by default", - "compile.warnings": "Tells gcc which warning level to use. It's 'None' by default", - "compilerWarnings": "Compiler warnings", - "editorFontSize": "Editor font size", - "editorQuickSuggestions": "Editor Quick Suggestions", - "enterAdditionalURLs": "Enter additional URLs, one for each row", - "files.inside.sketches": "Show files inside Sketches", - "ide.updateBaseUrl": "The base URL where to download updates from. Defaults to 'https://downloads.arduino.cc/arduino-ide'", - "ide.updateChannel": "Release channel to get updated from. 'stable' is the stable release, 'nightly' is the latest development build.", - "interfaceScale": "Interface scale", - "invalid.editorFontSize": "Invalid editor font size. It must be a positive integer.", - "invalid.sketchbook.location": "Invalid sketchbook location: {0}", - "invalid.theme": "Invalid theme.", - "language.log": "True if the Arduino Language Server should generate log files into the sketch folder. Otherwise, false. It's false by default.", - "manualProxy": "Manual proxy configuration", - "network": "Network", - "newSketchbookLocation": "Select new sketchbook location", - "noProxy": "No proxy", - "showVerbose": "Show verbose output during", - "sketchbook.location": "Sketchbook location", - "sketchbook.showAllFiles": "True to show all sketch files inside the sketch. It is false by default.", - "unofficialBoardSupport": "Click for a list of unofficial board support URLs", - "upload": "upload", - "upload.verbose": "True for verbose upload output. False by default.", - "verifyAfterUpload": "Verify code after upload", - "window.autoScale": "True if the user interface automatically scales with the font size.", - "window.zoomLevel": "Adjust the zoom level of the window. The original size is 0 and each increment above (e.g. 1) or below (e.g. -1) represents zooming 20% larger or smaller. You can also enter decimals to adjust the zoom level with a finer granularity." - }, - "replaceMsg": "Replace the existing version of {0}?", - "selectZip": "Select a zip file containing the library you'd like to add", - "serial": { - "autoscroll": "Autoscroll", - "carriageReturn": "Carriage Return", - "connectionBusy": "Connection failed. Serial port is busy: {0}", - "disconnected": "Disconnected {0} from {1}.", - "failedReconnect": "Failed to reconnect {0} to serial port after 10 consecutive attempts. The {1} serial port is busy.", - "message": "Message ({0} + Enter to send message to '{1}' on '{2}')", - "newLine": "New Line", - "newLineCarriageReturn": "Both NL & CR", - "noLineEndings": "No Line Ending", - "notConnected": "Not connected. Select a board and a port to connect automatically.", - "reconnect": "Reconnecting {0} to {1} in {2} seconds...", - "timestamp": "Timestamp", - "toggleTimestamp": "Toggle Timestamp", - "unexpectedError": "Unexpected error. Reconnecting {0} on port {1}." - }, - "sketch": { - "archiveSketch": "Archive Sketch", - "cantOpen": "A folder named \"{0}\" already exists. Can't open sketch.", - "close": "Are you sure you want to close the sketch?", - "configureAndUpload": "Configure And Upload", - "couldNotConnectToSerial": "Could not reconnect to serial port. {0}", - "createdArchive": "Created archive '{0}'.", - "doneCompiling": "Done compiling.", - "doneUploading": "Done uploading.", - "exportBinary": "Export Compiled Binary", - "moving": "Moving", - "movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?", - "new": "New", - "openFolder": "Open Folder", - "openRecent": "Open Recent", - "openSketchInNewWindow": "Open Sketch in New Window", - "saveFolderAs": "Save sketch folder as...", - "saveSketchAs": "Save sketch folder as...", - "saveTempSketch": "Save your sketch to open it again later.", - "showFolder": "Show Sketch Folder", - "sketch": "Sketch", - "sketchbook": "Sketchbook", - "titleLocalSketchbook": "Local Sketchbook", - "titleSketchbook": "Sketchbook", - "upload": "Upload", - "uploadUsingProgrammer": "Upload Using Programmer", - "userFieldsNotFoundError": "Can't find user fields for connected board", - "verify": "Verify", - "verifyOrCompile": "Verify/Compile" - }, - "upload": { - "error": "{0} error: {1}" - }, - "userFields": { - "cancel": "Cancel", - "upload": "Upload" - } - }, - "cloud": { - "GoToCloud": "GO TO CLOUD" - }, - "theia": { - "core": { - "cannotConnectBackend": "Cannot connect to the backend.", - "cannotConnectDaemon": "Cannot connect to the CLI daemon.", - "couldNotSave": "Could not save the sketch. Please copy your unsaved work into your favorite text editor, and restart the IDE.", - "daemonOffline": "CLI Daemon Offline", - "offline": "Offline", - "quitMessage": "Any unsaved changes will not be saved.", - "quitTitle": "Are you sure you want to quit?" - }, - "debug": { - "start": "Start...", - "startError": "There was an error starting the debug session, check the logs for more details.", - "typeNotSupported": "The debug session type \"{0}\" is not supported." - }, - "editor": { - "unsavedTitle": "Unsaved – {0}" - }, - "messages": { - "collapse": "Collapse", - "expand": "Expand" - }, - "workspace": { - "deleteCurrentSketch": "Do you want to delete the current sketch?", - "fileNewName": "Name for new file", - "invalidExtension": ".{0} is not a valid extension", - "invalidFilename": "Invalid filename.", - "newFileName": "New name for file", - "sketchDirectoryError": "There was an error creating the sketch directory. See the log for more details. The application will probably not work as expected." - } - } -} diff --git a/i18n/id.json b/i18n/id.json new file mode 100644 index 000000000..095f55fdc --- /dev/null +++ b/i18n/id.json @@ -0,0 +1,562 @@ +{ + "arduino": { + "about": { + "detail": "Versi:{0}\nTanggal:{1}{2}\nVersi CLI{3}\n\n{4}", + "label": "Tentang {0}" + }, + "account": { + "goToCloudEditor": "Buka Cloud Editor", + "goToIoTCloud": "Buka IoT Cloud", + "goToProfile": "Buka Profil", + "menuTitle": "Arduino Cloud" + }, + "board": { + "board": "Papan{0}", + "boardConfigDialogTitle": "Pilih Papan dan Port Lain", + "boardDataReloaded": "Board data reloaded.", + "boardInfo": "Informasi Papan", + "boards": "papan", + "configDialog1": "Pilih antara Papan dan Port jika kamu ingin mengunggah sebuah sketsa.", + "configDialog2": "Jika kamu hanya memilih Papanmu yang dapat untuk mengkompilasi, tetapi tidak untuk mengunggah sketsamu.", + "couldNotFindPreviouslySelected": "Could not find previously selected board '{0}' in installed platform '{1}'. Please manually reselect the board you want to use. Do you want to reselect it now?", + "editBoardsConfig": "Edit Board and Port...", + "getBoardInfo": "Dapatkan Informasi Papan", + "inSketchbook": "(di buku sketsa)", + "installNow": "The \"{0} {1}\" core has to be installed for the currently selected \"{2}\" board. Do you want to install it now?", + "noBoardsFound": "Tidak ditemukan papan untuk \"{0}\"", + "noNativeSerialPort": "Port serial asli, tidak dapat memperoleh informasi.", + "noPortsDiscovered": "Tidak ada port yang ditemukan", + "nonSerialPort": "Port non-serial, tidak dapat memperoleh informasi.", + "openBoardsConfig": "Pilih papan dan port yang lain... ", + "pleasePickBoard": "Please pick a board connected to the port you have selected.", + "port": "Port{0}", + "ports": "port", + "programmer": "Pemrogram", + "reloadBoardData": "Reload Board Data", + "reselectLater": "Pilih ulang nanti", + "revertBoardsConfig": "Use '{0}' discovered on '{1}'", + "searchBoard": "Cari papan", + "selectBoard": "Pilih Papan", + "selectBoardToReload": "Please select a board first.", + "selectPortForInfo": "Mohon pilih port untuk memperoleh informasi papan.", + "showAllAvailablePorts": "Tampilkan semua port yang tersedia saat dinyalakan", + "showAllPorts": "Tampilkan semua port", + "succesfullyInstalledPlatform": "Berhasil memasang platform {0}:{1}", + "succesfullyUninstalledPlatform": "Berhasil menghapus platform {0}:{1}", + "typeOfPorts": "{0}port", + "unconfirmedBoard": "Unconfirmed board", + "unknownBoard": "Papan tidak diketahui" + }, + "boardsManager": "Pengelola Papan", + "boardsType": { + "arduinoCertified": "Tersertifikasi Arduino" + }, + "bootloader": { + "burnBootloader": "Bakar Bootloader", + "burningBootloader": "Membakar bootloader...", + "doneBurningBootloader": "Pembakaran Bootloader Selesai." + }, + "burnBootloader": { + "error": "Eror saat membakar bootloader: {0}" + }, + "certificate": { + "addNew": "Tambah Baru", + "addURL": "Tambah URL untuk mengambil Sertifikat SSL", + "boardAtPort": "{0} pada {1}", + "certificatesUploaded": "Sertifikat terunggah.", + "enterURL": "Masukan URL", + "noSupportedBoardConnected": "Tidak ada papan yang didukung tersambung", + "openContext": "Buka konteks", + "remove": "Hapus", + "selectBoard": "Pilih sebuah papan...", + "selectCertificateToUpload": "1. Pilih sertifikat untuk diunggah", + "selectDestinationBoardToUpload": "2. Pilih papan tujuan dan unggah sertifikat", + "upload": "Unggah", + "uploadFailed": "Gagal mengunggah. Mohon dicoba kembali.", + "uploadRootCertificates": "Unggah Sertifikat Akar SSL", + "uploadingCertificates": "Mengunggah sertifikat." + }, + "checkForUpdates": { + "checkForUpdates": "Periksa Pembaruan Arduino", + "installAll": "Pasang Semua", + "noUpdates": "Tidak ada pembaruan terbaru yang tersedia.", + "promptUpdateBoards": "Pembaruan tersedia untuk beberapa papan Anda.", + "promptUpdateLibraries": "Updates are available for some of your libraries.", + "updatingBoards": "Updating boards...", + "updatingLibraries": "Updating libraries..." + }, + "cli-error-parser": { + "keyboardError": "'Keyboard' not found. Does your sketch include the line '#include <Keyboard.h>'?", + "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" + }, + "cloud": { + "chooseSketchVisibility": "Choose visibility of your Sketch:", + "cloudSketchbook": "Cloud Sketchbook", + "connected": "Connected", + "continue": "Continue", + "donePulling": "Done pulling '{0}'.", + "donePushing": "Done pushing '{0}'.", + "embed": "Embed:", + "emptySketchbook": "Buku Sketsa anda kosong", + "goToCloud": "Go to Cloud", + "learnMore": "Learn more", + "link": "Link:", + "notYetPulled": "Cannot push to Cloud. It is not yet pulled.", + "offline": "Offline", + "openInCloudEditor": "Open in Cloud Editor", + "options": "Options...", + "privateVisibility": "Private. Only you can view the Sketch.", + "profilePicture": "Profile picture", + "publicVisibility": "Public. Anyone with the link can view the Sketch.", + "pull": "Pull", + "pullFirst": "You have to pull first to be able to push to the Cloud.", + "pullSketch": "Pull Sketch", + "pullSketchMsg": "Pulling this Sketch from the Cloud will overwrite its local version. Are you sure you want to continue?", + "push": "Push", + "pushSketch": "Push Sketch", + "pushSketchMsg": "This is a Public Sketch. Before pushing, make sure any sensitive information is defined in arduino_secrets.h files. You can make a Sketch private from the Share panel.", + "remote": "Remote", + "share": "Membagikan...", + "shareSketch": "Bagikan Sketsa", + "showHideSketchbook": "Show/Hide Cloud Sketchbook", + "signIn": "MASUK", + "signInToCloud": "Masuk ke Arduino Cloud", + "signOut": "Sign Out", + "sync": "Sinkron", + "syncEditSketches": "Sinkron dan edit Sketsa Arduino Cloud anda", + "visitArduinoCloud": "Kunjungi Arduino Cloud untuk membuat Sketsa Cloud" + }, + "cloudSketch": { + "alreadyExists": "Sketsa Cloud '{0}' sudah ada", + "creating": "Membuat Sketsa Cloud '{0}'...", + "new": "Sketsa Cloud Baru", + "notFound": "Could not pull the cloud sketch '{0}'. It does not exist.", + "pulling": "Synchronizing sketchbook, pulling '{0}'...", + "pushing": "Synchronizing sketchbook, pushing '{0}'...", + "renaming": "Renaming cloud sketch from '{0}' to '{1}'...", + "synchronizingSketchbook": "Synchronizing sketchbook..." + }, + "common": { + "all": "All", + "contributed": "Contributed", + "installManually": "Install Manually", + "later": "Later", + "noBoardSelected": "No board selected", + "noSketchOpened": "No sketch opened", + "notConnected": "[not connected]", + "offlineIndicator": "You appear to be offline. Without an Internet connection, the Arduino CLI might not be able to download the required resources and could cause malfunction. Please connect to the Internet and restart the application.", + "oldFormat": "The '{0}' still uses the old `.pde` format. Do you want to switch to the new `.ino` extension?", + "partner": "Partner", + "processing": "Processing", + "recommended": "Recommended", + "retired": "Retired", + "selectManually": "Select Manually", + "selectedOn": "on {0}", + "serialMonitor": "Serial Monitor", + "type": "Type", + "unknown": "Unknown", + "updateable": "Updatable", + "userAbort": "User abort" + }, + "compile": { + "error": "Compilation error: {0}" + }, + "component": { + "boardsIncluded": "Boards included in this package:", + "by": "by", + "clickToOpen": "Click to open in browser: {0}", + "filterSearch": "Filter your search...", + "install": "Install", + "installLatest": "Install Latest", + "installVersion": "Install {0}", + "installed": "{0} installed", + "moreInfo": "More info", + "otherVersions": "Other Versions", + "remove": "Hapus", + "title": "{0} by {1}", + "uninstall": "Uninstall", + "uninstallMsg": "Do you want to uninstall {0}?", + "update": "Update" + }, + "configuration": { + "cli": { + "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" + } + }, + "connectionStatus": { + "connectionLost": "Connection lost. Cloud sketch actions and updates won't be available." + }, + "contributions": { + "addFile": "Add File", + "fileAdded": "One file added to the sketch.", + "plotter": { + "couldNotOpen": "Couldn't open serial plotter" + }, + "replaceTitle": "Replace" + }, + "core": { + "compilerWarnings": { + "all": "All", + "default": "Default", + "more": "More", + "none": "None" + } + }, + "coreContribution": { + "copyError": "Copy error messages", + "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." + }, + "createCloudCopy": "Push Sketch to Cloud", + "daemon": { + "restart": "Restart Daemon", + "start": "Start Daemon", + "stop": "Stop Daemon" + }, + "debug": { + "debugWithMessage": "Debug - {0}", + "debuggingNotSupported": "Debugging is not supported by '{0}'", + "getDebugInfo": "Getting debug info...", + "noPlatformInstalledFor": "Platform is not installed for '{0}'", + "optimizeForDebugging": "Optimize for Debugging", + "sketchIsNotCompiled": "Sketch '{0}' must be verified before starting a debug session. Please verify the sketch and start debugging again. Do you want to verify the sketch now?" + }, + "developer": { + "clearBoardList": "Clear the Board List History", + "clearBoardsConfig": "Clear the Board and Port Selection", + "dumpBoardList": "Dump the Board List" + }, + "dialog": { + "dontAskAgain": "Don't ask again" + }, + "editor": { + "autoFormat": "Auto Format", + "commentUncomment": "Comment/Uncomment", + "copyForForum": "Copy for Forum (Markdown)", + "decreaseFontSize": "Decrease Font Size", + "decreaseIndent": "Decrease Indent", + "increaseFontSize": "Increase Font Size", + "increaseIndent": "Increase Indent", + "nextError": "Next Error", + "previousError": "Previous Error", + "revealError": "Reveal Error" + }, + "examples": { + "builtInExamples": "Built-in examples", + "couldNotInitializeExamples": "Could not initialize built-in examples.", + "customLibrary": "Examples from Custom Libraries", + "for": "Examples for {0}", + "forAny": "Examples for any board", + "menu": "Examples" + }, + "firmware": { + "checkUpdates": "Check Updates", + "failedInstall": "Installation failed. Please try again.", + "install": "Install", + "installingFirmware": "Installing firmware.", + "overwriteSketch": "Installation will overwrite the Sketch on the board.", + "selectBoard": "Pilih Papan", + "selectVersion": "Select firmware version", + "successfullyInstalled": "Firmware successfully installed.", + "updater": "Firmware Updater" + }, + "help": { + "environment": "Environment", + "faq": "Frequently Asked Questions", + "findInReference": "Find in Reference", + "gettingStarted": "Getting Started", + "keyword": "Type a keyword", + "privacyPolicy": "Privacy Policy", + "reference": "Reference", + "search": "Search on Arduino.cc", + "troubleshooting": "Troubleshooting", + "visit": "Visit Arduino.cc" + }, + "ide-updater": { + "checkForUpdates": "Check for Arduino IDE Updates", + "closeAndInstallButton": "Close and Install", + "closeToInstallNotice": "Close the software and install the update on your machine.", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", + "downloadButton": "Download", + "downloadingNotice": "Downloading the latest version of the Arduino IDE.", + "errorCheckingForUpdates": "Error while checking for Arduino IDE updates.\n{0}", + "goToDownloadButton": "Go To Download", + "goToDownloadPage": "An update for the Arduino IDE is available, but we're not able to download and install it automatically. Please go to the download page and download the latest version from there.", + "ideUpdaterDialog": "Software Update", + "newVersionAvailable": "A new version of Arduino IDE ({0}) is available for download.", + "noUpdatesAvailable": "There are no recent updates available for the Arduino IDE", + "notNowButton": "Not now", + "skipVersionButton": "Skip Version", + "updateAvailable": "Update Available", + "versionDownloaded": "Arduino IDE {0} has been downloaded." + }, + "installable": { + "libraryInstallFailed": "Failed to install library: '{0}{1}'.", + "platformInstallFailed": "Failed to install platform: '{0}{1}'." + }, + "library": { + "addZip": "Add .ZIP Library...", + "arduinoLibraries": "Arduino libraries", + "contributedLibraries": "Contributed libraries", + "include": "Include Library", + "installAll": "Pasang Semua", + "installLibraryDependencies": "Install library dependencies", + "installMissingDependencies": "Would you like to install all the missing dependencies?", + "installOneMissingDependency": "Would you like to install the missing dependency?", + "installWithoutDependencies": "Install without dependencies", + "installedSuccessfully": "Successfully installed library {0}:{1}", + "libraryAlreadyExists": "A library already exists. Do you want to overwrite it?", + "manageLibraries": "Manage Libraries...", + "namedLibraryAlreadyExists": "A library folder named {0} already exists. Do you want to overwrite it?", + "needsMultipleDependencies": "The library <b>{0}:{1}</b> needs some other dependencies currently not installed:", + "needsOneDependency": "The library <b>{0}:{1}</b> needs another dependency currently not installed:", + "overwriteExistingLibrary": "Do you want to overwrite the existing library?", + "successfullyInstalledZipLibrary": "Successfully installed library from {0} archive", + "title": "Library Manager", + "uninstalledSuccessfully": "Successfully uninstalled library {0}:{1}", + "zipLibrary": "Library" + }, + "librarySearchProperty": { + "topic": "Topic" + }, + "libraryTopic": { + "communication": "Communication", + "dataProcessing": "Data Processing", + "dataStorage": "Data Storage", + "deviceControl": "Device Control", + "display": "Display", + "other": "Other", + "sensors": "Sensors", + "signalInputOutput": "Signal Input/Output", + "timing": "Timing", + "uncategorized": "Uncategorized" + }, + "libraryType": { + "installed": "Installed" + }, + "menu": { + "advanced": "Advanced", + "sketch": "Sketch", + "tools": "Tools" + }, + "monitor": { + "alreadyConnectedError": "Could not connect to {0} {1} port. Already connected.", + "baudRate": "{0} baud", + "connectionFailedError": "Could not connect to {0} {1} port.", + "connectionFailedErrorWithDetails": "{0} Could not connect to {1} {2} port.", + "connectionTimeout": "Timeout. The IDE has not received the 'success' message from the monitor after successfully connecting to it", + "missingConfigurationError": "Could not connect to {0} {1} port. The monitor configuration is missing.", + "notConnectedError": "Not connected to {0} {1} port.", + "unableToCloseWebSocket": "Unable to close websocket", + "unableToConnectToWebSocket": "Unable to connect to websocket" + }, + "newCloudSketch": { + "newSketchTitle": "Name of the new Cloud Sketch" + }, + "portProtocol": { + "network": "Network", + "serial": "Serial" + }, + "preferences": { + "additionalManagerURLs": "Additional Boards Manager URLs", + "auth.audience": "The OAuth2 audience.", + "auth.clientID": "The OAuth2 client ID.", + "auth.domain": "The OAuth2 domain.", + "auth.registerUri": "The URI used to register a new user.", + "automatic": "Automatic", + "board.certificates": "List of certificates that can be uploaded to boards", + "browse": "Browse", + "checkForUpdate": "Receive notifications of available updates for the IDE, boards, and libraries. Requires an IDE restart after change. It's true by default.", + "choose": "Choose", + "cli.daemonDebug": "Enable debug logging of the gRPC calls to the Arduino CLI. A restart of the IDE is needed for this setting to take effect. It's false by default.", + "cloud.enabled": "True if the sketch sync functions are enabled. Defaults to true.", + "cloud.pull.warn": "True if users should be warned before pulling a cloud sketch. Defaults to true.", + "cloud.push.warn": "True if users should be warned before pushing a cloud sketch. Defaults to true.", + "cloud.pushpublic.warn": "True if users should be warned before pushing a public sketch to the cloud. Defaults to true.", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", + "cloud.sketchSyncEndpoint": "The endpoint used to push and pull sketches from a backend. By default it points to Arduino Cloud API.", + "compile": "compile", + "compile.experimental": "True if the IDE should handle multiple compiler errors. False by default", + "compile.revealRange": "Adjusts how compiler errors are revealed in the editor after a failed verify/upload. Possible values: 'auto': Scroll vertically as necessary and reveal a line. 'center': Scroll vertically as necessary and reveal a line centered vertically. 'top': Scroll vertically as necessary and reveal a line close to the top of the viewport, optimized for viewing a code definition. 'centerIfOutsideViewport': Scroll vertically as necessary and reveal a line centered vertically only if it lies outside the viewport. The default value is '{0}'.", + "compile.verbose": "True for verbose compile output. False by default", + "compile.warnings": "Tells gcc which warning level to use. It's 'None' by default", + "compilerWarnings": "Compiler warnings", + "editorFontSize": "Editor font size", + "editorQuickSuggestions": "Editor Quick Suggestions", + "enterAdditionalURLs": "Enter additional URLs, one for each row", + "files.inside.sketches": "Show files inside Sketches", + "ide.updateBaseUrl": "The base URL where to download updates from. Defaults to 'https://downloads.arduino.cc/arduino-ide'", + "ide.updateChannel": "Release channel to get updated from. 'stable' is the stable release, 'nightly' is the latest development build.", + "interfaceScale": "Interface scale", + "invalid.editorFontSize": "Invalid editor font size. It must be a positive integer.", + "invalid.sketchbook.location": "Invalid sketchbook location: {0}", + "invalid.theme": "Invalid theme.", + "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", + "language.log": "True if the Arduino Language Server should generate log files into the sketch folder. Otherwise, false. It's false by default.", + "language.realTimeDiagnostics": "If true, the language server provides real-time diagnostics when typing in the editor. It's false by default.", + "manualProxy": "Manual proxy configuration", + "monitor": { + "dockPanel": "The area of the application shell where the _{0}_ widget will reside. It is either \"bottom\" or \"right\". It defaults to \"{1}\"." + }, + "network": "Network", + "newSketchbookLocation": "Select new sketchbook location", + "noCliConfig": "Could not load the CLI configuration", + "noProxy": "No proxy", + "proxySettings": { + "hostname": "Host name", + "password": "Password", + "port": "Port number", + "username": "Username" + }, + "showVerbose": "Show verbose output during", + "sketch": { + "inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect." + }, + "sketchbook.location": "Sketchbook location", + "sketchbook.showAllFiles": "True to show all sketch files inside the sketch. It is false by default.", + "unofficialBoardSupport": "Click for a list of unofficial board support URLs", + "upload": "upload", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", + "upload.verbose": "True for verbose upload output. False by default.", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", + "verifyAfterUpload": "Verify code after upload", + "window.autoScale": "True if the user interface automatically scales with the font size.", + "window.zoomLevel": { + "deprecationMessage": "Deprecated. Use 'window.zoomLevel' instead." + } + }, + "renameCloudSketch": { + "renameSketchTitle": "New name of the Cloud Sketch" + }, + "replaceMsg": "Replace the existing version of {0}?", + "selectZip": "Select a zip file containing the library you'd like to add", + "serial": { + "autoscroll": "Autoscroll", + "carriageReturn": "Carriage Return", + "connecting": "Connecting to '{0}' on '{1}'...", + "message": "Message (Enter to send message to '{0}' on '{1}')", + "newLine": "New Line", + "newLineCarriageReturn": "Both NL & CR", + "noLineEndings": "No Line Ending", + "notConnected": "Not connected. Select a board and a port to connect automatically.", + "openSerialPlotter": "Serial Plotter", + "timestamp": "Timestamp", + "toggleTimestamp": "Toggle Timestamp" + }, + "sketch": { + "archiveSketch": "Archive Sketch", + "cantOpen": "A folder named \"{0}\" already exists. Can't open sketch.", + "compile": "Compiling sketch...", + "configureAndUpload": "Configure and Upload", + "createdArchive": "Created archive '{0}'.", + "doneCompiling": "Done compiling.", + "doneUploading": "Done uploading.", + "editInvalidSketchFolderLocationQuestion": "Do you want to try saving the sketch to a different location?", + "editInvalidSketchFolderQuestion": "Do you want to try saving the sketch with a different name?", + "exportBinary": "Export Compiled Binary", + "invalidCloudSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", + "invalidSketchFolderLocationDetails": "You cannot save a sketch into a folder inside itself.", + "invalidSketchFolderLocationMessage": "Invalid sketch folder location: '{0}'", + "invalidSketchFolderNameMessage": "Invalid sketch folder name: '{0}'", + "invalidSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", + "moving": "Moving", + "movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?", + "new": "New Sketch", + "noTrailingPeriod": "A filename cannot end with a dot", + "openFolder": "Open Folder", + "openRecent": "Open Recent", + "openSketchInNewWindow": "Open Sketch in New Window", + "reservedFilename": "'{0}' is a reserved filename.", + "saveFolderAs": "Save sketch folder as...", + "saveSketch": "Save your sketch to open it again later.", + "saveSketchAs": "Save sketch folder as...", + "showFolder": "Show Sketch Folder", + "sketch": "Sketch", + "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", + "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", + "sketchbook": "Sketchbook", + "titleLocalSketchbook": "Local Sketchbook", + "titleSketchbook": "Sketchbook", + "upload": "Unggah", + "uploadUsingProgrammer": "Upload Using Programmer", + "uploading": "Uploading...", + "userFieldsNotFoundError": "Can't find user fields for connected board", + "verify": "Verify", + "verifyOrCompile": "Verify/Compile" + }, + "sketchbook": { + "newCloudSketch": "Sketsa Cloud Baru", + "newSketch": "New Sketch" + }, + "theme": { + "currentThemeNotFound": "Could not find the currently selected theme: {0}. Arduino IDE has picked a built-in theme compatible with the missing one.", + "dark": "Dark", + "deprecated": "{0} (deprecated)", + "hc": "Dark High Contrast", + "hcLight": "Light High Contrast", + "light": "Light", + "user": "{0} (user)" + }, + "title": { + "cloud": "Cloud" + }, + "updateIndexes": { + "updateIndexes": "Update Indexes", + "updateLibraryIndex": "Update Library Index", + "updatePackageIndex": "Update Package Index" + }, + "upload": { + "error": "{0} error: {1}" + }, + "userFields": { + "cancel": "Cancel", + "enterField": "Enter {0}", + "upload": "Unggah" + }, + "validateSketch": { + "abortFixMessage": "The sketch is still invalid. Do you want to fix the remaining problems? By clicking '{0}', a new sketch will open.", + "abortFixTitle": "Invalid sketch", + "renameSketchFileMessage": "The sketch file '{0}' cannot be used. {1} Do you want to rename the sketch file now?", + "renameSketchFileTitle": "Invalid sketch filename", + "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", + "renameSketchFolderTitle": "Invalid sketch name" + }, + "versionWelcome": { + "cancelButton": "Maybe later", + "donateButton": "Donate now", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Welcome to a new version of the Arduino IDE!", + "titleWithVersion": "Welcome to the new Arduino IDE {0}!" + }, + "workspace": { + "alreadyExists": "'{0}' already exists." + } + }, + "theia": { + "core": { + "cannotConnectBackend": "Cannot connect to the backend.", + "cannotConnectDaemon": "Cannot connect to the CLI daemon.", + "couldNotSave": "Could not save the sketch. Please copy your unsaved work into your favorite text editor, and restart the IDE.", + "daemonOffline": "CLI Daemon Offline", + "offline": "Offline", + "offlineText": "Offline", + "quitTitle": "Are you sure you want to quit?" + }, + "editor": { + "unsavedTitle": "Unsaved – {0}" + }, + "messages": { + "collapse": "Collapse", + "expand": "Expand" + }, + "workspace": { + "deleteCloudSketch": "The cloud sketch '{0}' will be permanently deleted from the Arduino servers and the local caches. This action is irreversible. Do you want to delete the current sketch?", + "deleteCurrentSketch": "The sketch '{0}' will be permanently deleted. This action is irreversible. Do you want to delete the current sketch?", + "fileNewName": "Name for new file", + "invalidExtension": ".{0} is not a valid extension", + "newFileName": "New name for file" + } + } +} diff --git a/i18n/it.json b/i18n/it.json index d74d69501..85a4132c0 100644 --- a/i18n/it.json +++ b/i18n/it.json @@ -1,42 +1,55 @@ { "arduino": { "about": { - "detail": "Versione: {0}\nData: {1}{2}\nVersione CLI: {3}{4} [{5}]\n\n{6}", + "detail": "Versione: {0}\nData: {1}{2}\nVersione CLI: {3}\n\n{4}", "label": "Informazioni su {0}" }, + "account": { + "goToCloudEditor": "Vai all'editor del cloud", + "goToIoTCloud": "Vai al cloud IoT", + "goToProfile": "Vai al profilo", + "menuTitle": "Cloud di Arduino" + }, "board": { "board": "Scheda{0}", - "boardConfigDialogTitle": "Select Other Board and Port", + "boardConfigDialogTitle": "Seleziona un'altra scheda e un'altra porta", + "boardDataReloaded": "Dati della scheda ricaricati.", "boardInfo": "Informazioni sulla scheda", + "boards": "schede", "configDialog1": "Seleziona una scheda ed una porta se vuoi caricare uno sketch.", "configDialog2": "Se selezioni solo una scheda, potrai compilare, ma non potrai caricare il tuo sketch.", "couldNotFindPreviouslySelected": "Impossibile trovare la scheda selezionata '{0}' nella piattaforma installata '{1}'. Scegli nuovamente la scheda che vuoi utilizzare. Vuoi sceglierla ora?", - "disconnected": "Disconnesso", + "editBoardsConfig": "Modifica scheda e porta...", "getBoardInfo": "Acquisisci informazioni sulla scheda", "inSketchbook": "(nella raccolta degli sketch)", - "installNow": "Il \"{0} {1}\" core non è installato per la scheda \"{2}\" . Vuoi installarlo ora?", - "noFQBN": "La FQBN non è disponibile per la scheda selezionata\"{0}\". Sei sicuro che il core specifico sia stato installato?", - "noPortsDiscovered": "No ports discovered", - "noPortsSelected": "Nessuna porta selezionata per la scheda: '{0}'.", - "noneSelected": "Nessuna scheda selezionata.", + "installNow": "Il \"{0} {1}\" core non è installato per la scheda \"{2}\". Vuoi installarlo ora?", + "noBoardsFound": "Nessuna scheda trovata per \"{0}\"", + "noNativeSerialPort": "Porta seriale nativa, non è possibile ottenere informazioni.", + "noPortsDiscovered": "Nessuna porta rilevata", + "nonSerialPort": "Porta non seriale, non è possibile ottenere informazioni.", "openBoardsConfig": "Scegli un'altra scheda e un altra porta...", - "platformMissing": "La piattaforma per la scheda '{0}' non è installata.", "pleasePickBoard": "Scegli la scheda collegata alla porta che hai selezionato.", "port": "Porta{0}", - "portLabel": "Porta: {0}", + "ports": "porte", "programmer": "Programmatore", + "reloadBoardData": "Ricarica i dati della scheda", "reselectLater": "Riselezionare più tardi", - "searchBoard": "Search board", + "revertBoardsConfig": "Usa '{0}' rilevato su '{1}'", + "searchBoard": "Cerca la scheda", "selectBoard": "Seleziona la scheda", - "selectBoardForInfo": "Seleziona la scheda per la quale desideri informazioni.", + "selectBoardToReload": "Seleziona una scheda.", "selectPortForInfo": "Selezionare la porta per ottenere info sulla scheda.", "showAllAvailablePorts": "Quando abilitato, mostra tutte le porte disponibili", + "showAllPorts": "Mostra tutte le porte", "succesfullyInstalledPlatform": "Piattaforma installata correttamente {0}:{1}", - "succesfullyUninstalledPlatform": "Piattaforma disinstallata correttamente {0}:{1}" + "succesfullyUninstalledPlatform": "Piattaforma disinstallata correttamente {0}:{1}", + "typeOfPorts": "{0} porte", + "unconfirmedBoard": "Scheda non confermata", + "unknownBoard": "Scheda sconosciuta" }, "boardsManager": "Gestore schede", "boardsType": { - "arduinoCertified": "Arduino Certified" + "arduinoCertified": "Certificato Arduino" }, "bootloader": { "burnBootloader": "Scrivi il bootloader", @@ -64,27 +77,28 @@ "uploadingCertificates": "Caricamento dei certificati." }, "checkForUpdates": { - "checkForUpdates": "Check for Arduino Updates", - "installAll": "Install All", - "noUpdates": "There are no recent updates available.", - "promptUpdateBoards": "Updates are available for some of your boards.", - "promptUpdateLibraries": "Updates are available for some of your libraries.", - "updatingBoards": "Updating boards...", - "updatingLibraries": "Updating libraries..." + "checkForUpdates": "Controlla gli aggiornamenti di Arduino", + "installAll": "Installa tutto", + "noUpdates": "Non sono disponibili aggiornamenti recenti.", + "promptUpdateBoards": "Sono disponibili aggiornamenti per alcune schede.", + "promptUpdateLibraries": "Sono disponibili aggiornamenti per alcune librerie.", + "updatingBoards": "Aggiornamento delle schede in corso...", + "updatingLibraries": "Aggiornamento delle librerie in corso..." }, "cli-error-parser": { "keyboardError": "'Keyboard' non è stato trovato. Il tuo sketch include la linea '#include <Keyboard.h>' nel codice?", "mouseError": "'Mouse' non è stato trovato. Il tuo sketch include la linea '#include <Mouse.h>' nel codice?" }, "cloud": { - "account": "Account", "chooseSketchVisibility": "Scegli a chi far vedere il tuo Sketch:", + "cloudSketchbook": "Cloud Sketchbook", "connected": "Connesso", "continue": "Continua", - "donePulling": "Pulling terminato ‘{0}’.", - "donePushing": "Invio terminato ‘{0}’.", + "donePulling": "Scaricamento di '{0}' effettuato.", + "donePushing": "Invio di '{0}' effettuato.", "embed": "Includi:", "emptySketchbook": "La raccolta degli sketch è vuota", + "goToCloud": "Vai al Cloud", "learnMore": "Più informazioni", "link": "Link:", "notYetPulled": "Sul Cloud non puoi effettuare il push se non hai ancora fatto il pull", @@ -93,67 +107,106 @@ "options": "Opzioni...", "privateVisibility": "Privato. Solo tu potrai vedere lo sketch.", "profilePicture": "Immagine profilo", - "publicVisibility": "Pubblico. Chiunque abbia il link può vedere lo Sketch.", + "publicVisibility": "Pubblico. Chiunque abbia il link può vedere lo sketch.", "pull": "Richiedi", "pullFirst": "Nel Cloud devi prima effettuare il Pull per poi poter eseguire il Push.", - "pullSketch": "Richiedi lo Sketch", - "pullSketchMsg": "Richiedendo questo Sketch tramite il Cloud, lo stesso sovrascriverà quello presente in locale. Sei sicuro di dover continuare?", + "pullSketch": "Richiedi lo sketch", + "pullSketchMsg": "Richiedendo questo sketch tramite il cloud, lo stesso sovrascriverà quello presente in locale. Sei sicuro di voler continuare?", "push": "Push", - "pushSketch": "Invia lo Sketch", - "pushSketchMsg": "Questo è uno sketch pubblico. Prima di inviarlo, verifica che tutte le informazioni sensibili siano all'interno di arduino_secrets.h. Eventualmente puoi rendere lo sketch privato dal Pannello di Condivisione.", + "pushSketch": "Invia lo sketch", + "pushSketchMsg": "Questo è uno sketch pubblico. Prima di inviarlo, verifica che tutte le informazioni sensibili siano all'interno di arduino_secrets.h. Eventualmente, puoi rendere lo sketch privato dal pannello della condivisione.", "remote": "Remoto", - "remoteSketchbook": "Raccolta remota degli sketch", "share": "Condividi...", "shareSketch": "Condividi sketch", - "showHideRemoveSketchbook": "Mostra/Nascondi la raccolta remota degli sketch", - "signIn": "COLLEGATI", + "showHideSketchbook": "Mostra/Nascondi la raccolta remota degli sketch", + "signIn": "ACCEDI", "signInToCloud": "Effettua la registrazione su Arduino Cloud", "signOut": "Disconnetti", "sync": "Sincronizza", - "syncEditSketches": "Sincronizza e modifica la tua raccolta di Sketches sul Cloud Arduino", - "visitArduinoCloud": "Visita Arduino Cloud per creare Cloud Sketch " + "syncEditSketches": "Sincronizza e modifica la tua raccolta degli sketch sul cloud di Arduino", + "visitArduinoCloud": "Visita il cloud di Arduino per creare gli sketch." + }, + "cloudSketch": { + "alreadyExists": "Lo sketch remoto '{0}' è già presente.", + "creating": "Creazione in corso dello sketch remoto '{0}'...", + "new": "Nuovo Sketch remoto", + "notFound": "Impossibile scaricare lo sketch remoto '{0}'. Non esiste.", + "pulling": "Sincronizzazione degli sketch, pulling \"{0}\"...", + "pushing": "Sincronizzazione della raccolta degli sketch in corso, sto inviando '{0}'...", + "renaming": "Sto rinominando lo sketch remoto da '{0}' a '{1}'...", + "synchronizingSketchbook": "Sincronizzazione della raccolta degli sketch in corso..." }, "common": { - "all": "All", - "contributed": "Contributed", + "all": "Tutti", + "contributed": "Fornita da terzi", "installManually": "Installa manualmente", "later": "Salta", "noBoardSelected": "Nessuna scheda selezionata", + "noSketchOpened": "Nessuno sketch aperto", "notConnected": "[non connesso]", "offlineIndicator": "Sembra che tu sia offline. Senza una connessione Internet, l'Arduino CLI potrebbe non essere in grado di scaricare le risorse richieste e potrebbe causare un malfunzionamento. Verificare la connessione a Internet e riavviare l'applicazione.", - "oldFormat": "Il '{0}' utilizza ancora il vecchio formato `.pde` . Vuoi sostituirlo con la nuova estensione `.ino?", + "oldFormat": "Il '{0}' utilizza ancora il vecchio formato `.pde`. Vuoi sostituirlo con la nuova estensione `.ino?", "partner": "Partner", "processing": "In elaborazione", - "recommended": "Recommended", - "retired": "Retired", + "recommended": "Consigliato", + "retired": "Fuori produzione", + "selectManually": "Seleziona manualmente", "selectedOn": "su {0}", "serialMonitor": "Monitor seriale", - "type": "Type", + "type": "Tipo", "unknown": "Sconosciuto", - "updateable": "Updatable" + "updateable": "Aggiornabile", + "userAbort": "Interruzione da parte dell'utente" }, "compile": { "error": "Errore di compilazione: {0}" }, "component": { - "boardsIncluded": "Boards included in this package:", + "boardsIncluded": "Schede incluse in questo pacchetto:", "by": "da", + "clickToOpen": "Cliccare per aprire nel browser: {0}", "filterSearch": "Filtra la tua ricerca...", "install": "Installa", + "installLatest": "Installa il più recente", + "installVersion": "Installa {0}", + "installed": "{0} installato", "moreInfo": "Maggiori informazioni", + "otherVersions": "Altre versioni", + "remove": "Rimuovi", + "title": "{0} di {1}", "uninstall": "Disinstalla", - "uninstallMsg": "Vuoi veramente disinstallare 1 {0} ?", - "version": "Versione {0}" + "uninstallMsg": "Vuoi veramente disinstallare {0}?", + "update": "Aggiornamento" + }, + "configuration": { + "cli": { + "inaccessibleDirectory": "Impossibile accedere alla raccolta degli sketch presenti in '{0}': {1}" + } + }, + "connectionStatus": { + "connectionLost": "Connessione persa. Le azioni e gli aggiornamenti degli sketch del cloud non saranno disponibili." }, "contributions": { - "addFile": "Aggiungi file...", + "addFile": "Aggiungi file", "fileAdded": "Aggiunto un file allo sketch.", + "plotter": { + "couldNotOpen": "Impossibile aprire la porta seriale" + }, "replaceTitle": "Sostituisci" }, + "core": { + "compilerWarnings": { + "all": "Tutti", + "default": "Predefinito", + "more": "Altro", + "none": "Nessuno" + } + }, "coreContribution": { "copyError": "Copia messaggi di errore", - "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." + "noBoardSelected": "Non è stata selezionata alcuna scheda. Selezionare la tua scheda Arduino dal menu Strumenti > Scheda." }, + "createCloudCopy": "Invia lo sketch nel cloud", "daemon": { "restart": "Riavvia il demone", "start": "Avvia il demone", @@ -161,9 +214,16 @@ }, "debug": { "debugWithMessage": "Debug - {0}", - "debuggingNotSupported": "Il debug non è supportato da '{0}'", + "debuggingNotSupported": "Il debug non è supportato da '{0}'", + "getDebugInfo": "Acquisizione delle informazioni di debug in corso...", "noPlatformInstalledFor": "La piattaforma non è ancora stata installata per '{0}'", - "optimizeForDebugging": "Ottimizzato per il Debug." + "optimizeForDebugging": "Ottimizzato per il debug", + "sketchIsNotCompiled": "Lo sketch '{0}' deve essere verificato prima di avviare una sessione di debug. Verificare lo sketch e avviare nuovamente il debug. Si desidera verificare lo sketch adesso?" + }, + "developer": { + "clearBoardList": "Cancella la cronologia dell'elenco delle schede", + "clearBoardsConfig": "Cancella la selezione della scheda e della porta", + "dumpBoardList": "Scarica l'elenco delle schede" }, "dialog": { "dontAskAgain": "Non chiedere più" @@ -178,17 +238,13 @@ "increaseIndent": "Aumenta indentazione", "nextError": "Errore Successivo", "previousError": "Errore Precedente", - "revealError": "Reveal Error" - }, - "electron": { - "couldNotSave": "Non è stato possibile salvare lo sketch. Si consiglia di copiarlo è salvarlo su un file di testo e solo successivamente riavviare l' Arduino IDE. ", - "unsavedChanges": "Eventuali modifiche non salvate verranno perse" + "revealError": "Rileva l'errore" }, "examples": { "builtInExamples": "Esempi integrati", "couldNotInitializeExamples": "Impossibile inizializzare gli esempi incorporati.", "customLibrary": "Esempi da librerie di terzi", - "for": "Esempi per {0}", + "for": "Esempi per {0}", "forAny": "Esempi per tutte le schede", "menu": "Esempi" }, @@ -201,7 +257,7 @@ "selectBoard": "Seleziona la scheda", "selectVersion": "Selezione la versione del firmware", "successfullyInstalled": "Firmware correttamente installato.", - "updater": "WiFi101 / WiFiNINA Aggiornamento Frmware" + "updater": "Aggiornamento del firmware" }, "help": { "environment": "Ambiente di sviluppo", @@ -216,61 +272,68 @@ "visit": "Vai al sito Arduino.cc" }, "ide-updater": { - "checkForUpdates": "Check for Arduino IDE Updates", + "checkForUpdates": "Controlla gli aggiornamenti dell'IDE di Arduino", "closeAndInstallButton": "Chiudi e Installa", "closeToInstallNotice": "Chiudi il software e installa l’aggiornamento sulla tua macchina", + "donateLinkIconTitle": "apri la pagina delle donazioni", + "donateLinkText": "dona per sostenerci", + "donateText": "L'open source è amore, {0}", "downloadButton": "Scarica", "downloadingNotice": "Stai scaricando l’ultima versione dell’Arduino IDE", - "errorCheckingForUpdates": "Si è verificato un errore durante il controllo degli aggiornamenti per Arduino IDE {0} .", + "errorCheckingForUpdates": "Si è verificato un errore durante il controllo degli aggiornamenti per Arduino IDE {0}.", "goToDownloadButton": "Clicca per scaricare", "goToDownloadPage": "E' disponibile un nuovo aggiornamento per Arduino IDE, ma attualmente non è possibile scaricarlo ne tantomeno installarlo in modalità automatica. Si consiglia di andare sul sito ufficiale e dalla pagina download scaricare l'ultima versione disponibile. ", "ideUpdaterDialog": "Aggiornamento software", - "newVersionAvailable": "La nuova versione (1{0}) di Arduino IDE è disponibile per il download.", + "newVersionAvailable": "La nuova versione ({0}) di Arduino IDE è disponibile per il download.", "noUpdatesAvailable": "Non ci sono aggiornamenti recenti per Arduino IDE ", "notNowButton": "Non ora", "skipVersionButton": "Salta questa versione", "updateAvailable": "Aggiornamento disponibile", - "versionDownloaded": "L'Arduino IDE ( 1 {0} ) è stato correttamente scaricato." + "versionDownloaded": "Arduino IDE {0} è stato scaricato correttamente." + }, + "installable": { + "libraryInstallFailed": "Impossibile installare la libreria: '{0}{1}'.", + "platformInstallFailed": "Impossibile installare la piattaforma: '{0}{1}'." }, "library": { "addZip": "Aggiungi libreria da file .ZIP...", "arduinoLibraries": "Librerie Arduino", "contributedLibraries": "Librerie di terze parti", - "dependenciesForLibrary": "Dipendenze per la libreria {0}:{1}", "include": "Includi Libreria", "installAll": "Installa tutto", + "installLibraryDependencies": "Installa le dipendenze della libreria", "installMissingDependencies": "Vorresti installare tutte le dipendenze mancanti?", "installOneMissingDependency": "Vorresti installare le dipendenze mancanti?", - "installOnly": "Installa {0} solamente", - "installedSuccessfully": "Libreria installata correttamente 1{0} : 2{1} ", + "installWithoutDependencies": "Installa senza le dipendenze", + "installedSuccessfully": "Libreria installata correttamente {0}:{1}", "libraryAlreadyExists": "Libreria già presente. Vuoi sovrascriverla?", - "manageLibraries": "Gestisci Librerie", + "manageLibraries": "Gestisci librerie...", "namedLibraryAlreadyExists": "La cartella con nome {0} esiste già. Vuoi sovrascriverla?", - "needsMultipleDependencies": "La libreria <b>{0}:{1}</b> di altre dipendenze che al momento non risultano installate:", - "needsOneDependency": "La libreria <b>{0}:{1}</b> necessità di dipendenze che attualmente non sono installate:", + "needsMultipleDependencies": "La libreria <b>{0}:{1}</b> necessita altre dipendenze che attualmente non sono installate:", + "needsOneDependency": "La libreria <b>{0}:{1}</b> necessita di dipendenze che attualmente non sono installate:", "overwriteExistingLibrary": "Vuoi sovrascrivere la libreria esistente?", "successfullyInstalledZipLibrary": "La libreria è stata installata con successo dalla cartella {0}", "title": "Gestore Librerie", - "uninstalledSuccessfully": "Libreria disinstallata con successo 1{0} : 2{1}", + "uninstalledSuccessfully": "Libreria disinstallata con successo {0}:{1}", "zipLibrary": "Libreria" }, "librarySearchProperty": { - "topic": "Topic" + "topic": "Argomento" }, "libraryTopic": { - "communication": "Communication", - "dataProcessing": "Data Processing", - "dataStorage": "Data Storage", - "deviceControl": "Device Control", - "display": "Display", - "other": "Other", - "sensors": "Sensors", - "signalInputOutput": "Signal Input/Output", - "timing": "Timing", - "uncategorized": "Uncategorized" + "communication": "Comunicazione", + "dataProcessing": "Elaborazione dati", + "dataStorage": "Archiviazione dati", + "deviceControl": "Controllo dispositivi", + "display": "Schermo", + "other": "Altro", + "sensors": "Sensori", + "signalInputOutput": "Segnale di ingresso/uscita", + "timing": "Sincronizzazione", + "uncategorized": "Senza categoria" }, "libraryType": { - "installed": "Installed" + "installed": "Installata" }, "menu": { "advanced": "Avanzate", @@ -278,9 +341,23 @@ "tools": "Strumenti" }, "monitor": { + "alreadyConnectedError": "Impossibile connettere alla porta {0} {1}. Già connesso.", + "baudRate": "{0} baud", + "connectionFailedError": "Impossibile connettere alla porta {0} {1}.", + "connectionFailedErrorWithDetails": "{0} Impossibile connettere alla porta {1} {2}.", + "connectionTimeout": "Tempo scaduto. L'IDE non ha ricevuto il messaggio di 'successo' dal monitor dopo essersi connesso con esso.", + "missingConfigurationError": "Impossibile connettere alla porta {0} {1}. Manca la configurazione del monitor.", + "notConnectedError": "Non connesso alla porta {0} {1}.", "unableToCloseWebSocket": "Impossibile chiudere il websocket", "unableToConnectToWebSocket": "Impossibile connettersi al websocket" }, + "newCloudSketch": { + "newSketchTitle": "Nome del nuovo sketch remoto" + }, + "portProtocol": { + "network": "Rete", + "serial": "Seriale" + }, "preferences": { "additionalManagerURLs": "URL aggiuntive per il Gestore schede", "auth.audience": "Protocollo pubblico OAuth2", @@ -290,53 +367,75 @@ "automatic": "Automatico", "board.certificates": "Lista dei certificati che possono essere caricati nelle schede", "browse": "Sfoglia", - "checkForUpdate": "Receive notifications of available updates for the IDE, boards, and libraries. Requires an IDE restart after change. It's true by default.", + "checkForUpdate": "Ricevere le notifiche degli aggiornamenti disponibili per l'IDE, le schede e le librerie. Richiede il riavvio dell'IDE dopo la modifica. È abilitata per impostazione predefinita.", "choose": "Scegli", "cli.daemonDebug": "Abilita il debug logging delle chiamate gRPC alla CLI di Arduino. Per rendere effettiva questa impostazione, è necessario un riavvio dell'IDE. L'impostazione predefinita è false.", "cloud.enabled": "Imposta su true per abilitare le funzioni di sincronia dello sketch. Il valore predefinito è true.", "cloud.pull.warn": "Imposta su true se gli utenti devono essere avvisato dopo avere effettuato il pull dello sketch sul cloud. Il valore predefinito è true.", "cloud.push.warn": "Imposta su True se gli utenti devono essere avvisati prima di eseguire l'invio di uno sketch cloud. Il valore predefinito è true.", "cloud.pushpublic.warn": "Imposta su true se gli utenti devono essere avvisati prima di eseguire l'invio di uno sketch pubblico nel cloud. Il valore predefinito è true.", + "cloud.sharedSpaceId": "L'ID dello spazio condiviso di Arduino Cloud da cui caricare lo sketchbook. Se vuoto, viene selezionato lo spazio privato.", "cloud.sketchSyncEndpoint": "La destinazione utilizzata per inviare e richiedere gli schizzi da un back-end. L'impostazione predefinita utilizza Arduino Cloud API.", "compile": "compilazione", "compile.experimental": "Imposta su true se l'IDE deve gestire errori multipli del compilatore. Il valore predefinito è false.", "compile.revealRange": "Regola il modo in cui gli errori del compilatore vengono rivelati nell'editor, dopo una verifica/caricamento non andato a buon fine. Valori possibili: 'auto': scorre verticalmente come necessario e rivela una riga. 'center': scorre verticalmente come necessario e rivela una riga centrata verticalmente. 'top': scorre verticalmente come necessario e rivela una riga vicino alla parte superiore della finestra, ottimizzata per la visualizzazione di una definizione di codice. 'centerIfOutsideViewport': scorre in verticale come necessario e rivela una riga centrata verticalmente solo se si trova al di fuori della finestra di visualizzazione. Il valore predefinito è '{0}'.", "compile.verbose": "Vero per compilazione esplicita. Falso come opzione predefinita", - "compile.warnings": "Indica a gcc il livello di avviso che deve mostrare. Il valore predefinito è 'None' ", + "compile.warnings": "Indica a gcc il livello di avviso che deve mostrare. Il valore predefinito è \"Nessuno\"", "compilerWarnings": "Warning del compilatore", "editorFontSize": "Dimensione del carattere dell'editor", "editorQuickSuggestions": "Suggerimenti rapidi dell'editor", "enterAdditionalURLs": "Aggiungi degli URLs aggiuntivi, uno per ogni riga", - "files.inside.sketches": "Mostra i file all'interno degli Sketch", + "files.inside.sketches": "Mostra i file all'interno degli sketch", "ide.updateBaseUrl": "L'URL base da cui scaricare gli aggiornamenti. Il valore predefinito è 'https://downloads.arduino.cc/arduino-ide'", "ide.updateChannel": "Canale di rilascio per le versioni aggiornate. 'stable' è per le versioni stabili, 'nightly' è per l'ultima versione in sviluppo.", "interfaceScale": "Scalabilità dell'interfaccia", "invalid.editorFontSize": "Dimensione del carattere dell'editor non valida. Deve essere un numero intero positivo.", "invalid.sketchbook.location": "Posizione dello sketchbook non valida: {0}", "invalid.theme": "Tema non valido", + "language.asyncWorkers": "Numero di worker async utilizzati da Arduino Language Server (clangd). Anche l'indice di background utilizza questo numero di worker. Il valore minimo è 0 e il massimo è 8. Quando è 0, il server linguistico utilizza tutti i core disponibili. Il valore predefinito è 0.", "language.log": "Imposta su True se vuoi che l'Arduino Language Server generi il file di log all'interno della cartella dello sketch. Diversamente, imposta su false. L'impostazione predefinita è false.", "language.realTimeDiagnostics": "Se vero, il server linguistico fornisce una diagnostica in tempo reale durante la digitazione nell'editor. Per impostazione predefinita è falso.", "manualProxy": "Configurazione manuale del proxy", + "monitor": { + "dockPanel": "L'area della shell dell'applicazione in cui risiederà il widget _{0}_ . Può essere \"in basso\" o \"a destra\". Il valore predefinito è \"{1}\"." + }, "network": "Rete", "newSketchbookLocation": "Seleziona un percorso per il nuovo sketchbook", + "noCliConfig": "Impossibile caricare il file di configurazione della CLI", "noProxy": "Nessun proxy", + "proxySettings": { + "hostname": "Nome host", + "password": "Password", + "port": "Numero di porta", + "username": "Nome utente" + }, "showVerbose": "Mostra un output dettagliato durante", - "sketchbook.location": "Posizione della raccolta degli sketch", + "sketch": { + "inoBlueprint": "Percorso assoluto del filesystem per il file predefinito blueprint `.ino`. Se specificato, il contenuto del file blueprint sarà utilizzato per ogni nuovo sketch creato dall'IDE. Se non specificato, gli sketch saranno generati con il contenuto predefinito di Arduino. I file blueprint non accessibili saranno ignorati. **È necessario un riavvio dell'IDE** affinché questa impostazione abbia effetto." + }, + "sketchbook.location": "Percorso della cartella degli sketch", "sketchbook.showAllFiles": "Vero per mostrare tutti i file relativi contenuti all'interno dello sketch. L'opzione predefinita è falso.", - "survey.notification": "Vero se gli utenti devono essere avvisati quando è disponibile un sondaggio. Vero per impostazione predefinita.", "unofficialBoardSupport": "Clicca per ottenere la lista di collegamenti per le schede di terze parti, non schede ufficiali.", "upload": "caricamento", - "upload.verbose": " Seleziona Vero per un rapporto dettagliato durante l'upload. Il valore predefinito è impostato su falso", + "upload.autoVerify": "Vero se l'IDE deve verificare automaticamente il codice prima del caricamento. Vero per impostazione predefinita. Quando questo valore è falso, l'IDE non ricompila il codice prima di caricare il binario sulla scheda. Si consiglia di impostare questo valore su false solo se si sa cosa si sta facendo.", + "upload.verbose": "Vero per un rapporto dettagliato durante l'upload. Il valore predefinito è impostato su falso.", + "upload.verify": "Dopo il caricamento, verificare che il contenuto della memoria sulla scheda corrisponda al binario caricato.", "verifyAfterUpload": "Verifica il codice dopo il caricamento", - "window.autoScale": "Impostato su True l'interfaccia scala automaticamente in base alla dimensione del font .", - "window.zoomLevel": "Regola il livello di zoom della finestra. La dimensione originale è 0 e ogni incremento sopra (es. 1) o sotto (es. -1) rappresenta lo zoom del 20% in più o in meno. Puoi anche inserire i decimali per regolare il livello di zoom con una granularità più fine." + "window.autoScale": "Vero se l'interfaccia scala automaticamente in base alla dimensione del font.", + "window.zoomLevel": { + "deprecationMessage": "Non più disponibile. Al suo posto utilizza 'windows.zoomLevel'." + } + }, + "renameCloudSketch": { + "renameSketchTitle": "Nuovo nome dello sketch remoto" }, - "replaceMsg": "Sostituisce la versione esistente con la versione 1{0} ?", + "replaceMsg": "Sostituire la versione esistente con la versione {0}?", "selectZip": "Scegli il file zip che contiene la libreria che vuoi aggiungere", "serial": { "autoscroll": "Scorrimento automatico", "carriageReturn": "Ritorno carrello (CR)", - "message": "Messaggio({0} + Invio per inviare il messaggio a '{1}' su '{2}')", + "connecting": "Connessione in corso di '{0}' su '{1}'...", + "message": "Messaggio (premi Enter per inviare il messaggio a '{0}' on '{1}')", "newLine": "A capo (NL)", "newLineCarriageReturn": "Entrambi NL & CR", "noLineEndings": "Nessun fine riga", @@ -348,77 +447,115 @@ "sketch": { "archiveSketch": "Archivia sketch", "cantOpen": "Una cartella di nome \"{0}\" esiste già. Impossibile aprire lo sketch.", - "close": "Sei sicuro di voler chiudere lo sketch?", "compile": "Compilazione dello sketch in corso...", - "configureAndUpload": "Configurare e caricare", + "configureAndUpload": "Configura e carica", "createdArchive": "Creato l'archivio '{0}'.", "doneCompiling": "Compilazione completata.", "doneUploading": "Caricamento terminato.", + "editInvalidSketchFolderLocationQuestion": "Vuoi provare a salvare lo sketch in una posizione diversa?", + "editInvalidSketchFolderQuestion": "Vuoi provare a salvare lo sketch con un nome diverso?", "exportBinary": "Esporta sketch compilato", + "invalidCloudSketchName": "Il nome deve iniziare con una lettera, un numero o un trattino basso, seguito da lettere, numeri, trattini, punti e trattini bassi. La lunghezza massima è di 36 caratteri.", + "invalidSketchFolderLocationDetails": "Non è possibile salvare uno sketch in una cartella al suo interno.", + "invalidSketchFolderLocationMessage": "Posizione della cartella degli sketch non valida: '{0}'", + "invalidSketchFolderNameMessage": "Nome della cartella degli sketch non valida: '{0}'", + "invalidSketchName": "Il nome deve iniziare con una lettera, un numero o un trattino basso, seguito da lettere, numeri, trattini, punti e trattini bassi. La lunghezza massima è di 63 caratteri.", "moving": "Spostando", - "movingMsg": "Il file \"{0}\" deve essere all'interno della cartella \"{1}\".\nCreare questa cartella, spostare il file e continuare?", - "new": "Nuovo", + "movingMsg": "Il file \"{0}\" deve essere all'interno della cartella \"{1}\".\nCreare questa cartella, spostare il file e continuare?", + "new": "Nuovo sketch", + "noTrailingPeriod": "Il nome di un file non può terminare con un punto", "openFolder": "Apri Cartella", "openRecent": "Apri recenti", - "openSketchInNewWindow": "Apri lo sketch in una Nuova Finestra.", + "openSketchInNewWindow": "Apri lo sketch in una nuova finestra", + "reservedFilename": "'{0}' è il nome di un file riservato.", "saveFolderAs": "Salva la cartella sketch come...", "saveSketch": "Salva il tuo sketch per riaprirlo in seguito.", "saveSketchAs": "Salva la cartella dello sketch come...", - "showFolder": "Mostra la cartella dello Sketch", + "showFolder": "Mostra la cartella dello sketch", "sketch": "Sketch", + "sketchAlreadyContainsThisFileError": "Lo sketch contiene già un file denominato '{0}'", + "sketchAlreadyContainsThisFileMessage": "Impossibile salvare lo sketch \"{0}\" come \"{1}\". {2}", "sketchbook": "Raccolta degli sketch", "titleLocalSketchbook": "Cartella degli sketch locali", "titleSketchbook": "Sketchbook", - "upload": "Caricare", - "uploadUsingProgrammer": "Carica tramite Programmatore", + "upload": "Carica", + "uploadUsingProgrammer": "Carica tramite programmatore", "uploading": "Caricamento in corso...", "userFieldsNotFoundError": "Non è possibile trovare i campi utente per connettere la scheda", "verify": "Verifica", "verifyOrCompile": "Verifica/Compila" }, - "survey": { - "answerSurvey": "Rispondi al questionario", - "dismissSurvey": "Non mostrare più", - "surveyMessage": "Aiutaci a migliorare rispondendo a questo brevissimo questionario. Abbiamo a cuore la nostra comunità e vorremmo conoscere meglio chi ci supporta!" + "sketchbook": { + "newCloudSketch": "Nuovo sketch remoto", + "newSketch": "Nuovo sketch" + }, + "theme": { + "currentThemeNotFound": "Impossibile trovare il tema attualmente selezionato: {0}. Arduino IDE ha selezionato un tema integrato compatibile con quello mancante.", + "dark": "Scuro", + "deprecated": "{0} (deprecato)", + "hc": "Scuro ad alto contrasto", + "hcLight": "Chiaro ad alto contrasto", + "light": "Chiaro", + "user": "{0} (utente)" + }, + "title": { + "cloud": "Cloud" + }, + "updateIndexes": { + "updateIndexes": "Aggiorna gli indici", + "updateLibraryIndex": "Aggiorna l'indice di libreria", + "updatePackageIndex": "Aggiorna l'indice del pacchetto" }, "upload": { - "error": "1 {0} errore: 2 {1}" + "error": "{0} errore: {1}" }, "userFields": { "cancel": "Annulla", - "enterField": "Enter {0}", + "enterField": "Inserisci {0}", "upload": "Carica" + }, + "validateSketch": { + "abortFixMessage": "Lo sketch non è ancora valido. Vuoi risolvere i problemi rimanenti? Facendo clic su '{0}', si aprirà un nuovo sketch.", + "abortFixTitle": "Lo sketch non è valido", + "renameSketchFileMessage": "Il file dello sketch '{0}' non può essere usato. {1} Vuoi rinominare adesso lo sketch?", + "renameSketchFileTitle": "Il nome del file dello sketch non è valido", + "renameSketchFolderMessage": "Lo sketch '{0}' non può essere usato. {1} Per eliminare questo messaggio, rinomina lo sketch. Vuoi rinominare adesso lo sketch?", + "renameSketchFolderTitle": "Il nome dello sketch non è valido" + }, + "versionWelcome": { + "cancelButton": "Forse in seguito", + "donateButton": "Dona adesso", + "donateMessage": "Arduino si impegna a mantenere il software libero e open-source per tutti. La tua donazione ci aiuta a sviluppare nuove funzionalità, a migliorare le librerie e a supportare milioni di utenti in tutto il mondo.", + "donateMessage2": "Considera l'opportunità di sostenere il nostro lavoro sull'IDE open source gratuito di Arduino.", + "title": "Benvenuto nella nuova versione dell'IDE di Arduino!", + "titleWithVersion": "Benvenuto nel nuovo IDE di Arduino! {0}!" + }, + "workspace": { + "alreadyExists": "'{0}' è già presente." } }, - "cloud": { - "GoToCloud": "Vai al Cloud" - }, "theia": { "core": { "cannotConnectBackend": "Non reisco a collegarmi al backend", "cannotConnectDaemon": "Non riesco a collegarmi al demone CLI", "couldNotSave": "Non è stato possibile salvare lo sketch. Si consiglia di copiarlo è salvarlo su un file di testo e solo successivamente riavviare l' Arduino IDE. ", "daemonOffline": "Il CLI Daemon è disconnesso", - "offline": "Disconnesso", + "offline": "Offline", + "offlineText": "Offline", "quitTitle": "Sei sicuro di volere chiudere?" }, - "debug": { - "start": "Inizio...", - "startError": "Si è verificato un problema all'avvio del debug, per ulteriori controlla i logs", - "typeNotSupported": "Il tipo di sessione di debug \" 1 {0} \" non è supportato. " - }, "editor": { - "unsavedTitle": "Non salvato – 1{0}" + "unsavedTitle": "Non salvato – {0}" }, "messages": { "collapse": "Collassa", "expand": "Espandi" }, "workspace": { + "deleteCloudSketch": "Lo sketch remoto '{0}' sarà eliminato definitivamente dai server di Arduino e dalle cache locali. Questa azione è irreversibile. Vuoi eliminare lo sketch?", "deleteCurrentSketch": "Vuoi eliminare lo sketch attuale?", "fileNewName": "Nome per il nuovo file", "invalidExtension": "\".{0}\" non è un'estensione valida", - "invalidFilename": "Nome del file invalido", "newFileName": "Nuovo nome del file" } } diff --git a/i18n/ja.json b/i18n/ja.json index c05d5b40a..3e0a869a1 100644 --- a/i18n/ja.json +++ b/i18n/ja.json @@ -1,46 +1,59 @@ { "arduino": { "about": { - "detail": "バージョン: {0}\n日付: {1}{2}\nCLIバージョン: {3}{4} [{5}]\n\n{6}", + "detail": "バージョン:{0}\n日付:{1}{2}\nCLIバージョン:{3}\n\n{4}", "label": "{0}について" }, + "account": { + "goToCloudEditor": "クラウドエディターへ移動", + "goToIoTCloud": "IoTクラウドへ移動", + "goToProfile": "プロファイルへ移動", + "menuTitle": "Arduinoクラウド" + }, "board": { "board": "ボード{0}", - "boardConfigDialogTitle": "Select Other Board and Port", + "boardConfigDialogTitle": "他のボードとポートを選択", + "boardDataReloaded": "Board data reloaded.", "boardInfo": "ボード情報", + "boards": "ボード", "configDialog1": "スケッチを書き込みたい場合には、ボードとポートの両方を選択してください。", "configDialog2": "ボードのみを選択した場合、コンパイルはできますが、スケッチの書き込みはできません。", "couldNotFindPreviouslySelected": "インストールされているプラットフォーム'{1}'で、以前に選択したボード'{0}'が見つかりませんでした。使用したいボードを手動で選択し直してください。今すぐ選択し直しますか?", - "disconnected": "切断中", + "editBoardsConfig": "Edit Board and Port...", "getBoardInfo": "ボード情報を取得", "inSketchbook": "(スケッチブック内)", "installNow": "現在選択されているボード\"{2}\"用にコア\"{0} {1}\"をインストールする必要があります。今すぐインストールしますか?", - "noFQBN": "選択されたボード\"{0}\"にはFQBNがありません。対応するコアをインストール済みですか?", - "noPortsDiscovered": "No ports discovered", - "noPortsSelected": "ボード用に選択されたポートがありません: '{0}'.", - "noneSelected": "ボード未選択です。", + "noBoardsFound": "\"{0}\"のボードが見つかりませんでした", + "noNativeSerialPort": "ネイティブのシリアルポートで、情報を取得できません。", + "noPortsDiscovered": "ポートが見つかりませんでした", + "nonSerialPort": "シリアルポートではないため、情報を取得できません。", "openBoardsConfig": "他のボードとポートを選択…", - "platformMissing": "選択したボード'{0}'用のプラットフォームがインストールされていません。", "pleasePickBoard": "選択したポートに接続されているボードを選んでください。", "port": "ポート{0}", - "portLabel": "ポート: {0}", + "ports": "ポート", "programmer": "書き込み装置", + "reloadBoardData": "Reload Board Data", "reselectLater": "後で選択しなおす", - "searchBoard": "Search board", + "revertBoardsConfig": "Use '{0}' discovered on '{1}'", + "searchBoard": "ボードを検索", "selectBoard": "ボードを選択", - "selectBoardForInfo": "ボード情報を得るには、ボードを選択してください。", + "selectBoardToReload": "Please select a board first.", "selectPortForInfo": "ボード情報を得るには、ポートを選択してください。", "showAllAvailablePorts": "有効な場合、利用可能なすべてのポートを表示", + "showAllPorts": "全てのポートを表示", "succesfullyInstalledPlatform": "プラットフォーム{0}:{1}のインストールに成功しました", - "succesfullyUninstalledPlatform": "プラットフォーム{0}:{1}のアンインストールに成功しました" + "succesfullyUninstalledPlatform": "プラットフォーム{0}:{1}のアンインストールに成功しました", + "typeOfPorts": "{0}ポート", + "unconfirmedBoard": "Unconfirmed board", + "unknownBoard": "未知のボード" }, "boardsManager": "ボードマネージャ", "boardsType": { - "arduinoCertified": "Arduino Certified" + "arduinoCertified": "Arduino認定" }, "bootloader": { "burnBootloader": "ブートローダを書き込む", - "burningBootloader": "Burning bootloader...", + "burningBootloader": "ブートローダを書き込み中…", "doneBurningBootloader": "ブートローダの書き込みが完了しました。" }, "burnBootloader": { @@ -64,32 +77,33 @@ "uploadingCertificates": "証明書を書き込み中。" }, "checkForUpdates": { - "checkForUpdates": "Check for Arduino Updates", - "installAll": "Install All", - "noUpdates": "There are no recent updates available.", - "promptUpdateBoards": "Updates are available for some of your boards.", - "promptUpdateLibraries": "Updates are available for some of your libraries.", - "updatingBoards": "Updating boards...", - "updatingLibraries": "Updating libraries..." + "checkForUpdates": "Arduinoのアップデートを確認", + "installAll": "全てをインストール", + "noUpdates": "最近のアップデートはありません。", + "promptUpdateBoards": "一部のボードにアップデートがあります。", + "promptUpdateLibraries": "一部のライブラリにアップデートがあります。", + "updatingBoards": "ボードをアップデート中…", + "updatingLibraries": "ライブラリをアップデート中…" }, "cli-error-parser": { "keyboardError": "'Keyboard'が見つかりません。スケッチに'#include <Keyboard.h>'という行はありますか?", "mouseError": "'Mouse'が見つかりません。スケッチに'#include <Mouse.h>'という行はありますか?" }, "cloud": { - "account": "アカウント", "chooseSketchVisibility": "スケッチの可視性を選択:", + "cloudSketchbook": "クラウドスケッチブック", "connected": "接続済み", "continue": "続ける", - "donePulling": "‘{0}’のプルが完了しました。", - "donePushing": "‘{0}’のプッシュが完了しました。", + "donePulling": "Done pulling '{0}'.", + "donePushing": "Done pushing '{0}'.", "embed": "埋め込み:", "emptySketchbook": "スケッチブックは空です", + "goToCloud": "クラウドへ", "learnMore": "詳細はこちら", "link": "リンク:", "notYetPulled": "クラウドにプッシュできません。まだプルされていません。", "offline": "オフライン", - "openInCloudEditor": "クラウドエディタで開く", + "openInCloudEditor": "クラウドエディターで開く", "options": "オプション…", "privateVisibility": "プライベート:スケッチを見られるのは自分だけです。", "profilePicture": "プロフィール画像", @@ -102,10 +116,9 @@ "pushSketch": "スケッチをプッシュする", "pushSketchMsg": "これはパブリックなスケッチです。プッシュする前に、すべての機密情報がarduino_secrets.hファイルで定義されていることを確認してください。共有パネルでスケッチをプライベートにできます。", "remote": "リモート", - "remoteSketchbook": "リモートスケッチブック", "share": "共有...", "shareSketch": "スケッチを共有", - "showHideRemoveSketchbook": "リモートスケッチブックの表示・非表示", + "showHideSketchbook": "クラウドスケッチブックの表示・非表示", "signIn": "ログイン", "signInToCloud": "Arduino Cloudにログインする", "signOut": "ログアウト", @@ -113,47 +126,87 @@ "syncEditSketches": "Arduinoクラウドスケッチの同期と編集", "visitArduinoCloud": "Arduino Cloudにアクセスしてクラウドスケッチを作成する" }, + "cloudSketch": { + "alreadyExists": "クラウドスケッチ'{0}'は既に存在しています。", + "creating": "クラウドスケッチ'{0}'を作成中…", + "new": "新規クラウドスケッチ", + "notFound": "クラウドスケッチ'{0}'を取得できませんでした。存在しません。", + "pulling": "スケッチブックを同期中。'{0}'を取得中です…", + "pushing": "スケッチブックを同期中。'{0}'をプッシュ中です…", + "renaming": "クラウドスケッチの名前を'{0}'から'{1}'に変更中です...", + "synchronizingSketchbook": "スケッチブックを同期中です…" + }, "common": { - "all": "All", - "contributed": "Contributed", + "all": "全て", + "contributed": "提供された", "installManually": "手動でインストール", "later": "後で", "noBoardSelected": "ボード未選択", + "noSketchOpened": "No sketch opened", "notConnected": "[未接続]", "offlineIndicator": "オフラインのようです。 インターネットに接続していないと、Arduino CLIが必要なリソースをダウンロードできず、誤動作を引き起こす可能性があります。 インターネットに接続して、アプリケーションを再起動してください。", "oldFormat": "'{0}'はまだ古い`.pde`形式を使用しています。新しい`.ino`拡張子に切り替えますか?", - "partner": "Partner", + "partner": "パートナー", "processing": "処理中", - "recommended": "Recommended", - "retired": "Retired", + "recommended": "推奨", + "retired": "廃止済み", + "selectManually": "Select Manually", "selectedOn": "{0}の", "serialMonitor": "シリアルモニタ", - "type": "Type", + "type": "タイプ", "unknown": "不明", - "updateable": "Updatable" + "updateable": "アップデート可能", + "userAbort": "User abort" }, "compile": { "error": "コンパイルエラー: {0}" }, "component": { - "boardsIncluded": "Boards included in this package:", + "boardsIncluded": "このパッケージに含まれるボード:", "by": "by", + "clickToOpen": "Click to open in browser: {0}", "filterSearch": "検索をフィルタ…", "install": "インストール", + "installLatest": "Install Latest", + "installVersion": "Install {0}", + "installed": "{0} installed", "moreInfo": "詳細情報", + "otherVersions": "Other Versions", + "remove": "削除", + "title": "{0} by {1}", "uninstall": "アンインストール", "uninstallMsg": "{0}をアンインストールしますか?", - "version": "バージョン{0}" + "update": "Update" + }, + "configuration": { + "cli": { + "inaccessibleDirectory": "'{0}': {1}にあるスケッチブックにアクセスできませんでした" + } + }, + "connectionStatus": { + "connectionLost": "Connection lost. Cloud sketch actions and updates won't be available." }, "contributions": { "addFile": "ファイルを追加...", "fileAdded": "スケッチにファイルが1つ追加されました。", + "plotter": { + "couldNotOpen": "シリアルプロッタを開けませんでした" + }, "replaceTitle": "置換" }, + "core": { + "compilerWarnings": { + "all": "全て", + "default": "デフォルト", + "more": "詳細", + "none": "なし" + } + }, "coreContribution": { "copyError": "エラーメッセージをコピー", - "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." + "noBoardSelected": "ボードが選択されていません。ツール > ボードメニューからArduinoボードを選択してください。" }, + "createCloudCopy": "Push Sketch to Cloud", "daemon": { "restart": "Daemonを再起動", "start": "Daemonを開始", @@ -162,8 +215,15 @@ "debug": { "debugWithMessage": "デバッグ - {0}", "debuggingNotSupported": "デバッグは'{0}'ではサポートされていません。", + "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "'{0}'用にプラットフォームがインストールされていません。", - "optimizeForDebugging": "デバッグに最適化" + "optimizeForDebugging": "デバッグに最適化", + "sketchIsNotCompiled": "デバッグセッションを開始する前に、スケッチ'{0}'を検証する必要があります。スケッチを検証してから、もう一度デバッグを開始してください。今すぐスケッチを検証しますか?" + }, + "developer": { + "clearBoardList": "Clear the Board List History", + "clearBoardsConfig": "Clear the Board and Port Selection", + "dumpBoardList": "Dump the Board List" }, "dialog": { "dontAskAgain": "次回から表示しない" @@ -178,11 +238,7 @@ "increaseIndent": "インデントを増やす", "nextError": "次のエラー", "previousError": "前のエラー", - "revealError": "Reveal Error" - }, - "electron": { - "couldNotSave": "スケッチを保存できませんでした。保存されていない作業内容を好きなテキストエディタにコピーして、IDEを再起動してください。", - "unsavedChanges": "未保存の変更は保存されません。" + "revealError": "エラーを表示" }, "examples": { "builtInExamples": "付属のスケッチ例", @@ -201,7 +257,7 @@ "selectBoard": "ボードを選択", "selectVersion": "ファームウェアのバージョンを選択", "successfullyInstalled": "ファームウェアのインストールに成功しました。", - "updater": "WiFi101 / WiFiNINAファームウェア・アップデータ" + "updater": "Firmware Updater" }, "help": { "environment": "環境", @@ -216,9 +272,12 @@ "visit": "Arduino.ccウェブサイトを開く" }, "ide-updater": { - "checkForUpdates": "Check for Arduino IDE Updates", + "checkForUpdates": "Arduino IDEのアップデートを確認", "closeAndInstallButton": "終了してインストール", "closeToInstallNotice": "ソフトウェアを終了してアップデートをインストールする。", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", "downloadButton": "ダウンロード", "downloadingNotice": "Arduino IDEの最新版をダウンロード中です。", "errorCheckingForUpdates": "Arduino IDEの更新を確認中にエラーが発生しました。\n{0}", @@ -232,16 +291,20 @@ "updateAvailable": "アップデートがあります", "versionDownloaded": "Arduino IDE {0}がダウンロードされました。" }, + "installable": { + "libraryInstallFailed": "Failed to install library: '{0}{1}'.", + "platformInstallFailed": "Failed to install platform: '{0}{1}'." + }, "library": { "addZip": ".ZIP形式のライブラリをインストール...", "arduinoLibraries": "Arduinoライブラリ", "contributedLibraries": "提供されたライブラリ", - "dependenciesForLibrary": "ライブラリ{0}:{1}の依存関係", "include": "ライブラリをインクルード", "installAll": "全てをインストール", + "installLibraryDependencies": "ライブラリの依存関係をインストール", "installMissingDependencies": "不足している全ての依存関係をインストールしますか?", "installOneMissingDependency": "不足している依存関係をインストールしますか?", - "installOnly": "{0}のみインストール", + "installWithoutDependencies": "依存関係なしにインストール", "installedSuccessfully": "ライブラリ{0}:{1}のインストールに成功しました。", "libraryAlreadyExists": "ライブラリはすでに存在しています。上書きしますか?", "manageLibraries": "ライブラリを管理...", @@ -255,22 +318,22 @@ "zipLibrary": "ライブラリ" }, "librarySearchProperty": { - "topic": "Topic" + "topic": "トピック" }, "libraryTopic": { - "communication": "Communication", - "dataProcessing": "Data Processing", - "dataStorage": "Data Storage", - "deviceControl": "Device Control", - "display": "Display", - "other": "Other", - "sensors": "Sensors", - "signalInputOutput": "Signal Input/Output", - "timing": "Timing", - "uncategorized": "Uncategorized" + "communication": "コミュニケーション", + "dataProcessing": "データ処理", + "dataStorage": "データ保存", + "deviceControl": "デバイス制御", + "display": "ディスプレイ", + "other": "その他", + "sensors": "センサ", + "signalInputOutput": "信号入出力", + "timing": "タイミング", + "uncategorized": "未分類" }, "libraryType": { - "installed": "Installed" + "installed": "インストール済み" }, "menu": { "advanced": "詳細", @@ -278,9 +341,23 @@ "tools": "ツール" }, "monitor": { + "alreadyConnectedError": "Could not connect to {0} {1} port. Already connected.", + "baudRate": "{0} baud", + "connectionFailedError": "Could not connect to {0} {1} port.", + "connectionFailedErrorWithDetails": "{0} Could not connect to {1} {2} port.", + "connectionTimeout": "Timeout. The IDE has not received the 'success' message from the monitor after successfully connecting to it", + "missingConfigurationError": "Could not connect to {0} {1} port. The monitor configuration is missing.", + "notConnectedError": "Not connected to {0} {1} port.", "unableToCloseWebSocket": "websocketを閉じることができません", "unableToConnectToWebSocket": "websocketに接続することができません" }, + "newCloudSketch": { + "newSketchTitle": "新しいクラウドスケッチの名前" + }, + "portProtocol": { + "network": "ネットワーク", + "serial": "シリアル" + }, "preferences": { "additionalManagerURLs": "追加のボードマネージャのURL", "auth.audience": "OAuth2オーディエンス。", @@ -290,13 +367,14 @@ "automatic": "自動", "board.certificates": "ボードに書き込みできる証明書の一覧", "browse": "参照", - "checkForUpdate": "Receive notifications of available updates for the IDE, boards, and libraries. Requires an IDE restart after change. It's true by default.", + "checkForUpdate": "IDE、ボード、ライブラリの利用可能なアップデートに関する通知を受け取ることができます。変更後にIDEの再起動が必要です。デフォルトはtrue。", "choose": "選択", "cli.daemonDebug": "Arduino CLIへのgRPC呼び出しのデバッグロギングを有効にします。この設定を有効にするにはIDEを再起動する必要があります。デフォルトはfalseです。", "cloud.enabled": "スケッチの同期機能が有効な場合にはtrueを指定。デフォルトではtrue。", "cloud.pull.warn": "クラウドスケッチをプルする前に、ユーザーに警告を表示するにはtrueを指定。デフォルトではtrue。", "cloud.push.warn": "クラウドスケッチをプッシュする前に、ユーザーに警告を表示するにはtrueを指定。デフォルトではtrue。", "cloud.pushpublic.warn": "パブリックスケッチをクラウドにプッシュする前に、ユーザーに警告を表示するにはtrueを指定。デフォルトではtrue。", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", "cloud.sketchSyncEndpoint": "バックエンドからスケッチをプッシュ/プルするために使用されるエンドポイント。デフォルトではArduino Cloud APIを指します。", "compile": "コンパイル", "compile.experimental": "IDEが複数のコンパイラエラーを処理するよう設定するにはtrueを指定します。デフォルトは falseです。", @@ -311,32 +389,53 @@ "ide.updateBaseUrl": "アップデートをダウンロードするためのベースURL。デフォルトは 'https://downloads.arduino.cc/arduino-ide' です。", "ide.updateChannel": "アップデート元のリリースチャンネル。stableは安定版リリース、nightlyは最新の開発用ビルドです。", "interfaceScale": "インターフェイスのスケール", - "invalid.editorFontSize": "エディタのフォントサイズが無効です。正の整数でなければなりません。", + "invalid.editorFontSize": "エディターのフォントサイズが無効です。正の整数でなければなりません。", "invalid.sketchbook.location": "スケッチブックの場所が無効です: {0}", "invalid.theme": "無効なテーマです。", + "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", "language.log": "Arduino Language Serverがスケッチフォルダにログファイルを生成した方がよい場合はtrue。それ以外はfalse。デフォルトではfalse。", "language.realTimeDiagnostics": "trueの場合、言語サーバーはエディターでの入力時にリアルタイムの診断を提供します。デフォルトはfalseです。", "manualProxy": "手動プロキシ設定", + "monitor": { + "dockPanel": "The area of the application shell where the _{0}_ widget will reside. It is either \"bottom\" or \"right\". It defaults to \"{1}\"." + }, "network": "ネットワーク", "newSketchbookLocation": "新しいスケッチブックの場所を選択", + "noCliConfig": "CLIの設定を読み込めませんでした", "noProxy": "プロキシなし", + "proxySettings": { + "hostname": "ホスト名", + "password": "パスワード", + "port": "ポート番号", + "username": "ユーザー名" + }, "showVerbose": "より詳細な情報を表示する", + "sketch": { + "inoBlueprint": "デフォルトの `.ino` ブループリント・ファイルへの絶対ファイルシステムパス。指定された場合、IDEによって作成されるすべての新しいスケッチに、ブループリント・ファイルの内容が使用されます。指定されない場合、スケッチはArduinoデフォルトの内容で生成されます。アクセスできないブループリント・ファイルは無視されます。この設定を有効にするには**IDE の再起動が必要**です。" + }, "sketchbook.location": "スケッチブックの場所", "sketchbook.showAllFiles": "スケッチ内のすべてのスケッチファイルを表示するにはtrueを指定。デフォルトではfalse。", - "survey.notification": "アンケートが利用可能になったとき、通知を受け取る場合はTrueを指定します。デフォルトではTrue。", "unofficialBoardSupport": "クリックして非公式ボードをサポートするURLのリストを表示", "upload": "書き込み", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", "upload.verbose": "書き込み時に詳細な出力を行うにはtrueを指定。デフォルトではfalse。", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "書き込み後にコードを検証する", "window.autoScale": "ユーザーインターフェイスをフォントサイズに合わせて自動的に拡大縮小させるにはtrueを指定。", - "window.zoomLevel": "ウィンドウの拡大率を調整します。元のサイズは0で、数値を上(例:1)か下(例:-1)に変えるごとに20%拡大率が変わります。小数を入力して、拡大率をより細かく調整することもできます。" + "window.zoomLevel": { + "deprecationMessage": "廃止済み。代わりに'window.zoomLevel'を使用してください。" + } + }, + "renameCloudSketch": { + "renameSketchTitle": "クラウドスケッチの新しい名前" }, "replaceMsg": "{0}の既存のバージョンを置き換えますか?", "selectZip": "追加したいライブラリの入ったZIPファイルを選択", "serial": { "autoscroll": "自動スクロール", "carriageReturn": "CRのみ", - "message": "メッセージ('{2}'の'{1}'にメッセージを送信するには{0} + Enter)", + "connecting": "Connecting to '{0}' on '{1}'...", + "message": "メッセージ('{1}'の{0}にメッセージを送信するにはEnter)", "newLine": "LFのみ", "newLineCarriageReturn": "CRおよびLF", "noLineEndings": "改行なし", @@ -348,65 +447,103 @@ "sketch": { "archiveSketch": "スケッチをアーカイブする", "cantOpen": "「{0}」というフォルダはすでに存在します。スケッチを開けません。", - "close": "本当にスケッチを閉じますか?", - "compile": "Compiling sketch...", + "compile": "スケッチをコンパイル中…", "configureAndUpload": "構成と書き込み", "createdArchive": "アーカイブ'{0}'を作成しました。", "doneCompiling": "コンパイル完了。", "doneUploading": "書き込み完了", + "editInvalidSketchFolderLocationQuestion": "スケッチを別の場所に保存してみますか?", + "editInvalidSketchFolderQuestion": "スケッチを別の名前で保存しますか?", "exportBinary": "コンパイル済みバイナリをエクスポート", + "invalidCloudSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", + "invalidSketchFolderLocationDetails": "スケッチは、それ自身の中のフォルダに保存することはできません。", + "invalidSketchFolderLocationMessage": "無効なスケッチフォルダの場所:'{0}'。", + "invalidSketchFolderNameMessage": "スケッチフォルダの名前が無効です:'{0}'", + "invalidSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", "moving": "移動", "movingMsg": "ファイル\"{0}\"は、\"{1}\"という名前のスケッチフォルダの中にあることが必要です。\nこのフォルダを作成し、ファイルを移動させ、継続しますか?", - "new": "新規", + "new": "新規スケッチ", + "noTrailingPeriod": "ファイル名の末尾にドットを付けることはできません", "openFolder": "フォルダを開く", "openRecent": "最近使った項目を開く", "openSketchInNewWindow": "新規ウィンドウでスケッチを開く", + "reservedFilename": "'{0}'は予約されたファイル名です。", "saveFolderAs": "スケッチフォルダを別名で保存…", "saveSketch": "あとで再び開くためスケッチを保存する。", "saveSketchAs": "スケッチを別名で保存…", "showFolder": "スケッチフォルダを表示", "sketch": "スケッチ", + "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", + "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", "sketchbook": "スケッチブック", "titleLocalSketchbook": "ローカルスケッチブック", "titleSketchbook": "スケッチブック", "upload": "書き込み", "uploadUsingProgrammer": "書き込み装置を使って書き込む", - "uploading": "Uploading...", + "uploading": "書き込み中…", "userFieldsNotFoundError": "接続されたボードのユーザーフィールドが見つかりません。", "verify": "検証", "verifyOrCompile": "検証・コンパイル" }, - "survey": { - "answerSurvey": "アンケートに回答する", - "dismissSurvey": "次回から表示しない", - "surveyMessage": "とても簡単なアンケートに答えて、私たちの改善にご協力ください。私たちはコミュニティを大切にしており、サポーターのことをもう少しよく知りたいのです。" + "sketchbook": { + "newCloudSketch": "新規クラウドスケッチ", + "newSketch": "新規スケッチ" + }, + "theme": { + "currentThemeNotFound": "Could not find the currently selected theme: {0}. Arduino IDE has picked a built-in theme compatible with the missing one.", + "dark": "Dark", + "deprecated": "{0} (deprecated)", + "hc": "Dark High Contrast", + "hcLight": "Light High Contrast", + "light": "Light", + "user": "{0} (user)" + }, + "title": { + "cloud": "Cloud" + }, + "updateIndexes": { + "updateIndexes": "インデックスを更新", + "updateLibraryIndex": "ライブラリのインデックスを更新", + "updatePackageIndex": "パッケージのインデックスを更新" }, "upload": { "error": "{0} エラー: {1}" }, "userFields": { "cancel": "キャンセル", - "enterField": "Enter {0}", + "enterField": "{0}を入力", "upload": "マイコンボードに書き込む" + }, + "validateSketch": { + "abortFixMessage": "スケッチはまだ無効です。残りの問題を修正しますか?'{0}'をクリックすると、新しいスケッチが開かれます。", + "abortFixTitle": "無効なスケッチです", + "renameSketchFileMessage": "スケッチファイル'{0}'は使用できません。{1}スケッチファイルの名前を今すぐ変更しますか?", + "renameSketchFileTitle": "無効なスケッチファイル名です", + "renameSketchFolderMessage": "スケッチ'{0}'は使用できません。{1}このメッセージをなくすには、スケッチの名前を変えてください。今すぐスケッチ名を変更しますか?", + "renameSketchFolderTitle": "無効なスケッチ名です" + }, + "versionWelcome": { + "cancelButton": "Maybe later", + "donateButton": "Donate now", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Welcome to a new version of the Arduino IDE!", + "titleWithVersion": "Welcome to the new Arduino IDE {0}!" + }, + "workspace": { + "alreadyExists": "'{0}'は既に存在しています。" } }, - "cloud": { - "GoToCloud": "クラウドへ" - }, "theia": { "core": { "cannotConnectBackend": "バックエンドに接続できません。", "cannotConnectDaemon": "CLI daemonに接続できません。", - "couldNotSave": "スケッチを保存できませんでした。保存されていない作業内容を好きなテキストエディタにコピーして、IDEを再起動してください。", + "couldNotSave": "スケッチを保存できませんでした。保存されていない作業内容を好きなテキストエディターにコピーして、IDEを再起動してください。", "daemonOffline": "CLI Daemonはオフラインです", "offline": "オフライン", + "offlineText": "オフライン", "quitTitle": "本当に終了しますか?" }, - "debug": { - "start": "開始…", - "startError": "デバッグセッションの開始時にエラーが発生しました。詳細はログを確認してください。", - "typeNotSupported": "デバッグセッションのタイプ\"{0}\"はサポートされていません。" - }, "editor": { "unsavedTitle": "未保存 – {0}" }, @@ -415,10 +552,10 @@ "expand": "展開する" }, "workspace": { - "deleteCurrentSketch": "現在のスケッチを削除しますか?", + "deleteCloudSketch": "クラウドスケッチ'{0}'はArduinoサーバおよびローカルキャッシュから永久に削除されます。この動作はやり直せません。現在のスケッチを削除しますか?", + "deleteCurrentSketch": "スケッチ'{0}'は永久に削除されます。この動作はやり直せません。現在のスケッチを削除しますか?", "fileNewName": "新しいファイルの名前", "invalidExtension": "拡張子「.{0}」は、使えません。", - "invalidFilename": "無効なファイル名です。", "newFileName": "ファイルの新しい名前" } } diff --git a/i18n/ko.json b/i18n/ko.json index 1c71ca237..e20f83d77 100644 --- a/i18n/ko.json +++ b/i18n/ko.json @@ -1,224 +1,283 @@ { "arduino": { "about": { - "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}{4} [{5}]\n\n{6}", - "label": "About {0}" + "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", + "label": "프로그램 정보 {0}" + }, + "account": { + "goToCloudEditor": "Go to Cloud Editor", + "goToIoTCloud": "Go to IoT Cloud", + "goToProfile": "Go to Profile", + "menuTitle": "Arduino Cloud" }, "board": { - "board": "Board{0}", - "boardConfigDialogTitle": "Select Other Board and Port", - "boardInfo": "Board Info", - "configDialog1": "Select both a Board and a Port if you want to upload a sketch.", - "configDialog2": "If you only select a Board you will be able to compile, but not to upload your sketch.", - "couldNotFindPreviouslySelected": "Could not find previously selected board '{0}' in installed platform '{1}'. Please manually reselect the board you want to use. Do you want to reselect it now?", - "disconnected": "Disconnected", - "getBoardInfo": "Get Board Info", - "inSketchbook": " (in Sketchbook)", - "installNow": "The \"{0} {1}\" core has to be installed for the currently selected \"{2}\" board. Do you want to install it now?", - "noFQBN": "The FQBN is not available for the selected board \"{0}\". Do you have the corresponding core installed?", - "noPortsDiscovered": "No ports discovered", - "noPortsSelected": "No ports selected for board: '{0}'.", - "noneSelected": "No boards selected.", - "openBoardsConfig": "Select other board and port…", - "platformMissing": "The platform for the selected '{0}' board is not installed.", - "pleasePickBoard": "Please pick a board connected to the port you have selected.", - "port": "Port{0}", - "portLabel": "Port: {0}", - "programmer": "Programmer", - "reselectLater": "Reselect later", - "searchBoard": "Search board", + "board": "보드{0}", + "boardConfigDialogTitle": "보드 및 포트 선택", + "boardDataReloaded": "Board data reloaded.", + "boardInfo": "보드 정보", + "boards": "boards", + "configDialog1": "스케치를 업로드할 보드 및 포트를 선택", + "configDialog2": "보드를 선택하면 컴파일은 가능하지만, 스케치를 업로드 할 수 없습니다.", + "couldNotFindPreviouslySelected": "선택된 보드를 찾을 수 없습니다. '{0}' 설치된 플랫폼에서'{1}'. 수동으로 사용 할 보드를 선택해주세요.\n지금 보드를 다시 선택하시겠습니까?", + "editBoardsConfig": "Edit Board and Port...", + "getBoardInfo": "보드정보 얻기", + "inSketchbook": "(스케치북에서)", + "installNow": "\"{0} {1}\"버전은 최근에 선택된 \"{2}\"보드를 설치해야 합니다. 지금 설치하시겠습니까?", + "noBoardsFound": "\"{0}\"에 대한 보드를 찾을 수 없습니다.", + "noNativeSerialPort": "Native serial port, can't obtain info.", + "noPortsDiscovered": "포트를 찾을 수 없습니다.", + "nonSerialPort": "Non-serial port, can't obtain info.", + "openBoardsConfig": "보드 및 포트를 선택하세요.", + "pleasePickBoard": "선택한 포트에 연결할 보드를 선택하십시오", + "port": "포트{0}", + "ports": "ports", + "programmer": "프로그래머", + "reloadBoardData": "Reload Board Data", + "reselectLater": "나중에 선택", + "revertBoardsConfig": "Use '{0}' discovered on '{1}'", + "searchBoard": "보드 검색", "selectBoard": "보드 선택", - "selectBoardForInfo": "Please select a board to obtain board info.", - "selectPortForInfo": "Please select a port to obtain board info.", - "showAllAvailablePorts": "Shows all available ports when enabled", - "succesfullyInstalledPlatform": "Successfully installed platform {0}:{1}", - "succesfullyUninstalledPlatform": "Successfully uninstalled platform {0}:{1}" - }, - "boardsManager": "Boards Manager", + "selectBoardToReload": "Please select a board first.", + "selectPortForInfo": "보드 정보를 얻으려면 포트를 선택하십시오.", + "showAllAvailablePorts": "활성화된 사용 가능한 모든 포트를 표시합니다.", + "showAllPorts": "모든 포트 보이기", + "succesfullyInstalledPlatform": "성공적으로 설치된 플랫폼{0}:{1}", + "succesfullyUninstalledPlatform": "성공적으로 설치된 플랫폼 {0}:{1}", + "typeOfPorts": "{0} ports", + "unconfirmedBoard": "Unconfirmed board", + "unknownBoard": "알 수 없는 보드" + }, + "boardsManager": "보드매니저", "boardsType": { - "arduinoCertified": "Arduino Certified" + "arduinoCertified": "아두이노 인증" }, "bootloader": { - "burnBootloader": "Burn Bootloader", - "burningBootloader": "Burning bootloader...", - "doneBurningBootloader": "Done burning bootloader." + "burnBootloader": "부트로더 굽기", + "burningBootloader": "부트로더 굽기...", + "doneBurningBootloader": "부트로더 굽기 완료." }, "burnBootloader": { - "error": "Error while burning the bootloader: {0}" + "error": "부트로더 굽기 중 에러: {0}" }, "certificate": { - "addNew": "Add New", - "addURL": "Add URL to fetch SSL certificate", + "addNew": "추가", + "addURL": "SSL 인증서를 가져올 URL 추가", "boardAtPort": "{0} at {1}", - "certificatesUploaded": "Certificates uploaded.", - "enterURL": "Enter URL", - "noSupportedBoardConnected": "No supported board connected", - "openContext": "Open context", - "remove": "Remove", - "selectBoard": "Select a board...", - "selectCertificateToUpload": "1. Select certificate to upload", - "selectDestinationBoardToUpload": "2. Select destination board and upload certificate", - "upload": "Upload", - "uploadFailed": "Upload failed. Please try again.", - "uploadRootCertificates": "Upload SSL Root Certificates", - "uploadingCertificates": "Uploading certificates." + "certificatesUploaded": "인증서 업로드 완료", + "enterURL": "URL 입력", + "noSupportedBoardConnected": "지원되는 보드가 연결되지 않았습니다.", + "openContext": "열린 내용", + "remove": "제거", + "selectBoard": "보드 선택...", + "selectCertificateToUpload": "1. 업로드할 인증서 선택", + "selectDestinationBoardToUpload": "2. 보드 선택 및 인증서 업로드", + "upload": "업로드", + "uploadFailed": "업로드에 실패했습니다. 다시 시도해 주세요.", + "uploadRootCertificates": "SSL 루트 인증서 업로드", + "uploadingCertificates": "인증서를 업로드 중입니다." }, "checkForUpdates": { - "checkForUpdates": "Check for Arduino Updates", - "installAll": "Install All", - "noUpdates": "There are no recent updates available.", - "promptUpdateBoards": "Updates are available for some of your boards.", - "promptUpdateLibraries": "Updates are available for some of your libraries.", - "updatingBoards": "Updating boards...", - "updatingLibraries": "Updating libraries..." + "checkForUpdates": "아두이노 업데이트 확인", + "installAll": "모두 설치", + "noUpdates": "사용 가능한 최신 업데이트가 없습니다.", + "promptUpdateBoards": "일부 보드에 대한 업데이트가 있습니다.", + "promptUpdateLibraries": "일부 라이브러리에 대한 업데이트가 있습니다.", + "updatingBoards": "보드 업데이트 중...", + "updatingLibraries": "라이브러리 업데이트 중..." }, "cli-error-parser": { - "keyboardError": "'Keyboard' not found. Does your sketch include the line '#include <Keyboard.h>'?", - "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" + "keyboardError": "'Keyboard'를 찾을 수 없습니다. 스케치에 '#include <Keyboard.h>' 줄이 포함되어 있습니까?", + "mouseError": "'Mouse'를 찾을 수 없습니다. 스케치에 '#include <Mouse.h>' 줄이 포함되어 있습니까?" }, "cloud": { - "account": "Account", - "chooseSketchVisibility": "Choose visibility of your Sketch:", - "connected": "Connected", - "continue": "Continue", - "donePulling": "Done pulling ‘{0}’.", - "donePushing": "Done pushing ‘{0}’.", + "chooseSketchVisibility": "보여질 스케치를 선택하세요", + "cloudSketchbook": "Cloud Sketchbook", + "connected": "연결됨", + "continue": "계속", + "donePulling": "Done pulling '{0}'.", + "donePushing": "Done pushing '{0}'.", "embed": "Embed:", - "emptySketchbook": "Your Sketchbook is empty", - "learnMore": "Learn more", - "link": "Link:", - "notYetPulled": "Cannot push to Cloud. It is not yet pulled.", - "offline": "Offline", - "openInCloudEditor": "Open in Cloud Editor", - "options": "Options...", - "privateVisibility": "Private. Only you can view the Sketch.", - "profilePicture": "Profile picture", - "publicVisibility": "Public. Anyone with the link can view the Sketch.", + "emptySketchbook": "스케치북이 비어 있습니다.", + "goToCloud": "Go to Cloud", + "learnMore": "더 알아보기", + "link": "링크:", + "notYetPulled": "클라우드에 push 할수 없습니다. 아직 pull 되지 않았습니다.", + "offline": "오프라인", + "openInCloudEditor": "클라우드 편집기에서 열기", + "options": "옵션...", + "privateVisibility": "비공개. 나만이 스케치를 볼 수 있습니다.", + "profilePicture": "프로필 사진", + "publicVisibility": "공개. 링크가 있는 사람은 누구나 스케치를 볼 수 있습니다.", "pull": "Pull", - "pullFirst": "You have to pull first to be able to push to the Cloud.", - "pullSketch": "Pull Sketch", - "pullSketchMsg": "Pulling this Sketch from the Cloud will overwrite its local version. Are you sure you want to continue?", + "pullFirst": "클라우드로 Push하려면 먼저 Pull 합니다.", + "pullSketch": "Pull 스케치", + "pullSketchMsg": "클라우드에서 이 스케치를 가져오면 로컬 버전을 덮어쓰게 됩니다. 계속하시겠습니까?", "push": "Push", - "pushSketch": "Push Sketch", - "pushSketchMsg": "This is a Public Sketch. Before pushing, make sure any sensitive information is defined in arduino_secrets.h files. You can make a Sketch private from the Share panel.", - "remote": "Remote", - "remoteSketchbook": "Remote Sketchbook", - "share": "Share...", - "shareSketch": "Share Sketch", - "showHideRemoveSketchbook": "Show/Hide Remote Sketchbook", - "signIn": "SIGN IN", - "signInToCloud": "Sign in to Arduino Cloud", - "signOut": "Sign Out", - "sync": "Sync", - "syncEditSketches": "Sync and edit your Arduino Cloud Sketches", - "visitArduinoCloud": "Visit Arduino Cloud to create Cloud Sketches." + "pushSketch": "Push 스케치", + "pushSketchMsg": "이것은 공개 스케치입니다. 클라우드로 내보내기 전에 민감한 정보가 arduino_secrets.h 파일에 정의되어 있는지 확인하세요. 공유 패널에서 스케치를 비공개로 설정할 수 있습니다.", + "remote": "원격", + "share": "공유...", + "shareSketch": "스케치 공유", + "showHideSketchbook": "클라우드 스케치북 보이기/숨기기", + "signIn": "로그인", + "signInToCloud": "아두이노 클라우드에 로그인", + "signOut": "로그아웃", + "sync": "동기화", + "syncEditSketches": "아두이노 클라우드 스케치 동기화 및 편집", + "visitArduinoCloud": "아두이노 클라우드를 방문하여 클라우드 스케치를 만드십시오." + }, + "cloudSketch": { + "alreadyExists": "Cloud sketch '{0}' already exists.", + "creating": "Creating cloud sketch '{0}'...", + "new": "New Cloud Sketch", + "notFound": "Could not pull the cloud sketch '{0}'. It does not exist.", + "pulling": "Synchronizing sketchbook, pulling '{0}'...", + "pushing": "Synchronizing sketchbook, pushing '{0}'...", + "renaming": "Renaming cloud sketch from '{0}' to '{1}'...", + "synchronizingSketchbook": "Synchronizing sketchbook..." }, "common": { - "all": "All", - "contributed": "Contributed", - "installManually": "Install Manually", + "all": "전체", + "contributed": "공헌된", + "installManually": "수동으로 설치", "later": "나중에", "noBoardSelected": "선택된 보드 없음", + "noSketchOpened": "No sketch opened", "notConnected": "[연결되지 않음]", "offlineIndicator": "오프라인 상태인 것 같습니다. 인터넷 연결이 없으면 Arduino CLI가 필요한 리소스를 다운로드하지 못하고 오작동을 일으킬 수 있습니다. 인터넷에 연결하고 애플리케이션을 다시 시작해주세요.", "oldFormat": "'{0}' 파일은 오래된 `.pde` 확장자로 되어있어요. 새로운 `.ino` 확장자로 변경하시겠어요?", - "partner": "Partner", + "partner": "파트너", "processing": "처리 중", - "recommended": "Recommended", + "recommended": "추천됨", "retired": "Retired", + "selectManually": "Select Manually", "selectedOn": "{0} 켜기", "serialMonitor": "시리얼 모니터", "type": "Type", "unknown": "알 수 없음", - "updateable": "Updatable" + "updateable": "업데이트 가능함", + "userAbort": "User abort" }, "compile": { - "error": "Compilation error: {0}" + "error": "컴파일 오류: {0}" }, "component": { - "boardsIncluded": "Boards included in this package:", + "boardsIncluded": "이 패키지에 포함된 보드:", "by": "by", - "filterSearch": "Filter your search...", - "install": "INSTALL", - "moreInfo": "More info", - "uninstall": "Uninstall", - "uninstallMsg": "Do you want to uninstall {0}?", - "version": "Version {0}" + "clickToOpen": "Click to open in browser: {0}", + "filterSearch": "필터 검색...", + "install": "설치", + "installLatest": "Install Latest", + "installVersion": "{0} 설치", + "installed": "{0} 설치됨", + "moreInfo": "더 많은 정보", + "otherVersions": "Other Versions", + "remove": "제거", + "title": "{0} by {1}", + "uninstall": "설치해제", + "uninstallMsg": "설치해제를 원하십니까 {0}?", + "update": "업데이트" + }, + "configuration": { + "cli": { + "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" + } + }, + "connectionStatus": { + "connectionLost": "Connection lost. Cloud sketch actions and updates won't be available." }, "contributions": { - "addFile": "Add File", - "fileAdded": "One file added to the sketch.", - "replaceTitle": "Replace" + "addFile": "파일 추가", + "fileAdded": "스케치에 하나의 파일이 추가되었습니다.", + "plotter": { + "couldNotOpen": "시리얼 플로터를 열 수 없습니다" + }, + "replaceTitle": "교체" + }, + "core": { + "compilerWarnings": { + "all": "전체", + "default": "기본", + "more": "추가", + "none": "없음" + } }, "coreContribution": { - "copyError": "Copy error messages", - "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." + "copyError": "에러 메시지 복사", + "noBoardSelected": "보드가 선택되지 않았습니다. Tools > Board menu 에서 당신의 보드를 선택해주세요." }, + "createCloudCopy": "Push Sketch to Cloud", "daemon": { - "restart": "Restart Daemon", - "start": "Start Daemon", - "stop": "Stop Daemon" + "restart": "데몬 재시작", + "start": "데몬 시작", + "stop": "데몬 정지" }, "debug": { "debugWithMessage": "디버그 - {0}", "debuggingNotSupported": "Debugging is not supported by '{0}'", + "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "'{0}'에 대한 플랫폼이 설치되어 있지 않습니다", - "optimizeForDebugging": "Optimize for Debugging" + "optimizeForDebugging": "디버깅 최적화", + "sketchIsNotCompiled": "Sketch '{0}' must be verified before starting a debug session. Please verify the sketch and start debugging again. Do you want to verify the sketch now?" + }, + "developer": { + "clearBoardList": "Clear the Board List History", + "clearBoardsConfig": "Clear the Board and Port Selection", + "dumpBoardList": "Dump the Board List" }, "dialog": { - "dontAskAgain": "Don't ask again" + "dontAskAgain": "다시 묻지 않음" }, "editor": { - "autoFormat": "Auto Format", - "commentUncomment": "Comment/Uncomment", - "copyForForum": "Copy for Forum (Markdown)", - "decreaseFontSize": "Decrease Font Size", - "decreaseIndent": "Decrease Indent", - "increaseFontSize": "Increase Font Size", - "increaseIndent": "Increase Indent", - "nextError": "Next Error", - "previousError": "Previous Error", - "revealError": "Reveal Error" - }, - "electron": { - "couldNotSave": "Could not save the sketch. Please copy your unsaved work into your favorite text editor, and restart the IDE.", - "unsavedChanges": "Any unsaved changes will not be saved." + "autoFormat": "자동 형식", + "commentUncomment": "주석/주석 삭제", + "copyForForum": "포럼용으로 복사 (Markdown)", + "decreaseFontSize": "글꼴 크기 줄이기", + "decreaseIndent": "들여쓰기 줄이기", + "increaseFontSize": "글꼴 크기 키우기", + "increaseIndent": "들여쓰기 늘이기", + "nextError": "다음 에러", + "previousError": "이전 에러", + "revealError": "에러 표시" }, "examples": { - "builtInExamples": "Built-in examples", - "couldNotInitializeExamples": "Could not initialize built-in examples.", - "customLibrary": "Examples from Custom Libraries", - "for": "Examples for {0}", - "forAny": "Examples for any board", - "menu": "Examples" + "builtInExamples": "포함된 예제들", + "couldNotInitializeExamples": "내장된 예제를 초기화 할 수 없습니다.", + "customLibrary": "사용자 정의 라이브러리의 예", + "for": "{0} 에 대한 예", + "forAny": "모든 보드의 예", + "menu": "예제" }, "firmware": { - "checkUpdates": "Check Updates", - "failedInstall": "Installation failed. Please try again.", - "install": "Install", - "installingFirmware": "Installing firmware.", - "overwriteSketch": "Installation will overwrite the Sketch on the board.", + "checkUpdates": "업데이트 확인", + "failedInstall": "설치에 실패했습니다. 다시 시도해 주세요.", + "install": "설치", + "installingFirmware": "펌웨어 설치중.", + "overwriteSketch": "설치하면 보드의 스케치를 덮어씁니다.", "selectBoard": "보드 선택", - "selectVersion": "Select firmware version", - "successfullyInstalled": "Firmware successfully installed.", - "updater": "WiFi101 / WiFiNINA Firmware Updater" + "selectVersion": "펌웨어 버전 선택", + "successfullyInstalled": "펌웨어가 성공적으로 설치되었습니다.", + "updater": "펌웨어 업데이터" }, "help": { - "environment": "Environment", - "faq": "Frequently Asked Questions", - "findInReference": "Find in Reference", - "gettingStarted": "Getting Started", - "keyword": "Type a keyword", - "privacyPolicy": "Privacy Policy", - "reference": "Reference", - "search": "Search on Arduino.cc", - "troubleshooting": "Troubleshooting", - "visit": "Visit Arduino.cc" + "environment": "환경", + "faq": "자주 묻는 질문", + "findInReference": "참조에서 찾기", + "gettingStarted": "시작하기", + "keyword": "키워드 입력", + "privacyPolicy": "개인정보 정책", + "reference": "참조", + "search": "on Arduino.cc 에서 검색", + "troubleshooting": "문제 해결", + "visit": "Arduino.cc 방문" }, "ide-updater": { - "checkForUpdates": "Check for Arduino IDE Updates", + "checkForUpdates": "Arduino IDE 업데이트 확인", "closeAndInstallButton": "닫고 설치하기", "closeToInstallNotice": "소프트웨어를 닫고 장치에 업데이트를 설치해주세요.", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", "downloadButton": "다운로드", "downloadingNotice": "최신 버전의 Arduino IDE를 다운로드하고 있습니다.", "errorCheckingForUpdates": "Arduino IDE의 업데이트를 확인하던 중에 오류가 발생했어요.\n{0}", @@ -232,193 +291,271 @@ "updateAvailable": "업데이트 사용 가능", "versionDownloaded": "Arduino IDE {0} 버전이 다운로드 되었습니다. " }, + "installable": { + "libraryInstallFailed": "Failed to install library: '{0}{1}'.", + "platformInstallFailed": "Failed to install platform: '{0}{1}'." + }, "library": { - "addZip": "Add .ZIP Library...", - "arduinoLibraries": "Arduino libraries", - "contributedLibraries": "Contributed libraries", - "dependenciesForLibrary": "Dependencies for library {0}:{1}", - "include": "Include Library", - "installAll": "Install all", - "installMissingDependencies": "Would you like to install all the missing dependencies?", + "addZip": ".ZIP 라이브러리 추가...", + "arduinoLibraries": "아두이노 라이브러리", + "contributedLibraries": "공헌된 라이브러리들", + "include": "라이브러리 포함", + "installAll": "모두 설치", + "installLibraryDependencies": "라이브러리 종속성 설치", + "installMissingDependencies": "누락된 모든 종속성을 설치하시겠습니까?", "installOneMissingDependency": "Would you like to install the missing dependency?", - "installOnly": "Install {0} only", - "installedSuccessfully": "Successfully installed library {0}:{1}", - "libraryAlreadyExists": "A library already exists. Do you want to overwrite it?", - "manageLibraries": "Manage Libraries...", - "namedLibraryAlreadyExists": "A library folder named {0} already exists. Do you want to overwrite it?", - "needsMultipleDependencies": "The library <b>{0}:{1}</b> needs some other dependencies currently not installed:", + "installWithoutDependencies": "Install without dependencies", + "installedSuccessfully": "성공적으로 설치된 라이브러리 {0}:{1}", + "libraryAlreadyExists": "라이브러리가 이미 존재합니다. 덮어 쓰시겠습니까? ", + "manageLibraries": "라이브러리 관리...", + "namedLibraryAlreadyExists": "{0} 이라는 라이브러리 폴더이름이 이미 존재합니다. 덮어 쓰시겠습니까?", + "needsMultipleDependencies": "라이브러리 <b>{0}:{1}</b> 는 현재 설치되지 않은 다른 종속성이 필요합니다.", "needsOneDependency": "The library <b>{0}:{1}</b> needs another dependency currently not installed:", - "overwriteExistingLibrary": "Do you want to overwrite the existing library?", - "successfullyInstalledZipLibrary": "Successfully installed library from {0} archive", - "title": "Library Manager", - "uninstalledSuccessfully": "Successfully uninstalled library {0}:{1}", - "zipLibrary": "Library" + "overwriteExistingLibrary": "기존 라이브러리를 덮어쓰시겠습니까?", + "successfullyInstalledZipLibrary": "라이브러리가 {0} 저장소에 성공적으로 설치됨", + "title": "라이브러리 매니저", + "uninstalledSuccessfully": "라이브러리가 성공적으로 제거됨 {0}:{1}", + "zipLibrary": "라이브러리" }, "librarySearchProperty": { - "topic": "Topic" + "topic": "주제" }, "libraryTopic": { "communication": "Communication", - "dataProcessing": "Data Processing", - "dataStorage": "Data Storage", - "deviceControl": "Device Control", - "display": "Display", - "other": "Other", - "sensors": "Sensors", - "signalInputOutput": "Signal Input/Output", - "timing": "Timing", - "uncategorized": "Uncategorized" + "dataProcessing": "데이터 처리", + "dataStorage": "데이터 저장소", + "deviceControl": "장치 제어", + "display": "화면표시", + "other": "기타", + "sensors": "센서", + "signalInputOutput": "신호 입/출력", + "timing": "타이밍", + "uncategorized": "미분류" }, "libraryType": { - "installed": "Installed" + "installed": "설치됨" }, "menu": { - "advanced": "Advanced", + "advanced": "고급", "sketch": "스케치", "tools": "도구" }, "monitor": { - "unableToCloseWebSocket": "Unable to close websocket", - "unableToConnectToWebSocket": "Unable to connect to websocket" + "alreadyConnectedError": "Could not connect to {0} {1} port. Already connected.", + "baudRate": "{0} baud", + "connectionFailedError": "Could not connect to {0} {1} port.", + "connectionFailedErrorWithDetails": "{0} Could not connect to {1} {2} port.", + "connectionTimeout": "Timeout. The IDE has not received the 'success' message from the monitor after successfully connecting to it", + "missingConfigurationError": "Could not connect to {0} {1} port. The monitor configuration is missing.", + "notConnectedError": "Not connected to {0} {1} port.", + "unableToCloseWebSocket": "웹소켓을 닫을 수 없습니다.", + "unableToConnectToWebSocket": "웹소켓에 연결 할 수 없습니다." + }, + "newCloudSketch": { + "newSketchTitle": "Name of the new Cloud Sketch" + }, + "portProtocol": { + "network": "네트워크", + "serial": "시리얼" }, "preferences": { - "additionalManagerURLs": "Additional Boards Manager URLs", + "additionalManagerURLs": "추가 보드 관리자 URL", "auth.audience": "The OAuth2 audience.", "auth.clientID": "The OAuth2 client ID.", "auth.domain": "The OAuth2 domain.", "auth.registerUri": "The URI used to register a new user.", - "automatic": "Automatic", + "automatic": "자동", "board.certificates": "List of certificates that can be uploaded to boards", - "browse": "Browse", - "checkForUpdate": "Receive notifications of available updates for the IDE, boards, and libraries. Requires an IDE restart after change. It's true by default.", - "choose": "Choose", - "cli.daemonDebug": "Enable debug logging of the gRPC calls to the Arduino CLI. A restart of the IDE is needed for this setting to take effect. It's false by default.", - "cloud.enabled": "True if the sketch sync functions are enabled. Defaults to true.", - "cloud.pull.warn": "True if users should be warned before pulling a cloud sketch. Defaults to true.", - "cloud.push.warn": "True if users should be warned before pushing a cloud sketch. Defaults to true.", - "cloud.pushpublic.warn": "True if users should be warned before pushing a public sketch to the cloud. Defaults to true.", + "browse": "검색", + "checkForUpdate": "IDE, 보드 및 라이브러리에 대한 사용 가능한 업데이트 알림을 받습니다. 변경 후 IDE를 다시 시작해야 합니다. 알림받기가 기본설정입니다.", + "choose": "선택", + "cli.daemonDebug": "Arduino CLI에 대한 gRPC 호출의 디버그 로깅을 활성화합니다. 이 설정을 적용하려면 IDE를 다시 시작해야 합니다. 기본적으로 false입니다.", + "cloud.enabled": "스케치 동기화 기능이 활성화된 경우 True입니다. 기본값은 true입니다.", + "cloud.pull.warn": "클라우드 스케치를 pulling 전에 사용자에게 경고해야 하는 경우 True입니다. 기본값은 true입니다.", + "cloud.push.warn": "클라우드 스케치를 pushing 전에 사용자에게 경고해야 하는 경우 True입니다. 기본값은 true입니다.", + "cloud.pushpublic.warn": "공개 스케치를 클라우드로 pushing 전에 사용자에게 경고해야 하는 경우 True입니다.기본값은 true입니다.", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", "cloud.sketchSyncEndpoint": "The endpoint used to push and pull sketches from a backend. By default it points to Arduino Cloud API.", - "compile": "compile", - "compile.experimental": "True if the IDE should handle multiple compiler errors. False by default", + "compile": "컴파일", + "compile.experimental": "IDE가 여러 컴파일러 오류를 처리해야 하는 경우 True입니다.기본적으로 False입니다.", "compile.revealRange": "Adjusts how compiler errors are revealed in the editor after a failed verify/upload. Possible values: 'auto': Scroll vertically as necessary and reveal a line. 'center': Scroll vertically as necessary and reveal a line centered vertically. 'top': Scroll vertically as necessary and reveal a line close to the top of the viewport, optimized for viewing a code definition. 'centerIfOutsideViewport': Scroll vertically as necessary and reveal a line centered vertically only if it lies outside the viewport. The default value is '{0}'.", - "compile.verbose": "True for verbose compile output. False by default", + "compile.verbose": "자세한 컴파일 출력의 경우 True입니다. 기본은 False입니다.", "compile.warnings": "gcc에 사용할 경고 수준을 알려줍니다. 기본값은 '없음'입니다.", - "compilerWarnings": "Compiler warnings", - "editorFontSize": "Editor font size", - "editorQuickSuggestions": "Editor Quick Suggestions", - "enterAdditionalURLs": "Enter additional URLs, one for each row", - "files.inside.sketches": "Show files inside Sketches", - "ide.updateBaseUrl": "The base URL where to download updates from. Defaults to 'https://downloads.arduino.cc/arduino-ide'", - "ide.updateChannel": "Release channel to get updated from. 'stable' is the stable release, 'nightly' is the latest development build.", - "interfaceScale": "Interface scale", - "invalid.editorFontSize": "Invalid editor font size. It must be a positive integer.", - "invalid.sketchbook.location": "Invalid sketchbook location: {0}", - "invalid.theme": "Invalid theme.", - "language.log": "True if the Arduino Language Server should generate log files into the sketch folder. Otherwise, false. It's false by default.", - "language.realTimeDiagnostics": "If true, the language server provides real-time diagnostics when typing in the editor. It's false by default.", - "manualProxy": "Manual proxy configuration", - "network": "Network", - "newSketchbookLocation": "Select new sketchbook location", + "compilerWarnings": "컴파일러 경고", + "editorFontSize": "에디터 글꼴 크기", + "editorQuickSuggestions": "에디터 빠른 제안", + "enterAdditionalURLs": "각 행에 하나씩 추가 URL을 입력하세요.", + "files.inside.sketches": "스케치 내부에 파일 표시", + "ide.updateBaseUrl": "업데이트를 다운로드할 기본 URL입니다. 기본값은 \n'https://downloads.arduino.cc/arduino-ide'", + "ide.updateChannel": "업데이트를 받을 릴리스 채널입니다. 'stable'은 안정적인 릴리스이고 'nightly'는 최신 개발 빌드입니다.", + "interfaceScale": "인터페이스 크기조절", + "invalid.editorFontSize": "잘못된 에디터 글꼴크기, 반드시 양의 정수를 사용해야합니다.", + "invalid.sketchbook.location": "잘못된 스케치북 위치: {0}", + "invalid.theme": "잘못된 테마.", + "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", + "language.log": "Arduino 언어 서버가 스케치 폴더에 로그 파일을 생성해야 하는 경우 true이고, 그렇지 않으면 false입니다. 기본은 false입니다.", + "language.realTimeDiagnostics": "true인 경우 언어 서버는 편집기에 입력할 때 실시간 진단을 제공하며 기본적으로 false입니다.", + "manualProxy": "수동 프록시 구성", + "monitor": { + "dockPanel": "The area of the application shell where the _{0}_ widget will reside. It is either \"bottom\" or \"right\". It defaults to \"{1}\"." + }, + "network": "네트워크", + "newSketchbookLocation": "새 스케치북 위치 선택", + "noCliConfig": "Could not load the CLI configuration", "noProxy": "No proxy", - "showVerbose": "Show verbose output during", - "sketchbook.location": "Sketchbook location", - "sketchbook.showAllFiles": "True to show all sketch files inside the sketch. It is false by default.", - "survey.notification": "True if users should be notified if a survey is available. True by default.", - "unofficialBoardSupport": "Click for a list of unofficial board support URLs", - "upload": "upload", - "upload.verbose": "True for verbose upload output. False by default.", - "verifyAfterUpload": "Verify code after upload", - "window.autoScale": "True if the user interface automatically scales with the font size.", - "window.zoomLevel": "Adjust the zoom level of the window. The original size is 0 and each increment above (e.g. 1) or below (e.g. -1) represents zooming 20% larger or smaller. You can also enter decimals to adjust the zoom level with a finer granularity." - }, - "replaceMsg": "Replace the existing version of {0}?", - "selectZip": "Select a zip file containing the library you'd like to add", + "proxySettings": { + "hostname": "Host name", + "password": "비밀번호", + "port": "포트 번호", + "username": "사용자이름" + }, + "showVerbose": "출력 중 자세한 표시", + "sketch": { + "inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect." + }, + "sketchbook.location": "스케치북 위치", + "sketchbook.showAllFiles": "스케치 내부의 모든 스케치 파일을 표시하려면 True입니다. 기본은 false입니다.", + "unofficialBoardSupport": "비공식 보드 지원 URL 목록을 보려면 클릭하십시오.", + "upload": "업로드", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", + "upload.verbose": "자세한 업로드 출력의 경우 True이고 기본적으로 False입니다.", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", + "verifyAfterUpload": "업로드 후 코드확인", + "window.autoScale": "사용자 인터페이스가 글꼴 크기에 따라 자동으로 조정되는 경우 True입니다.", + "window.zoomLevel": { + "deprecationMessage": "Deprecated. Use 'window.zoomLevel' instead." + } + }, + "renameCloudSketch": { + "renameSketchTitle": "New name of the Cloud Sketch" + }, + "replaceMsg": "{0}의 기존 버젼을 바꾸시겠습니까?", + "selectZip": "추가하려는 라이브러리가 포함된 zip 파일을 선택하세요.", "serial": { - "autoscroll": "Autoscroll", - "carriageReturn": "Carriage Return", - "message": "Message ({0} + Enter to send message to '{1}' on '{2}')", - "newLine": "New Line", + "autoscroll": "자동스크롤", + "carriageReturn": "캐리지 리턴", + "connecting": "Connecting to '{0}' on '{1}'...", + "message": "Message (Enter to send message to '{0}' on '{1}')", + "newLine": "새 줄", "newLineCarriageReturn": "Both NL & CR", "noLineEndings": "No Line Ending", - "notConnected": "Not connected. Select a board and a port to connect automatically.", - "openSerialPlotter": "Serial Plotter", - "timestamp": "Timestamp", - "toggleTimestamp": "Toggle Timestamp" + "notConnected": "연결되지 않음. 자동으로 연결할 보드와 포트를 선택합니다.", + "openSerialPlotter": "시리얼 플로터", + "timestamp": "타임스탬프", + "toggleTimestamp": "타임스탬프 표시" }, "sketch": { - "archiveSketch": "Archive Sketch", - "cantOpen": "A folder named \"{0}\" already exists. Can't open sketch.", - "close": "Are you sure you want to close the sketch?", - "compile": "Compiling sketch...", - "configureAndUpload": "Configure And Upload", + "archiveSketch": "스케치 압축저장", + "cantOpen": "이름이 \"{0}\" 인 폴더가 이미 존재합니다. 스케치를 열 수 없습니다.", + "compile": "스케치 컴파일중...", + "configureAndUpload": "Configure and Upload", "createdArchive": "Created archive '{0}'.", - "doneCompiling": "Done compiling.", - "doneUploading": "Done uploading.", - "exportBinary": "Export Compiled Binary", + "doneCompiling": "컴파일 완료.", + "doneUploading": "업로딩 완료.", + "editInvalidSketchFolderLocationQuestion": "Do you want to try saving the sketch to a different location?", + "editInvalidSketchFolderQuestion": "Do you want to try saving the sketch with a different name?", + "exportBinary": "컴파일된 바이너리 내보내기", + "invalidCloudSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", + "invalidSketchFolderLocationDetails": "You cannot save a sketch into a folder inside itself.", + "invalidSketchFolderLocationMessage": "Invalid sketch folder location: '{0}'", + "invalidSketchFolderNameMessage": "Invalid sketch folder name: '{0}'", + "invalidSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", "moving": "Moving", "movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?", - "new": "New", - "openFolder": "Open Folder", - "openRecent": "Open Recent", - "openSketchInNewWindow": "Open Sketch in New Window", - "saveFolderAs": "Save sketch folder as...", - "saveSketch": "Save your sketch to open it again later.", - "saveSketchAs": "Save sketch folder as...", - "showFolder": "Show Sketch Folder", + "new": "New Sketch", + "noTrailingPeriod": "A filename cannot end with a dot", + "openFolder": "폴더 열기", + "openRecent": "최근 파일 열기", + "openSketchInNewWindow": "새 창에서 스케치 열기", + "reservedFilename": "'{0}' is a reserved filename.", + "saveFolderAs": "스케치 폴더를 다른 이름으로 저장...", + "saveSketch": "스케치를 저장하여 나중에 다시 엽니다.", + "saveSketchAs": "스케치 폴더를 다른 이름으로 저장...", + "showFolder": "스케치 폴더 보기", "sketch": "스케치", - "sketchbook": "Sketchbook", - "titleLocalSketchbook": "Local Sketchbook", - "titleSketchbook": "Sketchbook", - "upload": "Upload", - "uploadUsingProgrammer": "Upload Using Programmer", - "uploading": "Uploading...", - "userFieldsNotFoundError": "Can't find user fields for connected board", - "verify": "Verify", - "verifyOrCompile": "Verify/Compile" - }, - "survey": { - "answerSurvey": "Answer survey", - "dismissSurvey": "Don't show again", - "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." + "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", + "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", + "sketchbook": "스케치북", + "titleLocalSketchbook": "로컬 스케치북", + "titleSketchbook": "스케치북", + "upload": "업로드", + "uploadUsingProgrammer": "프로그래머를 사용하여 업로드", + "uploading": "업로딩...", + "userFieldsNotFoundError": "연결된 보드에서 사용자 영역을 찾을 수 없습니다", + "verify": "확인", + "verifyOrCompile": "확인/컴파일" + }, + "sketchbook": { + "newCloudSketch": "New Cloud Sketch", + "newSketch": "New Sketch" + }, + "theme": { + "currentThemeNotFound": "Could not find the currently selected theme: {0}. Arduino IDE has picked a built-in theme compatible with the missing one.", + "dark": "Dark", + "deprecated": "{0} (deprecated)", + "hc": "Dark High Contrast", + "hcLight": "Light High Contrast", + "light": "Light", + "user": "{0} (user)" + }, + "title": { + "cloud": "Cloud" + }, + "updateIndexes": { + "updateIndexes": "Update Indexes", + "updateLibraryIndex": "Update Library Index", + "updatePackageIndex": "Update Package Index" }, "upload": { - "error": "{0} error: {1}" + "error": "{0} 오류: {1}" }, "userFields": { - "cancel": "Cancel", + "cancel": "취소", "enterField": "Enter {0}", - "upload": "Upload" + "upload": "업로드" + }, + "validateSketch": { + "abortFixMessage": "The sketch is still invalid. Do you want to fix the remaining problems? By clicking '{0}', a new sketch will open.", + "abortFixTitle": "Invalid sketch", + "renameSketchFileMessage": "The sketch file '{0}' cannot be used. {1} Do you want to rename the sketch file now?", + "renameSketchFileTitle": "Invalid sketch filename", + "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", + "renameSketchFolderTitle": "유효하지 않은 스케치 이름" + }, + "versionWelcome": { + "cancelButton": "Maybe later", + "donateButton": "Donate now", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Welcome to a new version of the Arduino IDE!", + "titleWithVersion": "Welcome to the new Arduino IDE {0}!" + }, + "workspace": { + "alreadyExists": "'{0}' already exists." } }, - "cloud": { - "GoToCloud": "GO TO CLOUD" - }, "theia": { "core": { - "cannotConnectBackend": "Cannot connect to the backend.", - "cannotConnectDaemon": "Cannot connect to the CLI daemon.", - "couldNotSave": "Could not save the sketch. Please copy your unsaved work into your favorite text editor, and restart the IDE.", - "daemonOffline": "CLI Daemon Offline", - "offline": "Offline", - "quitTitle": "Are you sure you want to quit?" - }, - "debug": { - "start": "Start...", - "startError": "There was an error starting the debug session, check the logs for more details.", - "typeNotSupported": "The debug session type \"{0}\" is not supported." + "cannotConnectBackend": "백엔드에 연결 할 수 없습니다.", + "cannotConnectDaemon": "CLI 데몬에 연결 할 수 없습니다.", + "couldNotSave": "스케치를 저장할 수 없습니다. 저장하지 않은 작업을 즐겨 사용하는 텍스트 편집기에 복사하고 IDE를 다시 시작하세요.", + "daemonOffline": "CLI 데몬 오프라인", + "offline": "오프라인", + "offlineText": "오프라인", + "quitTitle": "정말 종료하시겠습니까?" }, "editor": { - "unsavedTitle": "Unsaved – {0}" + "unsavedTitle": "저장되지않음 – {0}" }, "messages": { "collapse": "Collapse", "expand": "Expand" }, "workspace": { - "deleteCurrentSketch": "Do you want to delete the current sketch?", - "fileNewName": "Name for new file", - "invalidExtension": ".{0} is not a valid extension", - "invalidFilename": "Invalid filename.", + "deleteCloudSketch": "The cloud sketch '{0}' will be permanently deleted from the Arduino servers and the local caches. This action is irreversible. Do you want to delete the current sketch?", + "deleteCurrentSketch": "The sketch '{0}' will be permanently deleted. This action is irreversible. Do you want to delete the current sketch?", + "fileNewName": "새 파일의 이름", + "invalidExtension": ".{0} 유효한 확장자가 아닙니다", "newFileName": "New name for file" } } diff --git a/i18n/my_MM.json b/i18n/my_MM.json index fe68eda65..66a465fb2 100644 --- a/i18n/my_MM.json +++ b/i18n/my_MM.json @@ -1,46 +1,59 @@ { "arduino": { "about": { - "detail": "ဗားရှင်း: {0}\nရက်စွဲ: {1}{2}\nCLI ဗားရှင်း: {3}{4} [{5}]\n\n{6}", + "detail": "ဗားရှင်း - {0}\nရက်စွဲ {1}{2}\nCLI ဗားရှင်း - {3}\n\n{4}", "label": "{0} အကြောင်း" }, + "account": { + "goToCloudEditor": "Cloudအယ်ဒီတာသို့သွားမည်", + "goToIoTCloud": "IoT Cloudသို့သွားမည်", + "goToProfile": "ပရိုဖိုင်သို့သွားမည်", + "menuTitle": "Arduino Cloud" + }, "board": { "board": "ဘုတ်{0}", - "boardConfigDialogTitle": "Select Other Board and Port", + "boardConfigDialogTitle": "အခြားဘုတ်နှင့်အပေါက်ကို ရွေးချယ်ပါ", + "boardDataReloaded": "Board data reloaded.", "boardInfo": "ဘုတ်ဆိုင်ရာအချက်အလက်", + "boards": "ဘုတ်များ", "configDialog1": "ကုတ်ဖိုင်တစ်ခုကို upload တင်လိုပါက ဘုတ်နှင့်အပေါက် နှစ်ခုလုံးကို ရွေးပေးပါ။", "configDialog2": "သင် ဘုတ်တစ်ခုထဲကိုသာ ရွေးချယ်ထားပါက compile ပြုလုပ်နိုင်သော်လည်း ကုဒ်ဖိုင်ကိုတော့ upload မတင်နိုင်ပါ။", "couldNotFindPreviouslySelected": "တပ်ဆင်ထားသည့် ပလက်ဖောင်း '{1}' ထဲမှာ ယခင်ရွေးချယ်ထားသည့်ဘုတ် '{0}' ကို ရှာမတွေ့ပါ။ ကျေးဇူးပြု၍ မိမိအသုံးပြုလိုသည့် ဘုတ်ကို မိမိကိုယ်တိုင် ပြန်လည်ရွေးချယ်ပေးပါ။ သင်အခု ပြန်လည်ရွေးချယ် လိုပါသလား?", - "disconnected": "မချိတ်ဆက်ထားပါ", + "editBoardsConfig": "ဘုတ်နှင့်ကွန်ရက်ဆိပ်ကမ်းများတည်းဖြတ်မည်...", "getBoardInfo": "ဘုတ်ဆိုင်ရာအချက်အလက်ရယူမည်", "inSketchbook": " (Sketchbook ဖိုင်တွဲထဲ)", "installNow": "လက်ရှိရွေးချယ်ထားသည့် \"{2}\" ဘုတ်အတွက် \"{0} {1}\" core အား တပ်ဆင်ဖို့လိုပါသည်။ သင်ယခု တပ်ဆင်လိုပါသလား?", - "noFQBN": "ရွေးချယ်ထားသည့် ဘုတ် \"{0}\" အတွက် FQBN မရနိုင်သေးပါ။ သင့်မှာ သက်ဆိုင်ရာတပ်ဆင်ထားသည့် core ရှိပါသလား?", - "noPortsDiscovered": "No ports discovered", - "noPortsSelected": "'{0}' ဘုတ် အတွက် မည်သည့်အပေါက်မှ မရွေးချယ်ထားပါ။", - "noneSelected": "ဘုတ်မရွေးချယ်ထားပါ။", + "noBoardsFound": "\"{0}\"အတွက် ဘုတ်ရှာမတွေ့ပါ", + "noNativeSerialPort": "Native serial port, can't obtain info.", + "noPortsDiscovered": "မည်သည့်အပေါက်မှမတွေ့ပါ", + "nonSerialPort": "Non-serial port, can't obtain info.", "openBoardsConfig": "အခြားဘုတ်နှင့်အပေါက်ကို ရွေးချယ်ရန်...", - "platformMissing": "ရွေးချယ်ထားသည့် '{0}' ဘုတ်အတွက် ပလက်ဖောင်းမှာ မတပ်ဆင်ထားပါ။", "pleasePickBoard": "သင်ရွေးချယ်ထားသော အပေါက်နှင့် ချိတ်ဆက်ထားသည့် ဘုတ်ကို ကျေးဇူးပြု၍ ရွေးပေးပါ။", "port": "အပေါက်{0}", - "portLabel": "အပေါက် - {0}", + "ports": "အပေါက်များ", "programmer": "ပရိုဂရမ်မာ", + "reloadBoardData": "Reload Board Data", "reselectLater": "နောက်မှ ပြန်ရွေးချယ်မည်", - "searchBoard": "Search board", + "revertBoardsConfig": "Use '{0}' discovered on '{1}'", + "searchBoard": "ဘုတ်ရှာမည်", "selectBoard": "ဘုတ်ရွေးချယ်မည်", - "selectBoardForInfo": "လျှပ်စစ်ဘုတ်ဆိုင်ရာအချက်အလက်ရရှိရန် ဘုတ်ရွေးချယ်ပါ", + "selectBoardToReload": "Please select a board first.", "selectPortForInfo": "လျှပ်စစ်ဘုတ်ဆိုင်ရာအချက်အလက်ရရှိရန် အပေါက်ကို ရွေးချယ်ပါ။", "showAllAvailablePorts": "အမှန်ခြစ်ထားပါက ရွေးချယ်နိုင်သော အပေါက်များအားလုံးကို ဖော်ပြပေးမည်", + "showAllPorts": "အပေါက်အားလုံးပြ", "succesfullyInstalledPlatform": "{0} ပလက်ဖောင်းကို အောင်မြင်စွာ တပ်ဆင်ပြီးသည် :{1}", - "succesfullyUninstalledPlatform": "{0} ပလက်ဖောင်းကို အောင်မြင်စွာ ဖြုတ်ချပြီးသည် :{1}" + "succesfullyUninstalledPlatform": "{0} ပလက်ဖောင်းကို အောင်မြင်စွာ ဖြုတ်ချပြီးသည် :{1}", + "typeOfPorts": "{0} အပေါက်များ", + "unconfirmedBoard": "အတည်မပြုရသေးသောဘုတ်ပြား", + "unknownBoard": "အမျိုးအမည်မသိဘုတ်ပြား" }, "boardsManager": "ဘုတ်မန်နေဂျာ", "boardsType": { - "arduinoCertified": "Arduino Certified" + "arduinoCertified": "အာဒီနိုအသိမှတ်ပြု" }, "bootloader": { "burnBootloader": "ဘုလုတ်ဒါ ရေးသွင်းမည်", - "burningBootloader": "Burning bootloader...", + "burningBootloader": "ဘုလုတ်ဒါ ရေးသွင်းနေသည်…", "doneBurningBootloader": "ဘုလုတ်ဒါ ရေးသွင်းပြီးပါပြီ။" }, "burnBootloader": { @@ -53,7 +66,7 @@ "certificatesUploaded": "လက်မှတ်များ တင်သွင်းပြီးပါပြီ။", "enterURL": "URLရေးသွင်းပါ", "noSupportedBoardConnected": "ထောက်ပံ့ပေးသည့် ဘုတ်ကို မချိတ်ဆက်ထားပါ", - "openContext": "Open context", + "openContext": "ဆက်စပ်အကြောင်းအရာကြည့်မည်", "remove": "ဖယ်ရှားမည်", "selectBoard": "ဘုတ်တစ်ခုကို ရွေးချယ်ရန်...", "selectCertificateToUpload": "1. အပ်လုတ်တင်ရန် လက်မှတ်ရွေးပါ", @@ -64,27 +77,28 @@ "uploadingCertificates": "လက်မှတ်များကို အပ်လုတ်တင်နေသည်။" }, "checkForUpdates": { - "checkForUpdates": "Check for Arduino Updates", - "installAll": "Install All", - "noUpdates": "There are no recent updates available.", - "promptUpdateBoards": "Updates are available for some of your boards.", - "promptUpdateLibraries": "Updates are available for some of your libraries.", - "updatingBoards": "Updating boards...", - "updatingLibraries": "Updating libraries..." + "checkForUpdates": "အာဒီနိုအပ်ဒိတ်စစ်မည်", + "installAll": "အားလုံးတပ်ဆင်မည်", + "noUpdates": "လတ်တလော အပ်ဒိတ်တင်ရန် မရှိသေးပါ။", + "promptUpdateBoards": "ဘုတ်အချို့တွက် အပ်ဒိတ်ရရှိပါပြီ။", + "promptUpdateLibraries": "ကုတ်ကြည့်တိုက်အချို့တွက် အပ်ဒိတ်ရရှိပါပြီ။", + "updatingBoards": "ဘုတ်အပ်ဒိတ်တင်နေသည်…", + "updatingLibraries": "ကုတ်ကြည့်တိုက်အပ်ဒိတ်တင်နေသည်" }, "cli-error-parser": { "keyboardError": "'ကီးဘုတ်' ရှာမတွေ့ပါ။ '#include <Keyboard.h>' ကုတ်စာကြောင်းကို သင့်ကုတ်ပုံကြမ်းထဲတွင် ထည့်ရေးထားပါသလား?", "mouseError": "'မောက်စ်' ရှာမတွေ့ပါ။ '#include <Mouse.h>' ကုတ်စာကြောင်းကို သင့်ကုတ်ပုံကြမ်းထဲတွင် ထည့်ရေးထားပါသလား?" }, "cloud": { - "account": "အကောင့်", "chooseSketchVisibility": "သင့်ကုတ်ပုံကြမ်း၏ မြင်နိုင်စွမ်းအား ရွေးချယ်ခြင်း - ", + "cloudSketchbook": "တိမ်တိုက် Sketchbook ဖိုင်တွဲ", "connected": "ချိတ်ဆက်ထားသည်", "continue": "ဆက်သွားမည်", - "donePulling": "‘{0}’ကိုဆွဲယူပြီးပါပြီ။", - "donePushing": "‘{0}’တွန်းပို့ပြီးပါပြီ။", + "donePulling": "Done pulling '{0}'.", + "donePushing": "Done pushing '{0}'.", "embed": "မြှုပ်သွင်းထားသော -", "emptySketchbook": "သင့်ကုတ်ပုံကြမ်းဖိုင်တွဲထဲတွင် ဘာမှမရှိပါ", + "goToCloud": "ကလောက်သို့သွားမည်", "learnMore": "ပိုမိုလေ့လာရန်", "link": "လင့်ခ်-", "notYetPulled": "Cloudသို့တွန်းပို့၍မရသေးပါ။ မဆွဲယူရသေးသောကြောင့်ဖြစ်သည်။", @@ -102,58 +116,97 @@ "pushSketch": "ကုတ်ဖိုင်လ်တင်မည်", "pushSketchMsg": "ဤကုတ်ဖိုင်လ်သည် အများသုံးဖြစ်သည်။ မတင်မီ လျှိုဝှက်သင့်သောအချက်အလက်ကို arduino_secrets.h ဖိုင်လ်များတွင် သတ်မှတ်ထားပေးပါ။ သင်အနေဖြင့် 'ဝေမျှမည်'ပန်နယ်တွင် ကုတ်ဖိုင်လ်ကို ပုဂ္ဂလိကအဖြစ်သတ်မှတ်နိုင်သည်။", "remote": "အဝေး", - "remoteSketchbook": "အဝေးရှိ ကုတ်ပုံကြမ်းဖိုင်တွဲ", "share": "ဝေမျှမည်…", "shareSketch": "ကုတ်ဖိုင်လ်ဝေမျှမည်", - "showHideRemoveSketchbook": "အဝေးရှိ Sketchbook ဖိုင်တွဲအား ပြ/ဖွက် မည်", + "showHideSketchbook": "Show/Hide Cloud Sketchbook", "signIn": "လက်မှတ်ထိုးဝင်", "signInToCloud": "Arduino Cloudသို့ လက်မှတ်ထိုးဝင်ရောက်ပါ", "signOut": "လက်မှတ်ထိုးထွက်", "sync": "ထပ်တူပြုခြင်း", "syncEditSketches": "သင်၏Arduino Cloud ကုတ်ဖိုင်လ်များကို အင်တာနက်မှတဆင့် အချိန်နှင့်တပြေးညီ ရယူကိုက်ညီစေပြီး တည်းဖြတ်လိုက်ပါ", - "visitArduinoCloud": "Visit Arduino Cloud to create Cloud Sketches." + "visitArduinoCloud": "ကလောက်ကုတ်ဖိုင်ဖန်တီးရန် Arduino Cloudသို့သွားပါ။" + }, + "cloudSketch": { + "alreadyExists": "Cloud sketch '{0}' already exists.", + "creating": "Creating cloud sketch '{0}'...", + "new": "New Cloud Sketch", + "notFound": "Could not pull the cloud sketch '{0}'. It does not exist.", + "pulling": "Synchronizing sketchbook, pulling '{0}'...", + "pushing": "Synchronizing sketchbook, pushing '{0}'...", + "renaming": "Renaming cloud sketch from '{0}' to '{1}'...", + "synchronizingSketchbook": "Synchronizing sketchbook..." }, "common": { - "all": "All", - "contributed": "Contributed", + "all": "အားလုံး", + "contributed": "ကူညီရေးသားထားသည်များ", "installManually": "ကိုယ်တိုင်တပ်ဆင်မည်", "later": "နောက်မှ", "noBoardSelected": "ဘုတ် မရွေးချယ်ထားပါ", + "noSketchOpened": "No sketch opened", "notConnected": "[မချိတ်ဆက်ထားပါ]", "offlineIndicator": "အော့ဖ်လိုင်းဖြစ်နေသည်။ အင်တာနက်မရှိလျှင် Arduino CLIသည် လိုအပ်သော ဒေတာများမရယူနိုင်သောကြောင့် လုပ်ဆောင်ချက်ချို့ယွင်းမှုဖြစ်ပေါ်မည်။ အင်တာနက်နှင့်ချိတ်ဆက်ပြီး အပ္ပလီကေးရှင်းကို ပြန်စတင်ပေးပါ။", "oldFormat": "'{0}'သည် မူပုံစံအဟောင်း `.pde`ကိုအသုံးပြုထားသည်။ ဖိုင်လ်တိုးချဲ့အမှတ်အသားအသစ် `.ino` သို့ ပြောင်းလဲမှာလား။", - "partner": "Partner", + "partner": "တွဲဘက်", "processing": "အဆင့်ဆင့်ဆောင်ရွက်နေသည်", - "recommended": "Recommended", - "retired": "Retired", + "recommended": "အသုံးပြုရန်အကြုံပြုထားသည်များ", + "retired": "အငြိမ်းစား", + "selectManually": "ကိုယ်တိုင်ရွေးချယ်", "selectedOn": "{0}တွင်", "serialMonitor": "အတန်းလိုက်ဆက်သွယ်မှုမော်နီတာ", - "type": "Type", + "type": "အမျိုးအစား", "unknown": "မသိ", - "updateable": "Updatable" + "updateable": "အပ်ဒိတ်တင်၍ရသော", + "userAbort": "User abort" }, "compile": { - "error": "Compilation error: {0}" + "error": "ကုတ်ပေါင်းခြင်းဆိုင်ရာအမှား- {0}" }, "component": { - "boardsIncluded": "Boards included in this package:", + "boardsIncluded": "ဤပတ်ကေ့တွင်ပါဝင်သောဘုတ်များ-", "by": "မှ", - "filterSearch": "Filter your search...", + "clickToOpen": "Click to open in browser: {0}", + "filterSearch": "သင်၏ရှာဖွေမှုရလဒ်ကိုစစ်ထုတ်မည်…", "install": "တပ်ဆင်မည်", + "installLatest": "နောက်ဆုံးပေါ်များတပ်ဆင်မည်", + "installVersion": "Install {0}", + "installed": "{0} installed", "moreInfo": "နောက်ထပ်အချက်အလက်များ", + "otherVersions": "Other Versions", + "remove": "ဖယ်ရှားမည်", + "title": "{0} by {1}", "uninstall": "ဖြုတ်ချ", "uninstallMsg": "သင် {0} ကိုဖြုတ်ချချင်ပါသလား?", - "version": "ဗားရှင်း {0}" + "update": "Update" + }, + "configuration": { + "cli": { + "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" + } + }, + "connectionStatus": { + "connectionLost": "Connection lost. Cloud sketch actions and updates won't be available." }, "contributions": { "addFile": "ဖိုင်လ်ထည့်မည်", "fileAdded": "ကုတ်ပုံကြမ်းထဲသို့ ဖိုင်တစ်ခု ထည့်လိုက်သည်။", + "plotter": { + "couldNotOpen": "အတန်းလိုက်ပုံဆွဲကိရိယာကိုမဖွင့်နိုင်ခဲ့ပါ" + }, "replaceTitle": "အစားထိုးမည်" }, + "core": { + "compilerWarnings": { + "all": "အားလုံး", + "default": "မူလ", + "more": "နောက်ထပ်", + "none": "မရှိ" + } + }, "coreContribution": { "copyError": "အမှားပြစာများကို ကော်ပီဆွဲသည်", - "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." + "noBoardSelected": "မည်သည့်ဘုတ်မှ မရွေးထားပါ။ သင်၏အာဒီနိုဘုတ်ကို ကိရိယာများ>ဘုတ် မီနူးတွင် ရွေးချယ်ပါ။" }, + "createCloudCopy": "Push Sketch to Cloud", "daemon": { "restart": "Daemon ပြန်စမည်", "start": "Daemon စတင်မည်", @@ -162,8 +215,15 @@ "debug": { "debugWithMessage": "ပြစ်ချက်ရှာဖွေချက် - {0}", "debuggingNotSupported": "ကုတ်ပြစ်ချက်ရှာဖွေမှုကို '{0}'မှ မပေးထားပါ", + "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "'{0}' အတွက် ပလက်ဖောင်းကို မထည့်သွင်းရသေးပါ", - "optimizeForDebugging": "ကုတ်ပြစ်ချက်ရှာဖွေရန်အတွက်ဦးစားပေးမည်" + "optimizeForDebugging": "ကုတ်ပြစ်ချက်ရှာဖွေရန်အတွက်ဦးစားပေးမည်", + "sketchIsNotCompiled": "Sketch '{0}' must be verified before starting a debug session. Please verify the sketch and start debugging again. Do you want to verify the sketch now?" + }, + "developer": { + "clearBoardList": "Clear the Board List History", + "clearBoardsConfig": "Clear the Board and Port Selection", + "dumpBoardList": "Dump the Board List" }, "dialog": { "dontAskAgain": "နောက်ထပ်မမေးပါနှင့်" @@ -178,15 +238,11 @@ "increaseIndent": "အင်တင်းခြင်းတိုးမည်", "nextError": "နောက်ကအမှား", "previousError": "ရှေ့ကအမှား", - "revealError": "Reveal Error" - }, - "electron": { - "couldNotSave": "ကုတ်ပုံကြမ်းကို မသိမ်းဆည်းနိုင်ခဲ့ပါ။ ကျေးဇူးပြု၍ သင်၏ မသိမ်းဆည်းရသေးသော ကုတ်များကို သင်နှစ်သက်ရာ စာသားတည်းဖြတ်မှုဆော့ဖ်ဝဲထဲသို့ ကူးယူပြီး IDE ကို ပြန်စတင်ပါ။", - "unsavedChanges": "Any unsaved changes will not be saved." + "revealError": "အမှားဖော်ပြ" }, "examples": { - "builtInExamples": "Built-in examples", - "couldNotInitializeExamples": "Could not initialize built-in examples.", + "builtInExamples": "နဂိုပါဝင်သောဥပမာများ", + "couldNotInitializeExamples": "နဂိုပါဝင်သောဥပမာများကို မစတင်နိုင်ခဲ့ပါ။", "customLibrary": "စိတ်ကြိုက် Libraries များမှ ဥပမာများ", "for": "{0} အတွက် ဥပမာများ", "forAny": "ဘယ်ဘုတ်ပဲလာလာ အတွက် ဥပမာများ", @@ -197,11 +253,11 @@ "failedInstall": "ထည့်သွင်းခြင်း မအောင်မြင်ပါ။ ကျေးဇူးပြု၍ ထပ်မံကြိုးစားပါ။", "install": "တပ်ဆင်မည်", "installingFirmware": "ဖမ်းဝဲလ် သွင်းနေသည်။", - "overwriteSketch": "Installation will overwrite the Sketch on the board.", + "overwriteSketch": "တပ်ဆင်မှုသည် ဘုတ်ပေါ်ရှိကုတ်ဖိုင်လ်ကို ဖျက်ရေးသွားမည်", "selectBoard": "ဘုတ်ရွေးချယ်မည်", "selectVersion": "ဖမ်းဝဲလ်ဗားရှင်း ရွေးပါ", "successfullyInstalled": "ဖမ်းဝဲလ်ကို အောင်မြင်စွာ သွင်းပြီးပါပြီ။", - "updater": "WiFi101 / WiFiNINA ဖမ်းဝဲလ်မြှင့်ပေးသူ" + "updater": "Firmware Updater" }, "help": { "environment": "ဆော့ဖ်ဝဲလ်အကြောင်း", @@ -216,9 +272,12 @@ "visit": "Arduino.cc ကိုသွားကြည့်မယ်ကွာ" }, "ide-updater": { - "checkForUpdates": "Check for Arduino IDE Updates", + "checkForUpdates": "အာဒီနိုအိုင်ဒီအီးအပ်ဒိတ်များစစ်မည်", "closeAndInstallButton": "ပိတ်ပြီးသွင်းမယ်", "closeToInstallNotice": "ဆော့ဖ်ဝဲလ်ပိတ်ပြီး အသစ်ကိုသွင်းမယ်။", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", "downloadButton": "ဒေါင်းလုတ်ဆွဲမယ်", "downloadingNotice": "နောက်ဆုံးပေါ် Arduino IDE ဗားရှင်းကို ဒေါင်းလုတ်ဆွဲနေတယ်။", "errorCheckingForUpdates": "Arduino IDE အပ်ဒိတ်တွေအတွက် စစ်ဆေးနေတုန်း ပြဿနာတက်သွားတယ်။\n{0}", @@ -232,167 +291,249 @@ "updateAvailable": "အပ်ဒိတ်ရပါပြီ", "versionDownloaded": "Arduino IDE {0} ကိုဒေါင်းလုတ်ဆွဲပြီးပါပြီ။" }, + "installable": { + "libraryInstallFailed": "Failed to install library: '{0}{1}'.", + "platformInstallFailed": "Failed to install platform: '{0}{1}'." + }, "library": { "addZip": "ကုတ်ကြည့်တိုက် .ZIPထည့်မည်…", "arduinoLibraries": "Arduinoကုတ်ကြည့်တိုက်များ", "contributedLibraries": "ပါဝင်ကူညီပေးထားသော libraries များ", - "dependenciesForLibrary": "library အတွက် dependencies များ {0}:{1}", "include": "Library သွင်းမည်", "installAll": "အားလုံးတပ်ဆင်မည်", + "installLibraryDependencies": "Install library dependencies", "installMissingDependencies": "လိုအပ်နေသော dependencies များအားလုံးကို ထည့်သွင်းလိုပါသလား?", "installOneMissingDependency": "လိုအပ်နေသော dependency ကို ထည့်သွင်းလိုပါသလား?", - "installOnly": "{0}ကိုသာတပ်ဆင်မည်", + "installWithoutDependencies": "Install without dependencies", "installedSuccessfully": "အောင်မြင်စွာ ထည့်သွင်းပြီးပါပြီ library {0}:{1}", "libraryAlreadyExists": "Library ရှိပြီးသားပါ။ ထပ်ရေးလိုပါသလား?", "manageLibraries": "Libraries စီမံခြင်း...", "namedLibraryAlreadyExists": "{0} ခေါ် library ဖိုင်တွဲမှာရှိပြီးသားပါ။ ထပ်ရေးလိုပါသလား?", - "needsMultipleDependencies": "The library <b>{0}:{1}</b> needs some other dependencies currently not installed:", - "needsOneDependency": "The library <b>{0}:{1}</b> needs another dependency currently not installed:", + "needsMultipleDependencies": "ကုတ်ကြည့်တိုက် <b>{0}:{1}</b> သည် မတပ်ဆင်ရသေးသော အခြားကုတ်ကြည့်တိုက်များကို လိုအပ်သည်-", + "needsOneDependency": "ကုတ်ကြည့်တိုက် <b>{0}:{1}</b> သည် မတပ်ဆင်ရသေးသော အခြားကုတ်ကြည့်တိုက်ကို လိုအပ်သည်-", "overwriteExistingLibrary": "ရှိနေပြီးသား library ကို ထပ်ရေးလိုပါသလား?", - "successfullyInstalledZipLibrary": "Successfully installed library from {0} archive", + "successfullyInstalledZipLibrary": "{0} မှ ကုတ်ကြည့်တိုက်ကို အောင်မြင်စွာထည့်သွင်းပြီးပါပြီ", "title": "ကုတ်ကြည့်တိုက်မန်နေဂျာ", - "uninstalledSuccessfully": "Successfully uninstalled library {0}:{1}", + "uninstalledSuccessfully": "အောင်မြင်စွာ ဖြုတ်ချပြီးသော ကုတ်ကြည့်တိုက် {0}:{1}", "zipLibrary": "ကုတ်ကြည့်တိုက်" }, "librarySearchProperty": { - "topic": "Topic" + "topic": "ခေါင်းစဉ်" }, "libraryTopic": { - "communication": "Communication", - "dataProcessing": "Data Processing", - "dataStorage": "Data Storage", - "deviceControl": "Device Control", - "display": "Display", - "other": "Other", - "sensors": "Sensors", - "signalInputOutput": "Signal Input/Output", - "timing": "Timing", - "uncategorized": "Uncategorized" + "communication": "ဆယ်သွယ်ရေး", + "dataProcessing": "ဒေတာခွဲခြားစီမံခြင်း", + "dataStorage": "ဒေတာသိမ်းဆည်းမှု", + "deviceControl": "စက််ထိန်းချုပ်ရေး", + "display": "ရုပ်ပြမှန်ပြင်", + "other": "အခြား", + "sensors": "အာရုံခံစက်များ", + "signalInputOutput": "အချက်ပြ အသွင်း/အထုတ်", + "timing": "အချက်", + "uncategorized": "အမျိုးအစားခွဲမထားသော" }, "libraryType": { - "installed": "Installed" + "installed": "တပ်ဆင်ထားပြီး" }, "menu": { - "advanced": "Advanced", + "advanced": "အဆင့်မြင့်", "sketch": "ကုတ်ဖိုင်လ်ဆိုင်ရာ", "tools": "ကိရိယာများ" }, "monitor": { - "unableToCloseWebSocket": "Unable to close websocket", - "unableToConnectToWebSocket": "Unable to connect to websocket" + "alreadyConnectedError": "Could not connect to {0} {1} port. Already connected.", + "baudRate": "{0} baud", + "connectionFailedError": "Could not connect to {0} {1} port.", + "connectionFailedErrorWithDetails": "{0} Could not connect to {1} {2} port.", + "connectionTimeout": "Timeout. The IDE has not received the 'success' message from the monitor after successfully connecting to it", + "missingConfigurationError": "Could not connect to {0} {1} port. The monitor configuration is missing.", + "notConnectedError": "Not connected to {0} {1} port.", + "unableToCloseWebSocket": "ဝက်ဘ်ဆော့ကတ်ကိုမပိတ်နိုင်ပါ", + "unableToConnectToWebSocket": "ဝက်ဘ်ဆော့ကတ်သို့မချိတ်ဆက်နိုင်ပါ" + }, + "newCloudSketch": { + "newSketchTitle": "Name of the new Cloud Sketch" + }, + "portProtocol": { + "network": "ကွန်ရက်", + "serial": "အတန်းလိုက်" }, "preferences": { - "additionalManagerURLs": "Additional Boards Manager URLs", - "auth.audience": "The OAuth2 audience.", - "auth.clientID": "The OAuth2 client ID.", - "auth.domain": "The OAuth2 domain.", - "auth.registerUri": "The URI used to register a new user.", + "additionalManagerURLs": "နောက်ထပ်ဘုတ်မန်နေဂျာURLs", + "auth.audience": "OAuth2 ပရိတ်သတ်", + "auth.clientID": "OAuth2အသုံးပြုစက်အိုင်ဒီ", + "auth.domain": "OAuth2ဒိုမိန်း", + "auth.registerUri": "အသုံးပြုသူအသစ် မှတ်ပုံတင်ရန် သုံးသောURI", "automatic": "အလိုအလျောက်", - "board.certificates": "List of certificates that can be uploaded to boards", + "board.certificates": "ဘုတ်သို့အပ်လုတ်တင်နိုင်သောအသိအမှတ်ပြုစာချွန်လွှာစာရင်း", "browse": "လျှောက်ကြည့်မည်", - "checkForUpdate": "Receive notifications of available updates for the IDE, boards, and libraries. Requires an IDE restart after change. It's true by default.", + "checkForUpdate": "အပ်ဒိတ်တင်ရန် အသိပေးချက်များ လက်ခံမည်။ တန်ဖိုးပြောင်းပါက ပရိုဂရမ်ကို ပြန်စတင်ရမည်။ မူရင်းတန်ဖိုး - အမှန်", "choose": "ရွေးချယ်မည်", - "cli.daemonDebug": "Enable debug logging of the gRPC calls to the Arduino CLI. A restart of the IDE is needed for this setting to take effect. It's false by default.", - "cloud.enabled": "True if the sketch sync functions are enabled. Defaults to true.", - "cloud.pull.warn": "True if users should be warned before pulling a cloud sketch. Defaults to true.", - "cloud.push.warn": "True if users should be warned before pushing a cloud sketch. Defaults to true.", - "cloud.pushpublic.warn": "True if users should be warned before pushing a public sketch to the cloud. Defaults to true.", - "cloud.sketchSyncEndpoint": "The endpoint used to push and pull sketches from a backend. By default it points to Arduino Cloud API.", + "cli.daemonDebug": "ဒီဘက်မှတ်တမ်းတင်ခြင်းဖွင့်မည်။ မူရင်းတန်ဖိုး - အမှား", + "cloud.enabled": "ဆင့် ဖန်ရှင်းများ ဖွင့်မည်။ မူရင်းတန်ဖိုး - အမှန်", + "cloud.pull.warn": "ကလောက်ကုတ်ဖိုင်လ်ကို စက်ထဲ့သို့ မသွင်းခင် သတိပေးမည်။ မူရင်းတန်ဖိုး - အမှန်", + "cloud.push.warn": "ကလောက်ကုတ်ဖိုင်လ်သို့ ကုတ်ဖိုင်လ် မသွင်းခင် သတိပေးမည်။ မူရင်းတန်ဖိုး - အမှန်", + "cloud.pushpublic.warn": "ကလောက်သို့ အများသုံးကုတ်ဖိုင်လ် မသွင်းခင် သတိပေးမည်။ မူရင်းတန်ဖိုး - အမှန်", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", + "cloud.sketchSyncEndpoint": "နောက်ကွယ်လုပ်ဆောင်မှုစနစ်မှ ကုတ်ဖိုင်လ် ရယူခြင်း သို့ ပေးပို့ခြင်းလုပ်ရန် အသုံးပြုသော အဆုံးမှတ်။ မူရင်းတန်းဖိုး - အာဒီနိုကလောက်အေပီအိုင်သို့ ညွှန်ပြနေသည်။", "compile": "စက်ဘာသာပြန်", - "compile.experimental": "True if the IDE should handle multiple compiler errors. False by default", - "compile.revealRange": "Adjusts how compiler errors are revealed in the editor after a failed verify/upload. Possible values: 'auto': Scroll vertically as necessary and reveal a line. 'center': Scroll vertically as necessary and reveal a line centered vertically. 'top': Scroll vertically as necessary and reveal a line close to the top of the viewport, optimized for viewing a code definition. 'centerIfOutsideViewport': Scroll vertically as necessary and reveal a line centered vertically only if it lies outside the viewport. The default value is '{0}'.", - "compile.verbose": "True for verbose compile output. False by default", - "compile.warnings": "Tells gcc which warning level to use. It's 'None' by default", + "compile.experimental": "ကုတ်ပေါင်းမှုဆိုင်ရာပြဿနာများအား အိုင်ဒီအီးမှ ကိုင်တွယ်မည်။ မူရင်းတန်ဖိုး - အမှား", + "compile.revealRange": "စစ်ဆေး/အပ်လုတ် မအောင်မြင်ခဲ့လျှင် အယ်ဒီတာတွင် ကုတ်ပေါင်းမှုဆိုင်ရာ အမှားအယွင်းဖော်ပြချက် ချိန်ညှိသည်။ အသုံးပြုနိုင်သော တန်ဖိုးများ - 'auto' - ဒေါင်လိုက်လှိမ့်ဆွဲပြီးစာကြောင်းသို့ သွားမည်။ 'center' - ဒေါင်လိုက်လှိမ့်ဆွဲပြီး စာကြောင်းကို အလယ်တည့်တည့်တွင် ထားမည်။ 'top' - ဒေါင်လိုက်လှိမ့်ဆွဲပြီး စာကြောင်းကို မြင်ကွင်း၏ထိပ်နားတွင် ပြမည်။ 'centerIfOutsideViewport' - စာကြောင်းသည် မြင်ကွင်းအပြင်ရောက်နေပါက ဒေါင်လိုက်လှိမ့်ဆွဲပြီး စာကြောင်းကို အလယ်တည့်တည့်တွင် ထားမည်။ မူရင်းတန်ဖိုး - {0}", + "compile.verbose": "ကုတ်ပေါင်းကိရိယာမှ အသေးစိတ်အချက်အလက်များ ထုတ်ပြမည်။ မူရင်းတန်ဖိုး - အမှား", + "compile.warnings": "အသုံးပြုမည့်gccသတိပေးမှုအဆင့်။ မူရင်းအဆင့် - 'None'", "compilerWarnings": "စက်ဘာသာပြန်ကိရိယာသတိပေးချက်များ", "editorFontSize": "အယ်ဒီတာဖောင့်အရွယ်အစား", - "editorQuickSuggestions": "Editor Quick Suggestions", - "enterAdditionalURLs": "Enter additional URLs, one for each row", - "files.inside.sketches": "Show files inside Sketches", - "ide.updateBaseUrl": "The base URL where to download updates from. Defaults to 'https://downloads.arduino.cc/arduino-ide'", - "ide.updateChannel": "Release channel to get updated from. 'stable' is the stable release, 'nightly' is the latest development build.", + "editorQuickSuggestions": "အယ်ဒီတာအကြံပြုချက်များ", + "enterAdditionalURLs": "နောက်ထပ်URLများကို တစ်ခုလျှင် တစ်တန်းဆီ ရေးသွင်းပါ", + "files.inside.sketches": "ကုတ်ဖိုင်လ်များအတွင်း ဖိုင်လ်များပြမည်", + "ide.updateBaseUrl": "အပ်ဒိတ်များဒေါင်းလုတ်ဆွဲရန်အတွက် URL။ မူရင်းတန်ဖိုး - 'https://downloads.arduino.cc/arduino-ide'", + "ide.updateChannel": "အပ်ဒိတ်တင်ရန်အတွက် ထုတ်ဝေမှုချန်နယ်။ 'stable'သည် တည်ငြိမ်မှုဦးစားပေးချန်နယ်။ 'nightly'သည် နောက်ဆုံးပေါ်ထုတ်ဝေမှုချန်နယ်။", "interfaceScale": "အင်တာဖေ့စ်စကေး", - "invalid.editorFontSize": "Invalid editor font size. It must be a positive integer.", - "invalid.sketchbook.location": "Invalid sketchbook location: {0}", - "invalid.theme": "Invalid theme.", - "language.log": "True if the Arduino Language Server should generate log files into the sketch folder. Otherwise, false. It's false by default.", - "language.realTimeDiagnostics": "If true, the language server provides real-time diagnostics when typing in the editor. It's false by default.", - "manualProxy": "Manual proxy configuration", + "invalid.editorFontSize": "အယ်ဒီတာဖောင့်အရွယ်အစားမမှန်ကန်ပါ။ အပေါင်းကိန်းပြည့်ဖြစ်ရပါမည်။", + "invalid.sketchbook.location": "မမှန်ကန်သောကုတ်ဖိုင်လ်စာအုပ်တည်နေရာ-{0}", + "invalid.theme": "မမှန်ကန်သောသင်း", + "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", + "language.log": "အမှန်ဖြစ်နေပါက Arduinoဘာသာစကားစစ်ဆေးမှုဆာဗာသည် မှတ်တမ်းဖိုင်လ်များကို ကုတ်ဖိုင်လ်ဖိုလ်ဒါတွင် ထုတ်ပေးမည်။ မူရင်းတန်းဖိုးသည် အမှားဖြစ်သည်။", + "language.realTimeDiagnostics": "အမှန်ခြစ်ထားပါက အယ်ဒီတာတွင် စာရေးသောအခါ ဘာသာစကားစစ်ဆေးမှုဆာဗာသည် အချိန်နှင့်တပြေးညီ စစ်ဆေးပေးမည်။ မူလတန်ဖိုးသည် အမှားဖြစ်သည်။", + "manualProxy": "ကိုယ်တိုင် ကြားခံကွန်ရက်ပြင်ဆင်ခြင်း", + "monitor": { + "dockPanel": "The area of the application shell where the _{0}_ widget will reside. It is either \"bottom\" or \"right\". It defaults to \"{1}\"." + }, "network": "ကွန်ရက်", - "newSketchbookLocation": "Select new sketchbook location", + "newSketchbookLocation": "ကုတ်ဖိုင်လ်စာအုပ်တည်နေရာအသစ်ရွေးမည်", + "noCliConfig": "Could not load the CLI configuration", "noProxy": "ကြားခံကွန်ရက်မရှိ", + "proxySettings": { + "hostname": "အိမ်ရှင်အမည်", + "password": "စကားဝှက်", + "port": "အပေါက်နံပါတ်", + "username": "အသုံးပြုသူအမည်" + }, "showVerbose": "နောက်ပါလုပ်နေစဉ် အချက်အလက်များပိုမိုများပြားစွာပြမည်", - "sketchbook.location": "Sketchbook location", - "sketchbook.showAllFiles": "True to show all sketch files inside the sketch. It is false by default.", - "survey.notification": "True if users should be notified if a survey is available. True by default.", - "unofficialBoardSupport": "Click for a list of unofficial board support URLs", + "sketch": { + "inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect." + }, + "sketchbook.location": "ကုတ်ဖိုင်လ်စာအုပ်တည်နေရာ", + "sketchbook.showAllFiles": "အမှန်ဖြစ်ပါက ကုတ်ဖိုင်လ်အတွင်း ဖိုင်လ်အားလုံးပြမည်။ မူရင်းတန်ဖိုး - အမှား", + "unofficialBoardSupport": "တရားမဝင်ဘုတ် ထောက်ပံ့မှုURLစာရင်းအတွက် ကလစ်လိုက်ပါ", "upload": "အပ်လုတ်တင်", - "upload.verbose": "True for verbose upload output. False by default.", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", + "upload.verbose": "အပ်လုတ်တင်မှုဆိုင်အချက်အလက်များ အသေးစိတ်ဖော်ပြမည်။ မူရင်းတန်ဖိုး - အမှား", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "အပ်လုတ်တင်ပြီးလျှင်ကုတ်ကိုစစ်ဆေးပါ", - "window.autoScale": "True if the user interface automatically scales with the font size.", - "window.zoomLevel": "Adjust the zoom level of the window. The original size is 0 and each increment above (e.g. 1) or below (e.g. -1) represents zooming 20% larger or smaller. You can also enter decimals to adjust the zoom level with a finer granularity." + "window.autoScale": "အမှန်ဖြစ်နေပါက အသုံးပြုသူအင်တာဖေ့သည် ဖောင့်အရွယ်အစားနှင့်အတူ အလိုလိုချိန်ညှိမည်။", + "window.zoomLevel": { + "deprecationMessage": "Deprecated. Use 'window.zoomLevel' instead." + } + }, + "renameCloudSketch": { + "renameSketchTitle": "New name of the Cloud Sketch" }, - "replaceMsg": "Replace the existing version of {0}?", - "selectZip": "Select a zip file containing the library you'd like to add", + "replaceMsg": "{0}၏ရှိနှင့်ပြီးဗားရှင်းကို အစားထိုးမည်လား။", + "selectZip": "သင်ထည့်သွင်းချင်သော ကုတ်ကြည့်တိုက်ပါဝင်သည့်ဇစ်ဖိုင်လ်ရွေးပါ", "serial": { "autoscroll": "အလိုအလျောက်လှိမ့်ဆွဲခြင်း", "carriageReturn": "လက်နှိပ်စက်အတံပြန်အက္ခရာ", - "message": "Message ({0} + Enter to send message to '{1}' on '{2}')", + "connecting": "Connecting to '{0}' on '{1}'...", + "message": "စာတို (စာတိုကို '{0}'သို့ '{1}'တွင် ပို့ရန် ရိုက်နှိပ်ပါ)", "newLine": "စာကြောင်းအသစ်အက္ခရာ", "newLineCarriageReturn": "စာကြောင်းအသစ်နှင့်လက်နှိပ်စက်အတံပြန်အက္ခရာနှစ်ခုလုံး", "noLineEndings": "စာကြောင်းအဆုံးသတ်အက္ခရာမရှိ", - "notConnected": "Not connected. Select a board and a port to connect automatically.", - "openSerialPlotter": "Serial Plotter", + "notConnected": "မချိတ်ဆက်ထားပါ။ ဘုတ်နှင့်အပေါက်ကိုရွေးချယ်ပါ", + "openSerialPlotter": "အတန်းလိုက်ဆက်သွယ်မှုပုံဆွဲကိရိယာ", "timestamp": "အချိန်တံဆိပ်ခေါင်း", - "toggleTimestamp": "Toggle Timestamp" + "toggleTimestamp": "အချိန်တံဆိပ်ဖွင့်/ပိတ်" }, "sketch": { - "archiveSketch": "Archive Sketch", - "cantOpen": "A folder named \"{0}\" already exists. Can't open sketch.", - "close": "Are you sure you want to close the sketch?", - "compile": "Compiling sketch...", - "configureAndUpload": "Configure And Upload", - "createdArchive": "Created archive '{0}'.", - "doneCompiling": "Done compiling.", - "doneUploading": "Done uploading.", - "exportBinary": "Export Compiled Binary", + "archiveSketch": "ကုတ်ဖိုင်လ်သိမ်းမည်", + "cantOpen": "\"{0}\" အမည်ဖြင့်ဖိုလ်ဒါရှိနှင့်ပြီးဖြစ်သည်။ ကုတ်ဖိုင်လ်ကို မဖွင့်နိုင်ပါ။", + "compile": "ကုတ်ဖိုင်လ်ကို ကုတ်ပေါင်းနေသည်…", + "configureAndUpload": "ပြင်ဆင်၍အပ်လုတ်တင်မည်", + "createdArchive": "ဖန်းတီးပြီးသော သိမ်းဆည်းဖိုင်လ် '{0}'။", + "doneCompiling": "ကုတ်ပေါင်းပြီးပါပြီ။", + "doneUploading": "အပ်လုတ်တင်ပြီးပါပြီ။", + "editInvalidSketchFolderLocationQuestion": "Do you want to try saving the sketch to a different location?", + "editInvalidSketchFolderQuestion": "Do you want to try saving the sketch with a different name?", + "exportBinary": "ကုတ်ပေါင်းထားသောဘိုင်နရီဖိုင် ထုတ်ပို့မည်", + "invalidCloudSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", + "invalidSketchFolderLocationDetails": "You cannot save a sketch into a folder inside itself.", + "invalidSketchFolderLocationMessage": "Invalid sketch folder location: '{0}'", + "invalidSketchFolderNameMessage": "Invalid sketch folder name: '{0}'", + "invalidSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", "moving": "ရွှေ့နေသည်", - "movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?", - "new": "အသစ်", + "movingMsg": "ဖိုင်လ် \"{0}\" သည် ကုတ်ဖိုင်လ်ဖိုလ်ဒါ \"{1}\"အတွင်းရှိရန်လိုသည်။\nဖိုလ်ဒါတည်ဆောက်ပြီးဖိုင်လ်ကိုရွှေ့မည်လား။", + "new": "New Sketch", + "noTrailingPeriod": "A filename cannot end with a dot", "openFolder": "ဖိုလ်ဒါဖွင့်မည်", - "openRecent": "Open Recent", - "openSketchInNewWindow": "Open Sketch in New Window", - "saveFolderAs": "Save sketch folder as...", - "saveSketch": "Save your sketch to open it again later.", - "saveSketchAs": "Save sketch folder as...", + "openRecent": "လတ်တလောဖိုင်လ်ဖွင့်မည်", + "openSketchInNewWindow": "ကုတ်ဖိုင်လ်ကို ဝင်းဒိုးအသစ်တွင်ဖွင့်မည်", + "reservedFilename": "'{0}' is a reserved filename.", + "saveFolderAs": "ကုတ်ဖိုင်လ် ဖိုလ်ဒါကို သိမ်းမည်…", + "saveSketch": "သင်၏ကုတ်ဖိုင်လ်ကို နောင်အခါပြန်ကြည့်၍ရရန် မှတ်သားပါ။", + "saveSketchAs": "ကုတ်ဖိုင်လ် ဖိုလ်ဒါကို သိမ်းမည်…", "showFolder": "ကုတ်ပုံကြမ်းဖိုလ်ဒါပြမည်", "sketch": "ကုတ်ပုံကြမ်း", - "sketchbook": "Sketchbook", - "titleLocalSketchbook": "Local Sketchbook", - "titleSketchbook": "Sketchbook", - "upload": "Upload", - "uploadUsingProgrammer": "Upload Using Programmer", - "uploading": "Uploading...", - "userFieldsNotFoundError": "Can't find user fields for connected board", - "verify": "Verify", - "verifyOrCompile": "Verify/Compile" - }, - "survey": { - "answerSurvey": "Answer survey", - "dismissSurvey": "Don't show again", - "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." + "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", + "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", + "sketchbook": "ကုတ်ဖိုင်လ်စာအုပ်", + "titleLocalSketchbook": "စက်တွင်းကုတ်ဖိုင်လ်စာအုပ်", + "titleSketchbook": "ကုတ်ဖိုင်လ်စာအုပ်", + "upload": "အပ်လုတ်", + "uploadUsingProgrammer": "ပရိုဂရမ်မာဘုတ်သုံး၍အပ်လုတ်တင်မည်", + "uploading": "အပ်လုတ်တင်နေသည်…", + "userFieldsNotFoundError": "ချိတ်ဆက်ထားသောဘုတ်အတွက်အသုံးပြုသူဆိုင်ရာအချက်အလက်များရှာမတွေ့ပါ", + "verify": "စစ်ဆေး", + "verifyOrCompile": "စစ်ဆေး/ကုတ်ပေါင်း" + }, + "sketchbook": { + "newCloudSketch": "New Cloud Sketch", + "newSketch": "New Sketch" + }, + "theme": { + "currentThemeNotFound": "Could not find the currently selected theme: {0}. Arduino IDE has picked a built-in theme compatible with the missing one.", + "dark": "Dark", + "deprecated": "{0} (deprecated)", + "hc": "Dark High Contrast", + "hcLight": "Light High Contrast", + "light": "Light", + "user": "{0} (သုံးစွဲသူ)" + }, + "title": { + "cloud": "Cloud" + }, + "updateIndexes": { + "updateIndexes": "အပ်ဒိတ်စာရင်းများ", + "updateLibraryIndex": "ကုတ်ကြည့်တိုက်အပ်ဒိတ်စာရင်း", + "updatePackageIndex": "ပတ်ကေ့အပ်ဒိတ်စာရင်း" }, "upload": { - "error": "{0} error: {1}" + "error": "{0} အမှား- {1}" }, "userFields": { "cancel": "ပယ်ဖျက်မည်", - "enterField": "Enter {0}", + "enterField": "{0} ရိုက်သွင်းပါ", "upload": "အပ်လုတ်တင်မည်" + }, + "validateSketch": { + "abortFixMessage": "The sketch is still invalid. Do you want to fix the remaining problems? By clicking '{0}', a new sketch will open.", + "abortFixTitle": "Invalid sketch", + "renameSketchFileMessage": "The sketch file '{0}' cannot be used. {1} Do you want to rename the sketch file now?", + "renameSketchFileTitle": "Invalid sketch filename", + "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", + "renameSketchFolderTitle": "Invalid sketch name" + }, + "versionWelcome": { + "cancelButton": "Maybe later", + "donateButton": "Donate now", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Welcome to a new version of the Arduino IDE!", + "titleWithVersion": "Welcome to the new Arduino IDE {0}!" + }, + "workspace": { + "alreadyExists": "'{0}' already exists." } }, - "cloud": { - "GoToCloud": "CLOUDသို့သွားမည်" - }, "theia": { "core": { "cannotConnectBackend": "ကျောရိုးပရိုဂရမ်သို့ ချိတ်ဆက်၍မရခဲ့ပါ။", @@ -400,12 +541,8 @@ "couldNotSave": "ကုတ်ဖိုင်လ်ကိုမသိမ်းဆည်းနိုင်ခဲ့ပါ။ မသိမ်းဆည်းရသေးသော ကုတ်များကို သင်နှစ်သက်ရာစာသားတည်းဖြတ်ပရိုဂရမ်သို့ ကူးယူပြီး အိုင်ဒီအီး ပြန်စတင်ပါ။", "daemonOffline": "CLIနောက်ကွယ်လုပ်ဆောင်ပရိုဂရမ် အော့ဖ်လိုင်းဖြစ်နေသည်", "offline": "အော့ဖ်လိုင်း", - "quitTitle": "Are you sure you want to quit?" - }, - "debug": { - "start": "စတင်မည်…", - "startError": "ပြစ်ချက်ရှာဖွေမှုဆက်ရှင်စတင်ရာတွင် အမှားအယွင်းဖြစ်ပေါ်ခဲ့သည်။ အသေးစိတ်သိလိုပါက မှတ်တမ်းကို ကြည့်ပါ။", - "typeNotSupported": "ပြစ်ချက်ရှာဖွေမှုဆက်ရှင်အမျိုးအစား \"{0}\" ကိုမထောက်ပံ့ထားပါ။" + "offlineText": "အော့ဖ်လိုင်း", + "quitTitle": "သင်ထွက်မှာသေချာပါသလား။" }, "editor": { "unsavedTitle": "မသိမ်းဆည်းရသေး – {0}" @@ -415,10 +552,10 @@ "expand": "ချဲ့မည်" }, "workspace": { - "deleteCurrentSketch": "လက်ရှိကုတ်ဖိုင်လ်ကို ဖျက်ပစ်ချင်ပါသလား။", + "deleteCloudSketch": "The cloud sketch '{0}' will be permanently deleted from the Arduino servers and the local caches. This action is irreversible. Do you want to delete the current sketch?", + "deleteCurrentSketch": "The sketch '{0}' will be permanently deleted. This action is irreversible. Do you want to delete the current sketch?", "fileNewName": "ဖိုင်လ်အသစ်အတွက်အမည်", "invalidExtension": ".{0}သည် မှန်ကန်သော တိုးချဲ့အမှတ်အသားမဟုတ်ပါ", - "invalidFilename": "မမှန်ကန်သောဖိုင်လ်အမည်။", "newFileName": "ဖိုင်လ်အတွက်အမည်အသစ်" } } diff --git a/i18n/ne.json b/i18n/ne.json index d32dbf792..fd1dcb9e4 100644 --- a/i18n/ne.json +++ b/i18n/ne.json @@ -1,425 +1,562 @@ { "arduino": { "about": { - "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}{4} [{5}]\n\n{6}", - "label": "About {0}" + "detail": "संस्करण: {0}\nमिति: {1} {2}\nCLI संस्करण: {3}\n\n{4} ", + "label": "{0}को बारेमा " + }, + "account": { + "goToCloudEditor": "क्लाउड सम्पादकमा जानुहोस् |", + "goToIoTCloud": "IoT क्लाउडमा जानुहोस् । ", + "goToProfile": "प्रोफाइल मा जानुहोस्।", + "menuTitle": "आर्डुइनो क्लाउड्" }, "board": { - "board": "Board{0}", - "boardConfigDialogTitle": "Select Other Board and Port", - "boardInfo": "Board Info", - "configDialog1": "Select both a Board and a Port if you want to upload a sketch.", - "configDialog2": "If you only select a Board you will be able to compile, but not to upload your sketch.", - "couldNotFindPreviouslySelected": "Could not find previously selected board '{0}' in installed platform '{1}'. Please manually reselect the board you want to use. Do you want to reselect it now?", - "disconnected": "Disconnected", - "getBoardInfo": "Get Board Info", - "inSketchbook": " (in Sketchbook)", - "installNow": "The \"{0} {1}\" core has to be installed for the currently selected \"{2}\" board. Do you want to install it now?", - "noFQBN": "The FQBN is not available for the selected board \"{0}\". Do you have the corresponding core installed?", - "noPortsDiscovered": "No ports discovered", - "noPortsSelected": "No ports selected for board: '{0}'.", - "noneSelected": "No boards selected.", - "openBoardsConfig": "Select other board and port…", - "platformMissing": "The platform for the selected '{0}' board is not installed.", - "pleasePickBoard": "Please pick a board connected to the port you have selected.", - "port": "Port{0}", - "portLabel": "Port: {0}", - "programmer": "Programmer", - "reselectLater": "Reselect later", - "searchBoard": "Search board", - "selectBoard": "Select Board", - "selectBoardForInfo": "Please select a board to obtain board info.", - "selectPortForInfo": "Please select a port to obtain board info.", - "showAllAvailablePorts": "Shows all available ports when enabled", - "succesfullyInstalledPlatform": "Successfully installed platform {0}:{1}", - "succesfullyUninstalledPlatform": "Successfully uninstalled platform {0}:{1}" - }, - "boardsManager": "Boards Manager", + "board": "बोर्ड {0}", + "boardConfigDialogTitle": "अन्य बोर्ड र पोर्ट चयन गर्नुहोस् |", + "boardDataReloaded": "Board data reloaded.", + "boardInfo": "बोर्डको जानकारी", + "boards": "बोर्डहरू", + "configDialog1": "यदि तपाइँ स्केच अपलोड गर्न चाहनुहुन्छ भने बोर्ड र पोर्ट दुवै चयन गर्नुहोस्।", + "configDialog2": "यदि तपाइँ केवल बोर्ड चयन गर्नुहुन्छ भने तपाइँ कम्पाइल गर्न सक्षम हुनुहुनेछ, तर तपाइँको स्केच अपलोड गर्न सक्नुहुन्न।", + "couldNotFindPreviouslySelected": "स्थापित प्लेटफर्म '{1}' मा पहिले चयन गरिएको बोर्ड '{0}' फेला पार्न सकिएन​। कृपया तपाईंले प्रयोग गर्न चाहनुभएको बोर्डलाई म्यानुअल रूपमा पुन: चयन गर्नुहोस्। के तपाइँ यसलाई अहिले पुन: चयन गर्न चाहनुहुन्छ?", + "editBoardsConfig": "बोर्ड र पोर्ट परिमार्जन गर्नुहोस्...", + "getBoardInfo": "बोर्डको बारेमा जानकारी प्राप्त गर्नुहोस्।", + "inSketchbook": "(स्केचबुकमा)", + "installNow": "हाल चयन गरिएको \"{2}\" बोर्डको लागि \"{0} {1}\" core स्थापना गर्नुपर्छ। के तपाइँ यसलाई अहिले स्थापना गर्न चाहनुहुन्छ?", + "noBoardsFound": "\"{0}\" को लागि कुनै बोर्ड फेला परेन।", + "noNativeSerialPort": "Native serial port, जानकारी प्राप्त गर्न सक्दैन। ", + "noPortsDiscovered": "कुनै पोर्टहरू फेला परेन।", + "nonSerialPort": "गैर-सीरियल पोर्ट, जानकारी प्राप्त गर्न सकिदैन | ", + "openBoardsConfig": "अन्य बोर्ड र पोर्ट चयन गर्नुहोस्...", + "pleasePickBoard": "कृपया तपाईंले चयन गर्नुभएको पोर्टमा जडान भएको बोर्ड छान्नुहोस्।", + "port": "पोर्ट {0}", + "ports": "पोर्टहरू", + "programmer": "प्रोग्रामर", + "reloadBoardData": "Reload Board Data", + "reselectLater": "पुन: चयन गर्नुहोस्", + "revertBoardsConfig": "'{1}' मा फेला परेको '{0}' प्रयोग गर्नुहोस्", + "searchBoard": "बोर्ड खोज्नुहोस। ", + "selectBoard": "बोर्ड छान्नुहोस । ", + "selectBoardToReload": "Please select a board first.", + "selectPortForInfo": "बोर्ड जानकारी प्राप्त गर्न पोर्ट चयन गर्नुहोस्।", + "showAllAvailablePorts": "अनुमति हुँदा सबै उपलब्ध पोर्टहरू देखाउँछ।", + "showAllPorts": "पोर्टहरु हेर्नुहोस |", + "succesfullyInstalledPlatform": "प्लेटफर्म {0} : {1} को स्थापना सफलतापूर्वक रद्द गरियो।", + "succesfullyUninstalledPlatform": "प्लेटफर्म {0} : {1} सफलतापूर्वक अनइन्स्टल गरियो।", + "typeOfPorts": "{0} पोर्टहरू", + "unconfirmedBoard": "पुष्टि नभएको बोर्ड", + "unknownBoard": "बोर्ड चिनिएन" + }, + "boardsManager": "बोर्ड म्यानेजर ", "boardsType": { - "arduinoCertified": "Arduino Certified" + "arduinoCertified": "अर्डुइनो प्रमाणित" }, "bootloader": { - "burnBootloader": "Burn Bootloader", - "burningBootloader": "Burning bootloader...", - "doneBurningBootloader": "Done burning bootloader." + "burnBootloader": "बूटलोडर बर्न् गर्नुहोस। ", + "burningBootloader": "बूटलोडर बर्न् गर्दै... ", + "doneBurningBootloader": "बूटलोडर बर्न् भयो। " }, "burnBootloader": { - "error": "Error while burning the bootloader: {0}" + "error": "{0}: बुटलोडर बर्न् गर्दा त्रुटि भेटियो। " }, "certificate": { - "addNew": "Add New", - "addURL": "Add URL to fetch SSL certificate", - "boardAtPort": "{0} at {1}", - "certificatesUploaded": "Certificates uploaded.", - "enterURL": "Enter URL", - "noSupportedBoardConnected": "No supported board connected", - "openContext": "Open context", - "remove": "Remove", - "selectBoard": "Select a board...", - "selectCertificateToUpload": "1. Select certificate to upload", - "selectDestinationBoardToUpload": "2. Select destination board and upload certificate", - "upload": "Upload", - "uploadFailed": "Upload failed. Please try again.", - "uploadRootCertificates": "Upload SSL Root Certificates", - "uploadingCertificates": "Uploading certificates." + "addNew": "नयाँ राख्नुहोस। ", + "addURL": "SSL प्रमाणपत्र ल्याउन URL राख्नुहोस्। ", + "boardAtPort": "{1} मा {0}", + "certificatesUploaded": "प्रमाणपत्रहरू अपलोड गरियो।", + "enterURL": "URL राख्नुहोस्। ", + "noSupportedBoardConnected": "कुनै समर्थित बोर्ड जडान गरिएको छैन |", + "openContext": "सन्दर्भ खोल्नुहोस् |", + "remove": "हटाउनुहोस्", + "selectBoard": "बोर्ड छान्नुहोस |", + "selectCertificateToUpload": "1. अपलोड गर्न प्रमाणपत्र चयन गर्नुहोस् |", + "selectDestinationBoardToUpload": "2. बोर्ड चयन गर्नुहोस् र प्रमाणपत्र अपलोड गर्नुहोस् |", + "upload": "अपलोड गर्नुहोस्", + "uploadFailed": "अपलोड असफल भयो | कृपया फेरि प्रयास गर्नुहोस |", + "uploadRootCertificates": "SSL रूट प्रमाणपत्रहरू अपलोड गर्नुहोस्", + "uploadingCertificates": "प्रमाणपत्रहरू अपलोड गर्दै |" }, "checkForUpdates": { - "checkForUpdates": "Check for Arduino Updates", - "installAll": "Install All", - "noUpdates": "There are no recent updates available.", - "promptUpdateBoards": "Updates are available for some of your boards.", - "promptUpdateLibraries": "Updates are available for some of your libraries.", - "updatingBoards": "Updating boards...", - "updatingLibraries": "Updating libraries..." + "checkForUpdates": "Arduino अपडेटको लागि जाँच गर्नुहोस्", + "installAll": "सबै स्थापना गर्नुहोस्", + "noUpdates": "हाल कुनै अपडेटहरू उपलब्ध छैनन् |", + "promptUpdateBoards": "तपाईंका केही बोर्डहरूको लागि अपडेटहरू उपलब्ध छन्।", + "promptUpdateLibraries": "तपाईंका केही लाईब्रेरिहरुको लागि अपडेटहरू उपलब्ध छन्।", + "updatingBoards": "बोर्डहरू अद्यावधिक गर्दै...", + "updatingLibraries": "लाईब्रेरिहरु अद्यावधिक गर्दै..." }, "cli-error-parser": { - "keyboardError": "'Keyboard' not found. Does your sketch include the line '#include <Keyboard.h>'?", - "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" + "keyboardError": "'Keyboard' फेला परेन। के तपाईको स्केचमा 'include<Keyboard.h>' लाई समावेश गरिएको छ?", + "mouseError": "'Mouse'फेला परेन। के तपाईको स्केचमा 'include<Mouse.h>' लाई समावेश गरिएको छ?" }, "cloud": { - "account": "Account", - "chooseSketchVisibility": "Choose visibility of your Sketch:", - "connected": "Connected", - "continue": "Continue", - "donePulling": "Done pulling ‘{0}’.", - "donePushing": "Done pushing ‘{0}’.", - "embed": "Embed:", - "emptySketchbook": "Your Sketchbook is empty", - "learnMore": "Learn more", - "link": "Link:", - "notYetPulled": "Cannot push to Cloud. It is not yet pulled.", - "offline": "Offline", - "openInCloudEditor": "Open in Cloud Editor", - "options": "Options...", - "privateVisibility": "Private. Only you can view the Sketch.", - "profilePicture": "Profile picture", - "publicVisibility": "Public. Anyone with the link can view the Sketch.", - "pull": "Pull", - "pullFirst": "You have to pull first to be able to push to the Cloud.", - "pullSketch": "Pull Sketch", - "pullSketchMsg": "Pulling this Sketch from the Cloud will overwrite its local version. Are you sure you want to continue?", - "push": "Push", - "pushSketch": "Push Sketch", - "pushSketchMsg": "This is a Public Sketch. Before pushing, make sure any sensitive information is defined in arduino_secrets.h files. You can make a Sketch private from the Share panel.", - "remote": "Remote", - "remoteSketchbook": "Remote Sketchbook", - "share": "Share...", - "shareSketch": "Share Sketch", - "showHideRemoveSketchbook": "Show/Hide Remote Sketchbook", - "signIn": "SIGN IN", - "signInToCloud": "Sign in to Arduino Cloud", - "signOut": "Sign Out", - "sync": "Sync", - "syncEditSketches": "Sync and edit your Arduino Cloud Sketches", - "visitArduinoCloud": "Visit Arduino Cloud to create Cloud Sketches." + "chooseSketchVisibility": "आफ्नो स्केचको दृश्यता छान्नुहोस्:", + "cloudSketchbook": "क्लाउड स्केचबुक", + "connected": "जोडियो ", + "continue": "जारी राख्नुहोस्", + "donePulling": "'{0}' पूल् गरेर सकियो|", + "donePushing": "'{0}' पूस् गरेर सकियो|", + "embed": "इम्बेड:", + "emptySketchbook": "तपाईको स्केचबुक खाली छ", + "goToCloud": "क्लाउडमा जानुहोस्", + "learnMore": "विस्तृत रूपमा जान्नुहोस्| ", + "link": "लिङ्क:", + "notYetPulled": "क्लाउडमा पूस् गर्न सकिदैन । यो अझै पूल् हुन बाँकी छ । ", + "offline": "अफलाइन", + "openInCloudEditor": "क्लाउड सम्पादकमा खोल्नुहोस्", + "options": "विकल्पहरू...", + "privateVisibility": "निजी। तपाईं मात्र स्केच हेर्न सक्नुहुन्छ।", + "profilePicture": "प्रोफाइल तस्वीर", + "publicVisibility": "सार्वजनिक। लिङ्क भएका जो कोहीले स्केच हेर्न सक्छन्।", + "pull": "पुल", + "pullFirst": "क्लाउडमा पूस् गर्नका लागि तपाईंले पहिले पुल गर्नु पर्छ।", + "pullSketch": "स्केच पुल गर्नुहोस", + "pullSketchMsg": "क्लाउडबाट यो स्केच पुल गर्दा यस्मा भएको संस्करण अधिलेखन हुनेछ। के तपाइँ जारी राख्न निश्चित हुनुहुन्छ?", + "push": "पुश", + "pushSketch": "स्केच पुश गर्नुहोस", + "pushSketchMsg": "यो सार्वजनिक स्केच हो। पुश गर्नु अघि, arduino_secrets.h फाइलहरूमा कुनै पनि संवेदनशील जानकारी परिभाषित गरिएको छ भने सुनिश्चित गर्नुहोस्। तपाईंले साझेदारी प्यानलबाट स्केच निजी बनाउन सक्नुहुन्छ।", + "remote": "रिमोट", + "share": "साझेदारी...", + "shareSketch": "स्केच साझेदारी गर्नुहोस", + "showHideSketchbook": "क्लाउड स्केचबुक देखाउनुहोस् / लुकाउनुहोस्", + "signIn": "साइन इन ", + "signInToCloud": "अर्डुइनो क्लाउड मा साइन इन गर्नुहोस्", + "signOut": "साइन आउट ", + "sync": "सिंक गर्नुहोस्", + "syncEditSketches": "आफ्नो अर्डुइनो क्लाउड स्केचहरू सिङ्क गरेर सम्पादन गर्नुहोस्", + "visitArduinoCloud": "क्लाउड स्केचहरू सिर्जना गर्न अर्डुइनो क्लाउडमा जानुहोस्" + }, + "cloudSketch": { + "alreadyExists": "क्लाउड स्केच '{0}' पहिले नै अवस्थित छ।", + "creating": "क्लाउड स्केच '{0}' सिर्जना हुँदैछ", + "new": "नयाँ क्लाउड स्केच", + "notFound": "क्लाउड स्केच '{0}' पुल गर्न सकिएन। यो क्लाउडमा अवस्थित छैन।", + "pulling": "स्केचबुक सिङ्क्रोनाइज गरेर '{0}' पुल गर्दै...", + "pushing": "स्केचबुक सिङ्क्रोनाइज गरेर '{0}' पुश गर्दै...", + "renaming": "क्लाउड स्केचलाई '{0}' बाट '{1}' मा पुन: नामाकरण गर्दै...", + "synchronizingSketchbook": "स्केचबुक सिङ्क्रोनाइज गर्दै..." }, "common": { - "all": "All", - "contributed": "Contributed", - "installManually": "Install Manually", - "later": "Later", + "all": "सबै", + "contributed": "योगदान गरेको", + "installManually": "म्यानुअल रूपमा स्थापना गर्नुहोस्", + "later": "पछि", "noBoardSelected": "बोर्ड चयन गरिएको छैन।", + "noSketchOpened": "No sketch opened", "notConnected": "[ जोडिएको छैन ]", "offlineIndicator": "तपाईं अफलाइन हुनुहुन्छ। इन्टरनेट जडान बिना, Arduino CLI आवश्यक स्रोतहरू डाउनलोड गर्न सक्षम नहुन सक्छ र यसले खराबी निम्त्याउन सक्छ। कृपया इन्टरनेट जडान गर्नुहोस् र एप पुन: सुरु गर्नुहोस्।", - "oldFormat": "The '{0}' still uses the old `.pde` format. Do you want to switch to the new `.ino` extension?", - "partner": "Partner", - "processing": "Processing", - "recommended": "Recommended", - "retired": "Retired", - "selectedOn": "on {0}", + "oldFormat": "'{0}' ले अझै पुरानो '.pde' ढाँचा प्रयोग गर्छ। के तपाइँ नयाँ '.ino' एक्सटेन्सनमा स्विच गर्न चाहनुहुन्छ?", + "partner": "साथी", + "processing": "प्रशोधन हुँदैछ", + "recommended": "सिफारिस गरिएको", + "retired": "सेवानिवृत्त भएको", + "selectManually": "Select Manually", + "selectedOn": "{0} मा", "serialMonitor": "सिरियल मनिटर", - "type": "Type", - "unknown": "Unknown", - "updateable": "Updatable" + "type": "प्रकार", + "unknown": "थाहा नभएको", + "updateable": "अपडेट गर्न मिल्ने", + "userAbort": "User abort" }, "compile": { - "error": "Compilation error: {0}" + "error": "संकलन त्रुटि: {0}" }, "component": { - "boardsIncluded": "Boards included in this package:", - "by": "by", - "filterSearch": "Filter your search...", - "install": "INSTALL", - "moreInfo": "More info", - "uninstall": "Uninstall", - "uninstallMsg": "Do you want to uninstall {0}?", - "version": "Version {0}" + "boardsIncluded": "यस प्याकेजमा समावेश बोर्डहरू:", + "by": "द्वारा", + "clickToOpen": "ब्राउजरमा खोल्न क्लिक गर्नुहोस्: {0}", + "filterSearch": "आफ्नो खोज फिल्टर गर्नुहोस...", + "install": "स्थापना गर्नुहोस्", + "installLatest": "नवीनतम संस्करण स्थापना गर्नुहोस्", + "installVersion": "{0} स्थापना गर्नुहोस्", + "installed": "{0} स्थापित भयो", + "moreInfo": "थप जानकारी", + "otherVersions": "अन्य संस्करणहरू", + "remove": "हटाउनुहोस्", + "title": "{1} द्वारा {0}", + "uninstall": "स्थापना रद्द गर्नुहोस्", + "uninstallMsg": "के तपाई {0} को स्थापना रद्द गर्न चाहनुहुन्छ?", + "update": "अपडेट गर्नुहोस्" + }, + "configuration": { + "cli": { + "inaccessibleDirectory": "'{0}':{1} मा स्केचबुकको स्थान पहुँच गर्न सकेन" + } + }, + "connectionStatus": { + "connectionLost": "जडान हरायो। क्लाउड स्केचको कार्यहरू र अद्यावधिकहरू उपलब्ध हुने छैनन्।" }, "contributions": { - "addFile": "Add File", - "fileAdded": "One file added to the sketch.", - "replaceTitle": "Replace" + "addFile": "फाइल थप्नुहोस्", + "fileAdded": "स्केचमा एउटा फाइल थपियो", + "plotter": { + "couldNotOpen": "सिरियल प्लटर खोल्न सकेन" + }, + "replaceTitle": "प्रतिस्थापन गर्नुहोस्" + }, + "core": { + "compilerWarnings": { + "all": "सबै", + "default": "पूर्वनिर्धारित", + "more": "थप", + "none": "कुनै पनि होइन" + } }, "coreContribution": { - "copyError": "Copy error messages", - "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." + "copyError": "त्रुटि सन्देशहरूको प्रतिलिपि गर्नुहोस्", + "noBoardSelected": "बोर्ड चयन गरिएको छैन। कृपया उपकरण>बोर्ड मेनुबाट आफ्नो अर्डुइनो बोर्ड चयन गर्नुहोस्|" }, + "createCloudCopy": "स्केचलाई क्लाउडमा पुश गर्नुहोस्", "daemon": { - "restart": "Restart Daemon", - "start": "Start Daemon", - "stop": "Stop Daemon" + "restart": "डेमन पुन: सुरु गर्नुहोस्", + "start": "डेमन सुरु गर्नुहोस्", + "stop": "डेमन रोक्नुहोस्" }, "debug": { - "debugWithMessage": "Debug - {0}", - "debuggingNotSupported": "Debugging is not supported by '{0}'", - "noPlatformInstalledFor": "Platform is not installed for '{0}'", - "optimizeForDebugging": "Optimize for Debugging" + "debugWithMessage": "डिबग - {0}", + "debuggingNotSupported": "डिबगिङ '{0}' द्वारा समर्थित छैन", + "getDebugInfo": "Getting debug info...", + "noPlatformInstalledFor": "'{0}' को लागि प्लेटफर्म स्थापना गरिएको छैन", + "optimizeForDebugging": "डिबगिङका लागि अप्टिमाइज गर्नुहोस्", + "sketchIsNotCompiled": "डिबग अवधि सुरु गर्नु अघि स्केच {0} पुष्टि गरिनुपर्छ। कृपया स्केच पुष्टि गर्नुहोस् र फेरि डिबगिङ सुरु गर्नुहोस्। के तपाई अहिले स्केच पुष्टि गर्न चाहनुहुन्छ?" + }, + "developer": { + "clearBoardList": "बोर्ड इतिहास सूची खाली गर्नुहोस्", + "clearBoardsConfig": "चयन गरिएको बोर्ड र पोर्ट खाली गर्नुहोस् हटाउनुहोस्", + "dumpBoardList": "बोर्ड सूची हटाउनुहोस्" }, "dialog": { - "dontAskAgain": "Don't ask again" + "dontAskAgain": "फेरि नसोध्नुहोस्" }, "editor": { - "autoFormat": "Auto Format", - "commentUncomment": "Comment/Uncomment", - "copyForForum": "Copy for Forum (Markdown)", - "decreaseFontSize": "Decrease Font Size", - "decreaseIndent": "Decrease Indent", - "increaseFontSize": "Increase Font Size", - "increaseIndent": "Increase Indent", - "nextError": "Next Error", - "previousError": "Previous Error", - "revealError": "Reveal Error" - }, - "electron": { - "couldNotSave": "Could not save the sketch. Please copy your unsaved work into your favorite text editor, and restart the IDE.", - "unsavedChanges": "Any unsaved changes will not be saved." + "autoFormat": "ढाँचा स्वत: मिलाउनुहोस", + "commentUncomment": "टिप्पणी / टिप्पणी हटाउनुहोस्", + "copyForForum": "फोरमको लागि प्रतिलिपि गर्नुहोस् (मार्कडाउन)", + "decreaseFontSize": "फन्ट साइज घटाउनुहोस्", + "decreaseIndent": "इन्डेन्ट घटाउनुहोस्", + "increaseFontSize": "फन्ट साइज बढाउनुहोस्", + "increaseIndent": "इन्डेन्ट बढाउनुहोस्", + "nextError": "अर्को त्रुटि", + "previousError": "अघिल्लो त्रुटि", + "revealError": "त्रुटि देखाउनुहोस" }, "examples": { - "builtInExamples": "Built-in examples", - "couldNotInitializeExamples": "Could not initialize built-in examples.", - "customLibrary": "Examples from Custom Libraries", - "for": "Examples for {0}", - "forAny": "Examples for any board", - "menu": "Examples" + "builtInExamples": "पुन: निर्मित उदाहरणहरू", + "couldNotInitializeExamples": "पुन: निर्मित उदाहरणहरू सुरु गर्न सकिएन", + "customLibrary": "अनुकूलन लाईब्रेरीका उदाहरणहरू", + "for": "{0} को लागि उदाहरणहरू", + "forAny": "कुनै पनि बोर्डको लागि उदाहरणहरू", + "menu": "उदाहरणहरू" }, "firmware": { - "checkUpdates": "Check Updates", - "failedInstall": "Installation failed. Please try again.", - "install": "Install", - "installingFirmware": "Installing firmware.", - "overwriteSketch": "Installation will overwrite the Sketch on the board.", - "selectBoard": "Select Board", - "selectVersion": "Select firmware version", - "successfullyInstalled": "Firmware successfully installed.", - "updater": "WiFi101 / WiFiNINA Firmware Updater" + "checkUpdates": "अपडेटहरू जाँच गर्नुहोस्", + "failedInstall": "स्थापना असफल भयो। फेरि प्रयास गर्नुहोस", + "install": "स्थापना गर्नुहोस्", + "installingFirmware": "फर्मवेयर स्थापना हुँदैछ", + "overwriteSketch": "स्थापना गर्दा बोर्डमा स्केच अधिलेखन हुनेछ", + "selectBoard": "बोर्ड चयन गर्नुहोस्।", + "selectVersion": "फर्मवेयर संस्करण चयन गर्नुहोस्", + "successfullyInstalled": "फर्मवेयर सफलतापूर्वक स्थापित भयो।", + "updater": "फर्मवेयर अपडेटर" }, "help": { - "environment": "Environment", - "faq": "Frequently Asked Questions", - "findInReference": "Find in Reference", - "gettingStarted": "Getting Started", - "keyword": "Type a keyword", - "privacyPolicy": "Privacy Policy", - "reference": "Reference", - "search": "Search on Arduino.cc", - "troubleshooting": "Troubleshooting", - "visit": "Visit Arduino.cc" + "environment": "वातावरण", + "faq": "बारम्बार सोधिने प्रश्नहरू", + "findInReference": "सन्दर्भमा फेला पार्नुहोस्", + "gettingStarted": "सुरु गर्दै", + "keyword": "किवर्ड टाइप गर्नुहोस्", + "privacyPolicy": "गोपनीयता नीति", + "reference": "सन्दर्भ", + "search": "Arduino.cc मा खोज्नुहोस्", + "troubleshooting": "समस्या निवारण", + "visit": "Arduino.cc मा जानुहोस्" }, "ide-updater": { - "checkForUpdates": "Check for Arduino IDE Updates", - "closeAndInstallButton": "Close and Install", - "closeToInstallNotice": "Close the software and install the update on your machine.", - "downloadButton": "Download", - "downloadingNotice": "Downloading the latest version of the Arduino IDE.", - "errorCheckingForUpdates": "Error while checking for Arduino IDE updates.\n{0}", - "goToDownloadButton": "Go To Download", - "goToDownloadPage": "An update for the Arduino IDE is available, but we're not able to download and install it automatically. Please go to the download page and download the latest version from there.", - "ideUpdaterDialog": "Software Update", - "newVersionAvailable": "A new version of Arduino IDE ({0}) is available for download.", - "noUpdatesAvailable": "There are no recent updates available for the Arduino IDE", - "notNowButton": "Not now", - "skipVersionButton": "Skip Version", - "updateAvailable": "Update Available", - "versionDownloaded": "Arduino IDE {0} has been downloaded." + "checkForUpdates": "Arduino IDE अपडेटहरूको लागि जाँच गर्नुहोस्", + "closeAndInstallButton": "बन्द गरेर र स्थापना गर्नुहोस्", + "closeToInstallNotice": "सफ्टवेयर बन्द गर्नुहोस् र आफ्नो मेसिनमा अपडेट स्थापना गर्नुहोस्।", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", + "downloadButton": "डाउनलोड ", + "downloadingNotice": "अर्डुइनो IDE को नवीनतम संस्करण डाउनलोड हुँदैछ।", + "errorCheckingForUpdates": "अर्डुइनो IDE अपडेटहरूको लागि जाँच गर्दा त्रुटि भेटियो।\n{0}", + "goToDownloadButton": "डाउनलोड मा जानुहोस्", + "goToDownloadPage": "अर्डुइनो IDE को लागि अपडेट उपलब्ध छ, तर हामी यसलाई स्वचालित रूपमा डाउनलोड र स्थापना गर्न सकेनौँ । कृपया डाउनलोड पृष्ठमा जानुहोस् र त्यहाँबाट नवीनतम संस्करण डाउनलोड गर्नुहोस्।", + "ideUpdaterDialog": "सफ्टवेयर अपडेट", + "newVersionAvailable": "अर्डुइनो IDE ({0})को नयाँ संस्करण डाउनलोडको लागि उपलब्ध छ।", + "noUpdatesAvailable": "अर्डुइनो IDE को लागि कुनै हालको अपडेटहरू उपलब्ध छैनन्", + "notNowButton": "अहिले होइन", + "skipVersionButton": "संस्करण छोड्नुहोस्", + "updateAvailable": "अपडेट उपलब्ध छ", + "versionDownloaded": "अर्डुइनो IDE {0} डाउनलोड गरिएको छ।" + }, + "installable": { + "libraryInstallFailed": " '{0} {1}' लाईब्रेरी स्थापना गर्न असफल भयो।", + "platformInstallFailed": " '{0} {1}' प्लेटफर्म स्थापना गर्न असफल भयो।" }, "library": { - "addZip": "Add .ZIP Library...", - "arduinoLibraries": "Arduino libraries", - "contributedLibraries": "Contributed libraries", - "dependenciesForLibrary": "Dependencies for library {0}:{1}", - "include": "Include Library", - "installAll": "Install all", - "installMissingDependencies": "Would you like to install all the missing dependencies?", - "installOneMissingDependency": "Would you like to install the missing dependency?", - "installOnly": "Install {0} only", - "installedSuccessfully": "Successfully installed library {0}:{1}", - "libraryAlreadyExists": "A library already exists. Do you want to overwrite it?", - "manageLibraries": "Manage Libraries...", - "namedLibraryAlreadyExists": "A library folder named {0} already exists. Do you want to overwrite it?", - "needsMultipleDependencies": "The library <b>{0}:{1}</b> needs some other dependencies currently not installed:", - "needsOneDependency": "The library <b>{0}:{1}</b> needs another dependency currently not installed:", - "overwriteExistingLibrary": "Do you want to overwrite the existing library?", - "successfullyInstalledZipLibrary": "Successfully installed library from {0} archive", - "title": "Library Manager", - "uninstalledSuccessfully": "Successfully uninstalled library {0}:{1}", - "zipLibrary": "Library" + "addZip": ".ZIP लाइब्रेरी राख्नुहोस...", + "arduinoLibraries": "अर्डुइनो लाईब्रेरीहरू", + "contributedLibraries": "योगदान गरिएको लाईब्रेरीहरू ", + "include": "लाइब्रेरी समावेश गर्नुहोस्", + "installAll": "सबै स्थापना गर्नुहोस्", + "installLibraryDependencies": "लाइब्रेरी निर्भरताहरू स्थापना गर्नुहोस्", + "installMissingDependencies": "के तपाइँ सबै छुटेको निर्भरताहरू स्थापना गर्न चाहनुहुन्छ?", + "installOneMissingDependency": "के तपाइँ छुटेको निर्भरता स्थापना गर्न चाहनुहुन्छ?", + "installWithoutDependencies": "निर्भरता बिना स्थापना गर्नुहोस्", + "installedSuccessfully": "{0}:{1} लाइब्रेरी सफलतापूर्वक स्थापना गरियो", + "libraryAlreadyExists": "एउटा पुस्तकालय पहिले नै अवस्थित छ। के तपाइँ यसलाई अधिलेखन गर्न चाहनुहुन्छ?", + "manageLibraries": "लाईब्रेरीहरू व्यवस्थापन गर्नुहोस्...", + "namedLibraryAlreadyExists": "{0} नामको लाईब्रेरी फोल्डर पहिले नै अवस्थित छ। के तपाइँ यसलाई अधिलेखन गर्न चाहनुहुन्छ?", + "needsMultipleDependencies": "<b> {0}:{1} </b> लाईब्रेरीलाई हाल स्थापित नभएका केही अन्य निर्भरताहरू चाहिन्छ:", + "needsOneDependency": "<b> {0} : {1} </b> लाईब्रेरीलाई हाल स्थापित नभएको अर्को निर्भरता चाहिन्छ:", + "overwriteExistingLibrary": "के तपाइँ अवस्थित लाइब्रेरी अधिलेखन गर्न चाहनुहुन्छ?", + "successfullyInstalledZipLibrary": "{0} अभिलेखबाट लाइब्रेरी सफलतापूर्वक स्थापना गरियो", + "title": "लाईब्रेरी प्रबन्धक", + "uninstalledSuccessfully": "{0} : {1} लाईब्रेरीको स्थापना सफलतापूर्वक रद्द गरियो", + "zipLibrary": "लाईब्रेरी " }, "librarySearchProperty": { - "topic": "Topic" + "topic": "विषय" }, "libraryTopic": { - "communication": "Communication", - "dataProcessing": "Data Processing", - "dataStorage": "Data Storage", - "deviceControl": "Device Control", - "display": "Display", - "other": "Other", - "sensors": "Sensors", - "signalInputOutput": "Signal Input/Output", - "timing": "Timing", - "uncategorized": "Uncategorized" + "communication": "संचार", + "dataProcessing": "डाटा प्रशोधन", + "dataStorage": "डाटा भण्डारण", + "deviceControl": "उपकरण नियन्त्रण", + "display": "प्रदर्शन", + "other": "अन्य", + "sensors": "सेन्सरहरू", + "signalInputOutput": "सिग्नल इनपुट/आउटपुट", + "timing": "समय", + "uncategorized": "अवर्गीकृत" }, "libraryType": { - "installed": "Installed" + "installed": "स्थापित" }, "menu": { - "advanced": "Advanced", - "sketch": "Sketch", - "tools": "Tools" + "advanced": "उन्नत", + "sketch": "स्केच", + "tools": "उपकरणहरू" }, "monitor": { - "unableToCloseWebSocket": "Unable to close websocket", - "unableToConnectToWebSocket": "Unable to connect to websocket" + "alreadyConnectedError": "{0} {1} पोर्टमा जडान गर्न सकिएन। पहिले नै जोडिएको छ।", + "baudRate": "{0} बड", + "connectionFailedError": "{0} {1} पोर्टमा जडान गर्न सकिएन।", + "connectionFailedErrorWithDetails": "{1} {2} पोर्ट {0}मा जडान गर्न सकिएन।", + "connectionTimeout": "समय सकियो। सफलतापूर्वक जडान गरे पनि IDE ले मनिटरबाट 'सफलता' सन्देश प्राप्त गरेको छैन", + "missingConfigurationError": "{0} {1} पोर्टमा जडान गर्न सकिएन। मनिटर कन्फिगरेसन छुटेको छ।", + "notConnectedError": "{0} {1} पोर्टमा जोडिएको छैन।", + "unableToCloseWebSocket": "वेबसकेट बन्द गर्न सकिएन ", + "unableToConnectToWebSocket": "वेबसकेटमा जडान गर्न सकिएन " + }, + "newCloudSketch": { + "newSketchTitle": "नयाँ क्लाउड स्केचको नाम" + }, + "portProtocol": { + "network": "नेटवर्क", + "serial": "सिरियल" }, "preferences": { - "additionalManagerURLs": "Additional Boards Manager URLs", - "auth.audience": "The OAuth2 audience.", - "auth.clientID": "The OAuth2 client ID.", - "auth.domain": "The OAuth2 domain.", - "auth.registerUri": "The URI used to register a new user.", - "automatic": "Automatic", - "board.certificates": "List of certificates that can be uploaded to boards", - "browse": "Browse", - "checkForUpdate": "Receive notifications of available updates for the IDE, boards, and libraries. Requires an IDE restart after change. It's true by default.", - "choose": "Choose", - "cli.daemonDebug": "Enable debug logging of the gRPC calls to the Arduino CLI. A restart of the IDE is needed for this setting to take effect. It's false by default.", - "cloud.enabled": "True if the sketch sync functions are enabled. Defaults to true.", - "cloud.pull.warn": "True if users should be warned before pulling a cloud sketch. Defaults to true.", - "cloud.push.warn": "True if users should be warned before pushing a cloud sketch. Defaults to true.", - "cloud.pushpublic.warn": "True if users should be warned before pushing a public sketch to the cloud. Defaults to true.", - "cloud.sketchSyncEndpoint": "The endpoint used to push and pull sketches from a backend. By default it points to Arduino Cloud API.", - "compile": "compile", - "compile.experimental": "True if the IDE should handle multiple compiler errors. False by default", - "compile.revealRange": "Adjusts how compiler errors are revealed in the editor after a failed verify/upload. Possible values: 'auto': Scroll vertically as necessary and reveal a line. 'center': Scroll vertically as necessary and reveal a line centered vertically. 'top': Scroll vertically as necessary and reveal a line close to the top of the viewport, optimized for viewing a code definition. 'centerIfOutsideViewport': Scroll vertically as necessary and reveal a line centered vertically only if it lies outside the viewport. The default value is '{0}'.", - "compile.verbose": "True for verbose compile output. False by default", - "compile.warnings": "Tells gcc which warning level to use. It's 'None' by default", - "compilerWarnings": "Compiler warnings", - "editorFontSize": "Editor font size", - "editorQuickSuggestions": "Editor Quick Suggestions", - "enterAdditionalURLs": "Enter additional URLs, one for each row", - "files.inside.sketches": "Show files inside Sketches", - "ide.updateBaseUrl": "The base URL where to download updates from. Defaults to 'https://downloads.arduino.cc/arduino-ide'", - "ide.updateChannel": "Release channel to get updated from. 'stable' is the stable release, 'nightly' is the latest development build.", - "interfaceScale": "Interface scale", - "invalid.editorFontSize": "Invalid editor font size. It must be a positive integer.", - "invalid.sketchbook.location": "Invalid sketchbook location: {0}", - "invalid.theme": "Invalid theme.", - "language.log": "True if the Arduino Language Server should generate log files into the sketch folder. Otherwise, false. It's false by default.", - "language.realTimeDiagnostics": "If true, the language server provides real-time diagnostics when typing in the editor. It's false by default.", - "manualProxy": "Manual proxy configuration", - "network": "Network", - "newSketchbookLocation": "Select new sketchbook location", - "noProxy": "No proxy", - "showVerbose": "Show verbose output during", - "sketchbook.location": "Sketchbook location", - "sketchbook.showAllFiles": "True to show all sketch files inside the sketch. It is false by default.", - "survey.notification": "True if users should be notified if a survey is available. True by default.", - "unofficialBoardSupport": "Click for a list of unofficial board support URLs", - "upload": "upload", - "upload.verbose": "True for verbose upload output. False by default.", - "verifyAfterUpload": "Verify code after upload", - "window.autoScale": "True if the user interface automatically scales with the font size.", - "window.zoomLevel": "Adjust the zoom level of the window. The original size is 0 and each increment above (e.g. 1) or below (e.g. -1) represents zooming 20% larger or smaller. You can also enter decimals to adjust the zoom level with a finer granularity." - }, - "replaceMsg": "Replace the existing version of {0}?", - "selectZip": "Select a zip file containing the library you'd like to add", + "additionalManagerURLs": "अतिरिक्त बोर्ड प्रबन्धक URLहरू", + "auth.audience": "OAuth2 दर्शक।", + "auth.clientID": "OAuth2 क्लाएन्ट ID।", + "auth.domain": "OAuth2 डोमेन।", + "auth.registerUri": "नयाँ प्रयोगकर्ता दर्ता गर्न प्रयोग गरिएको URI", + "automatic": "स्वचालित", + "board.certificates": "बोर्डहरूमा अपलोड गर्न सकिने प्रमाणपत्रहरूको सूची", + "browse": "ब्राउज गर्नुहोस्", + "checkForUpdate": "IDE, बोर्डहरू र लाईब्रेरीहरूको लागि उपलब्ध अपडेटहरूको सूचनाहरू प्राप्त गर्नुहोस्। परिवर्तन पछि IDE पुन: सुरु गर्न आवश्यक छ। यो पूर्वनिर्धारित सेटिङमा सही हुन्छ।", + "choose": "छान्नुहोस्", + "cli.daemonDebug": "Arduino CLI मा gRPC कलहरूको डिबग लगिङ सक्षम गर्नुहोस्। यो सेटिङ प्रभावकारी हुनको लागि IDE को पुन: सुरु गर्न आवश्यक छ। यो पूर्वनिर्धारित सेटिङमा असक्षम छ।", + "cloud.enabled": "स्केच सिंक प्रकार्यहरू सक्रिय छन् भने सही संकेत गर्नुहोस्। यो पूर्वनिर्धारित सेटिङमा सही हुन्छ।", + "cloud.pull.warn": "क्लाउड स्केच पुल गर्नु अघि प्रयोगकर्ताहरूलाई चेतावनी दिनुपर्छ भने सही संकेत गर्नुहोस्। यो पूर्वनिर्धारित सेटिङमा सही हुन्छ।", + "cloud.push.warn": "क्लाउड स्केच पुश गर्नु अघि प्रयोगकर्ताहरूलाई चेतावनी दिनुपर्छ भने सही संकेत गर्नुहोस्। यो पूर्वनिर्धारित सेटिङमा सही हुन्छ।", + "cloud.pushpublic.warn": "यदि प्रयोगकर्ताहरूलाई क्लाउडमा सार्वजनिक स्केच पुश गर्नु अघि चेतावनी दिनुपर्छ भने सही संकेत गर्नुहोस्। यो पूर्वनिर्धारित सेटिङमा सही हुन्छ।", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", + "cloud.sketchSyncEndpoint": "ब्याकइन्डबाट स्केचहरू पुश गर्न र पुल गर्न अन्तिम बिन्दु प्रयोग गरियो। पूर्वनिर्धारित रूपमा यसले Arduino क्लाउड API लाई संकेत गर्दछ।", + "compile": "कम्पाइल ", + "compile.experimental": "यदि IDE ले धेरै कम्पाइलर त्रुटिहरू ह्यान्डल गर्नुपर्छ भने सक्षम गर्नुहोस्। यो पूर्वनिर्धारित सेटिङमा असक्षम छ।", + "compile.revealRange": "असफल प्रमाणित/अपलोड पछि सम्पादकमा कम्पाइलर त्रुटिहरू कसरी प्रकट हुन्छन् भनेर समायोजन गर्दछ। कोड परिभाषा हेर्नको लागि अनुकूलित गरिएको सम्भावित मानहरू: 'स्वतः': आवश्यक्ता अनुसार ठाडो रूपमा स्क्रोल गर्नुहोस् र कोड भएको रेखा हेर्नुहोस। 'केन्द्र': आवश्यक्ता अनुसार ठाडो रूपमा स्क्रोल गर्नुहोस् र ठाडो रूपमा केन्द्रित कोड भएको रेखा हेर्नुहोस। 'शीर्ष': आवश्यक रूपमा ठाडो रूपमा स्क्रोल गर्नुहोस् र भ्यूपोर्टको शीर्ष नजिकको रेखा हेर्नुहोस। 'centerIfOutsideViewport': आवश्यकता अनुसार ठाडो रूपमा स्क्रोल गर्नुहोस् र ठाडो रूपमा केन्द्रित रेखालाई भ्यूपोर्ट बाहिर रहेको खण्डमा मात्र प्रकट गर्नुहोस्। यस्को पूर्वनिर्धारित मान '{0}' हो।", + "compile.verbose": "वर्बोज कम्पाइल आउटपुटको लागि सक्षम। पूर्वनिर्धारित रूपमा असक्षम।", + "compile.warnings": "gcc लाई कुन चेतावनी स्तर प्रयोग गर्ने भनेर बताउँछ। पूर्वनिर्धारित रूपमा कुनै पनि अनुमति दिइएको छैन। ", + "compilerWarnings": "कम्पाइलर चेतावनीहरू", + "editorFontSize": "सम्पादकको फन्ट साइज", + "editorQuickSuggestions": "सम्पादकको द्रुत सुझावहरू", + "enterAdditionalURLs": "प्रत्येक पङ्क्तिको लागि एक थप URL प्रविष्ट गर्नुहोस्", + "files.inside.sketches": "स्केचहरू भित्र फाइलहरू देखाउनुहोस्", + "ide.updateBaseUrl": "अपडेटहरू डाउनलोड गर्ने आधार URL। पूर्वनिर्धारित URL 'https://downloads.arduino.cc/arduino-ide' छ।", + "ide.updateChannel": "अपडेट प्राप्त गर्न च्यानल जारी गर्नुहोस्। 'stable' स्थिर रिलीज हो, 'nightly' पछिल्लो विकास निर्माण हो।", + "interfaceScale": "इन्टरफेस स्केल", + "invalid.editorFontSize": "अवैध सम्पादक फन्ट साइज। यो सकारात्मक पूर्णांक हुनुपर्छ।", + "invalid.sketchbook.location": "अवैध स्केचबुक स्थान: {0}", + "invalid.theme": "अमान्य विषयवस्तु।", + "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", + "language.log": "यदि अर्डुइनो भाषा सर्भरले स्केच फोल्डरमा लग फाइलहरू उत्पन्न गर्नुपर्छ भने सक्षम गर्नुहोस्। अन्यथा, असक्षम। यो पूर्वनिर्धारित रूपमा असक्षम छ।", + "language.realTimeDiagnostics": "यदि सक्षम छ भने, सम्पादकमा टाइप गर्दा भाषा सर्भरले वास्तविक समय निदान प्रदान गर्दछ। यो पूर्वनिर्धारित रूपमा असक्षम हुन्छ।", + "manualProxy": "म्यानुअल प्रोक्सी कन्फिगरेसन", + "monitor": { + "dockPanel": "एप्लिकेसन शेलको क्षेत्र जहाँ _{0}_ विजेट रहनेछ। या त \"तल\" वा \"दायाँ\"। यो \"{1}\" मा पूर्वनिर्धारित छ|" + }, + "network": "नेटवर्क", + "newSketchbookLocation": "नयाँ स्केचबुक स्थान चयन गर्नुहोस्", + "noCliConfig": "CLI कन्फिगरेसन लोड गर्न सकिएन", + "noProxy": "कुनै प्रोक्सी छैन", + "proxySettings": { + "hostname": "होस्टको नाम", + "password": "पासवर्ड", + "port": "पोर्ट नम्बर", + "username": "प्रयोगकर्ता नाम" + }, + "showVerbose": "सो अबधिमा भर्बोज आउटपुट देखाउनुहोस् ", + "sketch": { + "inoBlueprint": "निरपेक्ष फाइल प्रणाली मार्ग `.ino` ब्लुप्रिन्ट फाइलमा पूर्वनिर्धारित छ। यदि तोकिएको छ भने, ब्लुप्रिन्ट फाइलको सामग्री IDE द्वारा सिर्जना गरिएको प्रत्येक नयाँ स्केचको लागि प्रयोग गरिनेछ। यदि छैन भने स्केचहरू पूर्वनिर्धारित अर्डुइनो सामग्रीसँग उत्पन्न हुनेछ। पहुँचयोग्य ब्लुप्रिन्ट फाइलहरूलाई बेवास्ता गरिन्छ। यो सेटिङ प्रभावकारी हुनको लागि **IDE लाई पुन: सुरु गर्न आवश्यक छ।** " + }, + "sketchbook.location": "स्केचबुकको स्थान", + "sketchbook.showAllFiles": "स्केच भित्र सबै स्केच फाइलहरू देखाउन सही संकेत गर्नुहोस्। यो पूर्वनिर्धारित रूपमा असक्षम छ।", + "unofficialBoardSupport": "अनौपचारिक बोर्ड समर्थन गर्ने URL को सूचीको लागि क्लिक गर्नुहोस्", + "upload": "अपलोड ", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", + "upload.verbose": "वर्बोज अपलोड आउटपुट को लागी सही संकेत गर्नुहोस्। यो पूर्वनिर्धारित रूपमा असक्षम छ। ", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", + "verifyAfterUpload": "कोड अपलोड गरेपछि प्रमाणित गर्नुहोस्", + "window.autoScale": "प्रयोगकर्ता इन्टरफेसले स्वचालित रूपमा फन्ट साइजसँग मापन गरेमा सही संकेत गर्नुहोस्।", + "window.zoomLevel": { + "deprecationMessage": "यो बहिष्कृत भैसक्यो। यसको सट्टा 'window.zoomLevel' प्रयोग गर्नुहोस्।" + } + }, + "renameCloudSketch": { + "renameSketchTitle": "क्लाउड स्केचको नयाँ नाम" + }, + "replaceMsg": "{0} को अवस्थित संस्करण बदल्न चाहनुहुन्छ?", + "selectZip": "तपाईले थप्न चाहनु भएको लाईब्ररी भएको zip फाइल चयन गर्नुहोस्", "serial": { - "autoscroll": "Autoscroll", - "carriageReturn": "Carriage Return", - "message": "Message ({0} + Enter to send message to '{1}' on '{2}')", - "newLine": "New Line", - "newLineCarriageReturn": "Both NL & CR", - "noLineEndings": "No Line Ending", - "notConnected": "Not connected. Select a board and a port to connect automatically.", - "openSerialPlotter": "Serial Plotter", - "timestamp": "Timestamp", - "toggleTimestamp": "Toggle Timestamp" + "autoscroll": "स्वत: स्क्रोल", + "carriageReturn": "क्यारिएज रिटर्न ", + "connecting": "'{1}' मा '{0}' सँग जडान गर्दै...", + "message": "सन्देश ('{1}' मा '{0}' लाई सन्देश पठाउन प्रविष्ट गर्नुहोस्)", + "newLine": "नयाँ लाइन", + "newLineCarriageReturn": "NL र CR दुबै", + "noLineEndings": "लाइन अन्त्य नगर्ने ", + "notConnected": "जोडिएको छैन। स्वचालित रूपमा जडान गर्न बोर्ड र पोर्ट चयन गर्नुहोस्।", + "openSerialPlotter": "सिरियल प्लटर ", + "timestamp": "टाइमस्ट्याम्प", + "toggleTimestamp": "टाइमस्ट्याम्प परिवर्तन गर्नुहोस्" }, "sketch": { - "archiveSketch": "Archive Sketch", - "cantOpen": "A folder named \"{0}\" already exists. Can't open sketch.", - "close": "Are you sure you want to close the sketch?", - "compile": "Compiling sketch...", - "configureAndUpload": "Configure And Upload", - "createdArchive": "Created archive '{0}'.", - "doneCompiling": "Done compiling.", - "doneUploading": "Done uploading.", - "exportBinary": "Export Compiled Binary", - "moving": "Moving", - "movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?", - "new": "New", - "openFolder": "Open Folder", - "openRecent": "Open Recent", - "openSketchInNewWindow": "Open Sketch in New Window", - "saveFolderAs": "Save sketch folder as...", - "saveSketch": "Save your sketch to open it again later.", - "saveSketchAs": "Save sketch folder as...", - "showFolder": "Show Sketch Folder", - "sketch": "Sketch", - "sketchbook": "Sketchbook", - "titleLocalSketchbook": "Local Sketchbook", - "titleSketchbook": "Sketchbook", - "upload": "Upload", - "uploadUsingProgrammer": "Upload Using Programmer", - "uploading": "Uploading...", - "userFieldsNotFoundError": "Can't find user fields for connected board", - "verify": "Verify", - "verifyOrCompile": "Verify/Compile" - }, - "survey": { - "answerSurvey": "Answer survey", - "dismissSurvey": "Don't show again", - "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." + "archiveSketch": "स्केच अभिलेख गर्नुहोस ", + "cantOpen": "\"{0}\" नामको फोल्डर पहिले नै अवस्थित छ। स्केच खोल्न सकिँदैन।", + "compile": "स्केच कम्पाइल हुँदैछ", + "configureAndUpload": "कन्फिगर गरेर अपलोड गर्नुहोस्", + "createdArchive": "अभिलेख '{0}' सिर्जना गर्नुहोस्।", + "doneCompiling": "कम्पाइल भयो।", + "doneUploading": "अपलोड भयो।", + "editInvalidSketchFolderLocationQuestion": "के तपाईं स्केचलाई फरक स्थानमा सुरक्षित गर्ने प्रयास गर्न चाहनुहुन्छ?", + "editInvalidSketchFolderQuestion": "के तपाइँ फरक नाम संग स्केच सुरक्षित गर्ने प्रयास गर्न चाहनुहुन्छ?", + "exportBinary": "कम्पाइल कम्पाइल बाइनरी निर्यात गर्नुहोस्", + "invalidCloudSketchName": "नाम अक्षर, संख्या, वा अन्डरस्कोरबाट सुरु हुनुपर्छ, त्यसपछि अक्षरहरू, संख्याहरू, ड्यासहरू, थोप्लाहरू र अन्डरस्कोरहरू हुनुपर्छ। अधिकतम लम्बाइ 36 वर्ण हो।", + "invalidSketchFolderLocationDetails": "तपाईले स्केचलाई यही नामको फोल्डरमा सुरक्षित गर्न सक्नुहुन्न।", + "invalidSketchFolderLocationMessage": "अवैध स्केच फोल्डरको स्थान: '{0}'", + "invalidSketchFolderNameMessage": "अवैध स्केच फोल्डरको नाम: '{0}'", + "invalidSketchName": "नाम अक्षर, संख्या, वा अन्डरसोरबाट सुरु हुनुपर्छ, त्यसपछि अक्षरहरू, संख्याहरू, ड्यासहरू, थोप्लाहरू र अन्डरस्कोरहरू हुनुपर्छ, । अधिकतम लम्बाइ 63 वर्ण हो।", + "moving": "सार्दै", + "movingMsg": "फाइल \"{0}\" लाई \"{1}\" नामक स्केच फोल्डर भित्र राख्नपर्छ।\n यो फोल्डर सिर्जना गर्नुहोस्, फाइल सार्नुहोस्, र जारी राख्नुहोस्?", + "new": "नयाँ स्केच", + "noTrailingPeriod": "फाइलको नाम थोप्ला संग समाप्त गर्न मिल्दैन ", + "openFolder": "फोल्डर खोल्नुहोस्", + "openRecent": "पछिल्लो फाइलहरू खोल्नुहोस्", + "openSketchInNewWindow": "नयाँ विन्डोमा स्केच खोल्नुहोस्", + "reservedFilename": "'{0}' आरक्षित फाइलको नाम हो।", + "saveFolderAs": "स्केच फोल्डर यस रूपमा सुरक्षित गर्नुहोस्..", + "saveSketch": "यसलाई पछि फेरि खोल्न आफ्नो स्केच सुरक्षित गर्नुहोस्।", + "saveSketchAs": "स्केच फोल्डर यस रूपमा सुरक्षित गर्नुहोस्..", + "showFolder": "स्केच फोल्डर देखाउनुहोस्", + "sketch": "स्केच", + "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", + "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", + "sketchbook": "स्केचबुक", + "titleLocalSketchbook": "स्थानीय स्केचबुक", + "titleSketchbook": "स्केचबुक", + "upload": "अपलोड गर्नुहोस्", + "uploadUsingProgrammer": "प्रोग्रामर प्रयोग गरेर अपलोड गर्नुहोस्", + "uploading": "अपलोड हुँदैछ...", + "userFieldsNotFoundError": "जडान गरिएको बोर्डको लागि प्रयोगकर्ता क्षेत्रहरू फेला पार्न सकिदैन ", + "verify": "प्रमाणित गर्नुहोस्", + "verifyOrCompile": "प्रमाणित/कम्पाइल गर्नुहोस्" + }, + "sketchbook": { + "newCloudSketch": "नयाँ क्लाउड स्केच", + "newSketch": "नयाँ स्केच" + }, + "theme": { + "currentThemeNotFound": "हाल चयन गरिएको विषयवस्तु फेला पार्न सकेन: {0}। अर्डुइनो IDE ले नभएको विषयवस्तु सँग मिल्दो बिल्ट-इन थिम छनोट गरेको छ।", + "dark": "गाढा ", + "deprecated": "{0} (बहिष्कृत)", + "hc": "गाढा उच्च कन्ट्रास्ट", + "hcLight": "हलुका उच्च कन्ट्रास्ट", + "light": "हलुका ", + "user": "{0} (प्रयोगकर्ता)" + }, + "title": { + "cloud": "क्लाउड " + }, + "updateIndexes": { + "updateIndexes": "इन्डेक्सहरु अपडेट गर्नुहोस्", + "updateLibraryIndex": "लाईब्ररी इन्डेक्स अपडेट गर्नुहोस्", + "updatePackageIndex": "प्याकेज इन्डेक्स अपडेट गर्नुहोस्" }, "upload": { - "error": "{0} error: {1}" + "error": "{0} त्रुटि: {1}" }, "userFields": { - "cancel": "Cancel", - "enterField": "Enter {0}", - "upload": "Upload" + "cancel": "रद्द गर्नुहोस्", + "enterField": "{0} प्रविष्ट गर्नुहोस्", + "upload": "अपलोड गर्नुहोस्" + }, + "validateSketch": { + "abortFixMessage": "स्केच अझै अमान्य छ। के तपाईं बाँकी समस्याहरू समाधान गर्न चाहनुहुन्छ? '{0}' क्लिक गरेर, नयाँ स्केच खुल्नेछ।", + "abortFixTitle": "अवैध स्केच", + "renameSketchFileMessage": "स्केच फाइल '{0}' प्रयोग गर्न सकिँदैन। {1} के तपाई अहिले स्केच फाइलको नाम परिवर्तन गर्न चाहनुहुन्छ? ", + "renameSketchFileTitle": "स्केच फाइलको नाम अमान्य छ", + "renameSketchFolderMessage": "स्केच '{0}' प्रयोग गर्न सकिँदैन। {1} यो सन्देशबाट छुटकारा पाउन, स्केचको नाम बदल्नुहोस्। के तपाई अहिले स्केचको नाम परिवर्तन गर्न चाहनुहुन्छ?", + "renameSketchFolderTitle": "स्केचको नाम अमान्य छ" + }, + "versionWelcome": { + "cancelButton": "Maybe later", + "donateButton": "Donate now", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Welcome to a new version of the Arduino IDE!", + "titleWithVersion": "Welcome to the new Arduino IDE {0}!" + }, + "workspace": { + "alreadyExists": "'{0}' पहिले नै अवस्थित छ।" } }, - "cloud": { - "GoToCloud": "GO TO CLOUD" - }, "theia": { "core": { - "cannotConnectBackend": "Cannot connect to the backend.", - "cannotConnectDaemon": "Cannot connect to the CLI daemon.", - "couldNotSave": "Could not save the sketch. Please copy your unsaved work into your favorite text editor, and restart the IDE.", - "daemonOffline": "CLI Daemon Offline", - "offline": "Offline", - "quitTitle": "Are you sure you want to quit?" - }, - "debug": { - "start": "Start...", - "startError": "There was an error starting the debug session, check the logs for more details.", - "typeNotSupported": "The debug session type \"{0}\" is not supported." + "cannotConnectBackend": "ब्याकइन्डमा जडान हुन सकेन ", + "cannotConnectDaemon": "CLI डेमनमा जडान गर्न सकेन।", + "couldNotSave": "स्केच सुरक्षित गर्न सकेन। कृपया सुरक्षित नगरिएको काम आफ्नो मनपर्ने पाठ सम्पादकमा प्रतिलिपि गर्नुहोस्, र IDE पुन: सुरु गर्नुहोस्।", + "daemonOffline": "CLI डेमन अफलाइन छ", + "offline": "अफलाइन", + "offlineText": "अफलाइन", + "quitTitle": "के तपाइँ निश्चित हुनुहुन्छ कि तपाइँ छोड्न चाहनुहुन्छ?" }, "editor": { - "unsavedTitle": "Unsaved – {0}" + "unsavedTitle": "सुरक्षित गरिएको छैन – {0}" }, "messages": { - "collapse": "Collapse", - "expand": "Expand" + "collapse": "कोल्याप्स ", + "expand": "एक्स्पान्ड " }, "workspace": { - "deleteCurrentSketch": "Do you want to delete the current sketch?", - "fileNewName": "Name for new file", - "invalidExtension": ".{0} is not a valid extension", - "invalidFilename": "Invalid filename.", - "newFileName": "New name for file" + "deleteCloudSketch": "क्लाउड स्केच '{0}' स्थायी रूपमा अर्डुइनो सर्भरहरू र स्थानीय क्यासहरूबाट मेटिनेछ। यो कार्य अपरिवर्तनीय छ। के तपाइँ हालको स्केच मेटाउन चाहनुहुन्छ?", + "deleteCurrentSketch": "स्केच '{0}' स्थायी रूपमा मेटिनेछ। यो कार्य अपरिवर्तनीय छ। के तपाइँ हालको स्केच मेटाउन चाहनुहुन्छ?", + "fileNewName": "नयाँ फाइलको लागि नाम", + "invalidExtension": ".{0} एक्स्टेन्सन मान्य छैन ", + "newFileName": "फाइलको लागि नयाँ नाम" } } } diff --git a/i18n/nl.json b/i18n/nl.json index d0c87f669..f7bc5d843 100644 --- a/i18n/nl.json +++ b/i18n/nl.json @@ -1,46 +1,59 @@ { "arduino": { "about": { - "detail": "Versie: {0}\nDatum: {1}{2}\nCLI versie: {3}{4} [{5}]\n\n{6} ", + "detail": "Versie: {0}\nDatum: {1}{2}\nCLI Versie: {3}\n\n{4}\n ", "label": "Over {0}" }, + "account": { + "goToCloudEditor": "Ga naar de Cloud Editor", + "goToIoTCloud": "Ga naar de IoT Cloud", + "goToProfile": "Ga naar profiel", + "menuTitle": "Arduino Cloud" + }, "board": { "board": "Bord{0}", - "boardConfigDialogTitle": "Select Other Board and Port", + "boardConfigDialogTitle": "Selecteer Ander Bord en Poort", + "boardDataReloaded": "Board data reloaded.", "boardInfo": "Bord Informatie", - "configDialog1": "Selecteer een Bord en een Poort als U een schets wilt uploaden.", - "configDialog2": "Als je alleen een Board kiest, kun je wel compileren, maar niet je schets uploaden.", - "couldNotFindPreviouslySelected": "Kon het voordien geselecteerde bord '{0}' in het geïnstalleerde platform '{1}' niet vinden. Gelieve manueel het bord te kiezen dat U wilt gebruiken. Wilt U het bord nu selecteren?", - "disconnected": "Disconnected", + "boards": "borden", + "configDialog1": "Selecteer een Bord en een Poort als je een schets wilt opladen.", + "configDialog2": "Als je alleen een bord kiest, kun je wel compileren, maar niet je schets opladen.", + "couldNotFindPreviouslySelected": "Kan het eerder geselecteerde bord '{0}' niet vinden in het geïnstalleerde platform '{1}'. Gelieve het bord, dat je wil gebruiken, manueel te selecteren. Wil je het bord nu opnieuw selecteren?", + "editBoardsConfig": "Bewerk Bord en Poort", "getBoardInfo": "Verkrijg Bord Informatie", "inSketchbook": "(in Schetsboek)", - "installNow": "De \"{0} {1}\" kern moet geïnstalleerd zijn om het huidige geselecteerde \"{2}\" bord. Wilt U dit nu installeren?", - "noFQBN": "De FQBN is niet beschikbaar voor het geselecteerde bord \"{0}\". Heeft U de bijhorende kern geïnstalleerd?", - "noPortsDiscovered": "No ports discovered", - "noPortsSelected": "Geen poorten geselecteerd voor bord: '{0}'.", - "noneSelected": "Geen borden geselecteerd.", + "installNow": "De \"{0} {1}\" kern moet geïnstalleerd zijn voor het huidig geselecteerde \"{2}\" bord. Wil je dit nu installeren?", + "noBoardsFound": "Geen borden gevonden voor \"{0}\"", + "noNativeSerialPort": "Oorpronkelijke seriële poort, ik kan geen info verkrijgen", + "noPortsDiscovered": "Geen poorten gevonden", + "nonSerialPort": "Dit is geen seriële poort, ik kan geen info verkrijgen", "openBoardsConfig": "Selecteer een ander bord en poort...", - "platformMissing": "Het platform voor het geselecteerde '{0}' bord is niet geïnstalleerd.", - "pleasePickBoard": "Gelieve een bord te selecteren dat verbonden is met de door U gekozen poort.", + "pleasePickBoard": "Gelieve een bord te kiezen dat verbonden is met poort die je geselecteerd hebt.", "port": "Poort{0}", - "portLabel": "Port: {0}", + "ports": "poorten", "programmer": "Programmeerapparaat", + "reloadBoardData": "Reload Board Data", "reselectLater": "Later opnieuw selecteren", - "searchBoard": "Search board", - "selectBoard": "Selecteer Bord", - "selectBoardForInfo": "Selecteer een bord om bord informatie te bekomen.", + "revertBoardsConfig": "Use '{0}' discovered on '{1}'", + "searchBoard": "Bord zoeken", + "selectBoard": "Bord selecteren", + "selectBoardToReload": "Please select a board first.", "selectPortForInfo": "Selecteer een poort om bord informatie te bekomen.", "showAllAvailablePorts": "Toont alle beschikbare poorten indien ingeschakeld", + "showAllPorts": "Toon alle poorten", "succesfullyInstalledPlatform": "Platform {0}:{1} succesvol geïnstalleerd", - "succesfullyUninstalledPlatform": "Platform {0}:{1} is succesvol verwijderd" + "succesfullyUninstalledPlatform": "Platform {0}:{1} succesvol verwijderd", + "typeOfPorts": "{0} poorten", + "unconfirmedBoard": "Onbevestigd bord", + "unknownBoard": "Onbekend bord" }, - "boardsManager": "Borden Beheerder", + "boardsManager": "Bordbeheerder", "boardsType": { - "arduinoCertified": "Arduino Certified" + "arduinoCertified": "Arduino gecertificeerd" }, "bootloader": { "burnBootloader": "Bootloader branden", - "burningBootloader": "Burning bootloader...", + "burningBootloader": "Bootloader aan het branden", "doneBurningBootloader": "Klaar met het branden van de bootloader." }, "burnBootloader": { @@ -59,111 +72,158 @@ "selectCertificateToUpload": "1. Selecteer certificaat om te uploaden", "selectDestinationBoardToUpload": "2. Selecteer bestemming bord en upload certificaat", "upload": "Uploaden", - "uploadFailed": "Upload mislukt. Probeer het opnieuw.", + "uploadFailed": "Uploaden mislukt. Probeer het opnieuw.", "uploadRootCertificates": "SSL-rootcertificaten uploaden", "uploadingCertificates": "Certificaten uploaden." }, "checkForUpdates": { - "checkForUpdates": "Check for Arduino Updates", - "installAll": "Install All", - "noUpdates": "There are no recent updates available.", - "promptUpdateBoards": "Updates are available for some of your boards.", - "promptUpdateLibraries": "Updates are available for some of your libraries.", - "updatingBoards": "Updating boards...", - "updatingLibraries": "Updating libraries..." + "checkForUpdates": "Controleren op Arduino-updates", + "installAll": "Alles installeren", + "noUpdates": "Er zijn geen recente updates beschikbaar.", + "promptUpdateBoards": "Voor sommige van je borden zijn updates beschikbaar.", + "promptUpdateLibraries": "Voor sommige van je bibliotheken zijn updates beschikbaar.", + "updatingBoards": "Borden bijwerken...", + "updatingLibraries": "Bibliotheken bijwerken..." }, "cli-error-parser": { "keyboardError": "'Keyboard' niet gevonden. Bevat je schets de regel '#include <Keyboard.h>'?", "mouseError": "'Mouse' niet gevonden. Bevat je schets de regel '#include <Mouse.h>'?" }, "cloud": { - "account": "Account", "chooseSketchVisibility": "Kies de zichtbaarheid van je Sketch:", + "cloudSketchbook": "Cloud Schetsboek", "connected": "Verbonden", "continue": "Doorgaan", - "donePulling": "Klaar met trekken van '{0}'.", - "donePushing": "Klaar met pushen van '{0}'.", + "donePulling": "Klaar met ophalen van '{0}'.", + "donePushing": "Klaar met opladen van '{0}'.", "embed": "Integreren:", "emptySketchbook": "Je schetsboek is leeg", + "goToCloud": "Ga naar de Cloud", "learnMore": "Leer meer", "link": "Koppeling:", - "notYetPulled": "Kan niet pushen naar Cloud. Het is nog niet getrokken.", + "notYetPulled": "Kan niet naar de Cloud opladen. Het is nog niet opgehaald.", "offline": "Offline", "openInCloudEditor": "Openen in Cloud Editor", "options": "Opties...", "privateVisibility": "Privaat. Alleen jij kunt de schets bekijken.", "profilePicture": "Profiel afbeelding", "publicVisibility": "Openbaar. Iedereen met de link kan de Sketch bekijken.", - "pull": "Trek", - "pullFirst": "Je moet eerst trekken om naar de Cloud te kunnen pushen.", - "pullSketch": "Schets Trekken", - "pullSketchMsg": "Als u deze schets uit de cloud haalt, wordt de lokale versie overschreven. Weet je zeker dat je door wilt gaan?", - "push": "Push", - "pushSketch": "Push Schets", - "pushSketchMsg": "Dit is een openbare schets. Voordat u gaat pushen, moet u ervoor zorgen dat gevoelige informatie is gedefinieerd in arduino_secrets.h bestanden. U kunt een schets privé maken vanuit het deelvenster Delen.", + "pull": "Ophalen", + "pullFirst": "Je moet eerst ophalen voordat je kan opladen naar de Cloud.", + "pullSketch": "Schets ophalen", + "pullSketchMsg": "Ophalen van deze schets uit de cloud zal de lokale versie overschrijven. Weet je zeker dat je door wilt gaan?", + "push": "Opladen", + "pushSketch": "Schets opladen", + "pushSketchMsg": "Dit is een openbare schets. Wees er zeker van dat eender welke gevoelige informatie in arduino_secrets.h bestanden gedefinieerd is voordat u ze oplaadt. Je kan een schets privé maken vanuit het deelvenster Delen.", "remote": "Op Afstand", - "remoteSketchbook": "Schetsboek op afstand", "share": "Delen...", "shareSketch": "Schets Delen", - "showHideRemoveSketchbook": "Toon/verberg schetsboek op afstand", - "signIn": "INLOGGEN", + "showHideSketchbook": "Toon / Verberg het Cloud Schetsboek", + "signIn": "AANMELDEN", "signInToCloud": "Aanmelden bij Arduino Cloud", - "signOut": "Uitloggen", + "signOut": "Afmelden", "sync": "Sync", - "syncEditSketches": "Synchroniseer en bewerk uw Arduino Cloud Sketches", - "visitArduinoCloud": "Bezoek Arduino Cloud om Cloud Sketches te maken." + "syncEditSketches": "Synchroniseer en bewerk je Arduino Cloud Schetsen", + "visitArduinoCloud": "Bezoek Arduino Cloud om Cloud Schetsen te maken." + }, + "cloudSketch": { + "alreadyExists": "Cloud sketch '{0}' bestaat al", + "creating": "cloud sketch '{0}'  maken...", + "new": "Nieuwe Cloud Sketch", + "notFound": "Kan Cloud schets '{0}' niet ophalen, Het bestaat niet.", + "pulling": "Schetsboek synchroniseren, ophalen van '{0}'...", + "pushing": "Schetsboek synchroniseren, opladen van '{0}'...", + "renaming": "Cloud schets hernoemen van '{0}' naar '{1}' ...", + "synchronizingSketchbook": "Schetsboek synchroniseren..." }, "common": { - "all": "All", - "contributed": "Contributed", + "all": "Alle", + "contributed": "Bijgedragen", "installManually": "Handmatig installeren", "later": "Later", "noBoardSelected": "Geen bord geselecteerd", + "noSketchOpened": "No sketch opened", "notConnected": "[niet verbonden]", - "offlineIndicator": "Je lijkt offline te zijn. Zonder een internetverbinding kan de Arduino CLI mogelijk niet de vereiste bronnen downloaden en dit kan storingen veroorzaken. Maak verbinding met het internet en start de applicatie opnieuw. ", + "offlineIndicator": "Je lijkt offline te zijn. Zonder een internetverbinding kan de Arduino CLI mogelijk niet de vereiste bronnen downloaden en dit kan storingen veroorzaken. Maak verbinding met het internet en herstart de applicatie. ", "oldFormat": "De '{0}' gebruikt nog steeds het oude '.pde' formaat. Wil je overstappen naar de nieuwe `.ino` extensie?", "partner": "Partner", "processing": "Verwerken", - "recommended": "Recommended", - "retired": "Retired", + "recommended": "Aanbevolen", + "retired": "Stopgezet", + "selectManually": "Select Manually", "selectedOn": "aan {0}", "serialMonitor": "Seriële Monitor", "type": "Type", "unknown": "Onbekend", - "updateable": "Updatable" + "updateable": "Bijwerkbaar", + "userAbort": "User abort" }, "compile": { "error": "Compilatiefout: {0}" }, "component": { - "boardsIncluded": "Boards included in this package:", + "boardsIncluded": "Borden in dit pakket:", "by": "door", + "clickToOpen": "Klip om te openen in browser: {0}", "filterSearch": "Filter je zoekopdracht...", - "install": "INSTALLEREN", + "install": "Installeren", + "installLatest": "Meest recente installeren", + "installVersion": "Installeer {0}", + "installed": "{0}geïnstalleerd", "moreInfo": "Meer informatie", + "otherVersions": "Andere versies", + "remove": "Verwijderer", + "title": "{0} bij {1}", "uninstall": "Verwijderen", "uninstallMsg": "Wil je {0} verwijderen?", - "version": "Versie {0}" + "update": "Bijwerken" + }, + "configuration": { + "cli": { + "inaccessibleDirectory": "Geen toegang tot schetsboek locatie in '{0}': {1} " + } + }, + "connectionStatus": { + "connectionLost": "Verbinding verbroken. Acties en updates voor Cloud schetsen zijn niet beschikbaar." }, "contributions": { "addFile": "Bestand Toevoegen", "fileAdded": "Één bestand toegevoegd aan de schets.", + "plotter": { + "couldNotOpen": "Kon de seriële plotter niet openen" + }, "replaceTitle": "Vervangen" }, + "core": { + "compilerWarnings": { + "all": "Alle", + "default": "Standaard", + "more": "Meer", + "none": "Geen" + } + }, "coreContribution": { "copyError": "Foutmeldingen kopiëren", - "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." + "noBoardSelected": "Geen bord geselecteerd. Selecteer je Arduino-bord in het menu Extra > Bord." }, + "createCloudCopy": "Schets opladen naar de Cloud.", "daemon": { - "restart": "Restart Daemon", - "start": "Start Daemon", + "restart": "Daemon opnieuw starten", + "start": "Daemon starten", "stop": "Stop Daemon" }, "debug": { "debugWithMessage": "Foutopsporing - {0}", "debuggingNotSupported": "Foutopsporing wordt niet ondersteund door '{0}'", + "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "Platform is niet geïnstalleerd voor '{0}'", - "optimizeForDebugging": "Optimaliseren voor foutopsporing" + "optimizeForDebugging": "Optimaliseren voor foutopsporing", + "sketchIsNotCompiled": "Schets '{0}' moet geverifieerd worden voordat de foutopsporing kan beginnen. Verifieer aub de schets opnieuw en herstart foutopsporing. Wil je de schets nu opnieuw verifiëren?" + }, + "developer": { + "clearBoardList": "Bordenlijst-geschiedenis wissen", + "clearBoardsConfig": "Bord en poort selectie wissen", + "dumpBoardList": "Bordenlijst dumpen" }, "dialog": { "dontAskAgain": "Niet meer vragen" @@ -178,11 +238,7 @@ "increaseIndent": "Inspringing vergroten", "nextError": "Volgende Fout", "previousError": "Vorige Fout", - "revealError": "Reveal Error" - }, - "electron": { - "couldNotSave": "Kan de schets niet opslaan. Kopieer uw niet-opgeslagen werk naar uw favoriete teksteditor en start de IDE opnieuw. ", - "unsavedChanges": "Niet opgeslagen wijzigingen worden niet opgeslagen." + "revealError": "Onthul fout" }, "examples": { "builtInExamples": "Ingebouwde voorbeelden", @@ -201,7 +257,7 @@ "selectBoard": "Selecteer Bord", "selectVersion": "Selecteer firmware versie", "successfullyInstalled": "Firmware succesvol geïnstalleerd.", - "updater": "WiFi101 / WiFiNINA Firmware Updater" + "updater": "Firmware Updater" }, "help": { "environment": "Omgeving", @@ -216,9 +272,12 @@ "visit": "Bezoek Arduino.cc" }, "ide-updater": { - "checkForUpdates": "Check for Arduino IDE Updates", + "checkForUpdates": "Controleren op Arduino IDE-updates", "closeAndInstallButton": "Sluiten en installeren", "closeToInstallNotice": "Sluit de software en installeer de update op je machine.", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", "downloadButton": "Download", "downloadingNotice": "Download de nieuwste versie van de Arduino IDE.", "errorCheckingForUpdates": "Fout bij het controleren op Arduino IDE updates.\n{0}", @@ -232,45 +291,49 @@ "updateAvailable": "Update beschikbaar", "versionDownloaded": "Arduino IDE {0} is gedownload." }, + "installable": { + "libraryInstallFailed": "Installeren van bibliotheek mislukt: '{0} {1}'.", + "platformInstallFailed": "Installeren van platform mislukt: '{0} {1}'." + }, "library": { "addZip": ".ZIP-bibliotheek toevoegen...", "arduinoLibraries": "Arduino Bibliotheken", "contributedLibraries": "Bijgedragen bibliotheken", - "dependenciesForLibrary": "Afhankelijkheden voor bibliotheek {0}:{1}", "include": "Bibliotheek Gebruiken", "installAll": "Alles installeren", - "installMissingDependencies": "Wilt u de ontbrekende afhankelijkheid installeren?", - "installOneMissingDependency": "Wilt u de ontbrekende afhankelijkheid installeren?", - "installOnly": "Installeer enkel {0}", + "installLibraryDependencies": "Installeer de bibliotheek afhankelijkheden", + "installMissingDependencies": "Wil je al de ontbrekende afhankelijkheden installeren?", + "installOneMissingDependency": "Wil je de ontbrekende afhankelijkheid installeren?", + "installWithoutDependencies": "Installeer zonder afhankelijkheden", "installedSuccessfully": "Bibliotheek {0}:{1} succesvol geïnstalleerd", - "libraryAlreadyExists": "Er bestaat al een bibliotheek. Wil U het overschrijven? ", + "libraryAlreadyExists": "Er bestaat al een bibliotheek. Wil je het overschrijven? ", "manageLibraries": "Bibliotheken Beheren...", - "namedLibraryAlreadyExists": "Er bestaat al een bibliotheek map met de naam {0}. Wil U het overschrijven?", + "namedLibraryAlreadyExists": "Er bestaat al een bibliotheekmap met de naam {0}. Wil je het overschrijven?", "needsMultipleDependencies": "De bibliotheek <b>{0}:{1}</b> heeft enkele andere afhankelijkheden nodig die momenteel niet zijn geïnstalleerd: ", "needsOneDependency": "De bibliotheek <b>{0}:{1}</b> heeft een andere afhankelijkheid nodig die momenteel niet is geïnstalleerd:", - "overwriteExistingLibrary": "Wilt u de bestaande bibliotheek overschrijven?", + "overwriteExistingLibrary": "Wil je de bestaande bibliotheek overschrijven?", "successfullyInstalledZipLibrary": "Succesvol bibliotheek uit {0} archief geïnstalleerd", "title": "Bibliotheken beheerder", "uninstalledSuccessfully": "Bibliotheek {0}:{1} succesvol verwijdert", "zipLibrary": "Bibliotheek" }, "librarySearchProperty": { - "topic": "Topic" + "topic": "Onderwerp" }, "libraryTopic": { - "communication": "Communication", - "dataProcessing": "Data Processing", - "dataStorage": "Data Storage", - "deviceControl": "Device Control", - "display": "Display", - "other": "Other", - "sensors": "Sensors", - "signalInputOutput": "Signal Input/Output", + "communication": "Communicatie", + "dataProcessing": "Gegevensverwerking", + "dataStorage": "Gegevensopslag", + "deviceControl": "Apparaatcontrole", + "display": "Toon", + "other": "Andere", + "sensors": "Sensoren", + "signalInputOutput": "Signaalingang/uitgang", "timing": "Timing", - "uncategorized": "Uncategorized" + "uncategorized": "Geen categorie" }, "libraryType": { - "installed": "Installed" + "installed": "Geïnstalleerd" }, "menu": { "advanced": "Geavanceerd", @@ -278,9 +341,23 @@ "tools": "Hulpmiddelen" }, "monitor": { + "alreadyConnectedError": "Kan niet verbinden met {0} {1} poort. Reeds verbonden.", + "baudRate": "{0} baud", + "connectionFailedError": "Kan niet verbinden met {0} {1} poort.", + "connectionFailedErrorWithDetails": "{0} Kan niet verbinden met {1} {2} poort.", + "connectionTimeout": "Time-out. De IDE heeft het 'succes'-bericht niet ontvangen van de monitor nadat er succesvol verbinding mee is gemaakt", + "missingConfigurationError": "Kon geen verbinding maken met de {0} {1} poort. De monitorconfiguratie ontbreekt.", + "notConnectedError": "Niet verbonden met {0}{1}poort.", "unableToCloseWebSocket": "Kan websocket niet sluiten", "unableToConnectToWebSocket": "Kan geen verbinding maken met websocket" }, + "newCloudSketch": { + "newSketchTitle": "Naam van de nieuwe Cloud schets" + }, + "portProtocol": { + "network": "Netwerk", + "serial": "Seriëel" + }, "preferences": { "additionalManagerURLs": "Bijkomende Borden Beheerder URL's", "auth.audience": "Het OAuth2 publiek.", @@ -290,14 +367,15 @@ "automatic": "Automatisch", "board.certificates": "Lijst met certificaten die kunnen worden geüpload naar borden", "browse": "Bladeren", - "checkForUpdate": "Receive notifications of available updates for the IDE, boards, and libraries. Requires an IDE restart after change. It's true by default.", + "checkForUpdate": "Meldingen ontvangen van beschikbare updates voor de IDE, borden en bibliotheken. Vereist een IDE herstart na wijziging. Standaard waar.", "choose": "Kies", "cli.daemonDebug": "Schakel debug logging van de gRPC aanroepen naar de Arduino CLI in. Een herstart van de IDE is nodig om deze instelling in werking te laten treden. Standaard Onwaar.", "cloud.enabled": "Waar als de schets synchronisatie functies zijn ingeschakeld. Standaard ingesteld op waar.", - "cloud.pull.warn": "Waar als de gebruiker verwittigd moet worden voor een cloud schets trekken. Standaard ingesteld op waar. ", - "cloud.push.warn": "Waar als gebruikers moeten worden gewaarschuwd voordat ze een cloud schets pushen. Standaard ingesteld op waar. ", - "cloud.pushpublic.warn": "Waar als gebruikers moeten worden gewaarschuwd voordat ze een openbare schets naar de cloud pushen. Standaard ingesteld op waar.", - "cloud.sketchSyncEndpoint": "Het eindpunt dat wordt gebruikt om schetsen van een backend te pushen en te trekken. Standaard verwijst het naar Arduino Cloud API.", + "cloud.pull.warn": "Waar als de gebruiker verwittigd moet worden voordat een Cloud schets opgehaald wordt. Standaard ingesteld op waar. ", + "cloud.push.warn": "Waar als de gebruiker verwittigd moet worden voordat een Cloud schets opgeladen wordt. Standaard ingesteld op waar. ", + "cloud.pushpublic.warn": "Waar als de gebruiker verwittigd moet worden voordat een publieke Cloud schets opgeladen wordt. Standaard ingesteld op waar. ", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", + "cloud.sketchSyncEndpoint": "Het eindpunt dat gebruikt wordt voor het opladen of ophalen van schetsen van een backend. Standaard verwijst het naar Arduino Cloud API.", "compile": "compileren", "compile.experimental": "Waar als de IDE meerdere compileer fouten moet afhandelen. Standaard is het Onwaar", "compile.revealRange": "Regelt hoe compileer fouten in de editor getoond worden na een mislukte verificatie/upload. Mogelijke waarden: 'auto': Scroll verticaal als dat nodig is en onthul een regel. 'centreren': Scroll verticaal als nodig en onthul een verticaal gecentreerde lijn. 'top': Scroll verticaal als nodig en onthul een lijn dicht bij de bovenkant van het kijkvenster, geoptimaliseerd voor het bekijken van een code-definitie. 'centerIfOutsideViewport': Scroll verticaal als nodig en onthul een verticaal gecentreerde lijn alleen als ze buiten het kijkvenster ligt. De standaardwaarde is '{0}'.", @@ -314,99 +392,158 @@ "invalid.editorFontSize": "Ongeldige lettergrootte voor editor. Het moet een positief geheel getal zijn.", "invalid.sketchbook.location": "Ongeldige schetsboek locatie: {0}", "invalid.theme": "Ongeldig Thema.", + "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", "language.log": "Waar als de Arduino Taal Server log bestanden moet genereren in de schets map. Anders onwaar. Standaard ingesteld op onwaar.", - "language.realTimeDiagnostics": "If true, the language server provides real-time diagnostics when typing in the editor. It's false by default.", + "language.realTimeDiagnostics": "Indien waar, geeft de taalserver real-time diagnostiek tijdens het typen in de editor. Standaard is dit onwaar.", "manualProxy": "Manuele proxy configuratie", + "monitor": { + "dockPanel": "The area of the application shell where the _{0}_ widget will reside. It is either \"bottom\" or \"right\". It defaults to \"{1}\"." + }, "network": "Netwerk", "newSketchbookLocation": "Selecteer een nieuwe schetsboeklocatie.", + "noCliConfig": "De Cloud kon de CLI configuratie niet laden", "noProxy": "Geen proxy", + "proxySettings": { + "hostname": "Naam van de host", + "password": "Wachtwoord", + "port": "Poortnummer", + "username": "Gebruikersnaam" + }, "showVerbose": "Uitgebreide uitvoer weergeven tijdens", + "sketch": { + "inoBlueprint": "Absoluut pad naar het standaard `.ino` systeem blauwdrukbestand. Indien opgegeven, zal de inhoud van het systeem blauwdrukbestand gebruikt worden voor elke nieuwe schets gemaakt met behulp van de IDE. De schetsen zullen gegenereerd worden met de standaard Arduino inhoud indien niet opgegeven. Ontoegangelijke blauwdrukbestanden worden genegeerd. **Een herstart van de IDE is nodig** om deze instelling te activeren." + }, "sketchbook.location": "Schetsboek locatie", "sketchbook.showAllFiles": "Waar om al de schets bestanden in de schets weer te geven. Standaard ingesteld op onwaar.", - "survey.notification": "Waar als gebruikers een melding moeten krijgen als er een enquête beschikbaar is. Standaard is dit waar.", "unofficialBoardSupport": "Klik voor een lijst met onofficiële borden ondersteuning URL's", "upload": "uploaden", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", "upload.verbose": "Waar voor uitgebreide uploaduitvoer. Standaard onwaar.", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "Verifieer de code na het uploaden", "window.autoScale": "Waar als de gebruikersinterface automatisch wordt geschaald met de lettergrootte.", - "window.zoomLevel": "Pas het zoomniveau van het venster aan. De oorspronkelijke grootte is 0 en elke stap hoger (bijv. 1) of lager (bijv. -1) staat voor 20% groter of kleiner zoomen. U kunt ook decimalen invoeren om het zoomniveau fijner in te stellen. " + "window.zoomLevel": { + "deprecationMessage": "Niet langer valide. Gebruik 'window.zoomLevel' in plaats daarvan." + } + }, + "renameCloudSketch": { + "renameSketchTitle": "Nieuwe naam van de Cloud schets" }, "replaceMsg": "De bestaande versie van {0} vervangen?", - "selectZip": "Selecteer een zipbestand met de bibliotheek die U wilt toevoegen", + "selectZip": "Selecteer een zip-bestand met de bibliotheek die je wil toevoegen", "serial": { "autoscroll": "Automatisch scrollen", "carriageReturn": "Carriage Return", - "message": "Bericht ({0} + Enter om bericht te verzenden naar '{1}' op '{2}')", + "connecting": "Verbinding maken met '{0}' op '{1}'...", + "message": "Bericht (Enter om het bericht naar '{0}' op '{1}' te zenden)", "newLine": "Nieuwe Regel", "newLineCarriageReturn": "Zowel NL & CR", "noLineEndings": "Geen RegelEinde", "notConnected": "Niet verbonden. Kies een bord en een poort om automatisch te verbinden.", - "openSerialPlotter": "Serial Plotter", + "openSerialPlotter": "Seriële plotter", "timestamp": "Tijdstempel", "toggleTimestamp": "Tijdstempel omschakelen" }, "sketch": { "archiveSketch": "Archiveer Schets", "cantOpen": "Er bestaat al een map met de naam \"{0}\". Kan schets niet openen.", - "close": "Weet je zeker dat je de schets wilt sluiten?", - "compile": "Compiling sketch...", - "configureAndUpload": "Configureren en uploaden", + "compile": "Sketch compileren...", + "configureAndUpload": "Configureer en upload", "createdArchive": "Archief '{0}' gemaakt.", "doneCompiling": "Klaar met compileren.", "doneUploading": "Klaar met uploaden.", + "editInvalidSketchFolderLocationQuestion": "Wil je proberen om de schets op een andere locatie op te slaan?", + "editInvalidSketchFolderQuestion": "Wil je proberen om de schets onder een andere naam op te slaan?", "exportBinary": "Gecompileerd binair bestand exporteren", + "invalidCloudSketchName": "De naam moet beginnen met een letter, nummer of underscore, gevolgd door letters, nummers, streepjes, punten en underscores. De maximale lengte is 36 karakters.", + "invalidSketchFolderLocationDetails": "Je kunt de schets niet opslaan in een map in de eigen map", + "invalidSketchFolderLocationMessage": "Foute locatie van de schets map: '{0}'", + "invalidSketchFolderNameMessage": "Ongeldige schets mapnaam: '{0}'", + "invalidSketchName": "De naam moet beginnen met een letter, nummer of underscore, gevolgd door letters, nummers, streepjes, punten en underscores. De maximale lengte is 63 karakters.", "moving": "Verplaatsten", "movingMsg": "Het bestand \"{0}\" moet binnen een schetsmap met de naam \"{1}\" staan.\nMaak deze map, verplaats het bestand, en ga verder?", - "new": "Nieuw", + "new": "Nieuwe schets", + "noTrailingPeriod": "Een bestandsnaam kan niet met een punt eindigen", "openFolder": "Map Openen", "openRecent": "Recentelijk geopend", "openSketchInNewWindow": "Schets openen in nieuw venster", + "reservedFilename": "'{0}' is een gereserveerde bestandsnaam.", "saveFolderAs": "Sla de schets map op als...", - "saveSketch": "Bewaar je schets om hem later weer te openen.", + "saveSketch": "Bewaar je schets om het later weer te openen.", "saveSketchAs": "Sla de schetsmap op als...", "showFolder": "Schetsmap tonen", "sketch": "Schets", + "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", + "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", "sketchbook": "Schetsboek", "titleLocalSketchbook": "Lokaal schetsboek", "titleSketchbook": "Schetsboek", "upload": "Uploaden", "uploadUsingProgrammer": "Uploaden met behulp van Programmeerapparaat", - "uploading": "Uploading...", - "userFieldsNotFoundError": "Kan gebruiker veld van verbonden bord niet vinden", + "uploading": "Uploaden...", + "userFieldsNotFoundError": "Kan gebruiker velden van verbonden bord niet vinden", "verify": "Verifiëren", "verifyOrCompile": "Verifiëren/Compileren" }, - "survey": { - "answerSurvey": "Antwoord enquête", - "dismissSurvey": "Niet meer laten zien", - "surveyMessage": "Help ons alsjeblieft te verbeteren door deze super korte enquête te beantwoorden. We waarderen onze gemeenschap en willen onze supporters graag wat beter leren kennen." + "sketchbook": { + "newCloudSketch": "Nieuwe Cloud Sketch", + "newSketch": "Nieuwe schets" + }, + "theme": { + "currentThemeNotFound": "Kan het huidig geselecteerde thema niet vinden: {0}. Arduino IDE heeft een ingebouwd thema gekozen dat compatibel is met het ontbrekende.", + "dark": "Donker", + "deprecated": "{0} (verouderd)", + "hc": "Donker hoog contrast", + "hcLight": "Licht hoog contrast", + "light": "Licht", + "user": "{0} (gebruiker)" + }, + "title": { + "cloud": "Cloud" + }, + "updateIndexes": { + "updateIndexes": "Indexen bijwerken", + "updateLibraryIndex": "Bibliotheek index bijwerken", + "updatePackageIndex": "Index van het pakket bijwerken" }, "upload": { "error": "{0} fout: {1}" }, "userFields": { "cancel": "Annuleer", - "enterField": "Enter {0}", + "enterField": "Ga naar {0}", "upload": "Uploaden" + }, + "validateSketch": { + "abortFixMessage": "De schets is nog steeds niet correct. Wil je de problemen oplossen? Door op '{0}' te klikken, zal een nieuwe schets worden geopend.", + "abortFixTitle": "Incorrecte schets", + "renameSketchFileMessage": "De schetsnaam '{0}' kan niet gebruikt worden. {1} Wil je de schets nu hernoemen?", + "renameSketchFileTitle": "Ongeldige bestandsnaam van de schets", + "renameSketchFolderMessage": "De schets '{0}' kan niet gebruikt worden. {1} Om van deze melding af te komen, hernoem de schets. Wil je de schets nu hernoemen?", + "renameSketchFolderTitle": "Ongeldige schetsnaam" + }, + "versionWelcome": { + "cancelButton": "Maybe later", + "donateButton": "Donate now", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Welcome to a new version of the Arduino IDE!", + "titleWithVersion": "Welcome to the new Arduino IDE {0}!" + }, + "workspace": { + "alreadyExists": "'{0}' bestaat al." } }, - "cloud": { - "GoToCloud": "GA NAAR CLOUD" - }, "theia": { "core": { "cannotConnectBackend": "Kan geen verbinding maken met het backend.", "cannotConnectDaemon": "Kan geen verbinding maken met de CLI daemon.", - "couldNotSave": "Kan de schets niet opslaan. Kopieer uw niet-opgeslagen werk naar uw favoriete teksteditor en start de IDE opnieuw. ", + "couldNotSave": "Kan de schets niet opslaan. Kopieer uw niet-opgeslagen werk naar uw favoriete teksteditor en herstart de IDE. ", "daemonOffline": "CLI Daemon Offline", "offline": "Offline", + "offlineText": "Offline", "quitTitle": "Weet je zeker dat je wilt stoppen?" }, - "debug": { - "start": "Start...", - "startError": "Er is een fout opgetreden bij het starten van de foutopsporingssessie, controleer de logboeken voor meer details. ", - "typeNotSupported": "Het foutopsporingssessietype \"{0}\" wordt niet ondersteund. " - }, "editor": { "unsavedTitle": "Niet opgeslagen – {0}" }, @@ -415,10 +552,10 @@ "expand": "Uitvouwen" }, "workspace": { - "deleteCurrentSketch": "Wilt u de huidige schets verwijderen?", + "deleteCloudSketch": "De Cloud schets '{0}' zal permanent verwijderd worden van de Arduino servers en van de locale caches. Deze actie is onomkeerbaar. Wil je de huidige schets verwijderen?", + "deleteCurrentSketch": "De schets '{0}' zal permanent verwijderd worden. Deze actie is onomkeerbaar. Wil je de huidige schets verwijderen?", "fileNewName": "Naam voor nieuw bestand", "invalidExtension": ".{0} is geen geldige extensie", - "invalidFilename": "Ongeldige bestandsnaam.", "newFileName": "Nieuwe naam voor bestand" } } diff --git a/i18n/my.json b/i18n/no.json similarity index 54% rename from i18n/my.json rename to i18n/no.json index 19a3645e0..739bec50d 100644 --- a/i18n/my.json +++ b/i18n/no.json @@ -1,41 +1,59 @@ { "arduino": { "about": { - "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}{4} [{5}]\n\n{6}", + "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "About {0}" }, + "account": { + "goToCloudEditor": "Go to Cloud Editor", + "goToIoTCloud": "Go to IoT Cloud", + "goToProfile": "Go to Profile", + "menuTitle": "Arduino Cloud" + }, "board": { - "board": "Board{0}", - "boardInfo": "Board Info", - "configDialog1": "Select both a Board and a Port if you want to upload a sketch.", - "configDialog2": "If you only select a Board you will be able to compile, but not to upload your sketch.", - "configDialogTitle": "Select Other Board & Port", + "board": "Kort{0}", + "boardConfigDialogTitle": "Velg et annet kort og port", + "boardDataReloaded": "Board data reloaded.", + "boardInfo": "Informasjon om kort", + "boards": "Kort", + "configDialog1": "Velg kort og portnummer for å laste opp skissen", + "configDialog2": "Hvis du bare velger kort vil du være i stand til å kompilere, men ikke laste opp skissen", "couldNotFindPreviouslySelected": "Could not find previously selected board '{0}' in installed platform '{1}'. Please manually reselect the board you want to use. Do you want to reselect it now?", - "disconnected": "Disconnected", - "getBoardInfo": "Get Board Info", + "editBoardsConfig": "Rediger kort og port", + "getBoardInfo": "Få info om kort", "inSketchbook": " (in Sketchbook)", - "installManually": "Install Manually", - "installNow": "The \"{0} {1}\" core has to be installed for the currently selected \"{2}\" board. Do you want to install it now?", - "noFQBN": "The FQBN is not available for the selected board \"{0}\". Do you have the corresponding core installed?", - "noPortsSelected": "No ports selected for board: '{0}'.", - "noneSelected": "No boards selected.", - "openBoardsConfig": "Select other board and port…", - "platformMissing": "The platform for the selected '{0}' board is not installed.", - "pleasePickBoard": "Please pick a board connected to the port you have selected.", - "port": "Port{0}", - "portLabel": "Port: {0}", + "installNow": "\"{0}{1}\"kjernen må installeres for kortet \"{2}\" som er valgt. Vil du installere det nå?", + "noBoardsFound": "Intet kort funnet for \"{0}\"", + "noNativeSerialPort": "Native serial port, can't obtain info.", + "noPortsDiscovered": "Ingen porter oppdaget", + "nonSerialPort": "Ikke-seriell port. Kan ikke innhentete info.", + "openBoardsConfig": "Velg et annet kort og port...", + "pleasePickBoard": "Velg et kort som er koblet til porten du har valgt.", + "port": "Port {0}", + "ports": "porter", "programmer": "Programmer", - "reselectLater": "Reselect later", - "selectBoard": "Select Board", - "selectBoardForInfo": "Please select a board to obtain board info.", - "selectPortForInfo": "Please select a port to obtain board info.", + "reloadBoardData": "Reload Board Data", + "reselectLater": "Velg igjen senere", + "revertBoardsConfig": "Use '{0}' discovered on '{1}'", + "searchBoard": "Søk etter kort", + "selectBoard": "Velg kort", + "selectBoardToReload": "Please select a board first.", + "selectPortForInfo": "Velg en port for å få info om kort", "showAllAvailablePorts": "Shows all available ports when enabled", + "showAllPorts": "Vis alle porter", "succesfullyInstalledPlatform": "Successfully installed platform {0}:{1}", - "succesfullyUninstalledPlatform": "Successfully uninstalled platform {0}:{1}" + "succesfullyUninstalledPlatform": "Successfully uninstalled platform {0}:{1}", + "typeOfPorts": "{0} ports", + "unconfirmedBoard": "Unconfirmed board", + "unknownBoard": "Ukjent kort" }, "boardsManager": "Boards Manager", + "boardsType": { + "arduinoCertified": "Arduino Certified" + }, "bootloader": { "burnBootloader": "Burn Bootloader", + "burningBootloader": "Burning bootloader...", "doneBurningBootloader": "Done burning bootloader." }, "burnBootloader": { @@ -58,19 +76,29 @@ "uploadRootCertificates": "Upload SSL Root Certificates", "uploadingCertificates": "Uploading certificates." }, + "checkForUpdates": { + "checkForUpdates": "Check for Arduino Updates", + "installAll": "Install All", + "noUpdates": "There are no recent updates available.", + "promptUpdateBoards": "Updates are available for some of your boards.", + "promptUpdateLibraries": "Updates are available for some of your libraries.", + "updatingBoards": "Updating boards...", + "updatingLibraries": "Updating libraries..." + }, "cli-error-parser": { "keyboardError": "'Keyboard' not found. Does your sketch include the line '#include <Keyboard.h>'?", "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" }, "cloud": { - "account": "Account", "chooseSketchVisibility": "Choose visibility of your Sketch:", + "cloudSketchbook": "Cloud Sketchbook", "connected": "Connected", "continue": "Continue", - "donePulling": "Done pulling ‘{0}’.", - "donePushing": "Done pushing ‘{0}’.", + "donePulling": "Done pulling '{0}'.", + "donePushing": "Done pushing '{0}'.", "embed": "Embed:", "emptySketchbook": "Your Sketchbook is empty", + "goToCloud": "Go to Cloud", "learnMore": "Learn more", "link": "Link:", "notYetPulled": "Cannot push to Cloud. It is not yet pulled.", @@ -88,10 +116,9 @@ "pushSketch": "Push Sketch", "pushSketchMsg": "This is a Public Sketch. Before pushing, make sure any sensitive information is defined in arduino_secrets.h files. You can make a Sketch private from the Share panel.", "remote": "Remote", - "remoteSketchbook": "Remote Sketchbook", "share": "Share...", "shareSketch": "Share Sketch", - "showHideRemoveSketchbook": "Show/Hide Remote Sketchbook", + "showHideSketchbook": "Show/Hide Cloud Sketchbook", "signIn": "SIGN IN", "signInToCloud": "Sign in to Arduino Cloud", "signOut": "Sign Out", @@ -99,38 +126,87 @@ "syncEditSketches": "Sync and edit your Arduino Cloud Sketches", "visitArduinoCloud": "Visit Arduino Cloud to create Cloud Sketches." }, + "cloudSketch": { + "alreadyExists": "Cloud sketch '{0}' already exists.", + "creating": "Creating cloud sketch '{0}'...", + "new": "New Cloud Sketch", + "notFound": "Could not pull the cloud sketch '{0}'. It does not exist.", + "pulling": "Synchronizing sketchbook, pulling '{0}'...", + "pushing": "Synchronizing sketchbook, pushing '{0}'...", + "renaming": "Renaming cloud sketch from '{0}' to '{1}'...", + "synchronizingSketchbook": "Synchronizing sketchbook..." + }, "common": { + "all": "All", + "contributed": "Contributed", + "installManually": "Install Manually", "later": "Later", "noBoardSelected": "No board selected", + "noSketchOpened": "No sketch opened", "notConnected": "[not connected]", "offlineIndicator": "You appear to be offline. Without an Internet connection, the Arduino CLI might not be able to download the required resources and could cause malfunction. Please connect to the Internet and restart the application.", "oldFormat": "The '{0}' still uses the old `.pde` format. Do you want to switch to the new `.ino` extension?", + "partner": "Partner", "processing": "Processing", - "selectBoard": "Select Board", + "recommended": "Recommended", + "retired": "Retired", + "selectManually": "Select Manually", "selectedOn": "on {0}", "serialMonitor": "Serial Monitor", - "unknown": "Unknown" + "type": "Type", + "unknown": "Unknown", + "updateable": "Updatable", + "userAbort": "User abort" }, "compile": { "error": "Compilation error: {0}" }, "component": { + "boardsIncluded": "Boards included in this package:", "by": "by", + "clickToOpen": "Click to open in browser: {0}", "filterSearch": "Filter your search...", - "install": "INSTALL", + "install": "Install", + "installLatest": "Install Latest", + "installVersion": "Install {0}", + "installed": "{0} installed", "moreInfo": "More info", + "otherVersions": "Other Versions", + "remove": "Remove", + "title": "{0} by {1}", "uninstall": "Uninstall", "uninstallMsg": "Do you want to uninstall {0}?", - "version": "Version {0}" + "update": "Update" + }, + "configuration": { + "cli": { + "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" + } + }, + "connectionStatus": { + "connectionLost": "Connection lost. Cloud sketch actions and updates won't be available." }, "contributions": { "addFile": "Add File", "fileAdded": "One file added to the sketch.", + "plotter": { + "couldNotOpen": "Couldn't open serial plotter" + }, "replaceTitle": "Replace" }, + "core": { + "compilerWarnings": { + "all": "All", + "default": "Default", + "more": "More", + "none": "None" + } + }, "coreContribution": { - "copyError": "Copy error messages" + "copyError": "Copy error messages", + "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." }, + "createCloudCopy": "Push Sketch to Cloud", "daemon": { "restart": "Restart Daemon", "start": "Start Daemon", @@ -139,8 +215,15 @@ "debug": { "debugWithMessage": "Debug - {0}", "debuggingNotSupported": "Debugging is not supported by '{0}'", + "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "Platform is not installed for '{0}'", - "optimizeForDebugging": "Optimize for Debugging" + "optimizeForDebugging": "Optimize for Debugging", + "sketchIsNotCompiled": "Sketch '{0}' must be verified before starting a debug session. Please verify the sketch and start debugging again. Do you want to verify the sketch now?" + }, + "developer": { + "clearBoardList": "Clear the Board List History", + "clearBoardsConfig": "Clear the Board and Port Selection", + "dumpBoardList": "Dump the Board List" }, "dialog": { "dontAskAgain": "Don't ask again" @@ -154,11 +237,8 @@ "increaseFontSize": "Increase Font Size", "increaseIndent": "Increase Indent", "nextError": "Next Error", - "previousError": "Previous Error" - }, - "electron": { - "couldNotSave": "Could not save the sketch. Please copy your unsaved work into your favorite text editor, and restart the IDE.", - "unsavedChanges": "Any unsaved changes will not be saved." + "previousError": "Previous Error", + "revealError": "Reveal Error" }, "examples": { "builtInExamples": "Built-in examples", @@ -174,10 +254,10 @@ "install": "Install", "installingFirmware": "Installing firmware.", "overwriteSketch": "Installation will overwrite the Sketch on the board.", - "selectBoard": "Select Board", + "selectBoard": "Velg kort", "selectVersion": "Select firmware version", "successfullyInstalled": "Firmware successfully installed.", - "updater": "WiFi101 / WiFiNINA Firmware Updater" + "updater": "Firmware Updater" }, "help": { "environment": "Environment", @@ -192,9 +272,12 @@ "visit": "Visit Arduino.cc" }, "ide-updater": { - "checkForUpdates": "Check for Arduino IDE updates", + "checkForUpdates": "Check for Arduino IDE Updates", "closeAndInstallButton": "Close and Install", "closeToInstallNotice": "Close the software and install the update on your machine.", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", "downloadButton": "Download", "downloadingNotice": "Downloading the latest version of the Arduino IDE.", "errorCheckingForUpdates": "Error while checking for Arduino IDE updates.\n{0}", @@ -208,16 +291,20 @@ "updateAvailable": "Update Available", "versionDownloaded": "Arduino IDE {0} has been downloaded." }, + "installable": { + "libraryInstallFailed": "Failed to install library: '{0}{1}'.", + "platformInstallFailed": "Failed to install platform: '{0}{1}'." + }, "library": { "addZip": "Add .ZIP Library...", "arduinoLibraries": "Arduino libraries", "contributedLibraries": "Contributed libraries", - "dependenciesForLibrary": "Dependencies for library {0}:{1}", "include": "Include Library", - "installAll": "Install all", + "installAll": "Install All", + "installLibraryDependencies": "Install library dependencies", "installMissingDependencies": "Would you like to install all the missing dependencies?", "installOneMissingDependency": "Would you like to install the missing dependency?", - "installOnly": "Install {0} only", + "installWithoutDependencies": "Install without dependencies", "installedSuccessfully": "Successfully installed library {0}:{1}", "libraryAlreadyExists": "A library already exists. Do you want to overwrite it?", "manageLibraries": "Manage Libraries...", @@ -230,15 +317,47 @@ "uninstalledSuccessfully": "Successfully uninstalled library {0}:{1}", "zipLibrary": "Library" }, + "librarySearchProperty": { + "topic": "Topic" + }, + "libraryTopic": { + "communication": "Communication", + "dataProcessing": "Data Processing", + "dataStorage": "Data Storage", + "deviceControl": "Device Control", + "display": "Display", + "other": "Other", + "sensors": "Sensors", + "signalInputOutput": "Signal Input/Output", + "timing": "Timing", + "uncategorized": "Uncategorized" + }, + "libraryType": { + "installed": "Installed" + }, "menu": { "advanced": "Advanced", "sketch": "Sketch", "tools": "Tools" }, "monitor": { + "alreadyConnectedError": "Could not connect to {0} {1} port. Already connected.", + "baudRate": "{0} baud", + "connectionFailedError": "Could not connect to {0} {1} port.", + "connectionFailedErrorWithDetails": "{0} Could not connect to {1} {2} port.", + "connectionTimeout": "Timeout. The IDE has not received the 'success' message from the monitor after successfully connecting to it", + "missingConfigurationError": "Could not connect to {0} {1} port. The monitor configuration is missing.", + "notConnectedError": "Not connected to {0} {1} port.", "unableToCloseWebSocket": "Unable to close websocket", "unableToConnectToWebSocket": "Unable to connect to websocket" }, + "newCloudSketch": { + "newSketchTitle": "Name of the new Cloud Sketch" + }, + "portProtocol": { + "network": "Network", + "serial": "Serial" + }, "preferences": { "additionalManagerURLs": "Additional Boards Manager URLs", "auth.audience": "The OAuth2 audience.", @@ -248,12 +367,14 @@ "automatic": "Automatic", "board.certificates": "List of certificates that can be uploaded to boards", "browse": "Browse", + "checkForUpdate": "Receive notifications of available updates for the IDE, boards, and libraries. Requires an IDE restart after change. It's true by default.", "choose": "Choose", "cli.daemonDebug": "Enable debug logging of the gRPC calls to the Arduino CLI. A restart of the IDE is needed for this setting to take effect. It's false by default.", "cloud.enabled": "True if the sketch sync functions are enabled. Defaults to true.", "cloud.pull.warn": "True if users should be warned before pulling a cloud sketch. Defaults to true.", "cloud.push.warn": "True if users should be warned before pushing a cloud sketch. Defaults to true.", "cloud.pushpublic.warn": "True if users should be warned before pushing a public sketch to the cloud. Defaults to true.", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", "cloud.sketchSyncEndpoint": "The endpoint used to push and pull sketches from a backend. By default it points to Arduino Cloud API.", "compile": "compile", "compile.experimental": "True if the IDE should handle multiple compiler errors. False by default", @@ -271,29 +392,50 @@ "invalid.editorFontSize": "Invalid editor font size. It must be a positive integer.", "invalid.sketchbook.location": "Invalid sketchbook location: {0}", "invalid.theme": "Invalid theme.", + "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", "language.log": "True if the Arduino Language Server should generate log files into the sketch folder. Otherwise, false. It's false by default.", "language.realTimeDiagnostics": "If true, the language server provides real-time diagnostics when typing in the editor. It's false by default.", "manualProxy": "Manual proxy configuration", + "monitor": { + "dockPanel": "The area of the application shell where the _{0}_ widget will reside. It is either \"bottom\" or \"right\". It defaults to \"{1}\"." + }, "network": "Network", "newSketchbookLocation": "Select new sketchbook location", + "noCliConfig": "Could not load the CLI configuration", "noProxy": "No proxy", + "proxySettings": { + "hostname": "Host name", + "password": "Password", + "port": "Port number", + "username": "Username" + }, "showVerbose": "Show verbose output during", + "sketch": { + "inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect." + }, "sketchbook.location": "Sketchbook location", "sketchbook.showAllFiles": "True to show all sketch files inside the sketch. It is false by default.", - "survey.notification": "True if users should be notified if a survey is available. True by default.", "unofficialBoardSupport": "Click for a list of unofficial board support URLs", "upload": "upload", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", "upload.verbose": "True for verbose upload output. False by default.", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "Verify code after upload", "window.autoScale": "True if the user interface automatically scales with the font size.", - "window.zoomLevel": "Adjust the zoom level of the window. The original size is 0 and each increment above (e.g. 1) or below (e.g. -1) represents zooming 20% larger or smaller. You can also enter decimals to adjust the zoom level with a finer granularity." + "window.zoomLevel": { + "deprecationMessage": "Deprecated. Use 'window.zoomLevel' instead." + } + }, + "renameCloudSketch": { + "renameSketchTitle": "New name of the Cloud Sketch" }, "replaceMsg": "Replace the existing version of {0}?", "selectZip": "Select a zip file containing the library you'd like to add", "serial": { "autoscroll": "Autoscroll", "carriageReturn": "Carriage Return", - "message": "Message ({0} + Enter to send message to '{1}' on '{2}')", + "connecting": "Connecting to '{0}' on '{1}'...", + "message": "Message (Enter to send message to '{0}' on '{1}')", "newLine": "New Line", "newLineCarriageReturn": "Both NL & CR", "noLineEndings": "No Line Ending", @@ -305,48 +447,93 @@ "sketch": { "archiveSketch": "Archive Sketch", "cantOpen": "A folder named \"{0}\" already exists. Can't open sketch.", - "close": "Are you sure you want to close the sketch?", - "configureAndUpload": "Configure And Upload", + "compile": "Compiling sketch...", + "configureAndUpload": "Configure and Upload", "createdArchive": "Created archive '{0}'.", "doneCompiling": "Done compiling.", "doneUploading": "Done uploading.", + "editInvalidSketchFolderLocationQuestion": "Do you want to try saving the sketch to a different location?", + "editInvalidSketchFolderQuestion": "Do you want to try saving the sketch with a different name?", "exportBinary": "Export Compiled Binary", + "invalidCloudSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", + "invalidSketchFolderLocationDetails": "You cannot save a sketch into a folder inside itself.", + "invalidSketchFolderLocationMessage": "Invalid sketch folder location: '{0}'", + "invalidSketchFolderNameMessage": "Invalid sketch folder name: '{0}'", + "invalidSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", "moving": "Moving", "movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?", - "new": "New", + "new": "New Sketch", + "noTrailingPeriod": "A filename cannot end with a dot", "openFolder": "Open Folder", "openRecent": "Open Recent", "openSketchInNewWindow": "Open Sketch in New Window", + "reservedFilename": "'{0}' is a reserved filename.", "saveFolderAs": "Save sketch folder as...", + "saveSketch": "Save your sketch to open it again later.", "saveSketchAs": "Save sketch folder as...", - "saveTempSketch": "Save your sketch to open it again later.", "showFolder": "Show Sketch Folder", "sketch": "Sketch", + "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", + "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", "sketchbook": "Sketchbook", "titleLocalSketchbook": "Local Sketchbook", "titleSketchbook": "Sketchbook", "upload": "Upload", "uploadUsingProgrammer": "Upload Using Programmer", + "uploading": "Uploading...", "userFieldsNotFoundError": "Can't find user fields for connected board", "verify": "Verify", "verifyOrCompile": "Verify/Compile" }, - "survey": { - "answerSurvey": "Answer survey", - "dismissSurvey": "Don't show again", - "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." + "sketchbook": { + "newCloudSketch": "New Cloud Sketch", + "newSketch": "New Sketch" + }, + "theme": { + "currentThemeNotFound": "Could not find the currently selected theme: {0}. Arduino IDE has picked a built-in theme compatible with the missing one.", + "dark": "Dark", + "deprecated": "{0} (deprecated)", + "hc": "Dark High Contrast", + "hcLight": "Light High Contrast", + "light": "Light", + "user": "{0} (user)" + }, + "title": { + "cloud": "Cloud" + }, + "updateIndexes": { + "updateIndexes": "Update Indexes", + "updateLibraryIndex": "Update Library Index", + "updatePackageIndex": "Update Package Index" }, "upload": { "error": "{0} error: {1}" }, "userFields": { "cancel": "Cancel", + "enterField": "Enter {0}", "upload": "Upload" + }, + "validateSketch": { + "abortFixMessage": "The sketch is still invalid. Do you want to fix the remaining problems? By clicking '{0}', a new sketch will open.", + "abortFixTitle": "Invalid sketch", + "renameSketchFileMessage": "The sketch file '{0}' cannot be used. {1} Do you want to rename the sketch file now?", + "renameSketchFileTitle": "Invalid sketch filename", + "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", + "renameSketchFolderTitle": "Invalid sketch name" + }, + "versionWelcome": { + "cancelButton": "Maybe later", + "donateButton": "Donate now", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Welcome to a new version of the Arduino IDE!", + "titleWithVersion": "Welcome to the new Arduino IDE {0}!" + }, + "workspace": { + "alreadyExists": "'{0}' already exists." } }, - "cloud": { - "GoToCloud": "GO TO CLOUD" - }, "theia": { "core": { "cannotConnectBackend": "Cannot connect to the backend.", @@ -354,14 +541,9 @@ "couldNotSave": "Could not save the sketch. Please copy your unsaved work into your favorite text editor, and restart the IDE.", "daemonOffline": "CLI Daemon Offline", "offline": "Offline", - "quitMessage": "Any unsaved changes will not be saved.", + "offlineText": "Offline", "quitTitle": "Are you sure you want to quit?" }, - "debug": { - "start": "Start...", - "startError": "There was an error starting the debug session, check the logs for more details.", - "typeNotSupported": "The debug session type \"{0}\" is not supported." - }, "editor": { "unsavedTitle": "Unsaved – {0}" }, @@ -370,10 +552,10 @@ "expand": "Expand" }, "workspace": { - "deleteCurrentSketch": "Do you want to delete the current sketch?", + "deleteCloudSketch": "The cloud sketch '{0}' will be permanently deleted from the Arduino servers and the local caches. This action is irreversible. Do you want to delete the current sketch?", + "deleteCurrentSketch": "The sketch '{0}' will be permanently deleted. This action is irreversible. Do you want to delete the current sketch?", "fileNewName": "Name for new file", "invalidExtension": ".{0} is not a valid extension", - "invalidFilename": "Invalid filename.", "newFileName": "New name for file" } } diff --git a/i18n/no_NO.json b/i18n/no_NO.json deleted file mode 100644 index 3bd7251da..000000000 --- a/i18n/no_NO.json +++ /dev/null @@ -1,352 +0,0 @@ -{ - "arduino": { - "about": { - "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}{4} [{5}]\n\n{6}", - "label": "About {0}" - }, - "board": { - "board": "Board{0}", - "boardInfo": "Board Info", - "boardListItem": "{0} at {1}", - "configDialog1": "Select both a Board and a Port if you want to upload a sketch.", - "configDialog2": "If you only select a Board you will be able to compile, but not to upload your sketch.", - "configDialogTitle": "Select Other Board & Port", - "couldNotFindPreviouslySelected": "Could not find previously selected board '{0}' in installed platform '{1}'. Please manually reselect the board you want to use. Do you want to reselect it now?", - "getBoardInfo": "Get Board Info", - "inSketchbook": " (in Sketchbook)", - "installManually": "Install Manually", - "installNow": "The \"{0} {1}\" core has to be installed for the currently selected \"{2}\" board. Do you want to install it now?", - "noFQBN": "The FQBN is not available for the selected board \"{0}\". Do you have the corresponding core installed?", - "noPortsSelected": "No ports selected for board: '{0}'.", - "noneSelected": "No boards selected.", - "openBoardsConfig": "Select other board and port…", - "platformMissing": "The platform for the selected '{0}' board is not installed.", - "pleasePickBoard": "Please pick a board connected to the port you have selected.", - "port": "Port{0}", - "programmer": "Programmer", - "reselectLater": "Reselect later", - "selectBoardForInfo": "Please select a board to obtain board info.", - "selectPortForInfo": "Please select a port to obtain board info.", - "showAllAvailablePorts": "Shows all available ports when enabled", - "succesfullyInstalledPlatform": "Successfully installed platform {0}:{1}", - "succesfullyUninstalledPlatform": "Successfully uninstalled platform {0}:{1}" - }, - "boardsManager": "Boards Manager", - "bootloader": { - "burnBootloader": "Burn Bootloader", - "doneBurningBootloader": "Done burning bootloader." - }, - "burnBootloader": { - "error": "Error while burning the bootloader: {0}" - }, - "certificate": { - "addNew": "Add New", - "addURL": "Add URL to fetch SSL certificate", - "boardAtPort": "{0} at {1}", - "certificatesUploaded": "Certificates uploaded.", - "enterURL": "Enter URL", - "noSupportedBoardConnected": "No supported board connected", - "openContext": "Open context", - "remove": "Remove", - "selectBoard": "Select a board...", - "selectCertificateToUpload": "1. Select certificate to upload", - "selectDestinationBoardToUpload": "2. Select destination board and upload certificate", - "upload": "Upload", - "uploadFailed": "Upload failed. Please try again.", - "uploadRootCertificates": "Upload SSL Root Certificates", - "uploadingCertificates": "Uploading certificates." - }, - "cloud": { - "chooseSketchVisibility": "Choose visibility of your Sketch:", - "cloudSketchbook": "Cloud Sketchbook", - "connected": "Connected", - "continue": "Continue", - "donePulling": "Done pulling ‘{0}’.", - "donePushing": "Done pushing ‘{0}’.", - "embed": "Embed:", - "emptySketchbook": "Your Sketchbook is empty", - "learnMore": "Learn more", - "link": "Link:", - "notYetPulled": "Cannot push to Cloud. It is not yet pulled.", - "offline": "Offline", - "openInCloudEditor": "Open in Cloud Editor", - "options": "Options...", - "privateVisibility": "Private. Only you can view the Sketch.", - "profilePicture": "Profile picture", - "publicVisibility": "Public. Anyone with the link can view the Sketch.", - "pull": "Pull", - "pullFirst": "You have to pull first to be able to push to the Cloud.", - "pullSketch": "Pull Sketch", - "pullSketchMsg": "Pulling this Sketch from the Cloud will overwrite its local version. Are you sure you want to continue?", - "push": "Push", - "pushSketch": "Push Sketch", - "pushSketchMsg": "This is a Public Sketch. Before pushing, make sure any sensitive information is defined in arduino_secrets.h files. You can make a Sketch private from the Share panel.", - "remote": "Remote", - "share": "Share...", - "shareSketch": "Share Sketch", - "showHideRemoveSketchbook": "Show/Hide Remote Sketchbook", - "signIn": "SIGN IN", - "signInToCloud": "Sign in to Arduino Cloud", - "signOut": "Sign Out", - "syncEditSketches": "Sync and edit your Arduino Cloud Sketches", - "visitArduinoCloud": "Visit Arduino Cloud to create Cloud Sketches." - }, - "common": { - "later": "Later", - "noBoardSelected": "No board selected", - "notConnected": "[not connected]", - "offlineIndicator": "You appear to be offline. Without an Internet connection, the Arduino CLI might not be able to download the required resources and could cause malfunction. Please connect to the Internet and restart the application.", - "oldFormat": "The '{0}' still uses the old `.pde` format. Do you want to switch to the new `.ino` extension?", - "processing": "Processing", - "selectBoard": "Select Board", - "selectedOn": "on {0}", - "serialMonitor": "Serial Monitor", - "unknown": "Unknown" - }, - "compile": { - "error": "Compilation error: {0}" - }, - "component": { - "by": "by", - "filterSearch": "Filter your search...", - "install": "INSTALL", - "moreInfo": "More info", - "uninstall": "Uninstall", - "uninstallMsg": "Do you want to uninstall {0}?", - "version": "Version {0}" - }, - "contributions": { - "addFile": "Add File", - "fileAdded": "One file added to the sketch.", - "replaceTitle": "Replace" - }, - "debug": { - "debugWithMessage": "Debug - {0}", - "debuggingNotSupported": "Debugging is not supported by '{0}'", - "noPlatformInstalledFor": "Platform is not installed for '{0}'", - "optimizeForDebugging": "Optimize for Debugging" - }, - "dialog": { - "dontAskAgain": "Don't ask again" - }, - "editor": { - "autoFormat": "Auto Format", - "commentUncomment": "Comment/Uncomment", - "copyForForum": "Copy for Forum (Markdown)", - "decreaseFontSize": "Decrease Font Size", - "decreaseIndent": "Decrease Indent", - "increaseFontSize": "Increase Font Size", - "increaseIndent": "Increase Indent" - }, - "electron": { - "couldNotSave": "Could not save the sketch. Please copy your unsaved work into your favorite text editor, and restart the IDE.", - "unsavedChanges": "Any unsaved changes will not be saved." - }, - "examples": { - "builtInExamples": "Built-in examples", - "couldNotInitializeExamples": "Could not initialize built-in examples.", - "customLibrary": "Examples from Custom Libraries", - "for": "Examples for {0}", - "forAny": "Examples for any board", - "menu": "Examples" - }, - "firmware": { - "checkUpdates": "Check Updates", - "failedInstall": "Installation failed. Please try again.", - "install": "Install", - "installingFirmware": "Installing firmware.", - "overwriteSketch": "Installation will overwrite the Sketch on the board.", - "selectBoard": "Select Board", - "selectVersion": "Select firmware version", - "successfullyInstalled": "Firmware successfully installed.", - "updater": "WiFi101 / WiFiNINA Firmware Updater" - }, - "help": { - "environment": "Environment", - "faq": "Frequently Asked Questions", - "findInReference": "Find in Reference", - "gettingStarted": "Getting Started", - "keyword": "Type a keyword", - "privacyPolicy": "Privacy Policy", - "reference": "Reference", - "search": "Search on Arduino.cc", - "troubleshooting": "Troubleshooting", - "visit": "Visit Arduino.cc" - }, - "ide-updater": { - "closeAndInstallButton": "Close and Install", - "closeToInstallNotice": "Close the software and install the update on your machine.", - "downloadButton": "Download", - "downloadingNotice": "Downloading the latest version of the Arduino IDE.", - "errorCheckingForUpdates": "Error while checking for Arduino IDE updates.\n{0}", - "goToDownloadButton": "Go To Download", - "goToDownloadPage": "An update for the Arduino IDE is available, but we're not able to download and install it automatically. Please go to the download page and download the latest version from there.", - "ideUpdaterDialog": "Software Update", - "newVersionAvailable": "A new version of Arduino IDE ({0}) is available for download.", - "noUpdatesAvailable": "There are no recent updates available for the Arduino IDE", - "notNowButton": "Not now", - "skipVersionButton": "Skip Version", - "updateAvailable": "Update Available", - "versionDownloaded": "Arduino IDE {0} has been downloaded." - }, - "library": { - "addZip": "Add .ZIP Library...", - "arduinoLibraries": "Arduino libraries", - "contributedLibraries": "Contributed libraries", - "dependenciesForLibrary": "Dependencies for library {0}:{1}", - "include": "Include Library", - "installAll": "Install all", - "installMissingDependencies": "Would you like to install all the missing dependencies?", - "installOneMissingDependency": "Would you like to install the missing dependency?", - "installOnly": "Install {0} only", - "installedSuccessfully": "Successfully installed library {0}:{1}", - "libraryAlreadyExists": "A library already exists. Do you want to overwrite it?", - "manageLibraries": "Manage Libraries...", - "namedLibraryAlreadyExists": "A library folder named {0} already exists. Do you want to overwrite it?", - "needsMultipleDependencies": "The library <b>{0}:{1}</b> needs some other dependencies currently not installed:", - "needsOneDependency": "The library <b>{0}:{1}</b> needs another dependency currently not installed:", - "overwriteExistingLibrary": "Do you want to overwrite the existing library?", - "successfullyInstalledZipLibrary": "Successfully installed library from {0} archive", - "title": "Library Manager", - "uninstalledSuccessfully": "Successfully uninstalled library {0}:{1}", - "zipLibrary": "Library" - }, - "menu": { - "sketch": "Sketch", - "tools": "Tools" - }, - "preferences": { - "additionalManagerURLs": "Additional Boards Manager URLs", - "auth.audience": "The OAuth2 audience.", - "auth.clientID": "The OAuth2 client ID.", - "auth.domain": "The OAuth2 domain.", - "auth.registerUri": "The URI used to register a new user.", - "automatic": "Automatic", - "board.certificates": "List of certificates that can be uploaded to boards", - "browse": "Browse", - "choose": "Choose", - "cloud.enabled": "True if the sketch sync functions are enabled. Defaults to true.", - "cloud.pull.warn": "True if users should be warned before pulling a cloud sketch. Defaults to true.", - "cloud.push.warn": "True if users should be warned before pushing a cloud sketch. Defaults to true.", - "cloud.pushpublic.warn": "True if users should be warned before pushing a public sketch to the cloud. Defaults to true.", - "cloud.sketchSyncEnpoint": "The endpoint used to push and pull sketches from a backend. By default it points to Arduino Cloud API.", - "compile": "compile", - "compile.verbose": "True for verbose compile output. False by default", - "compile.warnings": "Tells gcc which warning level to use. It's 'None' by default", - "compilerWarnings": "Compiler warnings", - "editorFontSize": "Editor font size", - "editorQuickSuggestions": "Editor Quick Suggestions", - "enterAdditionalURLs": "Enter additional URLs, one for each row", - "files.inside.sketches": "Show files inside Sketches", - "ide.updateBaseUrl": "The base URL where to download updates from. Defaults to 'https://downloads.arduino.cc/arduino-ide'", - "ide.updateChannel": "Release channel to get updated from. 'stable' is the stable release, 'nightly' is the latest development build.", - "interfaceScale": "Interface scale", - "invalid.editorFontSize": "Invalid editor font size. It must be a positive integer.", - "invalid.sketchbook.location": "Invalid sketchbook location: {0}", - "invalid.theme": "Invalid theme.", - "language.log": "True if the Arduino Language Server should generate log files into the sketch folder. Otherwise, false. It's false by default.", - "manualProxy": "Manual proxy configuration", - "network": "Network", - "newSketchbookLocation": "Select new sketchbook location", - "noProxy": "No proxy", - "showVerbose": "Show verbose output during", - "sketchbook.location": "Sketchbook location", - "sketchbook.showAllFiles": "True to show all sketch files inside the sketch. It is false by default.", - "unofficialBoardSupport": "Click for a list of unofficial board support URLs", - "upload": "upload", - "upload.verbose": "True for verbose upload output. False by default.", - "verifyAfterUpload": "Verify code after upload", - "window.autoScale": "True if the user interface automatically scales with the font size.", - "window.zoomLevel": "Adjust the zoom level of the window. The original size is 0 and each increment above (e.g. 1) or below (e.g. -1) represents zooming 20% larger or smaller. You can also enter decimals to adjust the zoom level with a finer granularity." - }, - "replaceMsg": "Replace the existing version of {0}?", - "selectZip": "Select a zip file containing the library you'd like to add", - "serial": { - "autoscroll": "Autoscroll", - "carriageReturn": "Carriage Return", - "connectionBusy": "Connection failed. Serial port is busy: {0}", - "disconnected": "Disconnected {0} from {1}.", - "failedReconnect": "Failed to reconnect {0} to serial port after 10 consecutive attempts. The {1} serial port is busy.", - "message": "Message ({0} + Enter to send message to '{1}' on '{2}')", - "newLine": "New Line", - "newLineCarriageReturn": "Both NL & CR", - "noLineEndings": "No Line Ending", - "notConnected": "Not connected. Select a board and a port to connect automatically.", - "reconnect": "Reconnecting {0} to {1} in {2} seconds...", - "timestamp": "Timestamp", - "toggleTimestamp": "Toggle Timestamp", - "unexpectedError": "Unexpected error. Reconnecting {0} on port {1}." - }, - "sketch": { - "archiveSketch": "Archive Sketch", - "cantOpen": "A folder named \"{0}\" already exists. Can't open sketch.", - "close": "Are you sure you want to close the sketch?", - "configureAndUpload": "Configure And Upload", - "couldNotConnectToSerial": "Could not reconnect to serial port. {0}", - "createdArchive": "Created archive '{0}'.", - "doneCompiling": "Done compiling.", - "doneUploading": "Done uploading.", - "exportBinary": "Export Compiled Binary", - "moving": "Moving", - "movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?", - "new": "New", - "openFolder": "Open Folder", - "openRecent": "Open Recent", - "openSketchInNewWindow": "Open Sketch in New Window", - "saveFolderAs": "Save sketch folder as...", - "saveSketchAs": "Save sketch folder as...", - "saveTempSketch": "Save your sketch to open it again later.", - "showFolder": "Show Sketch Folder", - "sketch": "Sketch", - "sketchbook": "Sketchbook", - "titleLocalSketchbook": "Local Sketchbook", - "titleSketchbook": "Sketchbook", - "upload": "Upload", - "uploadUsingProgrammer": "Upload Using Programmer", - "userFieldsNotFoundError": "Can't find user fields for connected board", - "verify": "Verify", - "verifyOrCompile": "Verify/Compile" - }, - "upload": { - "error": "{0} error: {1}" - }, - "userFields": { - "cancel": "Cancel", - "upload": "Upload" - } - }, - "cloud": { - "GoToCloud": "GO TO CLOUD" - }, - "theia": { - "core": { - "cannotConnectBackend": "Cannot connect to the backend.", - "cannotConnectDaemon": "Cannot connect to the CLI daemon.", - "couldNotSave": "Could not save the sketch. Please copy your unsaved work into your favorite text editor, and restart the IDE.", - "daemonOffline": "CLI Daemon Offline", - "offline": "Offline", - "quitMessage": "Any unsaved changes will not be saved.", - "quitTitle": "Are you sure you want to quit?" - }, - "debug": { - "start": "Start...", - "startError": "There was an error starting the debug session, check the logs for more details.", - "typeNotSupported": "The debug session type \"{0}\" is not supported." - }, - "editor": { - "unsavedTitle": "Unsaved – {0}" - }, - "messages": { - "collapse": "Collapse", - "expand": "Expand" - }, - "workspace": { - "deleteCurrentSketch": "Do you want to delete the current sketch?", - "fileNewName": "Name for new file", - "invalidExtension": ".{0} is not a valid extension", - "invalidFilename": "Invalid filename.", - "newFileName": "New name for file", - "sketchDirectoryError": "There was an error creating the sketch directory. See the log for more details. The application will probably not work as expected." - } - } -} diff --git a/i18n/pl.json b/i18n/pl.json index a506aecf5..e7a290ba2 100644 --- a/i18n/pl.json +++ b/i18n/pl.json @@ -1,42 +1,55 @@ { "arduino": { "about": { - "detail": "Wersja: {0}\nData: {1}{2}\nWersja CLI: {3}{4} [{5}]\n\n{6}", + "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "O {0}" }, + "account": { + "goToCloudEditor": "Przejdź do Edytora w Chmurze", + "goToIoTCloud": "Przejdź do IoT Cloud", + "goToProfile": "Przejdź do profilu", + "menuTitle": "Arduino Cloud" + }, "board": { "board": "Płytka{0}", - "boardConfigDialogTitle": "Select Other Board and Port", + "boardConfigDialogTitle": "Wybierz inną płytkę i port", + "boardDataReloaded": "Board data reloaded.", "boardInfo": "Informacje o płytce", + "boards": "Płytki", "configDialog1": "Wybierz płytkę oraz port, aby wgrać szkic.", "configDialog2": "Jeżeli wybierzesz płytkę, ale nie wybierzesz portu to nie będziesz mógł wgrywać szkicy, ale nadal możesz je kompilować.", "couldNotFindPreviouslySelected": "Nie można znaleźć poprzednio wybranej płytki '{0}' na zainstalowanej platformie '{1}'. Wybierz ręcznie ponownie płytkęę, której chcesz użyć. Czy chcesz ją teraz ponownie wybrać?", - "disconnected": "Rozłączony", + "editBoardsConfig": "Edytuj płytkę i port...", "getBoardInfo": "Pobierz informacje o płytce", "inSketchbook": "(w Szkicowniku)", - "installNow": "Jądro \" 1{0} 2{1} \" musi zostać zainstalowane dla wybranej płytki \"{2}\". Czy chcesz zainstalować je teraz?", - "noFQBN": "FQBN jest niedostępny dla wybranej płytki \" 1{0} \". Sprawdź czy zainstalowane jądro jest prawidłowe.", - "noPortsDiscovered": "No ports discovered", - "noPortsSelected": "Nie wybrano portu dla płytki: '{0}'.", - "noneSelected": "Nie wybrano płytki.", + "installNow": "Jądro \"{0} {1}\" musi zostać zainstalowane dla wybranej płytki \"{2}\". Czy chcesz zainstalować je teraz?", + "noBoardsFound": "Brak Znalezionych Płytek \"{0}\"", + "noNativeSerialPort": "Native serial port, can't obtain info.", + "noPortsDiscovered": "Nie wykryto portów", + "nonSerialPort": "Non-serial port, can't obtain info.", "openBoardsConfig": "Wybierz inną płytkę i port...", - "platformMissing": "Platforma dla wybranej płytki '{0}' nie jest zainstalowana.", "pleasePickBoard": "Wybierz płytkę podłączoną do wybranego portu.", - "port": "Port 1{0}", - "portLabel": "Port: 1{0}", + "port": "Port{0}", + "ports": "Porty", "programmer": "Programator", + "reloadBoardData": "Reload Board Data", "reselectLater": "Wybierz ponownie później", - "searchBoard": "Search board", + "revertBoardsConfig": "Use '{0}' discovered on '{1}'", + "searchBoard": "Szukaj płytki", "selectBoard": "Wybierz płytkę", - "selectBoardForInfo": "Wybierz płytkę, aby uzyskać o niej informacje.", + "selectBoardToReload": "Please select a board first.", "selectPortForInfo": "Wybierz port, aby uzyskać informacje o płytce.", "showAllAvailablePorts": "Po włączeniu pokazuje wszystkie dostępne porty", + "showAllPorts": "Pokaż wszystkie dostępne porty", "succesfullyInstalledPlatform": "Pomyślnie zainstalowano platformę {0}:{1}", - "succesfullyUninstalledPlatform": "Pomyślnie odinstalowano platformę {0}:{1}" + "succesfullyUninstalledPlatform": "Pomyślnie odinstalowano platformę {0}:{1}", + "typeOfPorts": "{0} Porty", + "unconfirmedBoard": "Niepotwierdzona płytka", + "unknownBoard": "Nieznana płytka" }, "boardsManager": "Menedżer Płytek", "boardsType": { - "arduinoCertified": "Arduino Certified" + "arduinoCertified": "Certyfikat Arduino" }, "bootloader": { "burnBootloader": "Wypal Bootloader'a", @@ -44,12 +57,12 @@ "doneBurningBootloader": "Zakończono wypalanie Bootloader'a" }, "burnBootloader": { - "error": "Błąd w czasie wypalania bootloader'a: 1{0}" + "error": "Błąd w czasie wypalania bootloader'a: {0}" }, "certificate": { "addNew": "Dodaj nowy", "addURL": "Dodaj adres URL, aby pobrać certyfikat SSL", - "boardAtPort": "1{0} w 2{1}", + "boardAtPort": "{0} w {1}", "certificatesUploaded": "Certyfikaty przesłane.", "enterURL": "Wprowadź adres URL", "noSupportedBoardConnected": "Podpięto nie wspieraną płytkę.", @@ -64,27 +77,28 @@ "uploadingCertificates": "Przesyłanie certyfikatów." }, "checkForUpdates": { - "checkForUpdates": "Check for Arduino Updates", - "installAll": "Install All", - "noUpdates": "There are no recent updates available.", - "promptUpdateBoards": "Updates are available for some of your boards.", - "promptUpdateLibraries": "Updates are available for some of your libraries.", - "updatingBoards": "Updating boards...", - "updatingLibraries": "Updating libraries..." + "checkForUpdates": "Sprawdź uaktualnienia dla Arduino IDE.", + "installAll": "Zainstaluj wszystko", + "noUpdates": "Brak nowych aktualizacji do zainstalowania", + "promptUpdateBoards": "Dostępne nowe aktualizację dla płytek.", + "promptUpdateLibraries": "Dostępne aktualizacje dla bibliotek.", + "updatingBoards": "Aktualizuję płytki...", + "updatingLibraries": "Aktualizuję biblioteki..." }, "cli-error-parser": { "keyboardError": "Nie znaleziono klawiatury. Czy szkic posiada linię kodu: '#include <Keyboard.h>'?", "mouseError": "Nie znaleziono myszy. Czy szkic posiada linię kodu: '#include <Mouse.h>'?" }, "cloud": { - "account": "Konto", "chooseSketchVisibility": "Wybierz widoczność swojego Szkicu:", + "cloudSketchbook": "Szkic w Chmurze", "connected": "Połączony", "continue": "Kontynuuj", - "donePulling": "Zakończono zaciąganie ‘{0}’.", - "donePushing": "Gotowe pchanie ‘{0}’.\n ", + "donePulling": "Done pulling '{0}'.", + "donePushing": "Done pushing '{0}'.", "embed": "Osadzić:", "emptySketchbook": "Twój Szkicownik jest pusty", + "goToCloud": "Przejdź do Chmury", "learnMore": "Dowiedz się więcej", "link": "Odnośnik:", "notYetPulled": "Nie można wysłać do chmury. Nie jest jeszcze wyciągnięty.", @@ -102,10 +116,9 @@ "pushSketch": "Dodaj szkic", "pushSketchMsg": "To jest szkic publiczny. Przed wysłaniem upewnij się, że wszelkie poufne informacje są zdefiniowane w plikach arduino_secrets.h. Możesz ustawić szkic jako prywatny z panelu Udostępnij.", "remote": "Zdalny", - "remoteSketchbook": "Szkicownik zdalny", "share": "Udostępnij...", "shareSketch": "Udostępnij Szkic", - "showHideRemoveSketchbook": "Pokaż/Ukryj zdalny szkicownik", + "showHideSketchbook": "Pokaż/ukryj szkicownik w chmurze", "signIn": "ZALOGUJ SIĘ", "signInToCloud": "Zaloguj się do Arduino Cloud", "signOut": "Wyloguj się", @@ -113,47 +126,87 @@ "syncEditSketches": "Synchronizuj i edytuj swoje szkice w chmurze Arduino", "visitArduinoCloud": "Odwiedź chmurę Arduino, aby tworzyć szkice w chmurze." }, + "cloudSketch": { + "alreadyExists": "Cloud sketch '{0}' already exists.", + "creating": "Creating cloud sketch '{0}'...", + "new": "Nowy szkic w Chmurze", + "notFound": "Could not pull the cloud sketch '{0}'. It does not exist.", + "pulling": "Synchronizing sketchbook, pulling '{0}'...", + "pushing": "Synchronizing sketchbook, pushing '{0}'...", + "renaming": "Renaming cloud sketch from '{0}' to '{1}'...", + "synchronizingSketchbook": "Synchronizacja szkicownika ..." + }, "common": { - "all": "All", - "contributed": "Contributed", + "all": "Wszystko", + "contributed": "Przyczynił się", "installManually": "Zainstaluj ręcznie", "later": "Później", "noBoardSelected": "Nie wybrano płytki", + "noSketchOpened": "Nie otworzono żadnego szkicu", "notConnected": "[nie podłączone]", "offlineIndicator": "Wygląda na to, że jesteś w trybie offline. Bez połączenia z Internetem Arduino CLI może nie być w stanie pobrać wymaganych zasobów i może spowodować awarię. Połącz się z Internetem i uruchom ponownie aplikację.", "oldFormat": "'{0}' nadal używa starego formatu `.pde`. Czy chcesz się przełączyć na nowe rozszerzenie `.ino`?", "partner": "Partner", "processing": "Przetwarzanie", - "recommended": "Recommended", - "retired": "Retired", - "selectedOn": "na 1{0}", + "recommended": "Zalecane", + "retired": "Odosobniony", + "selectManually": "Wybór ręczny", + "selectedOn": "na {0}", "serialMonitor": "Monitor portu szeregowego", - "type": "Type", + "type": "Typ", "unknown": "Nieznany", - "updateable": "Updatable" + "updateable": "Możliwość aktualizacji", + "userAbort": "Anulowanie przez użytkownika" }, "compile": { "error": "Błąd kompilacji: {0}" }, "component": { - "boardsIncluded": "Boards included in this package:", + "boardsIncluded": "Płytka dołączona w pakiecie:", "by": "przez", + "clickToOpen": "Kliknij, aby otworzyć w przeglądarce: {0}", "filterSearch": "Filtruj przeszukiwanie....", - "install": "ZAINSTALUJ", + "install": "Zainstaluj", + "installLatest": "Zainstaluj najnowszą", + "installVersion": "Zainstaluj{0}", + "installed": "{0}Zainstalowano", "moreInfo": "Więcej informacji", + "otherVersions": "Pozostałe wersje", + "remove": "Usuń", + "title": "{0}do{1}", "uninstall": "Odinstaluj", "uninstallMsg": "Czy chcesz odinstalować {0}?", - "version": "Wersja {0}" + "update": "Aktualizacja" + }, + "configuration": { + "cli": { + "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" + } + }, + "connectionStatus": { + "connectionLost": "Connection lost. Cloud sketch actions and updates won't be available." }, "contributions": { "addFile": "Dodaj plik", "fileAdded": "Jeden plik dodany do szkicu.", + "plotter": { + "couldNotOpen": "Błąd otwarcia portu szeregowego" + }, "replaceTitle": "Zamień" }, + "core": { + "compilerWarnings": { + "all": "Wszytko", + "default": "Domyślne", + "more": "Więcej", + "none": "Żadne" + } + }, "coreContribution": { "copyError": "Kopiuj komunikat błędu", - "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." + "noBoardSelected": "Nie wybrano płytki. Proszę wybierz płytkę z Narzędzia > Lista płytek" }, + "createCloudCopy": "Wrzuć szkic do Chmury", "daemon": { "restart": "Restartuj Daemon", "start": "Start Daemon", @@ -162,8 +215,15 @@ "debug": { "debugWithMessage": "Debuguj - {0}", "debuggingNotSupported": "Debugowanie nie jest wspierane przez '{0}'", + "getDebugInfo": "Pobieranie informacji debugowania", "noPlatformInstalledFor": "Platforma nie jest zainstalowana dla '{0}'", - "optimizeForDebugging": "Optymalizuj pod kątem debugowania" + "optimizeForDebugging": "Optymalizuj pod kątem debugowania", + "sketchIsNotCompiled": "Sketch '{0}' must be verified before starting a debug session. Please verify the sketch and start debugging again. Do you want to verify the sketch now?" + }, + "developer": { + "clearBoardList": "Clear the Board List History", + "clearBoardsConfig": "Wyczyść wybraną płytę i port", + "dumpBoardList": "Dump the Board List" }, "dialog": { "dontAskAgain": "Nie pytaj ponownie" @@ -178,11 +238,7 @@ "increaseIndent": "Zwiększ wcięcie", "nextError": "Następny Błąd", "previousError": "Poprzedni Błąd", - "revealError": "Reveal Error" - }, - "electron": { - "couldNotSave": "Wszystkie niezapisane zmiany zostaną utracone.", - "unsavedChanges": "Wszystkie niezapisane zmiany zostaną utracone." + "revealError": "Pokaż Error" }, "examples": { "builtInExamples": "Wbudowane przykłady", @@ -201,7 +257,7 @@ "selectBoard": "Wybierz płytkę", "selectVersion": "Wybierz wersję firmware'u", "successfullyInstalled": "Firmware zainstalowany prawidłowo.", - "updater": "WiFi101 / WiFiNINA Firmware Updater" + "updater": "Aktualizacja firmware" }, "help": { "environment": "Środowisko", @@ -216,32 +272,39 @@ "visit": "Odwiedź Arduino.cc" }, "ide-updater": { - "checkForUpdates": "Check for Arduino IDE Updates", + "checkForUpdates": "Sprawdź uaktualnienia dla Arduino IDE.", "closeAndInstallButton": "Wyjdź i instaluj", "closeToInstallNotice": "Zamknij aplikacje i zainstaluj aktualizacje.", + "donateLinkIconTitle": "Otwórz stronę pomocy dla projektu", + "donateLinkText": "Wesprzyj nasz projekt", + "donateText": "Open source is love, {0}", "downloadButton": "Pobierz", "downloadingNotice": "Pobieranie najnowszej wersji Arduino IDE.", "errorCheckingForUpdates": "Błąd podczas sprawdzania aktualizacji Arduino IDE.\n{0}", "goToDownloadButton": "Przejdź do pobierania", "goToDownloadPage": "Nie mogliśmy pobrać i zainstalować automatycznie aktualizacji Arduino IDE. Proszę pobrać najnowszą wersję ze strony pobierania.", "ideUpdaterDialog": "Aktualizacja oprogramowania", - "newVersionAvailable": "Dostępna jest nowa wersja Arduino IDE( 1{0} ).", + "newVersionAvailable": "Dostępna jest nowa wersja Arduino IDE ({0}).", "noUpdatesAvailable": "Brak nowych aktualizacji dla Arduino IDE.", "notNowButton": "Nie traz", "skipVersionButton": "Pomiń tą wersję.", "updateAvailable": "Dostępna aktualizacja.", - "versionDownloaded": "Pobrano Arduino IDE 1{0}" + "versionDownloaded": "Pobrano Arduino IDE {0}" + }, + "installable": { + "libraryInstallFailed": "Failed to install library: '{0}{1}'.", + "platformInstallFailed": "Nie udało się zainstalować platformy:'{0}{1}'." }, "library": { "addZip": "Dodaj bibliotekę .ZIP...", "arduinoLibraries": "Biblioteki Arduino", "contributedLibraries": "Przesłane biblioteki", - "dependenciesForLibrary": "Zależności dla biblioteki {0}:{1}", "include": "Dołącz bibliotekę", "installAll": "Zainstaluj wszystko", + "installLibraryDependencies": "Zainstaluj zależności bibliotek", "installMissingDependencies": "Czy chcesz zainstalować wszystkie brakujące zależności?", "installOneMissingDependency": "Czy chcesz zainstalować brakującą zależność?", - "installOnly": "Zainstaluj tylko {0}", + "installWithoutDependencies": "Zainstaluj bez zależności", "installedSuccessfully": "Pomyślnie zainstalowano bibliotekę {0}:{1}", "libraryAlreadyExists": "Biblioteka już istnieje. Czy chcesz ją nadpisać?", "manageLibraries": "Zarządzaj bibliotekami...", @@ -255,22 +318,22 @@ "zipLibrary": "Biblioteka" }, "librarySearchProperty": { - "topic": "Topic" + "topic": "Temat" }, "libraryTopic": { - "communication": "Communication", - "dataProcessing": "Data Processing", - "dataStorage": "Data Storage", - "deviceControl": "Device Control", - "display": "Display", - "other": "Other", - "sensors": "Sensors", - "signalInputOutput": "Signal Input/Output", - "timing": "Timing", - "uncategorized": "Uncategorized" + "communication": "Komunikacja", + "dataProcessing": "Przetwarzanie danych", + "dataStorage": "Magazyn danych", + "deviceControl": "Kontrola urządzenia", + "display": "Wyświetlacz", + "other": "Inne", + "sensors": "Czujniki", + "signalInputOutput": "Sygnał Wejściowy/Wyjściowy", + "timing": "Wyczucie czasu", + "uncategorized": "Brak kategorii" }, "libraryType": { - "installed": "Installed" + "installed": "Zainstalowane" }, "menu": { "advanced": "Niewłaściwy schemat.", @@ -278,9 +341,23 @@ "tools": "Narzędzia" }, "monitor": { + "alreadyConnectedError": "Could not connect to {0} {1} port. Already connected.", + "baudRate": "1{0} baud", + "connectionFailedError": "Could not connect to {0} {1} port.", + "connectionFailedErrorWithDetails": "{0} Could not connect to {1} {2} port.", + "connectionTimeout": "Timeout. The IDE has not received the 'success' message from the monitor after successfully connecting to it", + "missingConfigurationError": "Could not connect to {0} {1} port. The monitor configuration is missing.", + "notConnectedError": "Not connected to {0} {1} port.", "unableToCloseWebSocket": "Nie można zamknąć gniazda sieciowego", "unableToConnectToWebSocket": "Nie można połączyć się z gniazdem sieciowym" }, + "newCloudSketch": { + "newSketchTitle": "Nazwa nowego szkicu w chmurze" + }, + "portProtocol": { + "network": "Sieć", + "serial": "Szaregowy" + }, "preferences": { "additionalManagerURLs": "Dodatkowe adresy URL do menadżera płytek", "auth.audience": "Społeczność OAuth2.", @@ -290,17 +367,18 @@ "automatic": "Automatyczne", "board.certificates": "Lista certyfikatów, które można przesłać do płytki", "browse": "Przeglądaj", - "checkForUpdate": "Receive notifications of available updates for the IDE, boards, and libraries. Requires an IDE restart after change. It's true by default.", + "checkForUpdate": "Otrzymano powiadomienie o dostępności nowych aktualizacji dla IDE, płytek i bibliotek. Wymaga ponownego uruchomienia IDE po zmianie. Domyślnie ustawione na tak", "choose": "Wybierz", "cli.daemonDebug": "Włącz rejestrowanie debugowania wywołań gRPC do interfejsu Arduino CLI. Aby to ustawienie zaczęło obowiązywać, konieczne jest ponowne uruchomienie środowiska IDE. Domyślnie jest to fałszywy.", "cloud.enabled": "Prawdziwy jeśli włączone są funkcje synchronizacji szkicu. Wartość domyślna to prawdziwy.", "cloud.pull.warn": "Prawdziwy, jeśli użytkownicy powinni zostać ostrzeżeni przed wyciągnięciem szkicu z chmury. Wartość domyślna to prawdziwy.", "cloud.push.warn": "Prawdziwy, jeśli użytkownicy powinni zostać ostrzeżeni przed wysłaniem szkicu do chmury. Wartość domyślna to prawdziwy.", "cloud.pushpublic.warn": "Prawdziwy, jeśli użytkownicy powinni zostać ostrzeżeni przed przesłaniem szkicu publicznego do chmury. Wartość domyślna to prawdziwy.", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", "cloud.sketchSyncEndpoint": "Punkt końcowy używany do wypychania i wyciągania szkiców z zaplecza. Domyślnie wskazuje na Arduino Cloud API.", "compile": "kompilacja", "compile.experimental": "Prawdziwy, jeśli IDE powinno obsługiwać wiele błędów kompilatora. Nieprawdziwy domyślnie", - "compile.revealRange": "Dostosowuje sposób ujawniania błędów kompilatora w edytorze po nieudanej weryfikacji/przesłaniu. Możliwe wartości: „auto”: Przewiń w pionie w razie potrzeby i odsłoń linię. 'środek': Przewiń w pionie w razie potrzeby i odsłoń linię wyśrodkowaną w pionie. „góra”: przewiń w pionie w razie potrzeby i odsłoń linię blisko górnej części widocznego obszaru, zoptymalizowaną pod kątem wyświetlania definicji kodu. 'centerIfOutsideViewport': Przewiń w pionie w razie potrzeby i odsłoń linię wyśrodkowaną w pionie tylko wtedy, gdy leży poza rzutnią. Domyślna wartość to '1{0}'.", + "compile.revealRange": "Dostosowuje sposób ujawniania błędów kompilatora w edytorze po nieudanej weryfikacji/przesłaniu. Możliwe wartości: „auto”: Przewiń w pionie w razie potrzeby i odsłoń linię. 'środek': Przewiń w pionie w razie potrzeby i odsłoń linię wyśrodkowaną w pionie. „góra”: przewiń w pionie w razie potrzeby i odsłoń linię blisko górnej części widocznego obszaru, zoptymalizowaną pod kątem wyświetlania definicji kodu. 'centerIfOutsideViewport': Przewiń w pionie w razie potrzeby i odsłoń linię wyśrodkowaną w pionie tylko wtedy, gdy leży poza rzutnią. Domyślna wartość to '{0}'.", "compile.verbose": "Prawda, aby pokazywać szczegółowe informacje podczas kompilacji. Fałsz jest wartością domyślną.", "compile.warnings": "Ustawia poziom ostrzeżeń w kompilatorze gcc. Domyślną wartością jest 'Brak'", "compilerWarnings": "Ostrzeżenia kompilatora", @@ -314,29 +392,50 @@ "invalid.editorFontSize": "Nieprawidłowy rozmiar czcionki edytora. Musi to być dodatnia liczba całkowita.", "invalid.sketchbook.location": "Błędna lokalizacja szkicownika: {0}", "invalid.theme": "Nieprawidłowy schemat.", + "language.asyncWorkers": "Liczba procesów roboczych asynchronicznych używanych przez serwer językowy Arduino (clangd). Indeks tła również wykorzystuje tę liczbę pracowników. Minimalna wartość to 0, a maksymalna to 8. Gdy wynosi 0, serwer językowy wykorzystuje wszystkie dostępne rdzenie. Wartość domyślna to 0.", "language.log": "Prawda, jeśli Arduino Language Server ma generować pliki z logami do folderu ze sketchem. W przeciwnym wypadku fałsz. Fałsz jest wartością domyślną.", "language.realTimeDiagnostics": "Jeśli prawdziwy, serwer języka zapewnia diagnostykę w czasie rzeczywistym podczas pisania w edytorze. Domyślnie jest nieprawdziwy.", "manualProxy": "Konfiguracja ręczna proxy", + "monitor": { + "dockPanel": "The area of the application shell where the _{0}_ widget will reside. It is either \"bottom\" or \"right\". It defaults to \"{1}\"." + }, "network": "Sieć", "newSketchbookLocation": "Wybierz nową lokalizację szkicownika", + "noCliConfig": "Nie można załadować konfiguracji CLI", "noProxy": "Bez proxy", + "proxySettings": { + "hostname": "Nazwa Hosta", + "password": "Hasło", + "port": "Numer Portu", + "username": "Nazwa Użytkownika" + }, "showVerbose": "Pokazuj informacje zwrotne podczas:", + "sketch": { + "inoBlueprint": "Bezwzględna ścieżka systemu plików do domyślnego pliku planu `.ino`. Jeśli określono, zawartość pliku planu będzie używana dla każdego nowego szkicu utworzonego przez IDE. Jeśli nie określono inaczej, szkice zostaną wygenerowane z domyślną zawartością Arduino. Niedostępne pliki planów są ignorowane. **Wymagane jest ponowne uruchomienie IDE**, aby to ustawienie zaczęło obowiązywać." + }, "sketchbook.location": "Lokalizacja szkicownika", "sketchbook.showAllFiles": "Prawda, aby wyświetlać wszystkie pliki ze szkicu. Fałsz jest wartością domyślną.", - "survey.notification": "Prawdziwy, jeśli użytkownicy powinni być powiadamiani o dostępności ankiety. Domyślnie prawdwdziwy.", "unofficialBoardSupport": "Kliknij, aby przejść do listy linków nieoficjalnego wsparcia dla płytek.", "upload": "przesyłanie", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", "upload.verbose": "Prawda, aby pokazywać szczegółowe informacje podczas wgrywania. Fałsz jest wartością domyślną.", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "Weryfikuj kod po przesłaniu", "window.autoScale": "Prawda, jeśli interfejs użytkownika skaluje się automatycznie z rozmiarem czcionki.", - "window.zoomLevel": "Dostosuj poziom powiększenia okna. Oryginalny rozmiar to 0, a każdy przyrost powyżej (np. 1) lub poniżej (np. -1) oznacza odpowiednio powiększenie lub pomniejszenie o 20%. Możesz również wprowadzić ułamki dziesiętne, aby dostosować poziom powiększenia z większą dokładnością." + "window.zoomLevel": { + "deprecationMessage": "Deprecated. Use 'window.zoomLevel' instead." + } + }, + "renameCloudSketch": { + "renameSketchTitle": "New name of the Cloud Sketch" }, "replaceMsg": "Czy zamienić istniejącą wersję {0}?", "selectZip": "Wybierz plik ZIP zawierający bibliotekę, którą chcesz dodać", "serial": { "autoscroll": "Autoscroll", "carriageReturn": "Powrót karetki", - "message": "Wiadomość({0} + Enter aby wysłać wiadomość do '{1}' on '{2}')", + "connecting": "Connecting to '{0}' on '{1}'...", + "message": "Message(Kliknij aby wysłać wiadomość do '{0}' od '{1}')", "newLine": "Nowa linia", "newLineCarriageReturn": "Nowa linia i powrót karetki", "noLineEndings": "Brak końca linii", @@ -347,25 +446,35 @@ }, "sketch": { "archiveSketch": "Archiwizuj szkic", - "cantOpen": "Folder \" 1{0} \" już istnieje. Nie można otworzyć szkicu.", - "close": "Jesteś pewien, że chcesz zamknąć szkic?", + "cantOpen": "Folder \"{0}\" już istnieje. Nie można otworzyć szkicu.", "compile": "Kompilowanie szkicu...", - "configureAndUpload": "Skonfiguruj u wgraj", - "createdArchive": "Stwórz archiwum ' 1{0} '.", + "configureAndUpload": "Skompiluj i wgraj", + "createdArchive": "Stwórz archiwum '{0}'.", "doneCompiling": "Kompilacja zakończona.", "doneUploading": "Przesyłanie zakończone.", + "editInvalidSketchFolderLocationQuestion": "Do you want to try saving the sketch to a different location?", + "editInvalidSketchFolderQuestion": "Do you want to try saving the sketch with a different name?", "exportBinary": "Eksportuj skompilowane binarnie", + "invalidCloudSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", + "invalidSketchFolderLocationDetails": "You cannot save a sketch into a folder inside itself.", + "invalidSketchFolderLocationMessage": "Invalid sketch folder location: '{0}'", + "invalidSketchFolderNameMessage": "Invalid sketch folder name: '{0}'", + "invalidSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", "moving": "Przenoszenie", "movingMsg": "Plik \"{0}\" musi znajdować się w folderze szkiców o nazwie \"{1}\".\nCzy utworzyć ten folder, przenieść podany plik i kontynuować?", - "new": "Nowy", + "new": "New Sketch", + "noTrailingPeriod": "A filename cannot end with a dot", "openFolder": "Otwórz folder", "openRecent": "Otwórz ostatnie", "openSketchInNewWindow": "Otwórz szkic w nowym oknie.", + "reservedFilename": "'{0}' is a reserved filename.", "saveFolderAs": "Zapisz folder szkicu jako...", "saveSketch": "Zapisz szkic, aby otworzyć go później.", "saveSketchAs": "Zapisz folder szkicu jako...", "showFolder": "Pokaż folder szkiców.", "sketch": "Szkic", + "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", + "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", "sketchbook": "Szkicownik", "titleLocalSketchbook": "Lokalny folder szkiców", "titleSketchbook": "Szkicownik", @@ -376,23 +485,55 @@ "verify": "Weryfikuj", "verifyOrCompile": "Weryfikuj/Kompiluj" }, - "survey": { - "answerSurvey": "Odpowiedz na ankietę", - "dismissSurvey": "Pomóż nam się rozwijać wypełniając tą super krótką ankietę. Cenimy naszą społeczność i chcielibyśmy lepiej poznać tych którzy nas wspierają.", - "surveyMessage": "Pomóż nam się rozwijać wypełniając tą super krótką ankietę. Cenimy naszą społeczność i chcielibyśmy lepiej poznać tych którzy nas wspierają." + "sketchbook": { + "newCloudSketch": "Nowy szkic w Chmurze", + "newSketch": "New Sketch" + }, + "theme": { + "currentThemeNotFound": "Could not find the currently selected theme: {0}. Arduino IDE has picked a built-in theme compatible with the missing one.", + "dark": "Dark", + "deprecated": "{0} (deprecated)", + "hc": "Dark High Contrast", + "hcLight": "Light High Contrast", + "light": "Light", + "user": "{0} (user)" + }, + "title": { + "cloud": "Chmura" + }, + "updateIndexes": { + "updateIndexes": "Aktualizuj indeksy", + "updateLibraryIndex": "Aktualizuj indeksy bibliotek", + "updatePackageIndex": "Aktualizuj indeksy pakietów" }, "upload": { "error": "{0} błąd: {1}" }, "userFields": { "cancel": "Anuluj", - "enterField": "Enter {0}", + "enterField": "Kliknij {0}", "upload": "Prześlij" + }, + "validateSketch": { + "abortFixMessage": "The sketch is still invalid. Do you want to fix the remaining problems? By clicking '{0}', a new sketch will open.", + "abortFixTitle": "Nieprawidłowy szkic", + "renameSketchFileMessage": "The sketch file '{0}' cannot be used. {1} Do you want to rename the sketch file now?", + "renameSketchFileTitle": "Invalid sketch filename", + "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", + "renameSketchFolderTitle": "Invalid sketch name" + }, + "versionWelcome": { + "cancelButton": "Może później", + "donateButton": "Wspomóż projekt teraz", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Witaj w nowej wersji Arduino IDE!", + "titleWithVersion": "Witaj w Arduino IDE1{0}!" + }, + "workspace": { + "alreadyExists": "'{0}' already exists." } }, - "cloud": { - "GoToCloud": "IDŹ DO CHMURY" - }, "theia": { "core": { "cannotConnectBackend": "Nie można połączyć się z backendem.", @@ -400,13 +541,9 @@ "couldNotSave": "Nie można zapisać szkicu. Skopiuj niezapisany szkic do edytora tekstu i zrestartuj IDE.", "daemonOffline": "CLI Daemon Offline", "offline": "Offline", + "offlineText": "Offline", "quitTitle": "Jesteś pewien, że chcesz wyjść?" }, - "debug": { - "start": "Uruchamianie...", - "startError": "Wystąpił błąd podczas uruchamiania sesji debugowania. Więcej szczegółów znajdziesz w dziennikach.", - "typeNotSupported": "Typ sesji debugowania\" 1{0} \" nie jest obsługiwany." - }, "editor": { "unsavedTitle": "Niezapisany – {0}" }, @@ -415,10 +552,10 @@ "expand": "Rozwiń" }, "workspace": { - "deleteCurrentSketch": "Chcesz usunąć aktualny szkic?", + "deleteCloudSketch": "The cloud sketch '{0}' will be permanently deleted from the Arduino servers and the local caches. This action is irreversible. Do you want to delete the current sketch?", + "deleteCurrentSketch": "The sketch '{0}' will be permanently deleted. This action is irreversible. Do you want to delete the current sketch?", "fileNewName": "Nazwa nowego pliku", "invalidExtension": ".{0} nie jest prawidłowym rozszerzeniem", - "invalidFilename": "Nieprawidłowa nazwa pliku.", "newFileName": "Nowa nazwa pliku" } } diff --git a/i18n/pt.json b/i18n/pt.json index ae6b1d45b..fd7570180 100644 --- a/i18n/pt.json +++ b/i18n/pt.json @@ -4,43 +4,56 @@ "detail": "Versão: {0}\nData: {1}{2}\nVersão do CLI : {3}{4} [{5}]\n\n{6}", "label": "Sobre {0}" }, + "account": { + "goToCloudEditor": "Ir para Editor em Nuvem", + "goToIoTCloud": "Ir para Nuvem IoT", + "goToProfile": "Ir para Perfil", + "menuTitle": "Nuvem Arduino" + }, "board": { "board": "Placa{0}", - "boardConfigDialogTitle": "Select Other Board and Port", + "boardConfigDialogTitle": "Selecionar Outra Placa e Porta", + "boardDataReloaded": "Board data reloaded.", "boardInfo": "Informações da Placa", + "boards": "placas", "configDialog1": "Selecione uma placa e uma porta se quiser fazer o upload de um sketch.", - "configDialog2": "Se você selecionar apenas uma Placa, você será capaz de compilar, mas não de carregar o seu sketch.", + "configDialog2": "Se você selecionar apenas uma Placa, você será capaz de compilar, mas não de enviar o seu esboço.", "couldNotFindPreviouslySelected": "Não foi possível encontrar a placa selecionada anteriormente '{0}' na plataforma instalada '{1}'. Por favor, selecione manualmente a placa que deseja usar. Você deseja selecioná-la novamente agora?", - "disconnected": "Desconectado", + "editBoardsConfig": "Editar Placa e Porta...", "getBoardInfo": "Obter Informações da Placa", "inSketchbook": "(no Sketchbook)", "installNow": "O núcleo \"{0} {1}\" deve ser instalado para a placa \"{2}\" atualmente selecionada. Quer instalar agora?", - "noFQBN": "O FQBN não está disponível para a placa selecionada \"{0}\". Você tem o núcleo correspondente instalado?", - "noPortsDiscovered": "No ports discovered", - "noPortsSelected": "Nenhuma porta selecionada para placa: '{0}'.", - "noneSelected": "Nenhuma placa selecionada.", + "noBoardsFound": "Nenhuma placa encontrada para \"{0}\"", + "noNativeSerialPort": "Porta serial nativa, não é possível obter informações.", + "noPortsDiscovered": "Nenhuma porta detectada", + "nonSerialPort": "Porta não-serial, não é possível obter informações.", "openBoardsConfig": "Selecione outra placa e porta...", - "platformMissing": "A plataforma para a placa '{0}' selecionada não está instalada.", "pleasePickBoard": "Escolha uma placa conectada à porta que você selecionou.", "port": "Porta{0}", - "portLabel": "Porta{0}", + "ports": "portas", "programmer": "Programador/Gravador", + "reloadBoardData": "Reload Board Data", "reselectLater": "Selecionar novamente mais tarde", - "searchBoard": "Search board", + "revertBoardsConfig": "Uso '{0}' descoberto em '{1}'", + "searchBoard": "Procurar placa", "selectBoard": "Selecionar Placa", - "selectBoardForInfo": "Selecione uma placa para obter informações sobre ela.", + "selectBoardToReload": "Please select a board first.", "selectPortForInfo": "Selecione uma porta para obter informações sobre a placa.", "showAllAvailablePorts": "Mostrar todas as portas disponíveis quando habilitado", + "showAllPorts": "Mostrar todas as portas", "succesfullyInstalledPlatform": "Plataforma instalada com sucesso {0}: {1}", - "succesfullyUninstalledPlatform": "Plataforma desinstalada com sucesso {0}: {1}" + "succesfullyUninstalledPlatform": "Plataforma desinstalada com sucesso {0}: {1}", + "typeOfPorts": "{0} portas", + "unconfirmedBoard": "Placa não confirmada", + "unknownBoard": "Placa desconhecida" }, "boardsManager": "Gerenciador de Placas", "boardsType": { - "arduinoCertified": "Arduino Certified" + "arduinoCertified": "Certificado pelo Arduino" }, "bootloader": { "burnBootloader": "Gravar bootloader", - "burningBootloader": "Burning bootloader...", + "burningBootloader": "Gravando carregador de inicialização...", "doneBurningBootloader": "Feita a gravação do bootloader." }, "burnBootloader": { @@ -64,48 +77,48 @@ "uploadingCertificates": "Enviando certificados." }, "checkForUpdates": { - "checkForUpdates": "Check for Arduino Updates", - "installAll": "Install All", - "noUpdates": "There are no recent updates available.", - "promptUpdateBoards": "Updates are available for some of your boards.", - "promptUpdateLibraries": "Updates are available for some of your libraries.", - "updatingBoards": "Updating boards...", - "updatingLibraries": "Updating libraries..." + "checkForUpdates": "Verificar se há Atualizações do Arduino", + "installAll": "Instalar todas", + "noUpdates": "Não há atualizações recentes disponíveis.", + "promptUpdateBoards": "Atualizações estão disponíveis para algumas de suas placas.", + "promptUpdateLibraries": "Atualizações estão disponíveis para algumas de suas bibliotecas.", + "updatingBoards": "Atualizando placas...", + "updatingLibraries": "Atualizando bibliotecas..." }, "cli-error-parser": { - "keyboardError": "'Keyboard' não encontrado. O seu sketch inclue a linha '#include <Keyboard.h>'?", - "mouseError": "\"Mouse\" não encontrado. O seu sketch inclue a linha '#include <Mouse.h>' ?" + "keyboardError": "'Keyboard' não encontrado. O seu esboço inclui a linha '#include <Keyboard.h>'?", + "mouseError": "\"Mouse\" não encontrado. O seu esboço inclui a linha '#include <Mouse.h>' ?" }, "cloud": { - "account": "Conta", - "chooseSketchVisibility": "Escolha a visibilidade do seu Sketch:", + "chooseSketchVisibility": "Escolha a visibilidade do seu Esboço:", + "cloudSketchbook": "Caderno de Esboços na Nuvem", "connected": "Conectado", "continue": "Continuar", - "donePulling": "Terminou de baixar '{0}'.", - "donePushing": "Concluído o envio de ‘{0}’.", + "donePulling": "'{0}' terminou de baixar.", + "donePushing": "'{0}' foi enviado.", "embed": "Embutir:", - "emptySketchbook": "O seu Sketchbook está vazio", + "emptySketchbook": "O seu Caderno de Esboços está vazio", + "goToCloud": "Ir para Nuvem", "learnMore": "Saiba mais", "link": "Endereço", "notYetPulled": "Não é possível enviar para a nuvem. Ainda não foi baixado.", "offline": "Desconectado", "openInCloudEditor": "Abrir no Cloud Editor", "options": "Opções...", - "privateVisibility": "Privado. Só você poderá ver o Sketch.", + "privateVisibility": "Particular. Apenas você poderá ver o Esboço.", "profilePicture": "Foto do perfil", - "publicVisibility": "Público. Qualquer pessoa com o link poderá visualizar o Sketch.", + "publicVisibility": "Público. Qualquer pessoa com o link poderá ver o Esboço.", "pull": "Baixar", "pullFirst": "Você precisa baixar primeiro para poder enviar para a nuvem.", - "pullSketch": "Baixar Sketch", - "pullSketchMsg": "Baixar este Sketch da nuvem irá sobrescrever sua versão local. Você tem certeza que deseja continuar?", + "pullSketch": "Baixar Esboço", + "pullSketchMsg": "Baixar esse Esboço da Nuvem irá sobrescrever a sua versão local. Você tem certeza que deseja continuar?", "push": "Enviar", - "pushSketch": "Enviar Sketch", - "pushSketchMsg": "Este é um Sketch Público. Antes de enviar, verifique qualquer informação sensível que esteja denifinda nos arquivos arduino_secrets.h. Você pode tornar um Sketch privado a partir do painel Compartilhar.", + "pushSketch": "Enviar Esboço", + "pushSketchMsg": "Esse é um Esboço Público. Antes de enviá-lo, tenha certeza que qualquer informação sensível esteja definida nos arquivos arduino_secrets.h. Você pode tornar um Esboço particular no painel Compartilhar.", "remote": "Remoto", - "remoteSketchbook": "Sketchbook remoto", "share": "Compartilhar...", - "shareSketch": "Compartilhar Sketch", - "showHideRemoveSketchbook": "Exibir/Ocultar Sketchbook remoto", + "shareSketch": "Compartilhar Esboço", + "showHideSketchbook": "Mostrar/Esconder Caderno de esboços na Nuvem", "signIn": "ENTRAR", "signInToCloud": "Faça login no Arduino Cloud", "signOut": "Sair", @@ -113,47 +126,87 @@ "syncEditSketches": "Sincronizar e editar seus Sketches no Arduino Cloud", "visitArduinoCloud": "Visite Arduino Cloud para criar Cloud Sketches." }, + "cloudSketch": { + "alreadyExists": "Esboço na nuvem '{0}' já existe.", + "creating": "Criando esboço na nuvem '{0}'...", + "new": "Novo Esboço na Nuvem", + "notFound": "Não foi possível baixar o esboço na nuvem '{0}'. Esboço inexistente.", + "pulling": "Sincronizando cadernos de esboços, baixando '{0}'...", + "pushing": "Sincronizando cadernos de esboço, enviando '{0}'.", + "renaming": "Renomeando esboço na nuvem de '{0}' para '{1}'...", + "synchronizingSketchbook": "Sincronizando cadernos de esboço..." + }, "common": { - "all": "All", - "contributed": "Contributed", + "all": "Todos", + "contributed": "Contribuído", "installManually": "Instalar Manualmente", "later": "Depois", "noBoardSelected": "Nenhuma placa selecionada.", + "noSketchOpened": "Nenhum sketch aberto", "notConnected": "[não está conectado]", "offlineIndicator": "Parece que você está offline. Sem conexão com a Internet, o Arduino CLI não será capaz de baixar os recursos exigidos e poderá provovar mau funcionamento. Por favor, conecte-se à Internet e reinicie o aplicativo.", "oldFormat": "O '{0}' ainda utiliza o formato antigo `.pde`. Deseja mudar para a nova extensão `.ino`?", - "partner": "Partner", + "partner": "Parceiro", "processing": "Em processamento", - "recommended": "Recommended", - "retired": "Retired", + "recommended": "Recomendado", + "retired": "Afastado", + "selectManually": "Selecionar Manualmente", "selectedOn": "em {0}", "serialMonitor": "Monitor Serial", - "type": "Type", + "type": "Tipo", "unknown": "Desconhecido", - "updateable": "Updatable" + "updateable": "Atualizável", + "userAbort": "Abortado pelo usuário" }, "compile": { "error": "Erro de compilação: {0}" }, "component": { - "boardsIncluded": "Boards included in this package:", + "boardsIncluded": "Placas incluídas nesse pacote:", "by": "por", + "clickToOpen": "Aperte para abrir no navegador: {0}", "filterSearch": "Filtrar a sua pesquisa…", "install": "Instalar", + "installLatest": "Instalar mais recente", + "installVersion": "Instalar {0}", + "installed": "{0} instalado", "moreInfo": "Mais informações", + "otherVersions": "Outras Versões", + "remove": "Remover", + "title": "{0} por {1}", "uninstall": "Desinstalar", "uninstallMsg": "Deseja desinstalar {0}?", - "version": "Versão {0}" + "update": "Atualizar" + }, + "configuration": { + "cli": { + "inaccessibleDirectory": "Não foi possível acessar a localização do caderno de esboço em '{0}': {1}" + } + }, + "connectionStatus": { + "connectionLost": "Conexão perdida. Atualizações e Ações de Esboço na Nuvem não estarão disponíveis." }, "contributions": { "addFile": "Adicionar Arquivo", "fileAdded": "Um arquivo adicionado ao sketch.", + "plotter": { + "couldNotOpen": "Não foi possível abrir o planejador serial" + }, "replaceTitle": "Substituir" }, + "core": { + "compilerWarnings": { + "all": "Todos", + "default": "Padrão", + "more": "Mais", + "none": "Nenhum" + } + }, "coreContribution": { "copyError": "Mensagem de erro Copiar", - "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." + "noBoardSelected": "Nenhuma placa selecionada. Por favor, selecione a sua placa Arduino do menu Ferramentas -> Placas." }, + "createCloudCopy": "Enviar Esboço para Nuvem", "daemon": { "restart": "Reiniciar Daemon", "start": "Iniciar Daemon", @@ -162,8 +215,15 @@ "debug": { "debugWithMessage": "Depuração - {0}", "debuggingNotSupported": "A depuração não é suportada por '{0}'", + "getDebugInfo": "Obtendo informações de depuração...", "noPlatformInstalledFor": "A plataforma não está instalada para '{0}'", - "optimizeForDebugging": "Otimizar para Depuração" + "optimizeForDebugging": "Otimizar para Depuração", + "sketchIsNotCompiled": "O Esboço '{0}' deve ser verificado antes de iniciar uma sessão de depuramento. Por favor, verifique o esboço e comece a depurar novamente. Você quer verificar o esboço agora?" + }, + "developer": { + "clearBoardList": "Limpar Histórico de Lista de Placas", + "clearBoardsConfig": "Limpar Seleção de Placa e Porta", + "dumpBoardList": "Despejo da Lista de Placas" }, "dialog": { "dontAskAgain": "Não perguntar novamente" @@ -178,11 +238,7 @@ "increaseIndent": "Aumentar Recuo", "nextError": "Próximo Erro", "previousError": "Erro Anterior", - "revealError": "Reveal Error" - }, - "electron": { - "couldNotSave": "Não foi possível salvar o sketch. Por favor, copie seu trabalho não salvo para o seu editor de texto favorito e reinicie a IDE.", - "unsavedChanges": "Quaisquer alterações não salvas não serão salvas." + "revealError": "Mostrar Erro" }, "examples": { "builtInExamples": "Exemplos Integrados", @@ -201,7 +257,7 @@ "selectBoard": "Selecionar Placa", "selectVersion": "Selecione a versão do firmware", "successfullyInstalled": "Firmware instalado com sucesso. ", - "updater": "Atualizador de Firmware WiFi101 / WiFiNINA" + "updater": "Atualizador de Firmware" }, "help": { "environment": "Ambiente", @@ -216,9 +272,12 @@ "visit": "Visitar Arduino.cc" }, "ide-updater": { - "checkForUpdates": "Check for Arduino IDE Updates", + "checkForUpdates": "Checar atualizações da Arduino IDE", "closeAndInstallButton": "Fechar e instalar ", "closeToInstallNotice": "Feche o software e instale a atualização em sua máquina. ", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", "downloadButton": "Baixar", "downloadingNotice": "Baixando a versão mais recente do IDE do Arduino.", "errorCheckingForUpdates": "Erro ao verificar as atualizações do IDE do Arduino. {0}", @@ -232,16 +291,20 @@ "updateAvailable": "Atualização Disponível", "versionDownloaded": "O Arduino IDE {0} foi baixado. " }, + "installable": { + "libraryInstallFailed": "A instalação da biblioteca '{0}{1}' falhou. ", + "platformInstallFailed": "A instalação da plataforma '{0}{1}' falhou." + }, "library": { "addZip": "Adicionar biblioteca .ZIP...", "arduinoLibraries": "Bibliotecas Arduino", "contributedLibraries": "Bibliotecas contribuídas", - "dependenciesForLibrary": "Dependências da biblioteca {0}: {1}", "include": "Incluir Biblioteca", - "installAll": "Instalar tudo", + "installAll": "Instalar todas", + "installLibraryDependencies": "Instalar dependências da biblioteca", "installMissingDependencies": "Deseja instalar todas as dependências ausentes?", "installOneMissingDependency": "Deseja instalar a dependência ausente?", - "installOnly": "Instalar apenas {0} ", + "installWithoutDependencies": "Instalar sem dependências", "installedSuccessfully": "Biblioteca instalada com sucesso {0}: {1}", "libraryAlreadyExists": "Essa biblioteca já existe. Você deseja sobrescreve-la?", "manageLibraries": "Gerenciar bibliotecas...", @@ -255,22 +318,22 @@ "zipLibrary": "Biblioteca" }, "librarySearchProperty": { - "topic": "Topic" + "topic": "Tópico" }, "libraryTopic": { - "communication": "Communication", - "dataProcessing": "Data Processing", - "dataStorage": "Data Storage", - "deviceControl": "Device Control", - "display": "Display", - "other": "Other", - "sensors": "Sensors", - "signalInputOutput": "Signal Input/Output", - "timing": "Timing", - "uncategorized": "Uncategorized" + "communication": "Comunicação", + "dataProcessing": "Processamento de Dados", + "dataStorage": "Armazenamento de Dados", + "deviceControl": "Controle do Dispositivo", + "display": "Mostrar", + "other": "Outros", + "sensors": "Sensores", + "signalInputOutput": "Sinal de Entrada/Saída", + "timing": "Temporização", + "uncategorized": "Sem categoria" }, "libraryType": { - "installed": "Installed" + "installed": "Instalados" }, "menu": { "advanced": "Avançado", @@ -278,9 +341,23 @@ "tools": "Ferramentas" }, "monitor": { + "alreadyConnectedError": "Não foi possível se conectar à porta {0} {1}. Já conectado.", + "baudRate": "{0} baud", + "connectionFailedError": "Não foi possível se conectar à porta {0} {1}.", + "connectionFailedErrorWithDetails": "{0} Não foi possível se conectar à porta {1} {2}.", + "connectionTimeout": "Tempo esgotado. A IDE não recebeu a mensagem de 'sucesso' do monitor após estabelecer uma conexão com sucesso", + "missingConfigurationError": "Não foi possível se conectar à porta {0} {1}. As configurações do monitor estão faltando. ", + "notConnectedError": "Não conectado à porta {0} {1}.", "unableToCloseWebSocket": "Impossível fechar websocket", "unableToConnectToWebSocket": "Impossível conectar ao websocket" }, + "newCloudSketch": { + "newSketchTitle": "Nome do novo Esboço na Nuvem" + }, + "portProtocol": { + "network": "Rede", + "serial": "Serial" + }, "preferences": { "additionalManagerURLs": "URLs do Gerenciador de Placas Adicionais", "auth.audience": "O OAuth2 publico.", @@ -290,52 +367,74 @@ "automatic": "Automático", "board.certificates": "Lista de certificados que podem ser carregados nas placas", "browse": "Procurar", - "checkForUpdate": "Receive notifications of available updates for the IDE, boards, and libraries. Requires an IDE restart after change. It's true by default.", + "checkForUpdate": "Receba notificações de atualizações disponíveis para a IDE, placas, e bibliotecas. Requer que a IDE seja reinicializada depois de mudanças. Verdadeiro por padrão.", "choose": "Escolher", "cli.daemonDebug": "Habilite o log de depuração das chamadas gRPC para a CLI do Arduino. Uma reinicialização do IDE é necessária para que essa configuração tenha efeito. É falso por padrão.", - "cloud.enabled": "Verdadeiro se as funções de sincronização de sketch estiverem ativadas. O padrão é verdadeiro.", - "cloud.pull.warn": "Verdadeiro se os usuários devem ser avisados antes de baixar um sketch da nuvem. O padrão é verdadeiro.", - "cloud.push.warn": "Verdadeiro se os usuários devem ser avisados antes de enviar um sketch para a nuvem. O padrão é verdadeiro.", - "cloud.pushpublic.warn": "Verdadeiro se os usuários devem ser avisados antes de enviar um sketch público para a nuvem. O padrão é verdadeiro.", - "cloud.sketchSyncEndpoint": "O endpoint usado para enviar e baixar os sketches de um backend. Por padrão, ele aponta para a Arduino Cloud API.", + "cloud.enabled": "Verdadeiro se as funções de sincronização de Esboço estiverem habilitadas. O padrão é verdadeiro.", + "cloud.pull.warn": "Verdadeiro se os usuários devem ser avisados antes de baixar um esboço da nuvem. O padrão é verdadeiro.", + "cloud.push.warn": "Verdadeiro se os usuários devem ser avisados antes de enviar um esboço para a nuvem. O padrão é verdadeiro.", + "cloud.pushpublic.warn": "Verdadeiro se os usuários devem ser avisados antes de enviar um esboço público para a nuvem. O padrão é verdadeiro.", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", + "cloud.sketchSyncEndpoint": "O endpoint usado para enviar e baixar os esboços de um backend. Por padrão, ele aponta para a API da Nuvem Arduino.", "compile": "compilar", "compile.experimental": "Verdadeiro se o IDE deve trabalhar com múltiplos erros de compilação. Falso por padrão", - "compile.revealRange": "Ajusta como os erros do compilador são revelados no editor após uma falha na verificação/upload. Valores possíveis: 'auto': Role verticalmente conforme necessário e revele uma linha. 'center': Role verticalmente conforme necessário e revele uma linha centralizada verticalmente. 'top': Role verticalmente conforme necessário e revele uma linha próxima ao topo da janela de visualização, otimizada para visualizar uma definição de código. 'centerIfOutsideViewport': Role verticalmente conforme necessário e revele uma linha centralizada verticalmente somente se estiver fora da viewport. O valor padrão é ' {0}'.", + "compile.revealRange": "Ajusta como os erros do compilador são revelados no editor após uma falha na verificação/upload. Valores possíveis: 'auto': Role verticalmente conforme necessário e revele uma linha. 'center': Role verticalmente conforme necessário e revele uma linha centralizada verticalmente. 'top': Role verticalmente conforme necessário e revele uma linha próxima ao topo da janela de visualização, otimizada para visualizar uma definição de código. 'centerIfOutsideViewport': Role verticalmente conforme necessário e revele uma linha centralizada verticalmente somente se estiver fora da viewport. O valor padrão é '{0}'.", "compile.verbose": "Verdadeiro para saída de compilação detalhada. Falso é padrão", "compile.warnings": "Diz ao gcc qual nível de aviso usar. 'Nenhum' é padrão", "compilerWarnings": "Avisos do compilador", "editorFontSize": "Tamanho da fonte do editor", "editorQuickSuggestions": "Dicas do editor", "enterAdditionalURLs": "Insira URLs adicionais, uma por linha", - "files.inside.sketches": "Mostrar arquivos dentro dos Sketches", + "files.inside.sketches": "Mostrar arquivos dentro dos Esboços", "ide.updateBaseUrl": "A URL base de onde baixar atualizações. Padrão para 'https://downloads.arduino.cc/arduino-ide'", "ide.updateChannel": "Canal de lançamento para se atualizar. 'stable' é o lançamento estável, 'nightly' é o último build de desenvolvimento.", "interfaceScale": "Dimensões da interface", "invalid.editorFontSize": "Tamanho da fonte do editor inválido. Deve ser um número inteiro positivo.", - "invalid.sketchbook.location": "Localização inválida para o sketchbook: {0}", + "invalid.sketchbook.location": "Localização inválida para o caderno de esboços: {0}", "invalid.theme": "Tema inválido", - "language.log": "Verdadeiro se o Arduino Language Server deverá gerar arquivos de log na pasta do sketch. Caso contrário, falso. Falso é padrão.", + "language.asyncWorkers": "Número de trabalhadores assíncronos usados ​​pelo Arduino Language Server (clangd). O índice de segundo plano também usa esse número de trabalhadores. O valor mínimo é 0 e o máximo é 8. Quando for 0, o servidor de idioma usa todos os núcleos disponíveis. O valor padrão é 0.", + "language.log": "Verdadeiro se o Arduino Language Server deverá gerar arquivos de log na pasta do esboço. Caso contrário, falso. O padrão é falso.", "language.realTimeDiagnostics": "Se marcado, diagnósticos em tempo-real serão exibidos enquanto digita no editor. Fica desmarcado por padrão.", "manualProxy": "Configurações manuais de proxy", + "monitor": { + "dockPanel": "A área do shell da aplicação onde a ferramenta _{0}_ irá residir. Pode ser \"bottom\", a parte inferior, ou \"right\", a direita. Por padrão é \"{1}\"." + }, "network": "Rede", - "newSketchbookLocation": "Escolher", + "newSketchbookLocation": "Escolher nova localização para o Caderno de Esboços", + "noCliConfig": "Não foi possível carregar a configuração CLI", "noProxy": "Sem proxy", + "proxySettings": { + "hostname": "Nome do Hospedeiro", + "password": "Senha", + "port": "número da Porta", + "username": "Nome de usuário" + }, "showVerbose": "Mostrar a saída detalhada durante", - "sketchbook.location": "Localização dos Sketchbooks", - "sketchbook.showAllFiles": "Verdadeiro para mostrar todos os arquivos de sketch dentro do sketch. Falso é padrão.", - "survey.notification": "Verdadeiro se o usuário deve ser notificado se uma pesquisa estiver disponível. Verdadeiro por padrão", + "sketch": { + "inoBlueprint": "Caminho absoluto do sistema de arquivos para o arquivo de projeto `.ino`. Se especificado, o conteúdo do arquivo de projeto vai ser usado a cada esboço novo criado pela IDE. Se não especificado, os esboços vão ser gerados com o conteúdo padrão do Arduino. Arquivos de projeto inacessíveis são ignorados. **Uma reinicialização da IDE é necessária** para que essa configuração entre em efeito." + }, + "sketchbook.location": "Localização do Caderno de Esboços", + "sketchbook.showAllFiles": "Verdadeiro para mostrar todos os arquivos de esboço dentro do esboço. O padrão é falso.", "unofficialBoardSupport": "Clique para obter uma lista de URLs de placas não oficiais suportadas", "upload": "enviar", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", "upload.verbose": "Verdadeiro para saída de upload detalhada. Falsa é padrão.", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "Verificar o código após enviar", "window.autoScale": "Verdadeiro se a interface do usuário for dimensionada automaticamente com o tamanho da fonte.", - "window.zoomLevel": "Ajuste o nível de zoom da janela. O tamanho original é 0 e cada incremento acima (por exemplo, 1) ou abaixo (por exemplo, -1) representa um zoom 20% maior ou menor. Você também pode inserir decimais para ajustar o nível de zoom para uma maior precisão." + "window.zoomLevel": { + "deprecationMessage": "Descontinuada. Use 'window.zoomLevel' ao invés disso." + } + }, + "renameCloudSketch": { + "renameSketchTitle": "Novo nome para o Esboço na Nuvem" }, "replaceMsg": "Substituir a versão existente de {0}?", "selectZip": "Selecione um arquivo zip contendo a biblioteca que deseja adicionar", "serial": { "autoscroll": "Avanço automático de linha", "carriageReturn": "Retorno de linha", + "connecting": "Conectando a '{0}' em '{1}'...", "message": "Mensagem ({0} + Enter para enviar mensagem para '{1}' em '{2}'", "newLine": "Nova linha", "newLineCarriageReturn": "Nova linha e retorno de linha", @@ -346,53 +445,95 @@ "toggleTimestamp": "Mudar Data e Hora" }, "sketch": { - "archiveSketch": "Arquivar Sketch", - "cantOpen": "Directoria chamada \"{0}\" já existe. Não é possível abrir o rascunho.", - "close": "Tem certeza que deseja fechar o sketch?", - "compile": "Compiling sketch...", - "configureAndUpload": "Configurar e Fazer Envio", + "archiveSketch": "Arquivar Esboço", + "cantOpen": "Um diretório chamado de \"{0}\" já existe. Não é possível abrir o esboço.", + "compile": "Compilando esboço...", + "configureAndUpload": "Configurar e fazer Envio", "createdArchive": "Arquivo criado '{0}'.", "doneCompiling": "Compilação concluída.", "doneUploading": "Envio concluído.", + "editInvalidSketchFolderLocationQuestion": "Você quer tentar salvar o esboço para um local diferente?", + "editInvalidSketchFolderQuestion": "Você quer tentar salvar o esboço com um nome diferente?", "exportBinary": "Exportar Binário Compilado", + "invalidCloudSketchName": "O nome deve começar com uma letra, número, ou underline, seguido por letras, números, hífens, pontos ou underlines. O tamanho máximo é 36 caracteres. ", + "invalidSketchFolderLocationDetails": "Você não pode salvar um esboço em um diretório dentro de si mesmo.", + "invalidSketchFolderLocationMessage": "Localização de diretório de esboço inválida: '{0}'", + "invalidSketchFolderNameMessage": "Nome de diretório de esboço inválido: '{0}'", + "invalidSketchName": "O nome deve começar com uma letra, número, ou underline, seguido por letras, números, hífens, pontos ou underlines. O tamanho máximo é 63 caracteres. ", "moving": "Movendo", "movingMsg": "O ficheiro \"{0}\" tem que estar dentro de uma pasta de esboços chamada \"{1}\".\nCriar esta pasta, mover o ficheiro e continuar?", - "new": "Novo", + "new": "Novo Esboço", + "noTrailingPeriod": "Um nome de arquivo não pode terminar com um ponto.", "openFolder": "Abrir Pasta", "openRecent": "Abrir Recente", - "openSketchInNewWindow": "Abrir sketch em uma nova janela", - "saveFolderAs": "Salvar a pasta de sketch como...", - "saveSketch": "Salve seu sketch para abrí-lo novamente mais tarde", - "saveSketchAs": "Salvar a pasta de sketch como...", - "showFolder": "Mostrar a pasta de Sketches", - "sketch": "Sketch", - "sketchbook": "Sketchbook", - "titleLocalSketchbook": "Sketchbook Local", - "titleSketchbook": "Sketchbook", + "openSketchInNewWindow": "Abrir Esboço em uma Nova Janela", + "reservedFilename": "'{0}' é um nome de arquivo reservado.", + "saveFolderAs": "Salvar diretório de esboço como...", + "saveSketch": "Salve o seu esboço para abrí-lo novamente mais tarde.", + "saveSketchAs": "Salvar o diretório de esboços como...", + "showFolder": "Mostrar o diretório de Esboços...", + "sketch": "Esboço", + "sketchAlreadyContainsThisFileError": "O sketch já possui um arquivo nomeado '{0}'", + "sketchAlreadyContainsThisFileMessage": "Falha ao salvar sketch \"{0}\" como \"{1}\". {2}", + "sketchbook": "Caderno de Esboços", + "titleLocalSketchbook": "Caderno de Esboços local", + "titleSketchbook": "Caderno de Esboços", "upload": "Enviar usando Programador", "uploadUsingProgrammer": "Enviar Usando Programador", - "uploading": "Uploading...", + "uploading": "Enviando...", "userFieldsNotFoundError": "Não é possível encontrar dados de usuário para placa conectada", "verify": "Verificar", "verifyOrCompile": "Verificar/Compilar" }, - "survey": { - "answerSurvey": "Responder a pesquisa", - "dismissSurvey": "Não mostrar novamente", - "surveyMessage": "Por favor, ajude-nos a melhorar respondendo essa pequena pesquisa. Nós valorizamos nossa comunidade e gostaríamos de conhecer nossos colaboradores um pouco melhor." + "sketchbook": { + "newCloudSketch": "Novo Esboço na Nuvem", + "newSketch": "Novo Esboço" + }, + "theme": { + "currentThemeNotFound": "Não foi possível encontrar o tema selecionado atualmente: {0}. A IDE Arduino escolheu um tema embutido compatível com o que está faltando. ", + "dark": "Escuro", + "deprecated": "{0} (descontinuado)", + "hc": "Escuro Alto Contraste", + "hcLight": "Claro Alto Contraste", + "light": "Claro", + "user": "{0} (usuário)" + }, + "title": { + "cloud": "Nuvem" + }, + "updateIndexes": { + "updateIndexes": "Atualizar Índices", + "updateLibraryIndex": "Atualizar Índice de Biblioteca", + "updatePackageIndex": "Atualizar Índice de Pacote" }, "upload": { "error": "{0} erro: {1}" }, "userFields": { "cancel": "Cancelar", - "enterField": "Enter {0}", + "enterField": "Insira {0}", "upload": "Carregar" + }, + "validateSketch": { + "abortFixMessage": "O esboço ainda é inválido. Você quer consertar os problemas restantes? Ao apertar '{0}', um novo esboço irá abrir.", + "abortFixTitle": "Esboço inválido", + "renameSketchFileMessage": "O arquivo de esboço '{0}' não pode ser usado. {1} Você quer renomear o nome do arquivo de esboço agora?", + "renameSketchFileTitle": "Nome de arquivo de esboço inválido.", + "renameSketchFolderMessage": "O esboço '{0}' não pode ser usado. {1} Para se livrar dessa mensagem, renomeie o esboço. Você quer renomear o esboço agora?", + "renameSketchFolderTitle": "Nome de esboço inválido." + }, + "versionWelcome": { + "cancelButton": "Maybe later", + "donateButton": "Donate now", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Welcome to a new version of the Arduino IDE!", + "titleWithVersion": "Welcome to the new Arduino IDE {0}!" + }, + "workspace": { + "alreadyExists": "'{0}' já existe." } }, - "cloud": { - "GoToCloud": "IR PARA A NUVEM" - }, "theia": { "core": { "cannotConnectBackend": "Não é possível conectar-se ao backend.", @@ -400,25 +541,21 @@ "couldNotSave": "Não foi possível salvar o sketch. Copie seu trabalho não salvo em seu editor de texto favorito e reinicie a IDE.", "daemonOffline": "CLI Daemon Offline", "offline": "Offline", + "offlineText": "Desconectado", "quitTitle": "Você tem certeza que quer sair?" }, - "debug": { - "start": "Iniciar...", - "startError": "Ocorreu um erro ao iniciar a sessão de depuração, verifique os logs para obter mais detalhes.", - "typeNotSupported": "O tipo de sessão de depuração \"{0}\" não é suportado." - }, "editor": { - "unsavedTitle": "Não salvo – \"1{0}\"" + "unsavedTitle": "Sem Nome – {0}" }, "messages": { "collapse": "Recolher", "expand": "Expandir" }, "workspace": { - "deleteCurrentSketch": "Você deseja excluir o sketch atual?", + "deleteCloudSketch": "O Esboço na Nuvem '{0}' vai ser permanentemente deletado dos servidores Arduino e das memórias locais. Essa ação é irreversível. Você quer deletar o esboço atual?", + "deleteCurrentSketch": "O Esboço '{0}' vai ser permanentemente deletado. Essa ação é irreversível. Você quer deletar o esboço atual?", "fileNewName": "Nome para o novo arquivo", "invalidExtension": "\".{0}\" não é uma extensão válida.", - "invalidFilename": "Nome de arquivo inválido.", "newFileName": "Novo nome para o arquivo" } } diff --git a/i18n/ro.json b/i18n/ro.json index adbb37415..97950f0de 100644 --- a/i18n/ro.json +++ b/i18n/ro.json @@ -1,38 +1,51 @@ { "arduino": { "about": { - "detail": "Versiunea: {0}\nData: {1}{2}\nVersiunea CLI : {3}{4} [{5}]\n\n{6}", + "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "Despre {0}" }, + "account": { + "goToCloudEditor": "Go to Cloud Editor", + "goToIoTCloud": "Go to IoT Cloud", + "goToProfile": "Go to Profile", + "menuTitle": "Arduino Cloud" + }, "board": { "board": "Board{0}", "boardConfigDialogTitle": "Select Other Board and Port", + "boardDataReloaded": "Board data reloaded.", "boardInfo": "Board Info", + "boards": "boards", "configDialog1": "Select both a Board and a Port if you want to upload a sketch.", "configDialog2": "If you only select a Board you will be able to compile, but not to upload your sketch.", "couldNotFindPreviouslySelected": "Could not find previously selected board '{0}' in installed platform '{1}'. Please manually reselect the board you want to use. Do you want to reselect it now?", - "disconnected": "Disconnected", + "editBoardsConfig": "Edit Board and Port...", "getBoardInfo": "Get Board Info", "inSketchbook": " (in Sketchbook)", "installNow": "The \"{0} {1}\" core has to be installed for the currently selected \"{2}\" board. Do you want to install it now?", - "noFQBN": "The FQBN is not available for the selected board \"{0}\". Do you have the corresponding core installed?", + "noBoardsFound": "No boards found for \"{0}\"", + "noNativeSerialPort": "Native serial port, can't obtain info.", "noPortsDiscovered": "No ports discovered", - "noPortsSelected": "No ports selected for board: '{0}'.", - "noneSelected": "No boards selected.", + "nonSerialPort": "Non-serial port, can't obtain info.", "openBoardsConfig": "Select other board and port…", - "platformMissing": "The platform for the selected '{0}' board is not installed.", "pleasePickBoard": "Please pick a board connected to the port you have selected.", "port": "Portul{0}", - "portLabel": "Port: {0}", + "ports": "ports", "programmer": "Programator", + "reloadBoardData": "Reload Board Data", "reselectLater": "Re-selectează mai târziu", + "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "Search board", "selectBoard": "Selectează Placa", - "selectBoardForInfo": "Please select a board to obtain board info.", + "selectBoardToReload": "Please select a board first.", "selectPortForInfo": "Please select a port to obtain board info.", "showAllAvailablePorts": "Shows all available ports when enabled", + "showAllPorts": "Show all ports", "succesfullyInstalledPlatform": "Successfully installed platform {0}:{1}", - "succesfullyUninstalledPlatform": "Successfully uninstalled platform {0}:{1}" + "succesfullyUninstalledPlatform": "Successfully uninstalled platform {0}:{1}", + "typeOfPorts": "{0} ports", + "unconfirmedBoard": "Unconfirmed board", + "unknownBoard": "Unknown board" }, "boardsManager": "Boards Manager", "boardsType": { @@ -77,14 +90,15 @@ "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" }, "cloud": { - "account": "Account", "chooseSketchVisibility": "Choose visibility of your Sketch:", + "cloudSketchbook": "Cloud Sketchbook", "connected": "Conectat", "continue": "Continuă", - "donePulling": "Done pulling ‘{0}’.", - "donePushing": "Done pushing ‘{0}’.", + "donePulling": "Done pulling '{0}'.", + "donePushing": "Done pushing '{0}'.", "embed": "Embed:", "emptySketchbook": "Your Sketchbook is empty", + "goToCloud": "Go to Cloud", "learnMore": "Învață mai mult", "link": "Link:", "notYetPulled": "Cannot push to Cloud. It is not yet pulled.", @@ -102,10 +116,9 @@ "pushSketch": "Push Sketch", "pushSketchMsg": "This is a Public Sketch. Before pushing, make sure any sensitive information is defined in arduino_secrets.h files. You can make a Sketch private from the Share panel.", "remote": "La distanță ", - "remoteSketchbook": "Remote Sketchbook", "share": "Partajați...", "shareSketch": "Share Sketch", - "showHideRemoveSketchbook": "Show/Hide Remote Sketchbook", + "showHideSketchbook": "Show/Hide Cloud Sketchbook", "signIn": "CONECTARE", "signInToCloud": "Sign in to Arduino Cloud", "signOut": "Deconectare", @@ -113,12 +126,23 @@ "syncEditSketches": "Sync and edit your Arduino Cloud Sketches", "visitArduinoCloud": "Visit Arduino Cloud to create Cloud Sketches." }, + "cloudSketch": { + "alreadyExists": "Cloud sketch '{0}' already exists.", + "creating": "Creating cloud sketch '{0}'...", + "new": "New Cloud Sketch", + "notFound": "Could not pull the cloud sketch '{0}'. It does not exist.", + "pulling": "Synchronizing sketchbook, pulling '{0}'...", + "pushing": "Synchronizing sketchbook, pushing '{0}'...", + "renaming": "Renaming cloud sketch from '{0}' to '{1}'...", + "synchronizingSketchbook": "Synchronizing sketchbook..." + }, "common": { "all": "All", "contributed": "Contributed", "installManually": "Instalează Manual", "later": "Mai târziu", "noBoardSelected": "Placa de dezvoltare nu a fost aleasă.", + "noSketchOpened": "No sketch opened", "notConnected": "[neconectat]", "offlineIndicator": "Se pare că nu ești conectat la internet. Fără o conexiune la internet, Arduino CLI nu poate descarca resursele necesare și poate cauza funcționare anormală. Conectează-te la internet și repornește aplicația.", "oldFormat": "'{0}' utilizează formatul vechi `.pde`. Vrei să treci la noua extensie `ino`?", @@ -126,11 +150,13 @@ "processing": "Procesare", "recommended": "Recommended", "retired": "Retired", + "selectManually": "Select Manually", "selectedOn": "pe {0}", "serialMonitor": "Monitor Serial", "type": "Type", "unknown": "Necunoscut", - "updateable": "Updatable" + "updateable": "Updatable", + "userAbort": "User abort" }, "compile": { "error": "Compilation error: {0}" @@ -138,22 +164,49 @@ "component": { "boardsIncluded": "Boards included in this package:", "by": "de", + "clickToOpen": "Click to open in browser: {0}", "filterSearch": "Filtrează căutarea...", - "install": "INSTALEAZĂ", + "install": "Instalează", + "installLatest": "Install Latest", + "installVersion": "Install {0}", + "installed": "{0} installed", "moreInfo": "Mai multe informații", + "otherVersions": "Other Versions", + "remove": "Remove", + "title": "{0} by {1}", "uninstall": "Dezinstalează", "uninstallMsg": "Dorești să dezinstalezi {0}?", - "version": "Versiunea {0}" + "update": "Update" + }, + "configuration": { + "cli": { + "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" + } + }, + "connectionStatus": { + "connectionLost": "Connection lost. Cloud sketch actions and updates won't be available." }, "contributions": { "addFile": "Adaugă Fișier", "fileAdded": "One file added to the sketch.", + "plotter": { + "couldNotOpen": "Couldn't open serial plotter" + }, "replaceTitle": "Înlocuiește" }, + "core": { + "compilerWarnings": { + "all": "All", + "default": "Default", + "more": "More", + "none": "None" + } + }, "coreContribution": { "copyError": "Copy error messages", "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." }, + "createCloudCopy": "Push Sketch to Cloud", "daemon": { "restart": "Restart Daemon", "start": "Start Daemon", @@ -162,8 +215,15 @@ "debug": { "debugWithMessage": "Depanare - {0}", "debuggingNotSupported": "Depanarea nu este suportată de '{0}'", + "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "Platforma nu este instalată pentru '{0}'", - "optimizeForDebugging": "Optimizare pentru depanare" + "optimizeForDebugging": "Optimizare pentru depanare", + "sketchIsNotCompiled": "Sketch '{0}' must be verified before starting a debug session. Please verify the sketch and start debugging again. Do you want to verify the sketch now?" + }, + "developer": { + "clearBoardList": "Clear the Board List History", + "clearBoardsConfig": "Clear the Board and Port Selection", + "dumpBoardList": "Dump the Board List" }, "dialog": { "dontAskAgain": "Nu mai întreba" @@ -180,10 +240,6 @@ "previousError": "Previous Error", "revealError": "Reveal Error" }, - "electron": { - "couldNotSave": "Could not save the sketch. Please copy your unsaved work into your favorite text editor, and restart the IDE.", - "unsavedChanges": "Any unsaved changes will not be saved." - }, "examples": { "builtInExamples": "Built-in examples", "couldNotInitializeExamples": "Could not initialize built-in examples.", @@ -201,7 +257,7 @@ "selectBoard": "Selectează Placa", "selectVersion": "Select firmware version", "successfullyInstalled": "Firmware successfully installed.", - "updater": "WiFi101 / WiFiNINA Firmware Updater" + "updater": "Firmware Updater" }, "help": { "environment": "Mediu de lucru", @@ -219,6 +275,9 @@ "checkForUpdates": "Check for Arduino IDE Updates", "closeAndInstallButton": "Close and Install", "closeToInstallNotice": "Close the software and install the update on your machine.", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", "downloadButton": "Download", "downloadingNotice": "Downloading the latest version of the Arduino IDE.", "errorCheckingForUpdates": "Error while checking for Arduino IDE updates.\n{0}", @@ -232,16 +291,20 @@ "updateAvailable": "Update Available", "versionDownloaded": "Arduino IDE {0} has been downloaded." }, + "installable": { + "libraryInstallFailed": "Failed to install library: '{0}{1}'.", + "platformInstallFailed": "Failed to install platform: '{0}{1}'." + }, "library": { "addZip": "Add .ZIP Library...", "arduinoLibraries": "Arduino libraries", "contributedLibraries": "Contributed libraries", - "dependenciesForLibrary": "Dependencies for library {0}:{1}", "include": "Include Librăria", - "installAll": "Instalează tot", + "installAll": "Install All", + "installLibraryDependencies": "Install library dependencies", "installMissingDependencies": "Would you like to install all the missing dependencies?", "installOneMissingDependency": "Would you like to install the missing dependency?", - "installOnly": "Instalează doar {0}", + "installWithoutDependencies": "Install without dependencies", "installedSuccessfully": "Successfully installed library {0}:{1}", "libraryAlreadyExists": "A library already exists. Do you want to overwrite it?", "manageLibraries": "Gestionare Librării ", @@ -278,9 +341,23 @@ "tools": "Unelte" }, "monitor": { + "alreadyConnectedError": "Could not connect to {0} {1} port. Already connected.", + "baudRate": "{0} baud", + "connectionFailedError": "Could not connect to {0} {1} port.", + "connectionFailedErrorWithDetails": "{0} Could not connect to {1} {2} port.", + "connectionTimeout": "Timeout. The IDE has not received the 'success' message from the monitor after successfully connecting to it", + "missingConfigurationError": "Could not connect to {0} {1} port. The monitor configuration is missing.", + "notConnectedError": "Not connected to {0} {1} port.", "unableToCloseWebSocket": "Unable to close websocket", "unableToConnectToWebSocket": "Unable to connect to websocket" }, + "newCloudSketch": { + "newSketchTitle": "Name of the new Cloud Sketch" + }, + "portProtocol": { + "network": "Rețea", + "serial": "Serial" + }, "preferences": { "additionalManagerURLs": "Additional Boards Manager URLs", "auth.audience": "Audiența OAuth2.", @@ -297,6 +374,7 @@ "cloud.pull.warn": "True if users should be warned before pulling a cloud sketch. Defaults to true.", "cloud.push.warn": "True if users should be warned before pushing a cloud sketch. Defaults to true.", "cloud.pushpublic.warn": "True if users should be warned before pushing a public sketch to the cloud. Defaults to true.", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", "cloud.sketchSyncEndpoint": "The endpoint used to push and pull sketches from a backend. By default it points to Arduino Cloud API.", "compile": "compila", "compile.experimental": "True if the IDE should handle multiple compiler errors. False by default", @@ -314,29 +392,50 @@ "invalid.editorFontSize": "Invalid editor font size. It must be a positive integer.", "invalid.sketchbook.location": "Invalid sketchbook location: {0}", "invalid.theme": "Invalid theme.", + "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", "language.log": "True if the Arduino Language Server should generate log files into the sketch folder. Otherwise, false. It's false by default.", "language.realTimeDiagnostics": "If true, the language server provides real-time diagnostics when typing in the editor. It's false by default.", "manualProxy": "Configurare manuală proxy", + "monitor": { + "dockPanel": "The area of the application shell where the _{0}_ widget will reside. It is either \"bottom\" or \"right\". It defaults to \"{1}\"." + }, "network": "Rețea", "newSketchbookLocation": "Select new sketchbook location", + "noCliConfig": "Could not load the CLI configuration", "noProxy": "Fără proxy", + "proxySettings": { + "hostname": "Host name", + "password": "Password", + "port": "Port number", + "username": "Username" + }, "showVerbose": "Show verbose output during", + "sketch": { + "inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect." + }, "sketchbook.location": "Sketchbook location", "sketchbook.showAllFiles": "Adevărat pentru a afișa toate fișierele tip schița din interiorul schiței. Este fals în modul implicit.", - "survey.notification": "True if users should be notified if a survey is available. True by default.", "unofficialBoardSupport": "Click for a list of unofficial board support URLs", "upload": "încarcă", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", "upload.verbose": "True for verbose upload output. False by default.", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "Verifică codul după încarcare", "window.autoScale": "True if the user interface automatically scales with the font size.", - "window.zoomLevel": "Adjust the zoom level of the window. The original size is 0 and each increment above (e.g. 1) or below (e.g. -1) represents zooming 20% larger or smaller. You can also enter decimals to adjust the zoom level with a finer granularity." + "window.zoomLevel": { + "deprecationMessage": "Deprecated. Use 'window.zoomLevel' instead." + } + }, + "renameCloudSketch": { + "renameSketchTitle": "New name of the Cloud Sketch" }, "replaceMsg": "Replace the existing version of {0}?", "selectZip": "Select a zip file containing the library you'd like to add", "serial": { "autoscroll": "Autoderulare", "carriageReturn": "Carriage Return", - "message": "Message ({0} + Enter to send message to '{1}' on '{2}')", + "connecting": "Connecting to '{0}' on '{1}'...", + "message": "Message (Enter to send message to '{0}' on '{1}')", "newLine": "Linie Nouă", "newLineCarriageReturn": "NL și CR", "noLineEndings": "No Line Ending", @@ -348,24 +447,34 @@ "sketch": { "archiveSketch": "Archive Sketch", "cantOpen": "A folder named \"{0}\" already exists. Can't open sketch.", - "close": "Are you sure you want to close the sketch?", "compile": "Compiling sketch...", - "configureAndUpload": "Configure And Upload", + "configureAndUpload": "Configure and Upload", "createdArchive": "Created archive '{0}'.", "doneCompiling": "Done compiling.", "doneUploading": "Done uploading.", + "editInvalidSketchFolderLocationQuestion": "Do you want to try saving the sketch to a different location?", + "editInvalidSketchFolderQuestion": "Do you want to try saving the sketch with a different name?", "exportBinary": "Export Compiled Binary", + "invalidCloudSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", + "invalidSketchFolderLocationDetails": "You cannot save a sketch into a folder inside itself.", + "invalidSketchFolderLocationMessage": "Invalid sketch folder location: '{0}'", + "invalidSketchFolderNameMessage": "Invalid sketch folder name: '{0}'", + "invalidSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", "moving": "Moving", "movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?", - "new": "Nou", + "new": "New Sketch", + "noTrailingPeriod": "A filename cannot end with a dot", "openFolder": "Deschide Folder", "openRecent": "Deschide Recente", "openSketchInNewWindow": "Open Sketch in New Window", + "reservedFilename": "'{0}' is a reserved filename.", "saveFolderAs": "Save sketch folder as...", "saveSketch": "Save your sketch to open it again later.", "saveSketchAs": "Save sketch folder as...", "showFolder": "Show Sketch Folder", - "sketch": "Sketch", + "sketch": "Schița", + "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", + "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", "sketchbook": "Sketchbook", "titleLocalSketchbook": "Local Sketchbook", "titleSketchbook": "Sketchbook", @@ -376,10 +485,26 @@ "verify": "Verifică", "verifyOrCompile": "Verify/Compile" }, - "survey": { - "answerSurvey": "Answer survey", - "dismissSurvey": "Don't show again", - "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." + "sketchbook": { + "newCloudSketch": "New Cloud Sketch", + "newSketch": "New Sketch" + }, + "theme": { + "currentThemeNotFound": "Could not find the currently selected theme: {0}. Arduino IDE has picked a built-in theme compatible with the missing one.", + "dark": "Dark", + "deprecated": "{0} (deprecated)", + "hc": "Dark High Contrast", + "hcLight": "Light High Contrast", + "light": "Light", + "user": "{0} (user)" + }, + "title": { + "cloud": "Cloud" + }, + "updateIndexes": { + "updateIndexes": "Update Indexes", + "updateLibraryIndex": "Update Library Index", + "updatePackageIndex": "Update Package Index" }, "upload": { "error": "{0} eroare :{1}" @@ -388,11 +513,27 @@ "cancel": "Anulează", "enterField": "Enter {0}", "upload": "Încarcă" + }, + "validateSketch": { + "abortFixMessage": "The sketch is still invalid. Do you want to fix the remaining problems? By clicking '{0}', a new sketch will open.", + "abortFixTitle": "Invalid sketch", + "renameSketchFileMessage": "The sketch file '{0}' cannot be used. {1} Do you want to rename the sketch file now?", + "renameSketchFileTitle": "Invalid sketch filename", + "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", + "renameSketchFolderTitle": "Invalid sketch name" + }, + "versionWelcome": { + "cancelButton": "Maybe later", + "donateButton": "Donate now", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Welcome to a new version of the Arduino IDE!", + "titleWithVersion": "Welcome to the new Arduino IDE {0}!" + }, + "workspace": { + "alreadyExists": "'{0}' already exists." } }, - "cloud": { - "GoToCloud": "GO TO CLOUD" - }, "theia": { "core": { "cannotConnectBackend": "Cannot connect to the backend.", @@ -400,13 +541,9 @@ "couldNotSave": "Could not save the sketch. Please copy your unsaved work into your favorite text editor, and restart the IDE.", "daemonOffline": "CLI Daemon Offline", "offline": "Deconectat", + "offlineText": "Deconectat", "quitTitle": "Are you sure you want to quit?" }, - "debug": { - "start": "Start...", - "startError": "There was an error starting the debug session, check the logs for more details.", - "typeNotSupported": "The debug session type \"{0}\" is not supported." - }, "editor": { "unsavedTitle": "Nesalvat – {0}" }, @@ -415,10 +552,10 @@ "expand": "Extinde" }, "workspace": { - "deleteCurrentSketch": "Dorești sa ștergi schița curentă?", + "deleteCloudSketch": "The cloud sketch '{0}' will be permanently deleted from the Arduino servers and the local caches. This action is irreversible. Do you want to delete the current sketch?", + "deleteCurrentSketch": "The sketch '{0}' will be permanently deleted. This action is irreversible. Do you want to delete the current sketch?", "fileNewName": "Nume pentru noul fișier", "invalidExtension": ".{0} nu este o extensie validă", - "invalidFilename": "Numele fișierului este invalid.", "newFileName": "Nume pentru noul fișier" } } diff --git a/i18n/ru.json b/i18n/ru.json index a992ee54d..33f53af0f 100644 --- a/i18n/ru.json +++ b/i18n/ru.json @@ -4,39 +4,52 @@ "detail": "Версия: {0}\nДата: {1}{2}\nВерсия CLI: {3}{4} [{5}]\n\n{6}", "label": "О программе {0}" }, + "account": { + "goToCloudEditor": "Перейдите в редактор облаков", + "goToIoTCloud": "Перейти к облаку IoT", + "goToProfile": "Перейти в профиль", + "menuTitle": "Arduino Cloud" + }, "board": { "board": "Плата{0}", - "boardConfigDialogTitle": "Select Other Board and Port", + "boardConfigDialogTitle": "Выберите другую плату и порт", + "boardDataReloaded": "Board data reloaded.", "boardInfo": "Информация о плате", + "boards": "платы", "configDialog1": "Выберите плату и порт, если Вы хотите загрузить скетч в плату.", "configDialog2": "Если вы выбираете только плату, вы сможете компилировать, но не загружать свой скетч.", "couldNotFindPreviouslySelected": "Не удалось найти ранее выбранную плату '{0}' в установленной платформе '{1}'.Пожалуйста, выберите плату которую хотите использовать вручную повторно. Вы хотите повторно выбрать её сейчас?", - "disconnected": "Плата Arduino не подключена", + "editBoardsConfig": "Редактирование платы и порта...", "getBoardInfo": "Получить информацию о подключенной плате", "inSketchbook": " (в альбоме).", "installNow": "Необходимо установить ядро «{0} {1}» для выбранной в данный момент «{2}» платы. Вы хотите установить его сейчас?", - "noFQBN": "FQBN недоступен для выбранной платы \"{0}\". Проверьте наличие необходимого ядра.", - "noPortsDiscovered": "No ports discovered", - "noPortsSelected": "Не выбраны порты для платы: '{0}'.", - "noneSelected": "Плата не выбрана.", + "noBoardsFound": "Для \"{0}\" не найдено ни одной платы.", + "noNativeSerialPort": "Родной последовательный порт, не удается получить информацию.", + "noPortsDiscovered": "Порты не обнаружены", + "nonSerialPort": "Порт не последовательный, не удается получить информацию.", "openBoardsConfig": "Выберите другую плату и порт...", - "platformMissing": "Платформа для выбранной платы '{0}' не установлена.", "pleasePickBoard": "Пожалуйста, выберите плату, подключенную к выбранному вами порту.", "port": "Порт{0}", - "portLabel": "Порт:{0}", + "ports": "порты", "programmer": "Программатор", + "reloadBoardData": "Reload Board Data", "reselectLater": "Перевыбрать позже", - "searchBoard": "Search board", + "revertBoardsConfig": "Используйте '{0}', обнаруженный на '{1}'", + "searchBoard": "Поиск платы", "selectBoard": "Выбор платы", - "selectBoardForInfo": "Пожалуйста, выберите плату в меню инструментов для получения информации с платы.", + "selectBoardToReload": "Please select a board first.", "selectPortForInfo": "Пожалуйста, выберите порт в меню инструментов для получения информации с платы.", "showAllAvailablePorts": "Показать все доступные порты при включении", + "showAllPorts": "Показать все порты", "succesfullyInstalledPlatform": "Платформа установлена успешно {0}:{1}", - "succesfullyUninstalledPlatform": "Платформа успешно удалена {0}:{1}" + "succesfullyUninstalledPlatform": "Платформа успешно удалена {0}:{1}", + "typeOfPorts": "{0}порты", + "unconfirmedBoard": "Неподтвержденная плата", + "unknownBoard": "Неизвестная плата" }, "boardsManager": "Менеджер плат", "boardsType": { - "arduinoCertified": "Arduino Certified" + "arduinoCertified": "Сертифицированный Arduino" }, "bootloader": { "burnBootloader": "Записать Загрузчик", @@ -64,27 +77,28 @@ "uploadingCertificates": "Загрузка сертификатов." }, "checkForUpdates": { - "checkForUpdates": "Check for Arduino Updates", - "installAll": "Install All", - "noUpdates": "There are no recent updates available.", - "promptUpdateBoards": "Updates are available for some of your boards.", - "promptUpdateLibraries": "Updates are available for some of your libraries.", - "updatingBoards": "Updating boards...", - "updatingLibraries": "Updating libraries..." + "checkForUpdates": "Проверьте наличие обновлений Arduino", + "installAll": "Установить все", + "noUpdates": "Последние обновления отсутствуют.", + "promptUpdateBoards": "Для некоторых плат доступны обновления.", + "promptUpdateLibraries": "Для некоторых библиотек доступны обновления.", + "updatingBoards": "Обновление плат...", + "updatingLibraries": "Обновление библиотек..." }, "cli-error-parser": { "keyboardError": "'Keyboard' не найдено. В вашем скетче есть строка '#include <Keyboard.h>'?", "mouseError": "'Mouse' не найдено. В вашем скетче есть строка '#include <Mouse.h>'?" }, "cloud": { - "account": "Аккаунт", "chooseSketchVisibility": "Выберите видимость своего скетча:", + "cloudSketchbook": "Альбом в облаке", "connected": "Подключено", "continue": "Продолжить", - "donePulling": "Закончить вытягивание ‘{0}’.", - "donePushing": "Отправлено ‘{0}’.", + "donePulling": "Выполнено вытягивание '{0}'.", + "donePushing": "Выполнено нажатие '{0}'.", "embed": "Встроить:", "emptySketchbook": "Ваш альбом пуст", + "goToCloud": "Перейти в облако", "learnMore": "Узнать больше", "link": "Ссылка:", "notYetPulled": "Не удается отправить в облако. Он еще не вытащен.", @@ -102,10 +116,9 @@ "pushSketch": "Выдавить скетч", "pushSketchMsg": "Это Публичный скетч. Перед нажатием убедитесь, что любая конфиденциальная информация определена в файлах arduino_secrets.h. Вы можете сделать скетч приватным на панели общего доступа.", "remote": "Удаленный", - "remoteSketchbook": "Удалённый альбом", "share": "Поделиться...", "shareSketch": "Поделиться скетчем", - "showHideRemoveSketchbook": "Показать/скрыть удаленный альбом", + "showHideSketchbook": "Показать/скрыть облачный скетчбук", "signIn": "Войти", "signInToCloud": "Войдите в Arduino Cloud", "signOut": "Выйти", @@ -113,47 +126,87 @@ "syncEditSketches": "Синхронизировать и редактировать скетчи в Arduino Cloud", "visitArduinoCloud": "Посетите Arduino Cloud, чтобы создать скетчи в облаке." }, + "cloudSketch": { + "alreadyExists": "Облачный скетч '{0}' уже существует.", + "creating": "Создание облачного скетча '{0}'...", + "new": "Новый облачный скетч", + "notFound": "Не удалось извлечь облачный скетч '{0}'. Он не существует.", + "pulling": "Синхронизация скетчбука, вытягивание '{0}'...", + "pushing": "Синхронизация скетчбука, нажатие кнопки '{0}'...", + "renaming": "Переименование облачного скетча из '{0}' в '{1}'...", + "synchronizingSketchbook": "Синхронизация скетчбука..." + }, "common": { - "all": "All", - "contributed": "Contributed", + "all": "Все", + "contributed": "Вклад", "installManually": "Установить вручную", "later": "Позже", "noBoardSelected": "Плата не выбрана", + "noSketchOpened": "Скетч не открыт", "notConnected": "[не подключено].", "offlineIndicator": "Похоже, у Вас нет подключения к Интернету. Без подключения к Интернету Arduino CLI не сможет загрузить необходимые ресурсы и упадет. Подключитесь к Интернету и перезапустите приложение.", "oldFormat": "'{0}' использует старый формат `.pde`. Хотите сконвертировать в новый формат `.ino`?", - "partner": "Partner", + "partner": "Партнер", "processing": "Обработка", - "recommended": "Recommended", - "retired": "Retired", + "recommended": "Рекомендовано", + "retired": "В отставке", + "selectManually": "Выберите вручную", "selectedOn": "вкл. {0}", "serialMonitor": "Монитор порта", - "type": "Type", + "type": "Тип", "unknown": "Неизвестно", - "updateable": "Updatable" + "updateable": "Обновляемый", + "userAbort": "Прерывание пользователем" }, "compile": { "error": "Ошибка компиляции: {0}" }, "component": { - "boardsIncluded": "Boards included in this package:", + "boardsIncluded": "Платы, входящие в этот комплект:", "by": "от", + "clickToOpen": "Нажмите, чтобы открыть в браузере: {0}", "filterSearch": "Отфильтровать результаты поиска...", "install": "Установка", + "installLatest": "Установите последнюю версию", + "installVersion": "Установить {0}", + "installed": "{0} установлен", "moreInfo": "Дополнительная информация", + "otherVersions": "Другие версии", + "remove": "Удалить", + "title": "{0} на {1}", "uninstall": "Удалить", - "uninstallMsg": "Вы хотите удалить {0}?", - "version": "Версия {0}" + "uninstallMsg": "Вы хотите удалить {0}?", + "update": "Обновление" + }, + "configuration": { + "cli": { + "inaccessibleDirectory": "Не удалось получить доступ к местоположению скетчбука по адресу '{0}': {1}" + } + }, + "connectionStatus": { + "connectionLost": "Соединение потеряно. Действия и обновления облачных скетчей будут недоступны." }, "contributions": { "addFile": "Добавить файл...", "fileAdded": "Один файл добавлен в скетч.", + "plotter": { + "couldNotOpen": "Не удается открыть последовательный плоттер" + }, "replaceTitle": "Заменить" }, + "core": { + "compilerWarnings": { + "all": "Все", + "default": "По умолчанию", + "more": "Подробнее", + "none": "Нет" + } + }, "coreContribution": { "copyError": "Скопировать сообщения ошибок", - "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." + "noBoardSelected": "Не выбрана плата. Пожалуйста, выберите вашу плату Arduino в меню Инструменты > Плата." }, + "createCloudCopy": "Передача скетчей в облако", "daemon": { "restart": "Перезапустить Daemon", "start": "Запустить Daemon", @@ -162,8 +215,15 @@ "debug": { "debugWithMessage": "Отладка - {0}", "debuggingNotSupported": "Отладка не поддерживается '{0}'", + "getDebugInfo": "Получение отладочной информации...", "noPlatformInstalledFor": "Платформа не установлена для '{0}'", - "optimizeForDebugging": "Оптимизировать для отладки" + "optimizeForDebugging": "Оптимизировать для отладки", + "sketchIsNotCompiled": "Скетч '{0}' должен быть проверен перед началом сеанса отладки. Пожалуйста, проверьте скетч и начните отладку снова. Хотите ли вы проверить скетч сейчас?" + }, + "developer": { + "clearBoardList": "Очистите историю списка форумов", + "clearBoardsConfig": "Очистить выбор платы и порта", + "dumpBoardList": "Выбросить список плат управления" }, "dialog": { "dontAskAgain": "Больше не спрашивать" @@ -178,11 +238,7 @@ "increaseIndent": "Увеличить отступ", "nextError": "Следущая ошибка", "previousError": "Предыдущая ошибка", - "revealError": "Reveal Error" - }, - "electron": { - "couldNotSave": "Скетч не сохранён. Пожалуйста, скопируйте вашу не сохраненную работу в ваш внешний текстовый редактор и перезапустите IDE.", - "unsavedChanges": "Любые не сохраненные изменения не будут сохранены." + "revealError": "Ошибка раскрытия" }, "examples": { "builtInExamples": "Встроенные Примеры", @@ -201,7 +257,7 @@ "selectBoard": "Выбор платы", "selectVersion": "Выберите версию прошивки", "successfullyInstalled": "Прошивка успешно установлена.", - "updater": "WiFi101 / WiFiNINA Firmware Updater" + "updater": "Программа обновления прошивки" }, "help": { "environment": "Окружение", @@ -216,9 +272,12 @@ "visit": "Перейти на сайт Arduino.cc" }, "ide-updater": { - "checkForUpdates": "Check for Arduino IDE Updates", + "checkForUpdates": "Проверка обновлений среды Arduino IDE", "closeAndInstallButton": "Закрыть и установить", "closeToInstallNotice": "Закройте программное обеспечение и установите обновление на вашем компьютере.", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", "downloadButton": "Скачать", "downloadingNotice": "Загрузка последней версии Arduino IDE.", "errorCheckingForUpdates": "Ошибка при проверке обновлений IDE Arduino.\n{0}", @@ -232,16 +291,20 @@ "updateAvailable": "Доступны обновления", "versionDownloaded": "Arduino IDE {0} был загружен." }, + "installable": { + "libraryInstallFailed": "Не удалось установить библиотеку: '{0}{1}'.", + "platformInstallFailed": "Не удалось установить платформу: '{0}{1}'." + }, "library": { "addZip": "Добавить .ZIP библиотеку...", "arduinoLibraries": "Библиотеки Arduino", "contributedLibraries": "Сторонние библиотеки", - "dependenciesForLibrary": "Зависимости для библиотеки {0}:{1}", "include": "Подключить библиотеку", "installAll": "Установить все", + "installLibraryDependencies": "Установите зависимости библиотек", "installMissingDependencies": "Установить все недостающие зависимости?", "installOneMissingDependency": "Установить недостающую зависимость?", - "installOnly": "Установить только {0}", + "installWithoutDependencies": "Установка без зависимостей", "installedSuccessfully": "Успешно установлена библиотека {0}:{1}", "libraryAlreadyExists": "Библиотека уже существует. Вы хотите ее заменить?", "manageLibraries": "Управление библиотеками...", @@ -255,22 +318,22 @@ "zipLibrary": "Библиотека" }, "librarySearchProperty": { - "topic": "Topic" + "topic": "Тема" }, "libraryTopic": { - "communication": "Communication", - "dataProcessing": "Data Processing", - "dataStorage": "Data Storage", - "deviceControl": "Device Control", - "display": "Display", - "other": "Other", - "sensors": "Sensors", - "signalInputOutput": "Signal Input/Output", - "timing": "Timing", - "uncategorized": "Uncategorized" + "communication": "Общение", + "dataProcessing": "Обработка данных", + "dataStorage": "Хранение данных", + "deviceControl": "Управление устройством", + "display": "Дисплей", + "other": "Другое", + "sensors": "Датчики", + "signalInputOutput": "Вход/выход сигнала", + "timing": "Время", + "uncategorized": "Без категории" }, "libraryType": { - "installed": "Installed" + "installed": "Установлено" }, "menu": { "advanced": "Расширенные", @@ -278,9 +341,23 @@ "tools": "Инструменты" }, "monitor": { + "alreadyConnectedError": "Не удалось подключиться к {0} {1} порту. Уже подключились.", + "baudRate": "{0} бод", + "connectionFailedError": "Не удалось подключиться к {0} {1} порту.", + "connectionFailedErrorWithDetails": "{0} Не удалось подключиться к {1} {2} порту. ", + "connectionTimeout": "Таймаут. IDE не получила сообщение \"успех\" от монитора после успешного подключения к нему", + "missingConfigurationError": "Не удалось подключиться к {0} {1} порту. Отсутствует конфигурация монитора.", + "notConnectedError": "Не подключен к {0} {1} порту.", "unableToCloseWebSocket": "Не удалось закрыть веб-сокет.", "unableToConnectToWebSocket": "Не удается подключиться к веб-сокету." }, + "newCloudSketch": { + "newSketchTitle": "Имя нового облачного скетча" + }, + "portProtocol": { + "network": "Сеть", + "serial": "Серийный" + }, "preferences": { "additionalManagerURLs": "Дополнительные ссылки для Менеджера плат", "auth.audience": "Аудитория OAuth2.", @@ -290,13 +367,14 @@ "automatic": "Автоматика", "board.certificates": "Список сертификатов, которые могут быть загружены в платы", "browse": "Обзор", - "checkForUpdate": "Receive notifications of available updates for the IDE, boards, and libraries. Requires an IDE restart after change. It's true by default.", + "checkForUpdate": "Получение уведомлений о доступных обновлениях для IDE, плат и библиотек. Требуется перезапуск IDE после внесения изменений. По умолчанию установлено значение true.", "choose": "Выбрать", "cli.daemonDebug": "Включить отладочное логирование вызовов gRPC в Arduino CLI. Чтобы эта настройка вступила в силу, необходим перезапуск IDE. По умолчанию оно выключено.", "cloud.enabled": "True, если функции синхронизации скетчей включены. По умолчанию - true.", "cloud.pull.warn": "True, если пользователи должны быть предупреждены перед созданием облачного скетча. По умолчанию установлено значение true.", "cloud.push.warn": "True, если пользователи должны быть предупреждены перед запуском облачного эскиза. По умолчанию установлено значение true.", - "cloud.pushpublic.warn": "True, если пользователи должны быть предупреждены перед отправкой общедоступного эскиза в облако. По умолчанию установлено значение true.", + "cloud.pushpublic.warn": "True, если пользователи должны быть предупреждены перед отправкой общедоступного скетча в облако. По умолчанию установлено значение true.", + "cloud.sharedSpaceId": "Идентификатор общего пространства Arduino Cloud для загрузки скетчбука. Если он пуст, будет выбрано ваше личное пространство.", "cloud.sketchSyncEndpoint": "Конечная точка, используемая для отправки и извлечения скетчей из серверной части. По умолчанию он указывает на Arduino Cloud API.", "compile": "компиляции", "compile.experimental": "Включите, если IDE должна обрабатывать множественные ошибки компилятора. По умолчанию выключено", @@ -314,29 +392,50 @@ "invalid.editorFontSize": "Неверный размер шрифта редактора. Это должно быть положительное целое число.", "invalid.sketchbook.location": "Неправильный путь к альбому со скетчами: {0}", "invalid.theme": "Неверная тема.", + "language.asyncWorkers": "Количество асинхронных рабочих, используемых Arduino языковым сервером (clangd). Фоновый индекс также использует это количество рабочих. Минимальное значение - 0, максимальное - 8. Когда значение равно 0, языковой сервер использует все доступные ядра. По умолчанию значение равно 0.", "language.log": "True - сервер Arduino Language будет создавать файлы журнала в папке скетча. В противном случае - false. По умолчанию - false.", "language.realTimeDiagnostics": "Если включено, то языковой сервер проводит диагностику набранного текста в реальном времени. По умолчанию отключено.", "manualProxy": "Ручная настройка параметров прокси-сервера", + "monitor": { + "dockPanel": "Область оболочки приложения, в которой будет располагаться виджет _{0}_. Это либо \"внизу\", либо \"справа\". По умолчанию принимает значение \"{1}\"." + }, "network": "Сеть", "newSketchbookLocation": "Выбрать новое расположение для альбома со скетчами", + "noCliConfig": "Не удалось загрузить конфигурацию CLI", "noProxy": "Не использовать прокси-сервер", + "proxySettings": { + "hostname": "Имя хоста", + "password": "Пароль", + "port": "Номер порта", + "username": "Имя пользователя" + }, "showVerbose": "Показывать детализированный вывод при", + "sketch": { + "inoBlueprint": "Абсолютный путь к файловой системе к стандартному файлу чертежей `.ino`. Если указан, содержимое файла blueprint будет использоваться для каждого нового скетча, создаваемого IDE. Если не указано, то скетчи будут создаваться с содержимым по умолчанию для Arduino. Недоступные файлы чертежей будут игнорироваться. **Для того чтобы эта настройка вступила в силу, необходимо перезапустить IDE**." + }, "sketchbook.location": "Путь к альбому со скетчами", "sketchbook.showAllFiles": "True - показывать все файлы внутри скетча. По умолчанию - false.", - "survey.notification": "Включите, если пользователи должны получать уведомления, когда появится новый опрос. Включено по умолчанию.", "unofficialBoardSupport": "Список URL-адресов поддержки неофициальных плат", "upload": "выгрузке на плату", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", "upload.verbose": "True - подробный вывод при загрузке скетча на плату. По умолчанию - false.", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "Проверять содержимое памяти платы после загрузки", "window.autoScale": "True, если пользовательский интерфейс автоматически масштабируется в зависимости от размера шрифта.", - "window.zoomLevel": "Отрегулируйте уровень масштабирования окна. Оригинальный размер равен 0 и каждое изменение выше (например, 1) или ниже (например, -1) представляет собой масштабирование на 20% больше или меньше. Вы также можете войти в десятичные, чтобы настроить уровень масштабирования с более тонкой гранулярностью." + "window.zoomLevel": { + "deprecationMessage": "Утратил актуальность. Вместо этого используйте 'window.zoomLevel'." + } + }, + "renameCloudSketch": { + "renameSketchTitle": "Новое название облачного скетча" }, "replaceMsg": "Заменить имеющуюся версию {0}?", "selectZip": "Выберите zip-файл, содержащий библиотеку, которую вы хотите установить", "serial": { "autoscroll": "Автопрокрутка", "carriageReturn": "CR Возврат каретки", - "message": "Сообщение ({0} + Enter, чтобы отправить сообщение для '{1}' на '{2}')", + "connecting": "Подключение к '{0}' на '{1}'...", + "message": "Сообщение (введите, чтобы отправить сообщение на '{0}' на '{1}')", "newLine": "Новая строка", "newLineCarriageReturn": "NL & CR", "noLineEndings": "Нет конца строки", @@ -348,24 +447,34 @@ "sketch": { "archiveSketch": "Архивировать скетч", "cantOpen": "Папка \"{0}\" уже существует. Невозможно открыть скетч.", - "close": "Вы действительно хотите закрыть скетч?", "compile": "Компиляция скетча...", - "configureAndUpload": "Настроить и загрузить", + "configureAndUpload": "Настройка и загрузка", "createdArchive": "Создать архив '{0}'.", "doneCompiling": "Компиляция завершена.", "doneUploading": "Загрузка завершена.", + "editInvalidSketchFolderLocationQuestion": "Не хотите ли вы попробовать сохранить скетч в другом месте?", + "editInvalidSketchFolderQuestion": "Хотите попробовать сохранить скетч под другим именем?", "exportBinary": "Экспортировать скомпилированный бинарный файл", + "invalidCloudSketchName": "Имя должно начинаться с буквы, цифры или символа подчеркивания, за которыми следуют буквы, цифры, тире, точки и символы подчеркивания. Максимальная длина - 36 символов.", + "invalidSketchFolderLocationDetails": "Вы не можете сохранить скетч в папке внутри самого себя.", + "invalidSketchFolderLocationMessage": "Недопустимое расположение папки со скетчами: '{0}'", + "invalidSketchFolderNameMessage": "Недопустимое имя папки со скетчами: '{0}'", + "invalidSketchName": "Имя должно начинаться с буквы, цифры или символа подчеркивания, за которыми следуют буквы, цифры, тире, точки и символы подчеркивания. Максимальная длина - 63 символа.", "moving": "Переместить", "movingMsg": "Файл «{0}» должен быть в папке с именем скетча «{1}». \nСоздать эту папку, переместить файл и продолжить?", - "new": "Новый скетч", + "new": "Новый эскиз", + "noTrailingPeriod": "Имя файла не может заканчиваться точкой", "openFolder": "Открыть папку", "openRecent": "Открыть предыдущий", "openSketchInNewWindow": "Открыть скетч в новом окне", + "reservedFilename": "{0} это зарезервированное имя файла.", "saveFolderAs": "Сохранить папку со скетчем как...", "saveSketch": "Сохраните свой скетч, чтобы открыть его позже.", "saveSketchAs": "Сохранить папку скетча как...", "showFolder": "Показать папку скетча", "sketch": "Скетч", + "sketchAlreadyContainsThisFileError": "В скетче уже есть файл с именем '{0}'", + "sketchAlreadyContainsThisFileMessage": "Не удалось сохранить скетч \"{0}\" как \"{1}\". {2}", "sketchbook": "Альбом", "titleLocalSketchbook": "Локальный альбом", "titleSketchbook": "Альбом", @@ -376,23 +485,55 @@ "verify": "Проверить", "verifyOrCompile": "Проверить/Скомпилировать" }, - "survey": { - "answerSurvey": "Ответить на опрос", - "dismissSurvey": "Больше не показывать", - "surveyMessage": "Пожалуйста, помоги нам стать лучше, пройдя этот супер-короткий опрос. Мы ценим наше сообщество и хотели бы узнать наших сторонников немного лучше!" + "sketchbook": { + "newCloudSketch": "Новый облачный скетч", + "newSketch": "Новый скетч" + }, + "theme": { + "currentThemeNotFound": "Не удалось найти текущую выбранную тему: {0}. Arduino IDE выбрала встроенную тему, совместимую с отсутствующей.", + "dark": "Темный", + "deprecated": "{0} (устаревшее)", + "hc": "Темная высокая контрастность", + "hcLight": "Светлый Высокая контрастность", + "light": "Свет", + "user": "{0} (пользователь) " + }, + "title": { + "cloud": "Облако" + }, + "updateIndexes": { + "updateIndexes": "Обновление индексов", + "updateLibraryIndex": "Обновить библиотечный индекс", + "updatePackageIndex": "Обновление индекса пакетов" }, "upload": { "error": "{0} ошибка: {1}" }, "userFields": { "cancel": "Отмена", - "enterField": "Enter {0}", + "enterField": "Ввод {0}", "upload": "Загрузка" + }, + "validateSketch": { + "abortFixMessage": "Эскиз все еще недействителен. Хотите устранить оставшиеся проблемы? Если нажать кнопку '{0}', откроется новый эскиз.", + "abortFixTitle": "Неверный скетч", + "renameSketchFileMessage": "Файл скетча '{0}' не может быть использован.{1} Вы хотите переименовать файл скетча сейчас?", + "renameSketchFileTitle": "Недопустимое имя файла скетча", + "renameSketchFolderMessage": "Скетч '{0}' не может быть использован. {1} Чтобы избавиться от этого сообщения, переименуйте скетч. Хотите ли вы переименовать скетч сейчас?", + "renameSketchFolderTitle": "Неверное название скетча" + }, + "versionWelcome": { + "cancelButton": "Maybe later", + "donateButton": "Donate now", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Welcome to a new version of the Arduino IDE!", + "titleWithVersion": "Welcome to the new Arduino IDE {0}!" + }, + "workspace": { + "alreadyExists": "{0} уже существует." } }, - "cloud": { - "GoToCloud": "Переход в облако" - }, "theia": { "core": { "cannotConnectBackend": "Невозможно подключиться к бэкенду.", @@ -400,13 +541,9 @@ "couldNotSave": "Скетч не сохранён. Пожалуйста, скопируйте вашу не сохраненную работу в ваш внешний текстовый редактор и перезапустите IDE.", "daemonOffline": "CLI демон не подключен", "offline": "Не подключено", + "offlineText": "Не подключено", "quitTitle": "Вы уверены, что хотите выйти?" }, - "debug": { - "start": "Запуск...", - "startError": "Произошла ошибка при запуске отладочной сессии, просмотрите журнал для получения дополнительной информации.", - "typeNotSupported": "Тип сеанса отладки «{0}» не поддерживается." - }, "editor": { "unsavedTitle": "Несохраненный –{0}" }, @@ -415,10 +552,10 @@ "expand": "Развернуть" }, "workspace": { - "deleteCurrentSketch": "Вы хотите удалить текущий скетч?", + "deleteCloudSketch": "Облачный скетч '{0}' будет навсегда удален с серверов Arduino и из локальных кэшей. Это действие необратимо. Вы хотите удалить текущий скетч?", + "deleteCurrentSketch": "Скетч '{0}' будет удален навсегда. Это действие необратимо. Вы хотите удалить текущий эскиз?", "fileNewName": "Имя нового файла", "invalidExtension": "Файлы с расширением \".{0}\" не поддерживаются.", - "invalidFilename": "Неправильное имя файла", "newFileName": "Новое имя файла" } } diff --git a/i18n/hi.json b/i18n/si.json similarity index 52% rename from i18n/hi.json rename to i18n/si.json index 19a3645e0..d712e2a25 100644 --- a/i18n/hi.json +++ b/i18n/si.json @@ -1,41 +1,59 @@ { "arduino": { "about": { - "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}{4} [{5}]\n\n{6}", + "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "About {0}" }, + "account": { + "goToCloudEditor": "Go to Cloud Editor", + "goToIoTCloud": "Go to IoT Cloud", + "goToProfile": "පැතිකඩට යන්න", + "menuTitle": "Arduino Cloud" + }, "board": { "board": "Board{0}", + "boardConfigDialogTitle": "Select Other Board and Port", + "boardDataReloaded": "Board data reloaded.", "boardInfo": "Board Info", + "boards": "පුවරු", "configDialog1": "Select both a Board and a Port if you want to upload a sketch.", "configDialog2": "If you only select a Board you will be able to compile, but not to upload your sketch.", - "configDialogTitle": "Select Other Board & Port", "couldNotFindPreviouslySelected": "Could not find previously selected board '{0}' in installed platform '{1}'. Please manually reselect the board you want to use. Do you want to reselect it now?", - "disconnected": "Disconnected", - "getBoardInfo": "Get Board Info", + "editBoardsConfig": "Edit Board and Port...", + "getBoardInfo": "පුවරුවේ තොරතුරු ලබාගන්න", "inSketchbook": " (in Sketchbook)", - "installManually": "Install Manually", "installNow": "The \"{0} {1}\" core has to be installed for the currently selected \"{2}\" board. Do you want to install it now?", - "noFQBN": "The FQBN is not available for the selected board \"{0}\". Do you have the corresponding core installed?", - "noPortsSelected": "No ports selected for board: '{0}'.", - "noneSelected": "No boards selected.", + "noBoardsFound": "No boards found for \"{0}\"", + "noNativeSerialPort": "Native serial port, can't obtain info.", + "noPortsDiscovered": "No ports discovered", + "nonSerialPort": "Non-serial port, can't obtain info.", "openBoardsConfig": "Select other board and port…", - "platformMissing": "The platform for the selected '{0}' board is not installed.", "pleasePickBoard": "Please pick a board connected to the port you have selected.", "port": "Port{0}", - "portLabel": "Port: {0}", - "programmer": "Programmer", - "reselectLater": "Reselect later", - "selectBoard": "Select Board", - "selectBoardForInfo": "Please select a board to obtain board info.", + "ports": "ports", + "programmer": "ක්‍රමලේඛක", + "reloadBoardData": "Reload Board Data", + "reselectLater": "පසුව තෝරන්න", + "revertBoardsConfig": "Use '{0}' discovered on '{1}'", + "searchBoard": "පුවරුව සොයන්න", + "selectBoard": "පුවරුව තෝරන්න", + "selectBoardToReload": "Please select a board first.", "selectPortForInfo": "Please select a port to obtain board info.", "showAllAvailablePorts": "Shows all available ports when enabled", + "showAllPorts": "Show all ports", "succesfullyInstalledPlatform": "Successfully installed platform {0}:{1}", - "succesfullyUninstalledPlatform": "Successfully uninstalled platform {0}:{1}" + "succesfullyUninstalledPlatform": "Successfully uninstalled platform {0}:{1}", + "typeOfPorts": "{0} ports", + "unconfirmedBoard": "Unconfirmed board", + "unknownBoard": "Unknown board" }, "boardsManager": "Boards Manager", + "boardsType": { + "arduinoCertified": "Arduino Certified" + }, "bootloader": { "burnBootloader": "Burn Bootloader", + "burningBootloader": "Burning bootloader...", "doneBurningBootloader": "Done burning bootloader." }, "burnBootloader": { @@ -46,39 +64,49 @@ "addURL": "Add URL to fetch SSL certificate", "boardAtPort": "{0} at {1}", "certificatesUploaded": "Certificates uploaded.", - "enterURL": "Enter URL", + "enterURL": "ඒ.ස.නි. ලියන්න", "noSupportedBoardConnected": "No supported board connected", "openContext": "Open context", - "remove": "Remove", + "remove": "ඉවත් කරන්න", "selectBoard": "Select a board...", "selectCertificateToUpload": "1. Select certificate to upload", "selectDestinationBoardToUpload": "2. Select destination board and upload certificate", "upload": "Upload", "uploadFailed": "Upload failed. Please try again.", "uploadRootCertificates": "Upload SSL Root Certificates", - "uploadingCertificates": "Uploading certificates." + "uploadingCertificates": "සහතික උඩුගත වෙමින්." + }, + "checkForUpdates": { + "checkForUpdates": "Check for Arduino Updates", + "installAll": "සියල්ල ස්ථාපනය", + "noUpdates": "There are no recent updates available.", + "promptUpdateBoards": "Updates are available for some of your boards.", + "promptUpdateLibraries": "Updates are available for some of your libraries.", + "updatingBoards": "Updating boards...", + "updatingLibraries": "Updating libraries..." }, "cli-error-parser": { "keyboardError": "'Keyboard' not found. Does your sketch include the line '#include <Keyboard.h>'?", "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" }, "cloud": { - "account": "Account", "chooseSketchVisibility": "Choose visibility of your Sketch:", - "connected": "Connected", - "continue": "Continue", - "donePulling": "Done pulling ‘{0}’.", - "donePushing": "Done pushing ‘{0}’.", - "embed": "Embed:", + "cloudSketchbook": "Cloud Sketchbook", + "connected": "සම්බන්ධයි", + "continue": "ඉදිරියට", + "donePulling": "Done pulling '{0}'.", + "donePushing": "Done pushing '{0}'.", + "embed": "කාවැද්දූ:", "emptySketchbook": "Your Sketchbook is empty", - "learnMore": "Learn more", - "link": "Link:", + "goToCloud": "මේඝයට යන්න", + "learnMore": "තව දැනගන්න", + "link": "සබැඳිය:", "notYetPulled": "Cannot push to Cloud. It is not yet pulled.", "offline": "Offline", "openInCloudEditor": "Open in Cloud Editor", - "options": "Options...", + "options": "විකල්ප...", "privateVisibility": "Private. Only you can view the Sketch.", - "profilePicture": "Profile picture", + "profilePicture": "පැතිකඩ රූපය", "publicVisibility": "Public. Anyone with the link can view the Sketch.", "pull": "Pull", "pullFirst": "You have to pull first to be able to push to the Cloud.", @@ -87,50 +115,98 @@ "push": "Push", "pushSketch": "Push Sketch", "pushSketchMsg": "This is a Public Sketch. Before pushing, make sure any sensitive information is defined in arduino_secrets.h files. You can make a Sketch private from the Share panel.", - "remote": "Remote", - "remoteSketchbook": "Remote Sketchbook", - "share": "Share...", + "remote": "දුරස්ථ", + "share": "බෙදාගන්න...", "shareSketch": "Share Sketch", - "showHideRemoveSketchbook": "Show/Hide Remote Sketchbook", - "signIn": "SIGN IN", + "showHideSketchbook": "Show/Hide Cloud Sketchbook", + "signIn": "පිවිසෙන්න", "signInToCloud": "Sign in to Arduino Cloud", - "signOut": "Sign Out", - "sync": "Sync", + "signOut": "නික්මෙන්න", + "sync": "සමමුහූර්තය", "syncEditSketches": "Sync and edit your Arduino Cloud Sketches", "visitArduinoCloud": "Visit Arduino Cloud to create Cloud Sketches." }, + "cloudSketch": { + "alreadyExists": "Cloud sketch '{0}' already exists.", + "creating": "Creating cloud sketch '{0}'...", + "new": "New Cloud Sketch", + "notFound": "Could not pull the cloud sketch '{0}'. It does not exist.", + "pulling": "Synchronizing sketchbook, pulling '{0}'...", + "pushing": "Synchronizing sketchbook, pushing '{0}'...", + "renaming": "Renaming cloud sketch from '{0}' to '{1}'...", + "synchronizingSketchbook": "Synchronizing sketchbook..." + }, "common": { - "later": "Later", - "noBoardSelected": "No board selected", - "notConnected": "[not connected]", + "all": "සියල්ල", + "contributed": "Contributed", + "installManually": "අතින් ස්ථාපනය", + "later": "පසුව", + "noBoardSelected": "පුවරුවක් තෝරා නැත", + "noSketchOpened": "No sketch opened", + "notConnected": "[සම්බන්ධ වී නැත]", "offlineIndicator": "You appear to be offline. Without an Internet connection, the Arduino CLI might not be able to download the required resources and could cause malfunction. Please connect to the Internet and restart the application.", "oldFormat": "The '{0}' still uses the old `.pde` format. Do you want to switch to the new `.ino` extension?", - "processing": "Processing", - "selectBoard": "Select Board", + "partner": "Partner", + "processing": "සැකසෙමින්", + "recommended": "නිර්දේශිත", + "retired": "Retired", + "selectManually": "අතින් තෝරන්න", "selectedOn": "on {0}", "serialMonitor": "Serial Monitor", - "unknown": "Unknown" + "type": "වර්ගය", + "unknown": "නොදන්නා", + "updateable": "Updatable", + "userAbort": "User abort" }, "compile": { "error": "Compilation error: {0}" }, "component": { + "boardsIncluded": "Boards included in this package:", "by": "by", + "clickToOpen": "Click to open in browser: {0}", "filterSearch": "Filter your search...", - "install": "INSTALL", + "install": "ස්ථාපනය", + "installLatest": "Install Latest", + "installVersion": "Install {0}", + "installed": "{0} installed", "moreInfo": "More info", - "uninstall": "Uninstall", + "otherVersions": "Other Versions", + "remove": "ඉවත් කරන්න", + "title": "{0} by {1}", + "uninstall": "අස්ථාපනය", "uninstallMsg": "Do you want to uninstall {0}?", - "version": "Version {0}" + "update": "Update" + }, + "configuration": { + "cli": { + "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" + } + }, + "connectionStatus": { + "connectionLost": "Connection lost. Cloud sketch actions and updates won't be available." }, "contributions": { "addFile": "Add File", "fileAdded": "One file added to the sketch.", + "plotter": { + "couldNotOpen": "Couldn't open serial plotter" + }, "replaceTitle": "Replace" }, + "core": { + "compilerWarnings": { + "all": "සියල්ල", + "default": "Default", + "more": "More", + "none": "None" + } + }, "coreContribution": { - "copyError": "Copy error messages" + "copyError": "Copy error messages", + "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." }, + "createCloudCopy": "Push Sketch to Cloud", "daemon": { "restart": "Restart Daemon", "start": "Start Daemon", @@ -139,8 +215,15 @@ "debug": { "debugWithMessage": "Debug - {0}", "debuggingNotSupported": "Debugging is not supported by '{0}'", + "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "Platform is not installed for '{0}'", - "optimizeForDebugging": "Optimize for Debugging" + "optimizeForDebugging": "Optimize for Debugging", + "sketchIsNotCompiled": "Sketch '{0}' must be verified before starting a debug session. Please verify the sketch and start debugging again. Do you want to verify the sketch now?" + }, + "developer": { + "clearBoardList": "Clear the Board List History", + "clearBoardsConfig": "Clear the Board and Port Selection", + "dumpBoardList": "Dump the Board List" }, "dialog": { "dontAskAgain": "Don't ask again" @@ -154,11 +237,8 @@ "increaseFontSize": "Increase Font Size", "increaseIndent": "Increase Indent", "nextError": "Next Error", - "previousError": "Previous Error" - }, - "electron": { - "couldNotSave": "Could not save the sketch. Please copy your unsaved work into your favorite text editor, and restart the IDE.", - "unsavedChanges": "Any unsaved changes will not be saved." + "previousError": "Previous Error", + "revealError": "Reveal Error" }, "examples": { "builtInExamples": "Built-in examples", @@ -171,13 +251,13 @@ "firmware": { "checkUpdates": "Check Updates", "failedInstall": "Installation failed. Please try again.", - "install": "Install", + "install": "ස්ථාපනය", "installingFirmware": "Installing firmware.", "overwriteSketch": "Installation will overwrite the Sketch on the board.", - "selectBoard": "Select Board", + "selectBoard": "පුවරුව තෝරන්න", "selectVersion": "Select firmware version", "successfullyInstalled": "Firmware successfully installed.", - "updater": "WiFi101 / WiFiNINA Firmware Updater" + "updater": "Firmware Updater" }, "help": { "environment": "Environment", @@ -192,9 +272,12 @@ "visit": "Visit Arduino.cc" }, "ide-updater": { - "checkForUpdates": "Check for Arduino IDE updates", + "checkForUpdates": "Check for Arduino IDE Updates", "closeAndInstallButton": "Close and Install", "closeToInstallNotice": "Close the software and install the update on your machine.", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", "downloadButton": "Download", "downloadingNotice": "Downloading the latest version of the Arduino IDE.", "errorCheckingForUpdates": "Error while checking for Arduino IDE updates.\n{0}", @@ -208,16 +291,20 @@ "updateAvailable": "Update Available", "versionDownloaded": "Arduino IDE {0} has been downloaded." }, + "installable": { + "libraryInstallFailed": "Failed to install library: '{0}{1}'.", + "platformInstallFailed": "Failed to install platform: '{0}{1}'." + }, "library": { "addZip": "Add .ZIP Library...", "arduinoLibraries": "Arduino libraries", "contributedLibraries": "Contributed libraries", - "dependenciesForLibrary": "Dependencies for library {0}:{1}", "include": "Include Library", - "installAll": "Install all", + "installAll": "සියල්ල ස්ථාපනය", + "installLibraryDependencies": "Install library dependencies", "installMissingDependencies": "Would you like to install all the missing dependencies?", "installOneMissingDependency": "Would you like to install the missing dependency?", - "installOnly": "Install {0} only", + "installWithoutDependencies": "Install without dependencies", "installedSuccessfully": "Successfully installed library {0}:{1}", "libraryAlreadyExists": "A library already exists. Do you want to overwrite it?", "manageLibraries": "Manage Libraries...", @@ -230,15 +317,47 @@ "uninstalledSuccessfully": "Successfully uninstalled library {0}:{1}", "zipLibrary": "Library" }, + "librarySearchProperty": { + "topic": "Topic" + }, + "libraryTopic": { + "communication": "Communication", + "dataProcessing": "Data Processing", + "dataStorage": "Data Storage", + "deviceControl": "Device Control", + "display": "Display", + "other": "Other", + "sensors": "Sensors", + "signalInputOutput": "Signal Input/Output", + "timing": "Timing", + "uncategorized": "Uncategorized" + }, + "libraryType": { + "installed": "Installed" + }, "menu": { "advanced": "Advanced", "sketch": "Sketch", "tools": "Tools" }, "monitor": { + "alreadyConnectedError": "Could not connect to {0} {1} port. Already connected.", + "baudRate": "{0} baud", + "connectionFailedError": "Could not connect to {0} {1} port.", + "connectionFailedErrorWithDetails": "{0} Could not connect to {1} {2} port.", + "connectionTimeout": "Timeout. The IDE has not received the 'success' message from the monitor after successfully connecting to it", + "missingConfigurationError": "Could not connect to {0} {1} port. The monitor configuration is missing.", + "notConnectedError": "Not connected to {0} {1} port.", "unableToCloseWebSocket": "Unable to close websocket", "unableToConnectToWebSocket": "Unable to connect to websocket" }, + "newCloudSketch": { + "newSketchTitle": "Name of the new Cloud Sketch" + }, + "portProtocol": { + "network": "Network", + "serial": "Serial" + }, "preferences": { "additionalManagerURLs": "Additional Boards Manager URLs", "auth.audience": "The OAuth2 audience.", @@ -248,12 +367,14 @@ "automatic": "Automatic", "board.certificates": "List of certificates that can be uploaded to boards", "browse": "Browse", + "checkForUpdate": "Receive notifications of available updates for the IDE, boards, and libraries. Requires an IDE restart after change. It's true by default.", "choose": "Choose", "cli.daemonDebug": "Enable debug logging of the gRPC calls to the Arduino CLI. A restart of the IDE is needed for this setting to take effect. It's false by default.", "cloud.enabled": "True if the sketch sync functions are enabled. Defaults to true.", "cloud.pull.warn": "True if users should be warned before pulling a cloud sketch. Defaults to true.", "cloud.push.warn": "True if users should be warned before pushing a cloud sketch. Defaults to true.", "cloud.pushpublic.warn": "True if users should be warned before pushing a public sketch to the cloud. Defaults to true.", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", "cloud.sketchSyncEndpoint": "The endpoint used to push and pull sketches from a backend. By default it points to Arduino Cloud API.", "compile": "compile", "compile.experimental": "True if the IDE should handle multiple compiler errors. False by default", @@ -271,29 +392,50 @@ "invalid.editorFontSize": "Invalid editor font size. It must be a positive integer.", "invalid.sketchbook.location": "Invalid sketchbook location: {0}", "invalid.theme": "Invalid theme.", + "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", "language.log": "True if the Arduino Language Server should generate log files into the sketch folder. Otherwise, false. It's false by default.", "language.realTimeDiagnostics": "If true, the language server provides real-time diagnostics when typing in the editor. It's false by default.", "manualProxy": "Manual proxy configuration", + "monitor": { + "dockPanel": "The area of the application shell where the _{0}_ widget will reside. It is either \"bottom\" or \"right\". It defaults to \"{1}\"." + }, "network": "Network", "newSketchbookLocation": "Select new sketchbook location", + "noCliConfig": "Could not load the CLI configuration", "noProxy": "No proxy", + "proxySettings": { + "hostname": "Host name", + "password": "Password", + "port": "Port number", + "username": "Username" + }, "showVerbose": "Show verbose output during", + "sketch": { + "inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect." + }, "sketchbook.location": "Sketchbook location", "sketchbook.showAllFiles": "True to show all sketch files inside the sketch. It is false by default.", - "survey.notification": "True if users should be notified if a survey is available. True by default.", "unofficialBoardSupport": "Click for a list of unofficial board support URLs", "upload": "upload", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", "upload.verbose": "True for verbose upload output. False by default.", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "Verify code after upload", "window.autoScale": "True if the user interface automatically scales with the font size.", - "window.zoomLevel": "Adjust the zoom level of the window. The original size is 0 and each increment above (e.g. 1) or below (e.g. -1) represents zooming 20% larger or smaller. You can also enter decimals to adjust the zoom level with a finer granularity." + "window.zoomLevel": { + "deprecationMessage": "Deprecated. Use 'window.zoomLevel' instead." + } + }, + "renameCloudSketch": { + "renameSketchTitle": "New name of the Cloud Sketch" }, "replaceMsg": "Replace the existing version of {0}?", "selectZip": "Select a zip file containing the library you'd like to add", "serial": { "autoscroll": "Autoscroll", "carriageReturn": "Carriage Return", - "message": "Message ({0} + Enter to send message to '{1}' on '{2}')", + "connecting": "Connecting to '{0}' on '{1}'...", + "message": "Message (Enter to send message to '{0}' on '{1}')", "newLine": "New Line", "newLineCarriageReturn": "Both NL & CR", "noLineEndings": "No Line Ending", @@ -305,48 +447,93 @@ "sketch": { "archiveSketch": "Archive Sketch", "cantOpen": "A folder named \"{0}\" already exists. Can't open sketch.", - "close": "Are you sure you want to close the sketch?", - "configureAndUpload": "Configure And Upload", + "compile": "Compiling sketch...", + "configureAndUpload": "Configure and Upload", "createdArchive": "Created archive '{0}'.", "doneCompiling": "Done compiling.", "doneUploading": "Done uploading.", + "editInvalidSketchFolderLocationQuestion": "Do you want to try saving the sketch to a different location?", + "editInvalidSketchFolderQuestion": "Do you want to try saving the sketch with a different name?", "exportBinary": "Export Compiled Binary", + "invalidCloudSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", + "invalidSketchFolderLocationDetails": "You cannot save a sketch into a folder inside itself.", + "invalidSketchFolderLocationMessage": "Invalid sketch folder location: '{0}'", + "invalidSketchFolderNameMessage": "Invalid sketch folder name: '{0}'", + "invalidSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", "moving": "Moving", "movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?", - "new": "New", + "new": "New Sketch", + "noTrailingPeriod": "A filename cannot end with a dot", "openFolder": "Open Folder", "openRecent": "Open Recent", "openSketchInNewWindow": "Open Sketch in New Window", + "reservedFilename": "'{0}' is a reserved filename.", "saveFolderAs": "Save sketch folder as...", + "saveSketch": "Save your sketch to open it again later.", "saveSketchAs": "Save sketch folder as...", - "saveTempSketch": "Save your sketch to open it again later.", "showFolder": "Show Sketch Folder", "sketch": "Sketch", + "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", + "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", "sketchbook": "Sketchbook", "titleLocalSketchbook": "Local Sketchbook", "titleSketchbook": "Sketchbook", "upload": "Upload", "uploadUsingProgrammer": "Upload Using Programmer", + "uploading": "Uploading...", "userFieldsNotFoundError": "Can't find user fields for connected board", "verify": "Verify", "verifyOrCompile": "Verify/Compile" }, - "survey": { - "answerSurvey": "Answer survey", - "dismissSurvey": "Don't show again", - "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." + "sketchbook": { + "newCloudSketch": "New Cloud Sketch", + "newSketch": "New Sketch" + }, + "theme": { + "currentThemeNotFound": "Could not find the currently selected theme: {0}. Arduino IDE has picked a built-in theme compatible with the missing one.", + "dark": "Dark", + "deprecated": "{0} (deprecated)", + "hc": "Dark High Contrast", + "hcLight": "Light High Contrast", + "light": "Light", + "user": "{0} (user)" + }, + "title": { + "cloud": "Cloud" + }, + "updateIndexes": { + "updateIndexes": "Update Indexes", + "updateLibraryIndex": "Update Library Index", + "updatePackageIndex": "Update Package Index" }, "upload": { "error": "{0} error: {1}" }, "userFields": { "cancel": "Cancel", + "enterField": "Enter {0}", "upload": "Upload" + }, + "validateSketch": { + "abortFixMessage": "The sketch is still invalid. Do you want to fix the remaining problems? By clicking '{0}', a new sketch will open.", + "abortFixTitle": "Invalid sketch", + "renameSketchFileMessage": "The sketch file '{0}' cannot be used. {1} Do you want to rename the sketch file now?", + "renameSketchFileTitle": "Invalid sketch filename", + "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", + "renameSketchFolderTitle": "Invalid sketch name" + }, + "versionWelcome": { + "cancelButton": "Maybe later", + "donateButton": "Donate now", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Welcome to a new version of the Arduino IDE!", + "titleWithVersion": "Welcome to the new Arduino IDE {0}!" + }, + "workspace": { + "alreadyExists": "'{0}' already exists." } }, - "cloud": { - "GoToCloud": "GO TO CLOUD" - }, "theia": { "core": { "cannotConnectBackend": "Cannot connect to the backend.", @@ -354,14 +541,9 @@ "couldNotSave": "Could not save the sketch. Please copy your unsaved work into your favorite text editor, and restart the IDE.", "daemonOffline": "CLI Daemon Offline", "offline": "Offline", - "quitMessage": "Any unsaved changes will not be saved.", + "offlineText": "Offline", "quitTitle": "Are you sure you want to quit?" }, - "debug": { - "start": "Start...", - "startError": "There was an error starting the debug session, check the logs for more details.", - "typeNotSupported": "The debug session type \"{0}\" is not supported." - }, "editor": { "unsavedTitle": "Unsaved – {0}" }, @@ -370,10 +552,10 @@ "expand": "Expand" }, "workspace": { - "deleteCurrentSketch": "Do you want to delete the current sketch?", + "deleteCloudSketch": "The cloud sketch '{0}' will be permanently deleted from the Arduino servers and the local caches. This action is irreversible. Do you want to delete the current sketch?", + "deleteCurrentSketch": "The sketch '{0}' will be permanently deleted. This action is irreversible. Do you want to delete the current sketch?", "fileNewName": "Name for new file", "invalidExtension": ".{0} is not a valid extension", - "invalidFilename": "Invalid filename.", "newFileName": "New name for file" } } diff --git a/i18n/sq.json b/i18n/sq.json deleted file mode 100644 index 1ebc51e5d..000000000 --- a/i18n/sq.json +++ /dev/null @@ -1,350 +0,0 @@ -{ - "arduino": { - "common": { - "offlineIndicator": "You appear to be offline. Without an Internet connection, the Arduino CLI might not be able to download the required resources and could cause malfunction. Please connect to the Internet and restart the application.", - "noBoardSelected": "No board selected", - "selectedOn": "on {0}", - "notConnected": "[not connected]", - "serialMonitor": "Serial Monitor", - "oldFormat": "The '{0}' still uses the old `.pde` format. Do you want to switch to the new `.ino` extension?", - "later": "Later", - "selectBoard": "Select Board", - "unknown": "Unknown", - "processing": "Processing", - "saveChangesToSketch": "Do you want to save changes to this sketch before closing?", - "loseChanges": "If you don't save, your changes will be lost." - }, - "ide-updater": { - "errorCheckingForUpdates": "Error while checking for Arduino IDE updates.\n{0}", - "notNowButton": "Not now", - "versionDownloaded": "Arduino IDE {0} has been downloaded.", - "closeToInstallNotice": "Close the software and install the update on your machine.", - "closeAndInstallButton": "Close and Install", - "downloadingNotice": "Downloading the latest version of the Arduino IDE.", - "updateAvailable": "Update Available", - "newVersionAvailable": "A new version of Arduino IDE ({0}) is available for download.", - "skipVersionButton": "Skip Version", - "downloadButton": "Download", - "goToDownloadPage": "An update for the Arduino IDE is available, but we're not able to download and install it automatically. Please go to the download page and download the latest version from there.", - "goToDownloadButton": "Go To Download", - "ideUpdaterDialog": "Software Update", - "noUpdatesAvailable": "There are no recent updates available for the Arduino IDE" - }, - "menu": { - "sketch": "Sketch", - "tools": "Tools" - }, - "debug": { - "optimizeForDebugging": "Optimize for Debugging", - "debugWithMessage": "Debug - {0}", - "noPlatformInstalledFor": "Platform is not installed for '{0}'", - "debuggingNotSupported": "Debugging is not supported by '{0}'" - }, - "preferences": { - "language.log": "True if the Arduino Language Server should generate log files into the sketch folder. Otherwise, false. It's false by default.", - "compile.verbose": "True for verbose compile output. False by default", - "compile.warnings": "Tells gcc which warning level to use. It's 'None' by default", - "upload.verbose": "True for verbose upload output. False by default.", - "window.autoScale": "True if the user interface automatically scales with the font size.", - "window.zoomLevel": "Adjust the zoom level of the window. The original size is 0 and each increment above (e.g. 1) or below (e.g. -1) represents zooming 20% larger or smaller. You can also enter decimals to adjust the zoom level with a finer granularity.", - "ide.updateChannel": "Release channel to get updated from. 'stable' is the stable release, 'nightly' is the latest development build.", - "board.certificates": "List of certificates that can be uploaded to boards", - "sketchbook.showAllFiles": "True to show all sketch files inside the sketch. It is false by default.", - "cloud.enabled": "True if the sketch sync functions are enabled. Defaults to true.", - "cloud.pull.warn": "True if users should be warned before pulling a cloud sketch. Defaults to true.", - "cloud.push.warn": "True if users should be warned before pushing a cloud sketch. Defaults to true.", - "cloud.pushpublic.warn": "True if users should be warned before pushing a public sketch to the cloud. Defaults to true.", - "cloud.sketchSyncEnpoint": "The endpoint used to push and pull sketches from a backend. By default it points to Arduino Cloud API.", - "auth.clientID": "The OAuth2 client ID.", - "auth.domain": "The OAuth2 domain.", - "auth.audience": "The OAuth2 audience.", - "auth.registerUri": "The URI used to register a new user.", - "network": "Network", - "sketchbook.location": "Sketchbook location", - "browse": "Browse", - "files.inside.sketches": "Show files inside Sketches", - "editorFontSize": "Editor font size", - "interfaceScale": "Interface scale", - "showVerbose": "Show verbose output during", - "compilerWarnings": "Compiler warnings", - "automatic": "Automatic", - "compile": "compile", - "upload": "upload", - "verifyAfterUpload": "Verify code after upload", - "editorQuickSuggestions": "Editor Quick Suggestions", - "additionalManagerURLs": "Additional Boards Manager URLs", - "noProxy": "No proxy", - "manualProxy": "Manual proxy configuration", - "newSketchbookLocation": "Select new sketchbook location", - "choose": "Choose", - "enterAdditionalURLs": "Enter additional URLs, one for each row", - "unofficialBoardSupport": "Click for a list of unofficial board support URLs", - "invalid.sketchbook.location": "Invalid sketchbook location: {0}", - "invalid.editorFontSize": "Invalid editor font size. It must be a positive integer.", - "invalid.theme": "Invalid theme." - }, - "cloud": { - "signIn": "SIGN IN", - "signOut": "Sign Out", - "chooseSketchVisibility": "Choose visibility of your Sketch:", - "privateVisibility": "Private. Only you can view the Sketch.", - "publicVisibility": "Public. Anyone with the link can view the Sketch.", - "link": "Link:", - "embed": "Embed:", - "cloudSketchbook": "Cloud Sketchbook", - "shareSketch": "Share Sketch", - "showHideRemoveSketchbook": "Show/Hide Remote Sketchbook", - "pullSketch": "Pull Sketch", - "openInCloudEditor": "Open in Cloud Editor", - "options": "Options...", - "share": "Share...", - "remote": "Remote", - "emptySketchbook": "Your Sketchbook is empty", - "visitArduinoCloud": "Visit Arduino Cloud to create Cloud Sketches.", - "signInToCloud": "Sign in to Arduino Cloud", - "syncEditSketches": "Sync and edit your Arduino Cloud Sketches", - "learnMore": "Learn more", - "continue": "Continue", - "pushSketch": "Push Sketch", - "pushSketchMsg": "This is a Public Sketch. Before pushing, make sure any sensitive information is defined in arduino_secrets.h files. You can make a Sketch private from the Share panel.", - "pull": "Pull", - "pullSketchMsg": "Pulling this Sketch from the Cloud will overwrite its local version. Are you sure you want to continue?", - "donePulling": "Done pulling ‘{0}’.", - "notYetPulled": "Cannot push to Cloud. It is not yet pulled.", - "push": "Push", - "pullFirst": "You have to pull first to be able to push to the Cloud.", - "donePushing": "Done pushing ‘{0}’.", - "connected": "Connected", - "offline": "Offline", - "profilePicture": "Profile picture" - }, - "board": { - "installManually": "Install Manually", - "installNow": "The \"{0} {1}\" core has to be installed for the currently selected \"{2}\" board. Do you want to install it now?", - "configDialogTitle": "Select Other Board & Port", - "configDialog1": "Select both a Board and a Port if you want to upload a sketch.", - "configDialog2": "If you only select a Board you will be able to compile, but not to upload your sketch.", - "pleasePickBoard": "Please pick a board connected to the port you have selected.", - "showAllAvailablePorts": "Shows all available ports when enabled", - "programmer": "Programmer", - "succesfullyInstalledPlatform": "Successfully installed platform {0}:{1}", - "succesfullyUninstalledPlatform": "Successfully uninstalled platform {0}:{1}", - "couldNotFindPreviouslySelected": "Could not find previously selected board '{0}' in installed platform '{1}'. Please manually reselect the board you want to use. Do you want to reselect it now?", - "reselectLater": "Reselect later", - "noneSelected": "No boards selected.", - "noPortsSelected": "No ports selected for board: '{0}'.", - "noFQBN": "The FQBN is not available for the selected board \"{0}\". Do you have the corresponding core installed?", - "openBoardsConfig": "Select other board and port…", - "boardListItem": "{0} at {1}", - "selectBoardForInfo": "Please select a board to obtain board info.", - "platformMissing": "The platform for the selected '{0}' board is not installed.", - "selectPortForInfo": "Please select a port to obtain board info.", - "boardInfo": "Board Info", - "board": "Board{0}", - "port": "Port{0}", - "getBoardInfo": "Get Board Info", - "inSketchbook": " (in Sketchbook)" - }, - "boardsManager": "Boards Manager", - "about": { - "label": "About {0}", - "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}{4} [{5}]\n\n{6}" - }, - "contributions": { - "addFile": "Add File", - "replaceTitle": "Replace", - "fileAdded": "One file added to the sketch." - }, - "replaceMsg": "Replace the existing version of {0}?", - "library": { - "addZip": "Add .ZIP Library...", - "zipLibrary": "Library", - "overwriteExistingLibrary": "Do you want to overwrite the existing library?", - "successfullyInstalledZipLibrary": "Successfully installed library from {0} archive", - "namedLibraryAlreadyExists": "A library folder named {0} already exists. Do you want to overwrite it?", - "libraryAlreadyExists": "A library already exists. Do you want to overwrite it?", - "include": "Include Library", - "manageLibraries": "Manage Libraries...", - "arduinoLibraries": "Arduino libraries", - "contributedLibraries": "Contributed libraries", - "title": "Library Manager", - "needsOneDependency": "The library <b>{0}:{1}</b> needs another dependency currently not installed:", - "needsMultipleDependencies": "The library <b>{0}:{1}</b> needs some other dependencies currently not installed:", - "installOneMissingDependency": "Would you like to install the missing dependency?", - "installMissingDependencies": "Would you like to install all the missing dependencies?", - "dependenciesForLibrary": "Dependencies for library {0}:{1}", - "installAll": "Install all", - "installOnly": "Install {0} only", - "installedSuccessfully": "Successfully installed library {0}:{1}", - "uninstalledSuccessfully": "Successfully uninstalled library {0}:{1}" - }, - "selectZip": "Select a zip file containing the library you'd like to add", - "sketch": { - "archiveSketch": "Archive Sketch", - "saveSketchAs": "Save sketch folder as...", - "createdArchive": "Created archive '{0}'.", - "new": "New", - "openRecent": "Open Recent", - "showFolder": "Show Sketch Folder", - "sketch": "Sketch", - "moving": "Moving", - "movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?", - "cantOpen": "A folder named \"{0}\" already exists. Can't open sketch.", - "saveFolderAs": "Save sketch folder as...", - "sketchbook": "Sketchbook", - "upload": "Upload", - "uploadUsingProgrammer": "Upload Using Programmer", - "userFieldsNotFoundError": "Can't find user fields for connected board", - "doneUploading": "Done uploading.", - "configureAndUpload": "Configure And Upload", - "verifyOrCompile": "Verify/Compile", - "exportBinary": "Export Compiled Binary", - "verify": "Verify", - "doneCompiling": "Done compiling.", - "couldNotConnectToSerial": "Could not reconnect to serial port. {0}", - "openSketchInNewWindow": "Open Sketch in New Window", - "openFolder": "Open Folder", - "titleLocalSketchbook": "Local Sketchbook", - "titleSketchbook": "Sketchbook", - "close": "Are you sure you want to close the sketch?" - }, - "bootloader": { - "burnBootloader": "Burn Bootloader", - "doneBurningBootloader": "Done burning bootloader." - }, - "editor": { - "copyForForum": "Copy for Forum (Markdown)", - "commentUncomment": "Comment/Uncomment", - "increaseIndent": "Increase Indent", - "decreaseIndent": "Decrease Indent", - "increaseFontSize": "Increase Font Size", - "decreaseFontSize": "Decrease Font Size", - "autoFormat": "Auto Format" - }, - "examples": { - "menu": "Examples", - "couldNotInitializeExamples": "Could not initialize built-in examples.", - "builtInExamples": "Built-in examples", - "customLibrary": "Examples from Custom Libraries", - "for": "Examples for {0}", - "forAny": "Examples for any board" - }, - "help": { - "search": "Search on Arduino.cc", - "keyword": "Type a keyword", - "gettingStarted": "Getting Started", - "environment": "Environment", - "troubleshooting": "Troubleshooting", - "reference": "Reference", - "findInReference": "Find in Reference", - "faq": "Frequently Asked Questions", - "visit": "Visit Arduino.cc", - "privacyPolicy": "Privacy Policy" - }, - "certificate": { - "uploadRootCertificates": "Upload SSL Root Certificates", - "openContext": "Open context", - "remove": "Remove", - "upload": "Upload", - "addURL": "Add URL to fetch SSL certificate", - "enterURL": "Enter URL", - "selectCertificateToUpload": "1. Select certificate to upload", - "addNew": "Add New", - "selectDestinationBoardToUpload": "2. Select destination board and upload certificate", - "uploadingCertificates": "Uploading certificates.", - "certificatesUploaded": "Certificates uploaded.", - "uploadFailed": "Upload failed. Please try again.", - "selectBoard": "Select a board...", - "boardAtPort": "{0} at {1}", - "noSupportedBoardConnected": "No supported board connected" - }, - "firmware": { - "updater": "WiFi101 / WiFiNINA Firmware Updater", - "selectBoard": "Select Board", - "checkUpdates": "Check Updates", - "selectVersion": "Select firmware version", - "install": "Install", - "overwriteSketch": "Installation will overwrite the Sketch on the board.", - "installingFirmware": "Installing firmware.", - "successfullyInstalled": "Firmware successfully installed.", - "failedInstall": "Installation failed. Please try again." - }, - "dialog": { - "dontAskAgain": "Don't ask again" - }, - "userFields": { - "cancel": "Cancel", - "upload": "Upload" - }, - "serial": { - "toggleTimestamp": "Toggle Timestamp", - "autoscroll": "Autoscroll", - "timestamp": "Timestamp", - "noLineEndings": "No Line Ending", - "newLine": "New Line", - "carriageReturn": "Carriage Return", - "newLineCarriageReturn": "Both NL & CR", - "notConnected": "Not connected. Select a board and a port to connect automatically.", - "message": "Message ({0} + Enter to send message to '{1}' on '{2}')", - "connectionBusy": "Connection failed. Serial port is busy: {0}", - "disconnected": "Disconnected {0} from {1}.", - "unexpectedError": "Unexpected error. Reconnecting {0} on port {1}.", - "failedReconnect": "Failed to reconnect {0} to serial port after 10 consecutive attempts. The {1} serial port is busy.", - "reconnect": "Reconnecting {0} to {1} in {2} seconds..." - }, - "component": { - "uninstall": "Uninstall", - "uninstallMsg": "Do you want to uninstall {0}?", - "by": "by", - "version": "Version {0}", - "moreInfo": "More info", - "install": "INSTALL", - "filterSearch": "Filter your search..." - }, - "electron": { - "couldNotSave": "Could not save the sketch. Please copy your unsaved work into your favorite text editor, and restart the IDE.", - "unsavedChanges": "Any unsaved changes will not be saved." - }, - "compile": { - "error": "Compilation error: {0}" - }, - "upload": { - "error": "{0} error: {1}" - }, - "burnBootloader": { - "error": "Error while burning the bootloader: {0}" - } - }, - "theia": { - "core": { - "couldNotSave": "Could not save the sketch. Please copy your unsaved work into your favorite text editor, and restart the IDE.", - "offline": "Offline", - "daemonOffline": "CLI Daemon Offline", - "cannotConnectBackend": "Cannot connect to the backend.", - "cannotConnectDaemon": "Cannot connect to the CLI daemon." - }, - "debug": { - "start": "Start...", - "typeNotSupported": "The debug session type \"{0}\" is not supported.", - "startError": "There was an error starting the debug session, check the logs for more details." - }, - "editor": { - "unsavedTitle": "Unsaved – {0}" - }, - "messages": { - "expand": "Expand", - "collapse": "Collapse" - }, - "workspace": { - "fileNewName": "Name for new file", - "invalidFilename": "Invalid filename.", - "invalidExtension": ".{0} is not a valid extension", - "newFileName": "New name for file", - "deleteCurrentSketch": "Do you want to delete the current sketch?", - "sketchDirectoryError": "There was an error creating the sketch directory. See the log for more details. The application will probably not work as expected." - } - }, - "cloud": { - "GoToCloud": "GO TO CLOUD" - } -} diff --git a/i18n/sr.json b/i18n/sr.json index 1b0eed34e..3486d25a8 100644 --- a/i18n/sr.json +++ b/i18n/sr.json @@ -1,38 +1,51 @@ { "arduino": { "about": { - "detail": "Верзија: {0}\nДатум: {1}{2}\nCLI верзија: {3}{4} [{5}]\n\n{6}", + "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "О {0}" }, + "account": { + "goToCloudEditor": "Go to Cloud Editor", + "goToIoTCloud": "Go to IoT Cloud", + "goToProfile": "Go to Profile", + "menuTitle": "Arduino Cloud" + }, "board": { "board": "Плоча{0}", "boardConfigDialogTitle": "Select Other Board and Port", + "boardDataReloaded": "Board data reloaded.", "boardInfo": "Информације о плочи", + "boards": "boards", "configDialog1": "Одабери и плочу и порт ако желиш да спустиш рад.", "configDialog2": "Ако одабереш само плочу моћи ћеш само да преведеш, али не и да спустиш рад.", "couldNotFindPreviouslySelected": "Could not find previously selected board '{0}' in installed platform '{1}'. Please manually reselect the board you want to use. Do you want to reselect it now?", - "disconnected": "Disconnected", + "editBoardsConfig": "Edit Board and Port...", "getBoardInfo": "Дохвати информације о плочи", "inSketchbook": "(у радној свесци)", "installNow": "The \"{0} {1}\" core has to be installed for the currently selected \"{2}\" board. Do you want to install it now?", - "noFQBN": "The FQBN is not available for the selected board \"{0}\". Do you have the corresponding core installed?", + "noBoardsFound": "No boards found for \"{0}\"", + "noNativeSerialPort": "Native serial port, can't obtain info.", "noPortsDiscovered": "No ports discovered", - "noPortsSelected": "Ниједан порт није одабран за плочу: '{0}'.", - "noneSelected": "Ниједна плоча није одабрана.", + "nonSerialPort": "Non-serial port, can't obtain info.", "openBoardsConfig": "Одабери другу плочу и порт...", - "platformMissing": "Платформа за одабрану плочу '{0}' није инсталирана.", "pleasePickBoard": "Одабери плочу повезану са одабраним портом.", "port": "Порт{0}", - "portLabel": "Port: {0}", + "ports": "ports", "programmer": "Програмер", + "reloadBoardData": "Reload Board Data", "reselectLater": "Одабери поново касније", + "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "Search board", "selectBoard": "Одабери плочу", - "selectBoardForInfo": "Одабери плочу да добијеш информације о њој.", + "selectBoardToReload": "Please select a board first.", "selectPortForInfo": "Одабери порт да добијеш информације о плочи", "showAllAvailablePorts": "Приказује све доступне портове када је укључено", + "showAllPorts": "Show all ports", "succesfullyInstalledPlatform": "Успјешно инсталирана платформа {0}:{1}", - "succesfullyUninstalledPlatform": "Успјешно деинсталирана платформа {0}:{1}" + "succesfullyUninstalledPlatform": "Успјешно деинсталирана платформа {0}:{1}", + "typeOfPorts": "{0} ports", + "unconfirmedBoard": "Unconfirmed board", + "unknownBoard": "Unknown board" }, "boardsManager": "Управљач плочама", "boardsType": { @@ -77,14 +90,15 @@ "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" }, "cloud": { - "account": "Account", "chooseSketchVisibility": "Одабери видљивост твог рада:", + "cloudSketchbook": "Cloud Sketchbook", "connected": "Повезан", "continue": "Наставите", - "donePulling": "Готово повлачење ‘{0}’.", - "donePushing": "Done pushing ‘{0}’.", + "donePulling": "Done pulling '{0}'.", + "donePushing": "Done pushing '{0}'.", "embed": "Угради:", "emptySketchbook": "Твоја радна свеска је празна", + "goToCloud": "Go to Cloud", "learnMore": "Сазнајте више", "link": "Линк:", "notYetPulled": "Cannot push to Cloud. It is not yet pulled.", @@ -102,10 +116,9 @@ "pushSketch": "Push Sketch", "pushSketchMsg": "This is a Public Sketch. Before pushing, make sure any sensitive information is defined in arduino_secrets.h files. You can make a Sketch private from the Share panel.", "remote": "Удаљени", - "remoteSketchbook": "Remote Sketchbook", "share": "Подјели...", "shareSketch": "Подјели рад", - "showHideRemoveSketchbook": "Прикажи/Сакриј удаљене радне свеске", + "showHideSketchbook": "Show/Hide Cloud Sketchbook", "signIn": "ПРИЈАВИ СЕ", "signInToCloud": "Улогујте се на Arduino Cloud", "signOut": "Одјави се", @@ -113,12 +126,23 @@ "syncEditSketches": "Sync and edit your Arduino Cloud Sketches", "visitArduinoCloud": "Visit Arduino Cloud to create Cloud Sketches." }, + "cloudSketch": { + "alreadyExists": "Cloud sketch '{0}' already exists.", + "creating": "Creating cloud sketch '{0}'...", + "new": "New Cloud Sketch", + "notFound": "Could not pull the cloud sketch '{0}'. It does not exist.", + "pulling": "Synchronizing sketchbook, pulling '{0}'...", + "pushing": "Synchronizing sketchbook, pushing '{0}'...", + "renaming": "Renaming cloud sketch from '{0}' to '{1}'...", + "synchronizingSketchbook": "Synchronizing sketchbook..." + }, "common": { "all": "All", "contributed": "Contributed", "installManually": "Инсталирај ручно", "later": "Касније", "noBoardSelected": "Плоча није одабрана", + "noSketchOpened": "No sketch opened", "notConnected": "[није повезано]", "offlineIndicator": "Изгледа да сте ван мреже. Без интернет везе, Arduino CLI можда неће моћи да преузме потребне ресурсе и може изазвати квар. Повежите се на Интернет и поново покрените апликацију.", "oldFormat": "The '{0}' still uses the old `.pde` format. Do you want to switch to the new `.ino` extension?", @@ -126,11 +150,13 @@ "processing": "Обрађује се", "recommended": "Recommended", "retired": "Retired", + "selectManually": "Select Manually", "selectedOn": "на {0}", "serialMonitor": "Монитор серијског порта", "type": "Type", "unknown": "Непознато", - "updateable": "Updatable" + "updateable": "Updatable", + "userAbort": "User abort" }, "compile": { "error": "Грешка приликом превођења: {0}" @@ -138,22 +164,49 @@ "component": { "boardsIncluded": "Boards included in this package:", "by": "од", + "clickToOpen": "Click to open in browser: {0}", "filterSearch": "Филтрирај претрагу...", - "install": "ИНСТАЛИРАЈ", + "install": "Инсталирај", + "installLatest": "Install Latest", + "installVersion": "Install {0}", + "installed": "{0} installed", "moreInfo": "Више информација", + "otherVersions": "Other Versions", + "remove": "Избаци", + "title": "{0} by {1}", "uninstall": "Деинсталирај", "uninstallMsg": "Да ли желиш да деинсталираш {0}? ", - "version": "Верзија {0}" + "update": "Update" + }, + "configuration": { + "cli": { + "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" + } + }, + "connectionStatus": { + "connectionLost": "Connection lost. Cloud sketch actions and updates won't be available." }, "contributions": { "addFile": "Додај датотеку", "fileAdded": "Датотека је додата у рад.", + "plotter": { + "couldNotOpen": "Couldn't open serial plotter" + }, "replaceTitle": "Замјени" }, + "core": { + "compilerWarnings": { + "all": "All", + "default": "Default", + "more": "More", + "none": "None" + } + }, "coreContribution": { "copyError": "Copy error messages", "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." }, + "createCloudCopy": "Push Sketch to Cloud", "daemon": { "restart": "Restart Daemon", "start": "Start Daemon", @@ -162,8 +215,15 @@ "debug": { "debugWithMessage": "Отклањање грешака - {0}", "debuggingNotSupported": "'{0}' не подржава отклањање грешака", + "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "Платформа није инсталирана за '{0}'", - "optimizeForDebugging": "Оптимизовано за отклањање грешака" + "optimizeForDebugging": "Оптимизовано за отклањање грешака", + "sketchIsNotCompiled": "Sketch '{0}' must be verified before starting a debug session. Please verify the sketch and start debugging again. Do you want to verify the sketch now?" + }, + "developer": { + "clearBoardList": "Clear the Board List History", + "clearBoardsConfig": "Clear the Board and Port Selection", + "dumpBoardList": "Dump the Board List" }, "dialog": { "dontAskAgain": "Не питај поново" @@ -180,10 +240,6 @@ "previousError": "Previous Error", "revealError": "Reveal Error" }, - "electron": { - "couldNotSave": "Could not save the sketch. Please copy your unsaved work into your favorite text editor, and restart the IDE.", - "unsavedChanges": "Ниједна несачувана промјена неће бити сачувана." - }, "examples": { "builtInExamples": "Уграђени примјери", "couldNotInitializeExamples": "Није могуће иницијализовати уграђене примјере.", @@ -201,7 +257,7 @@ "selectBoard": "Одабери плочу", "selectVersion": "Одаберзи верзију фирмвера", "successfullyInstalled": "Фирмвер успјешно инсталиран.", - "updater": "WiFi101 / WiFiNINA Firmware Updater" + "updater": "Firmware Updater" }, "help": { "environment": "Окружење", @@ -219,6 +275,9 @@ "checkForUpdates": "Check for Arduino IDE Updates", "closeAndInstallButton": "Затвори и инсталирај", "closeToInstallNotice": "Затворите програм и покрените инсталацију надоградње на ваш рачунар.", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", "downloadButton": "Преузимање", "downloadingNotice": "Преузимање последње верзије Arduino IDE.", "errorCheckingForUpdates": "Грешка приликом провере надоградњи за Arduino IDE.\n{0}", @@ -232,16 +291,20 @@ "updateAvailable": "Доступна је надоградња", "versionDownloaded": "Arduino IDE {0} је преузет." }, + "installable": { + "libraryInstallFailed": "Failed to install library: '{0}{1}'.", + "platformInstallFailed": "Failed to install platform: '{0}{1}'." + }, "library": { "addZip": "Додај .ZIP библиотеку...", "arduinoLibraries": "Arduino библиотеке", "contributedLibraries": "Contributed libraries", - "dependenciesForLibrary": "Зависне библиотеке за библиотеку {0}:{1}", "include": "Укључи библиотеку", - "installAll": "Инсталирај све", + "installAll": "Install All", + "installLibraryDependencies": "Install library dependencies", "installMissingDependencies": "Да ли желиш да инсталираш све зависне библиотеке?", "installOneMissingDependency": "Да ли желиш да инсталираш зависну библиотеку?", - "installOnly": "Инсталирај само {0}", + "installWithoutDependencies": "Install without dependencies", "installedSuccessfully": "Успјешно инсталирана библиотека {0}:{1}", "libraryAlreadyExists": "Библиотека већ постоји. Желиш да препишеш преко ње?", "manageLibraries": "Управљај библиотекама...", @@ -278,9 +341,23 @@ "tools": "Алатке" }, "monitor": { + "alreadyConnectedError": "Could not connect to {0} {1} port. Already connected.", + "baudRate": "{0} baud", + "connectionFailedError": "Could not connect to {0} {1} port.", + "connectionFailedErrorWithDetails": "{0} Could not connect to {1} {2} port.", + "connectionTimeout": "Timeout. The IDE has not received the 'success' message from the monitor after successfully connecting to it", + "missingConfigurationError": "Could not connect to {0} {1} port. The monitor configuration is missing.", + "notConnectedError": "Not connected to {0} {1} port.", "unableToCloseWebSocket": "Unable to close websocket", "unableToConnectToWebSocket": "Unable to connect to websocket" }, + "newCloudSketch": { + "newSketchTitle": "Name of the new Cloud Sketch" + }, + "portProtocol": { + "network": "Мрежа", + "serial": "Serial" + }, "preferences": { "additionalManagerURLs": "Additional Boards Manager URLs", "auth.audience": "OAuth2 публика.", @@ -297,6 +374,7 @@ "cloud.pull.warn": "True if users should be warned before pulling a cloud sketch. Defaults to true.", "cloud.push.warn": "True if users should be warned before pushing a cloud sketch. Defaults to true.", "cloud.pushpublic.warn": "True if users should be warned before pushing a public sketch to the cloud. Defaults to true.", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", "cloud.sketchSyncEndpoint": "The endpoint used to push and pull sketches from a backend. By default it points to Arduino Cloud API.", "compile": "преведи", "compile.experimental": "True if the IDE should handle multiple compiler errors. False by default", @@ -314,29 +392,50 @@ "invalid.editorFontSize": "Неважећа величина текста уређивача. Мора да буде позитиван цијели број.", "invalid.sketchbook.location": "Неважећа локација радне свеске: {0}", "invalid.theme": "Неважећа тема.", + "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", "language.log": "Тачно ако Ардуино језички сервер треба да генерише датотеке евиденције у фасциклу за скице. Иначе, нетачно. Подразумевано је нетачно.", "language.realTimeDiagnostics": "If true, the language server provides real-time diagnostics when typing in the editor. It's false by default.", "manualProxy": "Ручно подешавање посредника", + "monitor": { + "dockPanel": "The area of the application shell where the _{0}_ widget will reside. It is either \"bottom\" or \"right\". It defaults to \"{1}\"." + }, "network": "Мрежа", "newSketchbookLocation": "Одабери нову локацију радне свеске", + "noCliConfig": "Could not load the CLI configuration", "noProxy": "Без посредника", + "proxySettings": { + "hostname": "Host name", + "password": "Password", + "port": "Port number", + "username": "Username" + }, "showVerbose": "Прикажи детаљан испис током", + "sketch": { + "inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect." + }, "sketchbook.location": "Локација радне свеске", "sketchbook.showAllFiles": "True to show all sketch files inside the sketch. It is false by default.", - "survey.notification": "True if users should be notified if a survey is available. True by default.", "unofficialBoardSupport": "Click for a list of unofficial board support URLs", "upload": "спусти", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", "upload.verbose": "True for verbose upload output. False by default.", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "Провјери код након спуштања", "window.autoScale": "True if the user interface automatically scales with the font size.", - "window.zoomLevel": "Подесите ниво зумирања прозора. Оригинална величина је 0 и сваки корак изнад (нпр. 1) или испод (нпр. -1) представља зумирање за 20% веће или мање. Такође можете да унесете децимале да бисте подесили ниво зумирања са бољом прецизношћу." + "window.zoomLevel": { + "deprecationMessage": "Deprecated. Use 'window.zoomLevel' instead." + } + }, + "renameCloudSketch": { + "renameSketchTitle": "New name of the Cloud Sketch" }, "replaceMsg": "Замјени тренутну верзију {0}?", "selectZip": "Одабери zip датотеку са библиотеком коју желиш да додаш", "serial": { "autoscroll": "Аутоматско скроловање", "carriageReturn": "Carriage Return", - "message": "Message ({0} + Enter to send message to '{1}' on '{2}')", + "connecting": "Connecting to '{0}' on '{1}'...", + "message": "Message (Enter to send message to '{0}' on '{1}')", "newLine": "Нова линија", "newLineCarriageReturn": "И нова линија и CR", "noLineEndings": "Без завршетка линије", @@ -348,24 +447,34 @@ "sketch": { "archiveSketch": "Архивирај рад", "cantOpen": "Директоријум \"{0}\" већ постоји. Није могуће отворити рад.", - "close": "Да ли желиш да затвориш рад?", "compile": "Compiling sketch...", - "configureAndUpload": "Конфигуриши и спусти", + "configureAndUpload": "Configure and Upload", "createdArchive": "Направљена архива '{0}'.", "doneCompiling": "Превођење завршено.", "doneUploading": "Спуштање завршено.", + "editInvalidSketchFolderLocationQuestion": "Do you want to try saving the sketch to a different location?", + "editInvalidSketchFolderQuestion": "Do you want to try saving the sketch with a different name?", "exportBinary": "Export Compiled Binary", + "invalidCloudSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", + "invalidSketchFolderLocationDetails": "You cannot save a sketch into a folder inside itself.", + "invalidSketchFolderLocationMessage": "Invalid sketch folder location: '{0}'", + "invalidSketchFolderNameMessage": "Invalid sketch folder name: '{0}'", + "invalidSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", "moving": "Премјешта се", "movingMsg": "Датотека \"{0}\" мора да буде унутар радног директоријума \"{1}\".\nКреирај овај директоријум, премјести датотеку, и настави?", - "new": "Нови", + "new": "New Sketch", + "noTrailingPeriod": "A filename cannot end with a dot", "openFolder": "Отвори директоријум", "openRecent": "Отвори недавно", "openSketchInNewWindow": "Отвори рад у новом прозору", + "reservedFilename": "'{0}' is a reserved filename.", "saveFolderAs": "Сачувај радни директоријум као...", "saveSketch": "Save your sketch to open it again later.", "saveSketchAs": "Сачувај радни фолдер као...", "showFolder": "Прикажи радни директоријум", "sketch": "Рад", + "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", + "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", "sketchbook": "Радна свеска", "titleLocalSketchbook": "Локална радна свеска", "titleSketchbook": "Радна свеска", @@ -376,10 +485,26 @@ "verify": "Провјери", "verifyOrCompile": "Провјери/Преведи" }, - "survey": { - "answerSurvey": "Answer survey", - "dismissSurvey": "Don't show again", - "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." + "sketchbook": { + "newCloudSketch": "New Cloud Sketch", + "newSketch": "New Sketch" + }, + "theme": { + "currentThemeNotFound": "Could not find the currently selected theme: {0}. Arduino IDE has picked a built-in theme compatible with the missing one.", + "dark": "Dark", + "deprecated": "{0} (deprecated)", + "hc": "Dark High Contrast", + "hcLight": "Light High Contrast", + "light": "Light", + "user": "{0} (user)" + }, + "title": { + "cloud": "Cloud" + }, + "updateIndexes": { + "updateIndexes": "Update Indexes", + "updateLibraryIndex": "Update Library Index", + "updatePackageIndex": "Update Package Index" }, "upload": { "error": "{0} грешка: {1}" @@ -388,11 +513,27 @@ "cancel": "Одустани", "enterField": "Enter {0}", "upload": "Спусти" + }, + "validateSketch": { + "abortFixMessage": "The sketch is still invalid. Do you want to fix the remaining problems? By clicking '{0}', a new sketch will open.", + "abortFixTitle": "Invalid sketch", + "renameSketchFileMessage": "The sketch file '{0}' cannot be used. {1} Do you want to rename the sketch file now?", + "renameSketchFileTitle": "Invalid sketch filename", + "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", + "renameSketchFolderTitle": "Invalid sketch name" + }, + "versionWelcome": { + "cancelButton": "Maybe later", + "donateButton": "Donate now", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Welcome to a new version of the Arduino IDE!", + "titleWithVersion": "Welcome to the new Arduino IDE {0}!" + }, + "workspace": { + "alreadyExists": "'{0}' already exists." } }, - "cloud": { - "GoToCloud": "GO TO CLOUD" - }, "theia": { "core": { "cannotConnectBackend": "Cannot connect to the backend.", @@ -400,13 +541,9 @@ "couldNotSave": "Could not save the sketch. Please copy your unsaved work into your favorite text editor, and restart the IDE.", "daemonOffline": "CLI Daemon Offline", "offline": "Није на мрежи", + "offlineText": "Није на мрежи", "quitTitle": "Are you sure you want to quit?" }, - "debug": { - "start": "Почни...", - "startError": "There was an error starting the debug session, check the logs for more details.", - "typeNotSupported": "The debug session type \"{0}\" is not supported." - }, "editor": { "unsavedTitle": "Несачуван – {0} " }, @@ -415,10 +552,10 @@ "expand": "Прошири" }, "workspace": { - "deleteCurrentSketch": "Да ли желиш да обришеш тренутни рад?", + "deleteCloudSketch": "The cloud sketch '{0}' will be permanently deleted from the Arduino servers and the local caches. This action is irreversible. Do you want to delete the current sketch?", + "deleteCurrentSketch": "The sketch '{0}' will be permanently deleted. This action is irreversible. Do you want to delete the current sketch?", "fileNewName": "Име за нову датотеку", "invalidExtension": ".{0} није валидна екстензија", - "invalidFilename": "Неважеће име датотеке.", "newFileName": "Ново име за датотеку" } } diff --git a/i18n/sv_SE.json b/i18n/sv_SE.json deleted file mode 100644 index 459770646..000000000 --- a/i18n/sv_SE.json +++ /dev/null @@ -1,334 +0,0 @@ -{ - "arduino": { - "common": { - "offlineIndicator": "You appear to be offline. Without an Internet connection, the Arduino CLI might not be able to download the required resources and could cause malfunction. Please connect to the Internet and restart the application.", - "noBoardSelected": "No board selected", - "selectedOn": "on {0}", - "notConnected": "[not connected]", - "serialMonitor": "Serial Monitor", - "oldFormat": "The '{0}' still uses the old `.pde` format. Do you want to switch to the new `.ino` extension?", - "later": "Later", - "selectBoard": "Select Board", - "unknown": "Unknown", - "processing": "Processing", - "saveChangesToSketch": "Do you want to save changes to this sketch before closing?", - "loseChanges": "If you don't save, your changes will be lost." - }, - "menu": { - "sketch": "Sketch", - "tools": "Tools" - }, - "debug": { - "optimizeForDebugging": "Optimize for Debugging", - "debugWithMessage": "Debug - {0}", - "noPlatformInstalledFor": "Platform is not installed for '{0}'", - "debuggingNotSupported": "Debugging is not supported by '{0}'" - }, - "preferences": { - "language.log": "True if the Arduino Language Server should generate log files into the sketch folder. Otherwise, false. It's false by default.", - "compile.verbose": "True for verbose compile output. False by default", - "compile.warnings": "Tells gcc which warning level to use. It's 'None' by default", - "upload.verbose": "True for verbose upload output. False by default.", - "window.autoScale": "True if the user interface automatically scales with the font size.", - "window.zoomLevel": "Adjust the zoom level of the window. The original size is 0 and each increment above (e.g. 1) or below (e.g. -1) represents zooming 20% larger or smaller. You can also enter decimals to adjust the zoom level with a finer granularity.", - "ide.autoUpdate": "True to enable automatic update checks. The IDE will check for updates automatically and periodically.", - "board.certificates": "List of certificates that can be uploaded to boards", - "sketchbook.showAllFiles": "True to show all sketch files inside the sketch. It is false by default.", - "cloud.enabled": "True if the sketch sync functions are enabled. Defaults to true.", - "cloud.pull.warn": "True if users should be warned before pulling a cloud sketch. Defaults to true.", - "cloud.push.warn": "True if users should be warned before pushing a cloud sketch. Defaults to true.", - "cloud.pushpublic.warn": "True if users should be warned before pushing a public sketch to the cloud. Defaults to true.", - "cloud.sketchSyncEnpoint": "The endpoint used to push and pull sketches from a backend. By default it points to Arduino Cloud API.", - "auth.clientID": "The OAuth2 client ID.", - "auth.domain": "The OAuth2 domain.", - "auth.audience": "The OAuth2 audience.", - "auth.registerUri": "The URI used to register a new user.", - "network": "Network", - "sketchbook.location": "Sketchbook location", - "browse": "Browse", - "files.inside.sketches": "Show files inside Sketches", - "editorFontSize": "Editor font size", - "interfaceScale": "Interface scale", - "showVerbose": "Show verbose output during", - "compilerWarnings": "Compiler warnings", - "automatic": "Automatic", - "compile": "compile", - "upload": "upload", - "verifyAfterUpload": "Verify code after upload", - "checkForUpdates": "Check for updates on startup", - "editorQuickSuggestions": "Editor Quick Suggestions", - "additionalManagerURLs": "Additional Boards Manager URLs", - "noProxy": "No proxy", - "manualProxy": "Manual proxy configuration", - "newSketchbookLocation": "Select new sketchbook location", - "choose": "Choose", - "enterAdditionalURLs": "Enter additional URLs, one for each row", - "unofficialBoardSupport": "Click for a list of unofficial board support URLs", - "invalid.sketchbook.location": "Invalid sketchbook location: {0}", - "invalid.editorFontSize": "Invalid editor font size. It must be a positive integer.", - "invalid.theme": "Invalid theme." - }, - "cloud": { - "signIn": "SIGN IN", - "signOut": "Sign Out", - "chooseSketchVisibility": "Choose visibility of your Sketch:", - "privateVisibility": "Private. Only you can view the Sketch.", - "publicVisibility": "Public. Anyone with the link can view the Sketch.", - "link": "Link:", - "embed": "Embed:", - "cloudSketchbook": "Cloud Sketchbook", - "shareSketch": "Share Sketch", - "showHideRemoveSketchbook": "Show/Hide Remote Sketchbook", - "pullSketch": "Pull Sketch", - "openInCloudEditor": "Open in Cloud Editor", - "options": "Options...", - "share": "Share...", - "remote": "Remote", - "emptySketchbook": "Your Sketchbook is empty", - "visitArduinoCloud": "Visit Arduino Cloud to create Cloud Sketches.", - "signInToCloud": "Sign in to Arduino Cloud", - "syncEditSketches": "Sync and edit your Arduino Cloud Sketches", - "learnMore": "Learn more", - "continue": "Continue", - "pushSketch": "Push Sketch", - "pushSketchMsg": "This is a Public Sketch. Before pushing, make sure any sensitive information is defined in arduino_secrets.h files. You can make a Sketch private from the Share panel.", - "pull": "Pull", - "pullSketchMsg": "Pulling this Sketch from the Cloud will overwrite its local version. Are you sure you want to continue?", - "donePulling": "Done pulling ‘{0}’.", - "notYetPulled": "Cannot push to Cloud. It is not yet pulled.", - "push": "Push", - "pullFirst": "You have to pull first to be able to push to the Cloud.", - "donePushing": "Done pushing ‘{0}’.", - "connected": "Connected", - "offline": "Offline", - "profilePicture": "Profile picture" - }, - "board": { - "installManually": "Install Manually", - "installNow": "The \"{0} {1}\" core has to be installed for the currently selected \"{2}\" board. Do you want to install it now?", - "configDialogTitle": "Select Other Board & Port", - "configDialog1": "Select both a Board and a Port if you want to upload a sketch.", - "configDialog2": "If you only select a Board you will be able just to compile, but not to upload your sketch.", - "pleasePickBoard": "Please pick a board connected to the port you have selected.", - "showAllAvailablePorts": "Shows all available ports when enabled", - "programmer": "Programmer", - "succesfullyInstalledPlatform": "Successfully installed platform {0}:{1}", - "succesfullyUninstalledPlatform": "Successfully uninstalled platform {0}:{1}", - "couldNotFindPreviouslySelected": "Could not find previously selected board '{0}' in installed platform '{1}'. Please manually reselect the board you want to use. Do you want to reselect it now?", - "reselectLater": "Reselect later", - "noneSelected": "No boards selected.", - "noPortsSelected": "No ports selected for board: '{0}'.", - "noFQBN": "The FQBN is not available for the selected board \"{0}\". Do you have the corresponding core installed?", - "openBoardsConfig": "Select other board and port…", - "boardListItem": "{0} at {1}", - "selectBoardForInfo": "Please select a board to obtain board info.", - "platformMissing": "The platform for the selected '{0}' board is not installed.", - "selectPortForInfo": "Please select a port to obtain board info.", - "boardInfo": "Board Info", - "board": "Board{0}", - "port": "Port{0}", - "getBoardInfo": "Get Board Info", - "inSketchbook": " (in Sketchbook)" - }, - "boardsManager": "Boards Manager", - "about": { - "label": "About {0}", - "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}{4} [{5}]\n\n{6}" - }, - "contributions": { - "addFile": "Add File", - "replaceTitle": "Replace", - "fileAdded": "One file added to the sketch." - }, - "replaceMsg": "Replace the existing version of {0}?", - "library": { - "addZip": "Add .ZIP Library...", - "zipLibrary": "Library", - "overwriteExistingLibrary": "Do you want to overwrite the existing library?", - "successfullyInstalledZipLibrary": "Successfully installed library from {0} archive", - "namedLibraryAlreadyExists": "A library folder named {0} already exists. Do you want to overwrite it?", - "libraryAlreadyExists": "A library already exists. Do you want to overwrite it?", - "include": "Include Library", - "manageLibraries": "Manage Libraries...", - "arduinoLibraries": "Arduino libraries", - "contributedLibraries": "Contributed libraries", - "title": "Library Manager", - "needsOneDependency": "The library <b>{0}:{1}</b> needs another dependency currently not installed:", - "needsMultipleDependencies": "The library <b>{0}:{1}</b> needs some other dependencies currently not installed:", - "installOneMissingDependency": "Would you like to install the missing dependency?", - "installMissingDependencies": "Would you like to install all the missing dependencies?", - "dependenciesForLibrary": "Dependencies for library {0}:{1}", - "installAll": "Install all", - "installOnly": "Install {0} only", - "installedSuccessfully": "Successfully installed library {0}:{1}", - "uninstalledSuccessfully": "Successfully uninstalled library {0}:{1}" - }, - "selectZip": "Select a zip file containing the library you'd like to add", - "sketch": { - "archiveSketch": "Archive Sketch", - "saveSketchAs": "Save sketch folder as...", - "createdArchive": "Created archive '{0}'.", - "new": "New", - "openRecent": "Open Recent", - "showFolder": "Show Sketch Folder", - "sketch": "Sketch", - "moving": "Moving", - "movingMsg": "The file \"{0}\" needs to be inside a sketch folder named as \"{1}\".\nCreate this folder, move the file, and continue?", - "cantOpen": "A folder named \"{0}\" already exists. Can't open sketch.", - "saveFolderAs": "Save sketch folder as...", - "sketchbook": "Sketchbook", - "upload": "Upload", - "uploadUsingProgrammer": "Upload Using Programmer", - "userFieldsNotFoundError": "Can't find user fields for connected board", - "doneUploading": "Done uploading.", - "configureAndUpload": "Configure And Upload", - "verifyOrCompile": "Verify/Compile", - "exportBinary": "Export Compiled Binary", - "verify": "Verify", - "doneCompiling": "Done compiling.", - "couldNotConnectToSerial": "Could not reconnect to serial port. {0}", - "openSketchInNewWindow": "Open Sketch in New Window", - "openFolder": "Open Folder", - "titleLocalSketchbook": "Local Sketchbook", - "titleSketchbook": "Sketchbook", - "close": "Are you sure you want to close the sketch?" - }, - "bootloader": { - "burnBootloader": "Burn Bootloader", - "doneBurningBootloader": "Done burning bootloader." - }, - "editor": { - "copyForForum": "Copy for Forum (Markdown)", - "commentUncomment": "Comment/Uncomment", - "increaseIndent": "Increase Indent", - "decreaseIndent": "Decrease Indent", - "increaseFontSize": "Increase Font Size", - "decreaseFontSize": "Decrease Font Size", - "autoFormat": "Auto Format" - }, - "examples": { - "menu": "Examples", - "couldNotInitializeExamples": "Could not initialize built-in examples.", - "builtInExamples": "Built-in examples", - "customLibrary": "Examples from Custom Libraries", - "for": "Examples for {0}", - "forAny": "Examples for any board" - }, - "help": { - "search": "Search on Arduino.cc", - "keyword": "Type a keyword", - "gettingStarted": "Getting Started", - "environment": "Environment", - "troubleshooting": "Troubleshooting", - "reference": "Reference", - "findInReference": "Find in Reference", - "faq": "Frequently Asked Questions", - "visit": "Visit Arduino.cc" - }, - "certificate": { - "uploadRootCertificates": "Upload SSL Root Certificates", - "openContext": "Open context", - "remove": "Remove", - "upload": "Upload", - "addURL": "Add URL to fetch SSL certificate", - "enterURL": "Enter URL", - "selectCertificateToUpload": "1. Select certificate to upload", - "addNew": "Add New", - "selectDestinationBoardToUpload": "2. Select destination board and upload certificate", - "uploadingCertificates": "Uploading certificates.", - "certificatesUploaded": "Certificates uploaded.", - "uploadFailed": "Upload failed. Please try again.", - "selectBoard": "Select a board...", - "boardAtPort": "{0} at {1}", - "noSupportedBoardConnected": "No supported board connected" - }, - "firmware": { - "updater": "WiFi101 / WiFiNINA Firmware Updater", - "selectBoard": "Select Board", - "checkUpdates": "Check Updates", - "selectVersion": "Select firmware version", - "install": "Install", - "overwriteSketch": "Installation will overwrite the Sketch on the board.", - "installingFirmware": "Installing firmware.", - "successfullyInstalled": "Firmware succesfully installed.", - "failedInstall": "Installation failed. Please try again." - }, - "dialog": { - "dontAskAgain": "Don't ask again" - }, - "userFields": { - "cancel": "Cancel", - "upload": "Upload" - }, - "serial": { - "toggleTimestamp": "Toggle Timestamp", - "autoscroll": "Autoscroll", - "timestamp": "Timestamp", - "noLineEndings": "No Line Ending", - "newLine": "New Line", - "carriageReturn": "Carriage Return", - "newLineCarriageReturn": "Both NL & CR", - "notConnected": "Not connected. Select a board and a port to connect automatically.", - "message": "Message ({0} + Enter to send message to '{1}' on '{2}'", - "connectionBusy": "Connection failed. Serial port is busy: {0}", - "disconnected": "Disconnected {0} from {1}.", - "unexpectedError": "Unexpected error. Reconnecting {0} on port {1}.", - "failedReconnect": "Failed to reconnect {0} to serial port after 10 consecutive attempts. The {1} serial port is busy.", - "reconnect": "Reconnecting {0} to {1} in {2} seconds..." - }, - "component": { - "uninstall": "Uninstall", - "uninstallMsg": "Do you want to uninstall {0}?", - "by": "by", - "version": "Version {0}", - "moreInfo": "More info", - "install": "INSTALL", - "filterSearch": "Filter your search..." - }, - "electron": { - "couldNotSave": "Could not save the sketch. Please copy your unsaved work into your favorite text editor, and restart the IDE.", - "unsavedChanges": "Any unsaved changes will not be saved." - }, - "compile": { - "error": "Compilation error: {0}" - }, - "upload": { - "error": "{0} error: {1}" - }, - "burnBootloader": { - "error": "Error while burning the bootloader: {0}" - } - }, - "theia": { - "core": { - "couldNotSave": "Could not save the sketch. Please copy your unsaved work into your favorite text editor, and restart the IDE.", - "offline": "Offline", - "daemonOffline": "CLI Daemon Offline", - "cannotConnectBackend": "Cannot connect to the backend.", - "cannotConnectDaemon": "Cannot connect to the CLI daemon." - }, - "debug": { - "start": "Start...", - "typeNotSupported": "The debug session type \"{0}\" is not supported.", - "startError": "There was an error starting the debug session, check the logs for more details." - }, - "editor": { - "unsavedTitle": "Unsaved – {0}" - }, - "messages": { - "expand": "Expand", - "collapse": "Collapse" - }, - "workspace": { - "fileNewName": "Name for new file", - "invalidFilename": "Invalid filename.", - "invalidExtension": ".{0} is not a valid extension", - "newFileName": "New name for file", - "deleteCurrentSketch": "Do you want to delete the current sketch?", - "sketchDirectoryError": "There was an error creating the sketch directory. See the log for more details. The application will probably not work as expected." - } - }, - "cloud": { - "GoToCloud": "GO TO CLOUD" - } -} diff --git a/i18n/ta.json b/i18n/ta.json deleted file mode 100644 index 1ebc51e5d..000000000 --- a/i18n/ta.json +++ /dev/null @@ -1,350 +0,0 @@ -{ - "arduino": { - "common": { - "offlineIndicator": "You appear to be offline. Without an Internet connection, the Arduino CLI might not be able to download the required resources and could cause malfunction. Please connect to the Internet and restart the application.", - "noBoardSelected": "No board selected", - "selectedOn": "on {0}", - "notConnected": "[not connected]", - "serialMonitor": "Serial Monitor", - "oldFormat": "The '{0}' still uses the old `.pde` format. Do you want to switch to the new `.ino` extension?", - "later": "Later", - "selectBoard": "Select Board", - "unknown": "Unknown", - "processing": "Processing", - "saveChangesToSketch": "Do you want to save changes to this sketch before closing?", - "loseChanges": "If you don't save, your changes will be lost." - }, - "ide-updater": { - "errorCheckingForUpdates": "Error while checking for Arduino IDE updates.\n{0}", - "notNowButton": "Not now", - "versionDownloaded": "Arduino IDE {0} has been downloaded.", - "closeToInstallNotice": "Close the software and install the update on your machine.", - "closeAndInstallButton": "Close and Install", - "downloadingNotice": "Downloading the latest version of the Arduino IDE.", - "updateAvailable": "Update Available", - "newVersionAvailable": "A new version of Arduino IDE ({0}) is available for download.", - "skipVersionButton": "Skip Version", - "downloadButton": "Download", - "goToDownloadPage": "An update for the Arduino IDE is available, but we're not able to download and install it automatically. Please go to the download page and download the latest version from there.", - "goToDownloadButton": "Go To Download", - "ideUpdaterDialog": "Software Update", - "noUpdatesAvailable": "There are no recent updates available for the Arduino IDE" - }, - "menu": { - "sketch": "Sketch", - "tools": "Tools" - }, - "debug": { - "optimizeForDebugging": "Optimize for Debugging", - "debugWithMessage": "Debug - {0}", - "noPlatformInstalledFor": "Platform is not installed for '{0}'", - "debuggingNotSupported": "Debugging is not supported by '{0}'" - }, - "preferences": { - "language.log": "True if the Arduino Language Server should generate log files into the sketch folder. Otherwise, false. It's false by default.", - "compile.verbose": "True for verbose compile output. False by default", - "compile.warnings": "Tells gcc which warning level to use. It's 'None' by default", - "upload.verbose": "True for verbose upload output. False by default.", - "window.autoScale": "True if the user interface automatically scales with the font size.", - "window.zoomLevel": "Adjust the zoom level of the window. The original size is 0 and each increment above (e.g. 1) or below (e.g. -1) represents zooming 20% larger or smaller. You can also enter decimals to adjust the zoom level with a finer granularity.", - "ide.updateChannel": "Release channel to get updated from. 'stable' is the stable release, 'nightly' is the latest development build.", - "board.certificates": "List of certificates that can be uploaded to boards", - "sketchbook.showAllFiles": "True to show all sketch files inside the sketch. It is false by default.", - "cloud.enabled": "True if the sketch sync functions are enabled. Defaults to true.", - "cloud.pull.warn": "True if users should be warned before pulling a cloud sketch. Defaults to true.", - "cloud.push.warn": "True if users should be warned before pushing a cloud sketch. Defaults to true.", - "cloud.pushpublic.warn": "True if users should be warned before pushing a public sketch to the cloud. Defaults to true.", - "cloud.sketchSyncEnpoint": "The endpoint used to push and pull sketches from a backend. By default it points to Arduino Cloud API.", - "auth.clientID": "The OAuth2 client ID.", - "auth.domain": "The OAuth2 domain.", - "auth.audience": "The OAuth2 audience.", - "auth.registerUri": "The URI used to register a new user.", - "network": "Network", - "sketchbook.location": "Sketchbook location", - "browse": "Browse", - "files.inside.sketches": "Show files inside Sketches", - "editorFontSize": "Editor font size", - "interfaceScale": "Interface scale", - "showVerbose": "Show verbose output during", - "compilerWarnings": "Compiler warnings", - "automatic": "Automatic", - "compile": "compile", - "upload": "upload", - "verifyAfterUpload": "Verify code after upload", - "editorQuickSuggestions": "Editor Quick Suggestions", - "additionalManagerURLs": "Additional Boards Manager URLs", - "noProxy": "No proxy", - "manualProxy": "Manual proxy configuration", - "newSketchbookLocation": "Select new sketchbook location", - "choose": "Choose", - "enterAdditionalURLs": "Enter additional URLs, one for each row", - "unofficialBoardSupport": "Click for a list of unofficial board support URLs", - "invalid.sketchbook.location": "Invalid sketchbook location: {0}", - "invalid.editorFontSize": "Invalid editor font size. It must be a positive integer.", - "invalid.theme": "Invalid theme." - }, - "cloud": { - "signIn": "SIGN IN", - "signOut": "Sign Out", - "chooseSketchVisibility": "Choose visibility of your Sketch:", - "privateVisibility": "Private. Only you can view the Sketch.", - "publicVisibility": "Public. Anyone with the link can view the Sketch.", - "link": "Link:", - "embed": "Embed:", - "cloudSketchbook": "Cloud Sketchbook", - "shareSketch": "Share Sketch", - "showHideRemoveSketchbook": "Show/Hide Remote Sketchbook", - "pullSketch": "Pull Sketch", - "openInCloudEditor": "Open in Cloud Editor", - "options": "Options...", - "share": "Share...", - "remote": "Remote", - "emptySketchbook": "Your Sketchbook is empty", - "visitArduinoCloud": "Visit Arduino Cloud to create Cloud Sketches.", - "signInToCloud": "Sign in to Arduino Cloud", - "syncEditSketches": "Sync and edit your Arduino Cloud Sketches", - "learnMore": "Learn more", - "continue": "Continue", - "pushSketch": "Push Sketch", - "pushSketchMsg": "This is a Public Sketch. Before pushing, make sure any sensitive information is defined in arduino_secrets.h files. You can make a Sketch private from the Share panel.", - "pull": "Pull", - "pullSketchMsg": "Pulling this Sketch from the Cloud will overwrite its local version. Are you sure you want to continue?", - "donePulling": "Done pulling ‘{0}’.", - "notYetPulled": "Cannot push to Cloud. It is not yet pulled.", - "push": "Push", - "pullFirst": "You have to pull first to be able to push to the Cloud.", - "donePushing": "Done pushing ‘{0}’.", - "connected": "Connected", - "offline": "Offline", - "profilePicture": "Profile picture" - }, - "board": { - "installManually": "Install Manually", - "installNow": "The \"{0} {1}\" core has to be installed for the currently selected \"{2}\" board. Do you want to install it now?", - "configDialogTitle": "Select Other Board & Port", - "configDialog1": "Select both a Board and a Port if you want to upload a sketch.", - "configDialog2": "If you only select a Board you will be able to compile, but not to upload your sketch.", - "pleasePickBoard": "Please pick a board connected to the port you have selected.", - "showAllAvailablePorts": "Shows all available ports when enabled", - "programmer": "Programmer", - "succesfullyInstalledPlatform": "Successfully installed platform {0}:{1}", - "succesfullyUninstalledPlatform": "Successfully uninstalled platform {0}:{1}", - "couldNotFindPreviouslySelected": "Could not find previously selected board '{0}' in installed platform '{1}'. Please manually reselect the board you want to use. Do you want to reselect it now?", - "reselectLater": "Reselect later", - "noneSelected": "No boards selected.", - "noPortsSelected": "No ports selected for board: '{0}'.", - "noFQBN": "The FQBN is not available for the selected board \"{0}\". Do you have the corresponding core installed?", - "openBoardsConfig": "Select other board and port…", - "boardListItem": "{0} at {1}", - "selectBoardForInfo": "Please select a board to obtain board info.", - "platformMissing": "The platform for the selected '{0}' board is not installed.", - "selectPortForInfo": "Please select a port to obtain board info.", - "boardInfo": "Board Info", - "board": "Board{0}", - "port": "Port{0}", - "getBoardInfo": "Get Board Info", - "inSketchbook": " (in Sketchbook)" - }, - "boardsManager": "Boards Manager", - "about": { - "label": "About {0}", - "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}{4} [{5}]\n\n{6}" - }, - "contributions": { - "addFile": "Add File", - "replaceTitle": "Replace", - "fileAdded": "One file added to the sketch." - }, - "replaceMsg": "Replace the existing version of {0}?", - "library": { - "addZip": "Add .ZIP Library...", - "zipLibrary": "Library", - "overwriteExistingLibrary": "Do you want to overwrite the existing library?", - "successfullyInstalledZipLibrary": "Successfully installed library from {0} archive", - "namedLibraryAlreadyExists": "A library folder named {0} already exists. Do you want to overwrite it?", - "libraryAlreadyExists": "A library already exists. Do you want to overwrite it?", - "include": "Include Library", - "manageLibraries": "Manage Libraries...", - "arduinoLibraries": "Arduino libraries", - "contributedLibraries": "Contributed libraries", - "title": "Library Manager", - "needsOneDependency": "The library <b>{0}:{1}</b> needs another dependency currently not installed:", - "needsMultipleDependencies": "The library <b>{0}:{1}</b> needs some other dependencies currently not installed:", - "installOneMissingDependency": "Would you like to install the missing dependency?", - "installMissingDependencies": "Would you like to install all the missing dependencies?", - "dependenciesForLibrary": "Dependencies for library {0}:{1}", - "installAll": "Install all", - "installOnly": "Install {0} only", - "installedSuccessfully": "Successfully installed library {0}:{1}", - "uninstalledSuccessfully": "Successfully uninstalled library {0}:{1}" - }, - "selectZip": "Select a zip file containing the library you'd like to add", - "sketch": { - "archiveSketch": "Archive Sketch", - "saveSketchAs": "Save sketch folder as...", - "createdArchive": "Created archive '{0}'.", - "new": "New", - "openRecent": "Open Recent", - "showFolder": "Show Sketch Folder", - "sketch": "Sketch", - "moving": "Moving", - "movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?", - "cantOpen": "A folder named \"{0}\" already exists. Can't open sketch.", - "saveFolderAs": "Save sketch folder as...", - "sketchbook": "Sketchbook", - "upload": "Upload", - "uploadUsingProgrammer": "Upload Using Programmer", - "userFieldsNotFoundError": "Can't find user fields for connected board", - "doneUploading": "Done uploading.", - "configureAndUpload": "Configure And Upload", - "verifyOrCompile": "Verify/Compile", - "exportBinary": "Export Compiled Binary", - "verify": "Verify", - "doneCompiling": "Done compiling.", - "couldNotConnectToSerial": "Could not reconnect to serial port. {0}", - "openSketchInNewWindow": "Open Sketch in New Window", - "openFolder": "Open Folder", - "titleLocalSketchbook": "Local Sketchbook", - "titleSketchbook": "Sketchbook", - "close": "Are you sure you want to close the sketch?" - }, - "bootloader": { - "burnBootloader": "Burn Bootloader", - "doneBurningBootloader": "Done burning bootloader." - }, - "editor": { - "copyForForum": "Copy for Forum (Markdown)", - "commentUncomment": "Comment/Uncomment", - "increaseIndent": "Increase Indent", - "decreaseIndent": "Decrease Indent", - "increaseFontSize": "Increase Font Size", - "decreaseFontSize": "Decrease Font Size", - "autoFormat": "Auto Format" - }, - "examples": { - "menu": "Examples", - "couldNotInitializeExamples": "Could not initialize built-in examples.", - "builtInExamples": "Built-in examples", - "customLibrary": "Examples from Custom Libraries", - "for": "Examples for {0}", - "forAny": "Examples for any board" - }, - "help": { - "search": "Search on Arduino.cc", - "keyword": "Type a keyword", - "gettingStarted": "Getting Started", - "environment": "Environment", - "troubleshooting": "Troubleshooting", - "reference": "Reference", - "findInReference": "Find in Reference", - "faq": "Frequently Asked Questions", - "visit": "Visit Arduino.cc", - "privacyPolicy": "Privacy Policy" - }, - "certificate": { - "uploadRootCertificates": "Upload SSL Root Certificates", - "openContext": "Open context", - "remove": "Remove", - "upload": "Upload", - "addURL": "Add URL to fetch SSL certificate", - "enterURL": "Enter URL", - "selectCertificateToUpload": "1. Select certificate to upload", - "addNew": "Add New", - "selectDestinationBoardToUpload": "2. Select destination board and upload certificate", - "uploadingCertificates": "Uploading certificates.", - "certificatesUploaded": "Certificates uploaded.", - "uploadFailed": "Upload failed. Please try again.", - "selectBoard": "Select a board...", - "boardAtPort": "{0} at {1}", - "noSupportedBoardConnected": "No supported board connected" - }, - "firmware": { - "updater": "WiFi101 / WiFiNINA Firmware Updater", - "selectBoard": "Select Board", - "checkUpdates": "Check Updates", - "selectVersion": "Select firmware version", - "install": "Install", - "overwriteSketch": "Installation will overwrite the Sketch on the board.", - "installingFirmware": "Installing firmware.", - "successfullyInstalled": "Firmware successfully installed.", - "failedInstall": "Installation failed. Please try again." - }, - "dialog": { - "dontAskAgain": "Don't ask again" - }, - "userFields": { - "cancel": "Cancel", - "upload": "Upload" - }, - "serial": { - "toggleTimestamp": "Toggle Timestamp", - "autoscroll": "Autoscroll", - "timestamp": "Timestamp", - "noLineEndings": "No Line Ending", - "newLine": "New Line", - "carriageReturn": "Carriage Return", - "newLineCarriageReturn": "Both NL & CR", - "notConnected": "Not connected. Select a board and a port to connect automatically.", - "message": "Message ({0} + Enter to send message to '{1}' on '{2}')", - "connectionBusy": "Connection failed. Serial port is busy: {0}", - "disconnected": "Disconnected {0} from {1}.", - "unexpectedError": "Unexpected error. Reconnecting {0} on port {1}.", - "failedReconnect": "Failed to reconnect {0} to serial port after 10 consecutive attempts. The {1} serial port is busy.", - "reconnect": "Reconnecting {0} to {1} in {2} seconds..." - }, - "component": { - "uninstall": "Uninstall", - "uninstallMsg": "Do you want to uninstall {0}?", - "by": "by", - "version": "Version {0}", - "moreInfo": "More info", - "install": "INSTALL", - "filterSearch": "Filter your search..." - }, - "electron": { - "couldNotSave": "Could not save the sketch. Please copy your unsaved work into your favorite text editor, and restart the IDE.", - "unsavedChanges": "Any unsaved changes will not be saved." - }, - "compile": { - "error": "Compilation error: {0}" - }, - "upload": { - "error": "{0} error: {1}" - }, - "burnBootloader": { - "error": "Error while burning the bootloader: {0}" - } - }, - "theia": { - "core": { - "couldNotSave": "Could not save the sketch. Please copy your unsaved work into your favorite text editor, and restart the IDE.", - "offline": "Offline", - "daemonOffline": "CLI Daemon Offline", - "cannotConnectBackend": "Cannot connect to the backend.", - "cannotConnectDaemon": "Cannot connect to the CLI daemon." - }, - "debug": { - "start": "Start...", - "typeNotSupported": "The debug session type \"{0}\" is not supported.", - "startError": "There was an error starting the debug session, check the logs for more details." - }, - "editor": { - "unsavedTitle": "Unsaved – {0}" - }, - "messages": { - "expand": "Expand", - "collapse": "Collapse" - }, - "workspace": { - "fileNewName": "Name for new file", - "invalidFilename": "Invalid filename.", - "invalidExtension": ".{0} is not a valid extension", - "newFileName": "New name for file", - "deleteCurrentSketch": "Do you want to delete the current sketch?", - "sketchDirectoryError": "There was an error creating the sketch directory. See the log for more details. The application will probably not work as expected." - } - }, - "cloud": { - "GoToCloud": "GO TO CLOUD" - } -} diff --git a/i18n/th.json b/i18n/th.json new file mode 100644 index 000000000..621cff165 --- /dev/null +++ b/i18n/th.json @@ -0,0 +1,562 @@ +{ + "arduino": { + "about": { + "detail": "เวอร์ชัน: {0}\nวันที่: {1}{2}\nเวอร์ชัน CLI: {3}\n\n{4}", + "label": "เกี่ยวกับ{0}" + }, + "account": { + "goToCloudEditor": "ไปยัง Cloud Editor", + "goToIoTCloud": "ไปยัง IoT Cloud", + "goToProfile": "ไปยัง Profile", + "menuTitle": "Arduino Cloud" + }, + "board": { + "board": "บอร์ด{0}", + "boardConfigDialogTitle": "เลือกบอร์ดและพอร์ตอื่นๆ", + "boardDataReloaded": "โหลดข้อมูลบอร์ดใหม่แล้ว", + "boardInfo": "ข้อมูลบอร์ด", + "boards": "บอร์ด", + "configDialog1": "เลือกบอร์ดและพอร์ตที่คุณต้องการอัปโหลดโปรแกรมของคุณ", + "configDialog2": "หากคุณแค่เลือกบอร์ดคุณจะสามารถคอมไพล์ได้ แต่สเก็ตช์ของคุณจะไม่ถูกอัปโหลด", + "couldNotFindPreviouslySelected": "ไม่สามาถหาบอร์ด {0} ที่ถูกเลือกไว้ก่อนหน้านี้พบในแพลตฟอร์มที่ถูกติดตั้ง {1} กรุณาเลือกบอร์ดที่คุณต้องการใช้งานด้วยตัวเอง คุณต้องการเลือกใหม่ในตอนนี้หรือไม่?", + "editBoardsConfig": "แก้ไขบอร์ดและพอร์ต", + "getBoardInfo": "เรียกดูข้อมูลของบอร์ด", + "inSketchbook": "(ใน Sketchbook)", + "installNow": "คอร์ \"{0}{1}\" ต้องถูกติดตั้งสำหรับบอร์ด \"{2}\" ที่ถูกเลือก คุณต้องการติดตั้งในตอนนี้หรือไม่?", + "noBoardsFound": "ไม่พบบอร์ด \"{0}\"", + "noNativeSerialPort": "พอร์ต Serial ดั้งเดิม ไม่สามารถรับข้อมูลได้", + "noPortsDiscovered": "ไม่พบพอร์ต", + "nonSerialPort": "ไม่ใช่พอร์ต Serial ไม่สามารถรับข้อมูลได้", + "openBoardsConfig": "เลือกบอร์ดอื่นและพอร์ต...", + "pleasePickBoard": "กรุณาเลือกบอร์ดที่เชื่อมต่อกับพอร์ตที่คุณได้เลือกไว้", + "port": "พอร์ต {0}", + "ports": "พอร์ต", + "programmer": "เครื่องโปรแกรม", + "reloadBoardData": "โหลดข้อมูลบอร์ดใหม่", + "reselectLater": "เลือกใหม่ในภายหลัง", + "revertBoardsConfig": "ใช้ '{0}' ค้นพบเมื่อ '{1}'", + "searchBoard": "ค้นหาบอร์ด", + "selectBoard": "เลือกบอร์ด", + "selectBoardToReload": "กรุณาเลือกบอร์ดก่อน", + "selectPortForInfo": "กรุณาเลือกพอร์ตเพื่อดึงข้อมูลของบอร์ด", + "showAllAvailablePorts": "แสดงพอร์ตทั้งหมดที่มีอยู่เมื่อเลือก", + "showAllPorts": "แสดงพอร์ตทั้งหมด", + "succesfullyInstalledPlatform": "ติดตั้งแพลตฟอร์ม {0}:{1} สำเร็จ", + "succesfullyUninstalledPlatform": "ถอนการติดตั้งแพลตฟอร์ม {0}:{1} สำเร็จ", + "typeOfPorts": "{0} พอร์ต", + "unconfirmedBoard": "บอร์ดไม่ได้รับการยืนยัน", + "unknownBoard": "บอร์ดที่ไม่รู้จัก" + }, + "boardsManager": "ตัวจัดการบอร์ด", + "boardsType": { + "arduinoCertified": "ได้รับการับรองจาก Arduino" + }, + "bootloader": { + "burnBootloader": "เขียนบูทโหลดเดอร์", + "burningBootloader": "กำลังเขียนบูทโหลดเดอร์...", + "doneBurningBootloader": "เขียนบูทโหลดเดอร์สำเร็จ" + }, + "burnBootloader": { + "error": "เกิดความผิดพลาดในขณะเขียนบูทโหลดเดอร์: {0}" + }, + "certificate": { + "addNew": "เพิ่มใหม่", + "addURL": "เพิ่ม URL เพื่อดึงใบรับรอง SSL", + "boardAtPort": "{0} ที่ {1}", + "certificatesUploaded": "อัปโหลดใบรับรองแล้ว", + "enterURL": "ใส่ URL", + "noSupportedBoardConnected": "ไม่มีบอร์ดที่รองรับเชื่อมต่ออยู่", + "openContext": "เปิดบริบท", + "remove": "นำออก", + "selectBoard": "เลือกบอร์ด...", + "selectCertificateToUpload": "1. เลือกใบรับรองที่จะอัปโหลด", + "selectDestinationBoardToUpload": "2. เลือกบอร์ดปลายทางเพื่ออัปโหลด", + "upload": "อัปโหลด", + "uploadFailed": "อัปโหลดล้มเหลว โปรดลองอีกครั้ง", + "uploadRootCertificates": "อัปโหลดใบรับรองรูท SSL ", + "uploadingCertificates": "กำลังอัปโหลดใบรับรอง" + }, + "checkForUpdates": { + "checkForUpdates": "ตรวจสอบการอัปเดต Arduino", + "installAll": "ติดตั้งทั้งหมด", + "noUpdates": "ไม่มีอัปเดต", + "promptUpdateBoards": "ต้องการอัปเดตบอร์ดหรือไม่?", + "promptUpdateLibraries": "ต้องการอัปเดตไลบรารีหรือไม่?", + "updatingBoards": "กำลังอัปเดตบอร์ด", + "updatingLibraries": "กำลังอัปเดตไลบรารี" + }, + "cli-error-parser": { + "keyboardError": "ไม่พบ 'Keyboard' ตรวจสอบว่าสเก็ตช์ของคุณมีบรรทัด '#include <Keyboard.h>' หรือไม่?", + "mouseError": " ไม่พบ 'Mouse' ตรวจสอบว่าโค้ดของคุณมีบรรทัด #include <Mouse.h> หรือไม่?" + }, + "cloud": { + "chooseSketchVisibility": "เลือกการเปิดเผยสเก็ตช์ของคุณ:", + "cloudSketchbook": "สมุดสเก็ตช์บนคลาวด์", + "connected": "เชื่อมต่อ", + "continue": "ดำเนินการต่อ", + "donePulling": "ดึงข้อมูลเสร็จสิ้น '{0}'", + "donePushing": "ส่งข้อมูลเสร็จสิ้น '{0}'", + "embed": "ฝัง:", + "emptySketchbook": "สมุดสเก็ตช์ของคุณว่างเปล่า", + "goToCloud": "ไปยัง Cloud", + "learnMore": "เรียนรู้เพิ่มเติม", + "link": "ลิ้งก์:", + "notYetPulled": " ไม่สามารถอัปโหลดไปยัง Cloud ได้ เนื่องจากยังไม่ได้ดึงข้อมูลลงมาก่อน", + "offline": "ออฟไลน์", + "openInCloudEditor": "เปิดใน Cloud Editor", + "options": "ตัวเลือก...", + "privateVisibility": "เป็นแบบส่วนตัว มีเพียงคุณเท่านั้นที่สามารถดู สเก็ตช์ ได้", + "profilePicture": "ภาพโปรไฟล์", + "publicVisibility": " เป็นแบบสาธารณะ ทุกคนที่มีลิงก์สามารถดู สเก็ตช์ ได้", + "pull": "ดึง", + "pullFirst": "คุณต้องดึงข้อมูลมาก่อน จึงจะสามารถอัปโหลดไปยัง Cloud ได้", + "pullSketch": "ดึง สเก็ตช์", + "pullSketchMsg": "การดึง สเก็ตช์ นี้จาก Cloud จะเขียนทับเวอร์ชันที่อยู่ในเครื่องของคุณ คุณแน่ใจหรือไม่ว่าต้องการดำเนินการต่อ?", + "push": "ส่ง", + "pushSketch": "ส่ง สเก็ตช์", + "pushSketchMsg": " นี่คือ สเก็ตช์ สาธารณะ ก่อนอัปโหลด โปรดตรวจสอบว่าข้อมูลที่ละเอียดอ่อนถูกกำหนดไว้ในไฟล์ arduino_secrets.h แล้ว คุณสามารถทำให้ สเก็ตช์ เป็นแบบส่วนตัวได้จากเมนู แชร์", + "remote": "ระยะไกล", + "share": "แชร์...", + "shareSketch": "แชร์ สเก็ตช์", + "showHideSketchbook": "แสดง/ซ่อน Cloud Sketchbook", + "signIn": "ลงชื่อเข้าใช้", + "signInToCloud": "ลงชื่อเข้าใช้ Arduino Cloud", + "signOut": "ลงชื่อออก", + "sync": "ซิงค์", + "syncEditSketches": "ซิงค์และแก้ไข สเก็ตช์ ของคุณใน Arduino Cloud", + "visitArduinoCloud": "ไปที่ Arduino Cloud เพื่อสร้าง Cloud Sketches" + }, + "cloudSketch": { + "alreadyExists": "สมุดสเก็ตช์ '{0}' มีอยู่แล้ว", + "creating": "กำลังสร้าง สมุดสเก็ตช์ '{0}'...", + "new": "Cloud Sketch ใหม่", + "notFound": "ไม่สามารถดึงสเก็ตช์จากคลาวด์ '{0}' สเก็ตช์นี้ไม่มีอยู่จริง", + "pulling": "กำลังซิงค์สมุดสเก็ตช์, ดึง '{0}'...", + "pushing": "กำลังซิงค์สมุดสเก็ตช์, กำลังอัปโหลด '{0}'...", + "renaming": "กำลังเปลี่ยนชื่อสเก็ตช์ในคลาวด์จาก '{0}' เป็น '{1}'...", + "synchronizingSketchbook": "กำลังซิงค์สมุดสเก็ตช์..." + }, + "common": { + "all": "ทั้งหมด", + "contributed": "มีส่วนร่วม", + "installManually": "ติดตั้งด้วยตัวเอง", + "later": "ภายหลัง", + "noBoardSelected": "ไม่ได้เลือกบอร์ด :O", + "noSketchOpened": "ไม่ได้เปิด สเก็ตช์", + "notConnected": "[ไม่ได้เชื่อมต่อ]", + "offlineIndicator": "ดูเหมือนว่าคุณจะออฟไลน์อยู่ โดยไม่มีการเชื่อมต่ออินเทอร์เน็ต Arduino CLI อาจไม่สามารถดาวน์โหลดทรัพยากรที่จำเป็นและอาจทำให้เกิดการทำงานผิดปกติได้ กรุณาเชื่อมต่อกับอินเทอร์เน็ตและรีสตาร์ทแอปพลิเคชัน", + "oldFormat": "'{0}' ยังคงใช้รูปแบบเก่า .pde อยู่ คุณต้องการเปลี่ยนเป็นนามสกุลใหม่ .ino หรือไม่?", + "partner": "พาร์ทเนอร์", + "processing": "กำลังประมวลผล", + "recommended": "แนะนำ", + "retired": "ยกเลิกการใช้งาน", + "selectManually": "เลือกด้วยตัวเอง", + "selectedOn": "บน {0}", + "serialMonitor": "Serial Monitor", + "type": "ชนิด", + "unknown": "ไม่รู้จัก", + "updateable": "อัปเดตได้", + "userAbort": "การยกเลิกที่ผู้ใช้ทำเอง" + }, + "compile": { + "error": "ข้อผิดพลาดในการคอมไพล์: {0}" + }, + "component": { + "boardsIncluded": "บอร์ดที่รวมอยู่ในแพ็คเกจนี้:", + "by": "โดย", + "clickToOpen": "คลิกเพื่อเปิดในเบราว์เซอร์: {0}", + "filterSearch": "กรองการค้นหาของคุณ...", + "install": "ติดตั้ง", + "installLatest": "ติดตั้งภายหลัง", + "installVersion": "ติดตั้ง {0}", + "installed": "ติดตั้ง {0} แล้ว", + "moreInfo": "ข้อมูลเพิ่มเติม", + "otherVersions": "เวอร์ชั่นก่อนหน้า", + "remove": "นำออก", + "title": "{0} โดย {1}", + "uninstall": "ถอนการติดตั้ง", + "uninstallMsg": "คุณต้องการถอนการติดตั้ง {0}?", + "update": "อัปเดต" + }, + "configuration": { + "cli": { + "inaccessibleDirectory": "ไม่สามารถเข้าถึงตำแหน่งสมุดสเก็ตช์ที่ '{0}': {1}" + } + }, + "connectionStatus": { + "connectionLost": "การเชื่อมต่อขาดหาย การดำเนินการและอัปเดตสเก็ตช์บนคลาวด์จะไม่สามารถใช้ได้" + }, + "contributions": { + "addFile": "เพิ่มไฟล์", + "fileAdded": "เพิ่มไฟล์หนึ่งไฟล์ลงในสเก็ตช์", + "plotter": { + "couldNotOpen": "ไม่สามารถเปิด Serial Plotter ได้" + }, + "replaceTitle": "แทนที" + }, + "core": { + "compilerWarnings": { + "all": "ทั้งหมด", + "default": "ค่าเริ่มต้น", + "more": "อื่นๆ", + "none": "ว่าง" + } + }, + "coreContribution": { + "copyError": "คัดลอกข้อความแสดงข้อผิดพลาด", + "noBoardSelected": "ยังไม่ได้เลือกบอร์ด กรุณาเลือกบอร์ด Arduino ของคุณจากเมนู เครื่องมือ > บอร์ด" + }, + "createCloudCopy": "อัพโหลดสเก็ตช์ขึ้นคลาวด์", + "daemon": { + "restart": "รีสตาร์ท Daemon", + "start": "เริ่ม Daemon", + "stop": "หยุด Daemon" + }, + "debug": { + "debugWithMessage": "ดีบัก - {0}", + "debuggingNotSupported": "'{0}' ไม่รองรับการดีบัก", + "getDebugInfo": "กำลังรับข้อมูลการดีบัก", + "noPlatformInstalledFor": "ไม่ได้ติดตั้งแฟลตฟอร์มสำหรับ '{0}'", + "optimizeForDebugging": "ปรับให้เหมาะสมสำหรับการดีบัก", + "sketchIsNotCompiled": "สเก็ตช์ '{0}' ต้องได้รับการตรวจสอบก่อนเริ่มการดีบัก กรุณาตรวจสอบสเก็ตช์แล้วลองดีบักอีกครั้ง คุณต้องการตรวจสอบสเก็ตช์ตอนนี้หรือไม่?" + }, + "developer": { + "clearBoardList": "ล้างประวัติรายการบอร์ด", + "clearBoardsConfig": "ล้างการเลือกบอร์ดและพอร์ต", + "dumpBoardList": "แสดงรายการบอร์ด" + }, + "dialog": { + "dontAskAgain": "อย่าถามอีก 😠" + }, + "editor": { + "autoFormat": "จัดรูปแบบอัตโนมัติ", + "commentUncomment": "คอมเมนต์/ยกเลิกคอมเมนต์", + "copyForForum": "คัดลอกสำหรับฟอรั่ม (Markdown)", + "decreaseFontSize": "ลดขนาดฟอนต์", + "decreaseIndent": "ลดการเยื้อง", + "increaseFontSize": "เพิ่มขนาดฟอนต์", + "increaseIndent": "เพิ่มการเยื้อง", + "nextError": "ข้อผิดพลาดถัดไป", + "previousError": "ข้อผิดพลาดก่อนหน้า", + "revealError": "ดูข้อผิดพลาด" + }, + "examples": { + "builtInExamples": "ตัวอย่างที่มีมาให้", + "couldNotInitializeExamples": "ไม่สามารถเริ่มต้นตัวอย่างที่มีมาให้", + "customLibrary": "ตัวอย่างจากไลบรารีที่กำหนดเอง", + "for": "ตัวอย่างสำหรับ {0}", + "forAny": "ตัวอย่างสำหรับบอร์ดใดก็ได้", + "menu": "ตัวอย่าง" + }, + "firmware": { + "checkUpdates": "ตรวจหาอัปเดต", + "failedInstall": "ติดตั้งล้มเหลว โปรดลองอีกครั้ง", + "install": "ติดตั้ง", + "installingFirmware": "กำลังติดตั้งเฟิร์มแวร์", + "overwriteSketch": "การติดตั้งจะเขียนทับสเก็ตช์บนบอร์ด", + "selectBoard": "เลือกบอร์ด", + "selectVersion": "เลือกเวอร์ชั่นเฟิร์มแวร์", + "successfullyInstalled": "การติดตั้งเฟิร์มแวร์เสร็จสิ้น 😁", + "updater": "อัปเดตเฟิร์มแวร์" + }, + "help": { + "environment": "สภาพแวดล้อม", + "faq": "Frequently Asked Questions", + "findInReference": "Find in Reference", + "gettingStarted": "Getting Started", + "keyword": "Type a keyword", + "privacyPolicy": "Privacy Policy", + "reference": "Reference", + "search": "Search on Arduino.cc", + "troubleshooting": "Troubleshooting", + "visit": "Visit Arduino.cc" + }, + "ide-updater": { + "checkForUpdates": "Check for Arduino IDE Updates", + "closeAndInstallButton": "Close and Install", + "closeToInstallNotice": "Close the software and install the update on your machine.", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", + "downloadButton": "Download", + "downloadingNotice": "Downloading the latest version of the Arduino IDE.", + "errorCheckingForUpdates": "Error while checking for Arduino IDE updates.\n{0}", + "goToDownloadButton": "Go To Download", + "goToDownloadPage": "มีการอัปเดตสำหรับ Arduino IDE แต่เราไม่สามารถดาวน์โหลดและติดตั้งมันโดยอัตโนมัติได้ กรุณาไปที่หน้าดาวน์โหลดและดาวน์โหลดเวอร์ชันล่าสุดจากที่นั่น", + "ideUpdaterDialog": "Software Update", + "newVersionAvailable": "A new version of Arduino IDE ({0}) is available for download.", + "noUpdatesAvailable": "There are no recent updates available for the Arduino IDE", + "notNowButton": "Not now", + "skipVersionButton": "Skip Version", + "updateAvailable": "Update Available", + "versionDownloaded": "Arduino IDE {0} has been downloaded." + }, + "installable": { + "libraryInstallFailed": "Failed to install library: '{0}{1}'.", + "platformInstallFailed": "Failed to install platform: '{0}{1}'." + }, + "library": { + "addZip": "เพิ่มไลบารี .zip...", + "arduinoLibraries": "ไลบารีของ Arduino", + "contributedLibraries": "ไลบรารีที่มีการร่วมพัฒนา", + "include": "รวมไลบารี", + "installAll": "ติดตั้งทั้งหมด", + "installLibraryDependencies": "ติดตั้งการเพิ่งพาไลบารี", + "installMissingDependencies": "คุณต้องการติดตั้งการพึ่งพาที่ขาดหายไปทั้งหมดหรือไม่?", + "installOneMissingDependency": "Would you like to install the missing dependency?", + "installWithoutDependencies": "Install without dependencies", + "installedSuccessfully": "Successfully installed library {0}:{1}", + "libraryAlreadyExists": "A library already exists. Do you want to overwrite it?", + "manageLibraries": "Manage Libraries...", + "namedLibraryAlreadyExists": "A library folder named {0} already exists. Do you want to overwrite it?", + "needsMultipleDependencies": "The library <b>{0}:{1}</b> needs some other dependencies currently not installed:", + "needsOneDependency": "The library <b>{0}:{1}</b> needs another dependency currently not installed:", + "overwriteExistingLibrary": "Do you want to overwrite the existing library?", + "successfullyInstalledZipLibrary": "Successfully installed library from {0} archive", + "title": "ตัวจัดการไลบารี", + "uninstalledSuccessfully": "ถอนการติดตั้งไลบารี {0};{1} สำเร็จ", + "zipLibrary": "ไลบารี" + }, + "librarySearchProperty": { + "topic": "หัวข้อ" + }, + "libraryTopic": { + "communication": "การสื่อสาร", + "dataProcessing": "ประมวลผลข้อมูล", + "dataStorage": "การจัดเก็บข้อมูล", + "deviceControl": "ควบคุมอุปกรณ์", + "display": "จอแสดงผล", + "other": "อื่นๆ", + "sensors": "เซนเซอร์", + "signalInputOutput": "สัญญาณ เข้า/ออก", + "timing": "เวลา", + "uncategorized": "ไม่มีหมวดหมู่" + }, + "libraryType": { + "installed": "ติดตั้งอยู่" + }, + "menu": { + "advanced": "ขั้นสูง", + "sketch": "สเก็ตช์", + "tools": "เครื่องมื่อ" + }, + "monitor": { + "alreadyConnectedError": "Could not connect to {0} {1} port. Already connected.", + "baudRate": "{0} baud", + "connectionFailedError": "Could not connect to {0} {1} port.", + "connectionFailedErrorWithDetails": "{0} Could not connect to {1} {2} port.", + "connectionTimeout": "หมดเวลา. IDE ไม่ได้รับข้อความ 'success' จากตัวมอนิเตอร์หลังจากเชื่อมต่อสำเร็จ", + "missingConfigurationError": "Could not connect to {0} {1} port. The monitor configuration is missing.", + "notConnectedError": "Not connected to {0} {1} port.", + "unableToCloseWebSocket": "Unable to close websocket", + "unableToConnectToWebSocket": "Unable to connect to websocket" + }, + "newCloudSketch": { + "newSketchTitle": "Name of the new Cloud Sketch" + }, + "portProtocol": { + "network": "เน็ตเวิร์ก", + "serial": "Serial" + }, + "preferences": { + "additionalManagerURLs": "Additional Boards Manager URLs", + "auth.audience": "The OAuth2 audience.", + "auth.clientID": "The OAuth2 client ID.", + "auth.domain": "The OAuth2 domain.", + "auth.registerUri": "The URI used to register a new user.", + "automatic": "อัตโนมัติ", + "board.certificates": "List of certificates that can be uploaded to boards", + "browse": "เรียกดู", + "checkForUpdate": "รับการแจ้งเตือนเกี่ยวกับการอัปเดตที่มีสำหรับ IDE, บอร์ด และไลบรารี จำเป็นต้องรีสตาร์ท IDE หลังจากการเปลี่ยนแปลง ค่าเริ่มต้นเป็น true", + "choose": "เลือก", + "cli.daemonDebug": "เปิดการบันทึกดีบักของการเรียก gRPC ไปยัง Arduino CLI จำเป็นต้องรีสตาร์ท IDE เพื่อให้การตั้งค่านี้มีผล ค่าเริ่มต้นเป็น false", + "cloud.enabled": "เป็น true หากฟังก์ชันการซิงค์สเก็ตช์เปิดใช้งาน ค่าเริ่มต้นเป็น true", + "cloud.pull.warn": "เป็น true หากผู้ใช้ควรได้รับการเตือนก่อนดึงสเก็ตช์จากคลาวด์ ค่าเริ่มต้นเป็น true", + "cloud.push.warn": "เป็น true หากผู้ใช้ควรได้รับการเตือนก่อนอัปโหลดสเก็ตช์ไปยังคลาวด์ ค่าเริ่มต้นเป็น true", + "cloud.pushpublic.warn": "True if users should be warned before pushing a public sketch to the cloud. Defaults to true.", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", + "cloud.sketchSyncEndpoint": "The endpoint used to push and pull sketches from a backend. By default it points to Arduino Cloud API.", + "compile": "รวบรวม", + "compile.experimental": "True if the IDE should handle multiple compiler errors. False by default", + "compile.revealRange": "ปรับแต่งวิธีการแสดงข้อผิดพลาดของคอมไพเลอร์ในตัวแก้ไขหลังจากการตรวจสอบ/อัปโหลดล้มเหลว ค่าที่เป็นไปได้ ได้แก่:\n'auto': เลื่อนแนวตั้งตามที่จำเป็นและแสดงบรรทัด\n'center': เลื่อนแนวตั้งตามที่จำเป็นและแสดงบรรทัดที่ตรงกลางแนวตั้ง\n'top': เลื่อนแนวตั้งตามที่จำเป็นและแสดงบรรทัดที่ใกล้กับด้านบนของหน้าจอ แนะนำสำหรับการดูการนิยามของโค้ด\n'centerIfOutsideViewport': เลื่อนแนวตั้งตามที่จำเป็นและแสดงบรรทัดที่ตรงกลางแนวตั้งเฉพาะเมื่อบรรทัดนั้นอยู่นอกหน้าจอ\nค่าเริ่มต้นคือ '{0}'", + "compile.verbose": "True for verbose compile output. False by default", + "compile.warnings": "Tells gcc which warning level to use. It's 'None' by default", + "compilerWarnings": "คำเตือนของคอมไพเลอร์", + "editorFontSize": "แก้ไขขนาดตัวอักษร", + "editorQuickSuggestions": "Editor Quick Suggestions", + "enterAdditionalURLs": "Enter additional URLs, one for each row", + "files.inside.sketches": "Show files inside Sketches", + "ide.updateBaseUrl": "URL หลักที่ใช้สำหรับดาวน์โหลดการอัปเดต ค่าเริ่มต้นเป็น 'https://downloads.arduino.cc/arduino-ide'", + "ide.updateChannel": "ช่องการอัปเดตที่ใช้สำหรับดาวน์โหลดการอัปเดต 'stable' คือเวอร์ชันที่เสถียร, 'nightly' คือการพัฒนาล่าสุด", + "interfaceScale": "Interface scale", + "invalid.editorFontSize": "Invalid editor font size. It must be a positive integer.", + "invalid.sketchbook.location": "สมุดสเก็ตช์ท้องถิ่น ไม่ถูกต้อง: {0}", + "invalid.theme": "ธีมไม่ถูกต้อง", + "language.asyncWorkers": "จำนวนของผู้ทำงานแบบอะซิงโครนัสที่ใช้โดย Arduino Language Server (clangd) การสร้างดัชนีพื้นหลังยังใช้จำนวนผู้ทำงานเหล่านี้ ค่าขั้นต่ำคือ 0 และค่าสูงสุดคือ 8 เมื่อเป็น 0 เซิร์ฟเวอร์ภาษาใช้ทุกคอร์ที่มีอยู่ ค่าเริ่มต้นคือ 0", + "language.log": "เป็น true หาก Arduino Language Server ควรสร้างไฟล์บันทึกลงในโฟลเดอร์สเก็ตช์ มิฉะนั้นเป็น false ค่าเริ่มต้นเป็น false", + "language.realTimeDiagnostics": "ถ้าเป็น true เซิร์ฟเวอร์ภาษาจะให้การวินิจฉัยแบบเรียลไทม์เมื่อพิมพ์ในตัวแก้ไข ค่าเริ่มต้นเป็น false", + "manualProxy": "กำหนดค่า proxy เอง", + "monitor": { + "dockPanel": "The area of the application shell where the _{0}_ widget will reside. It is either \"bottom\" or \"right\". It defaults to \"{1}\"." + }, + "network": "เน็ตเวิร์ก", + "newSketchbookLocation": "เลือกสมุดสเก็ตช์ท้องถิ่นใหม่", + "noCliConfig": "Could not load the CLI configuration", + "noProxy": "ไม่มี proxy", + "proxySettings": { + "hostname": "ชื่อ Host", + "password": "รหัสผ่าน", + "port": "หมายเลขพอร์ต", + "username": "ชื่อผู้ใช้" + }, + "showVerbose": "Show verbose output during", + "sketch": { + "inoBlueprint": "เส้นทางระบบไฟล์ที่สมบูรณ์ไปยังไฟล์แม่แบบ .ino เริ่มต้น หากระบุไว้ เนื้อหาของไฟล์แม่แบบจะถูกใช้สำหรับสเก็ตช์ใหม่ทุกครั้งที่สร้างโดย IDE สเก็ตช์จะถูกสร้างขึ้นด้วยเนื้อหามาตรฐานของ Arduino หากไม่ระบุ ไฟล์แม่แบบที่ไม่สามารถเข้าถึงได้จะถูกละเลย ต้องรีสตาร์ท IDE เพื่อให้การตั้งค่านี้มีผล" + }, + "sketchbook.location": "Sketchbook location", + "sketchbook.showAllFiles": "True to show all sketch files inside the sketch. It is false by default.", + "unofficialBoardSupport": "Click for a list of unofficial board support URLs", + "upload": "upload", + "upload.autoVerify": "เป็น true หาก IDE ควรตรวจสอบโค้ดโดยอัตโนมัติก่อนการอัปโหลด ค่าเริ่มต้นเป็นจริง เมื่อค่าตั้งเป็นเท็จ IDE จะไม่คอมไพล์โค้ดใหม่ก่อนที่จะอัปโหลดไบนารีไปยังบอร์ด ⚠️ ขอแนะนำให้ตั้งค่านี้เป็น false เฉพาะเมื่อคุณแน่ใจในสิ่งที่กำลังทำ ⚠️", + "upload.verbose": "True for verbose upload output. False by default.", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", + "verifyAfterUpload": "Verify code after upload", + "window.autoScale": "True if the user interface automatically scales with the font size.", + "window.zoomLevel": { + "deprecationMessage": "Deprecated. Use 'window.zoomLevel' instead." + } + }, + "renameCloudSketch": { + "renameSketchTitle": "New name of the Cloud Sketch" + }, + "replaceMsg": "Replace the existing version of {0}?", + "selectZip": "Select a zip file containing the library you'd like to add", + "serial": { + "autoscroll": "เลื่อนอัตโนมัติ", + "carriageReturn": "การคืนตำแหน่งของตัวพิมพ์", + "connecting": "เชื่อมต่อกับ '{0}' บน '{1}'...", + "message": "Message (Enter to send message to '{0}' on '{1}')", + "newLine": "บรรทัดใหม่", + "newLineCarriageReturn": "Both NL & CR", + "noLineEndings": "ไม่มีการสิ้นสุดบรรทัด", + "notConnected": "Not connected. Select a board and a port to connect automatically.", + "openSerialPlotter": "Serial Plotter", + "timestamp": "Timestamp", + "toggleTimestamp": "Toggle Timestamp" + }, + "sketch": { + "archiveSketch": "Archive Sketch", + "cantOpen": "A folder named \"{0}\" already exists. Can't open sketch.", + "compile": "Compiling sketch...", + "configureAndUpload": "Configure and Upload", + "createdArchive": "Created archive '{0}'.", + "doneCompiling": "การคอมไพล์เสร็จสิ้น", + "doneUploading": "การอัปโหลดเสร็จสิ้น", + "editInvalidSketchFolderLocationQuestion": "Do you want to try saving the sketch to a different location?", + "editInvalidSketchFolderQuestion": "Do you want to try saving the sketch with a different name?", + "exportBinary": "Export Compiled Binary", + "invalidCloudSketchName": "ชื่อจะต้องเริ่มต้นด้วยตัวอักษร ตัวเลข หรือขีดล่าง ตามด้วยตัวอักษร ตัวเลข ขีด จุด และขีดล่าง ความยาวสูงสุดคือ 36 อักขระ", + "invalidSketchFolderLocationDetails": "You cannot save a sketch into a folder inside itself.", + "invalidSketchFolderLocationMessage": "Invalid sketch folder location: '{0}'", + "invalidSketchFolderNameMessage": "Invalid sketch folder name: '{0}'", + "invalidSketchName": "ชื่อจะต้องเริ่มต้นด้วยตัวอักษร ตัวเลข หรือขีดล่าง ตามด้วยตัวอักษร ตัวเลข ขีด จุด และขีดล่าง ความยาวสูงสุดคือ 63 อักขระ", + "moving": "ย้าย", + "movingMsg": "ไฟล์ \"{0}\" จำเป็นต้องอยู่ภายในโฟลเดอร์สเก็ตช์ที่ชื่อว่า \"{1}\" \nสร้างโฟลเดอร์นี้ หรือ ย้ายไฟล์ และดำเนินการต่อหรือไม่?", + "new": "สเก็ตช์ ใหม่", + "noTrailingPeriod": "A filename cannot end with a dot", + "openFolder": "เปิดโฟลเดอร์", + "openRecent": "Open Recent", + "openSketchInNewWindow": "Open Sketch in New Window", + "reservedFilename": "'{0}' is a reserved filename.", + "saveFolderAs": "บันทึกโฟลเดอร์สเก็ตช์เป็น...", + "saveSketch": "Save your sketch to open it again later.", + "saveSketchAs": "บันทึกโฟลเดอร์สเก็ตช์เป็น...", + "showFolder": "แสดงโฟลเดอร์สเก็ตช์", + "sketch": "สเก็ตช์", + "sketchAlreadyContainsThisFileError": "สเก็ตช์นี้มีไฟล์ที่มีชื่อว่า '{0}' อยู่แล้ว", + "sketchAlreadyContainsThisFileMessage": "ไม่สามารถบันทึกสเก็ตช์ \"{0}\" เป็น \"{1}\" ได้ {2}", + "sketchbook": "สมุดสเก็ตช์", + "titleLocalSketchbook": "สมุดสเก็ตช์ ท้องถื่น", + "titleSketchbook": "สมุดสเก็ตช์", + "upload": "อัปโหลด", + "uploadUsingProgrammer": "อัปโหลดโดยใช้โปรแกรมเมอร์", + "uploading": "กำลังอัปโหลด", + "userFieldsNotFoundError": "ไม่สามารถค้นหาฟิลด์ผู้ใช้สำหรับบอร์ดที่เชื่อมต่ออยู่", + "verify": "ยืนยัน", + "verifyOrCompile": "ยืนยัน/คอมไพล์" + }, + "sketchbook": { + "newCloudSketch": "Cloud Sketch ใหม่", + "newSketch": "สเก็ตช์ ใหม่" + }, + "theme": { + "currentThemeNotFound": " ไม่สามารถค้นหาธีมที่เลือกไว้ในปัจจุบัน: {0} Arduino IDE ได้เลือกธีมที่มีในตัวที่เข้ากันได้กับธีมที่หายไป", + "dark": "มืด", + "deprecated": "{0} (เลิกใช้แล้ว)", + "hc": "มืด", + "hcLight": "สว่าง", + "light": "สว่าง", + "user": "{0} (ผู้ใช้)" + }, + "title": { + "cloud": "Cloud" + }, + "updateIndexes": { + "updateIndexes": "อัปเดตดัชนี", + "updateLibraryIndex": "อัปเดตดัชนีของไลบารี", + "updatePackageIndex": "อัปเดตดัชนีของแพ็กเกจ" + }, + "upload": { + "error": "{0} ล้มเหลว: {1}" + }, + "userFields": { + "cancel": "ยกเลิก", + "enterField": "ป้อน {0}", + "upload": "อัปโหลด" + }, + "validateSketch": { + "abortFixMessage": "สเก็ตช์ยังไม่ถูกต้อง คุณต้องการแก้ไขปัญหาที่เหลืออยู่หรือไม่? โดยการคลิก '{0}' จะเปิดสเก็ตช์ใหม่", + "abortFixTitle": "สเก็ตช์ไม่ถูกต้อง", + "renameSketchFileMessage": "ไฟล์สเก็ตช์ '{0}' ไม่สามารถใช้ได้ {1} เนื่องจากชื่อสเก็ตซ์ของคุณโหดเกินไป คุณต้องการเปลี่ยนชื่อสเก็ตช์ตอนนี้หรือไม่?", + "renameSketchFileTitle": "ชื่อไฟล์สเก็ตช์ไม่ถูกต้อง", + "renameSketchFolderMessage": "สเก็ตช์ '{0}' ไม่สามารถใช้ได้ {1} เนื่องจากชื่อสเก็ตซ์ของคุณโหดเกินไป เพื่อกำจัดข้อความนี้ กรุณาเปลี่ยนชื่อสเก็ตช์ คุณต้องการเปลี่ยนชื่อสเก็ตช์ตอนนี้หรือไม่?", + "renameSketchFolderTitle": "ชื่อสเก็ตช์ไม่ถูกต้อง" + }, + "versionWelcome": { + "cancelButton": "อาจจะในภายหลัง", + "donateButton": "บริจาคเลย!", + "donateMessage": "Arduino มุ่งมั่นที่จะรักษาซอฟต์แวร์ให้ฟรีและเป็นโอเพ่นซอร์สสำหรับทุกคน การบริจาคของคุณช่วยให้เราพัฒนาฟีเจอร์ใหม่ ปรับปรุงไลบรารี และรองรับผู้ใช้หลายล้านคนทั่วโลก!", + "donateMessage2": "โปรดพิจารณาสนับสนุนงานของเราบน Arduino IDE ที่เป็นโอเพนซอร์สฟรี", + "title": "ยินดีต้อนรับสู่เวอร์ชันใหม่ของ Arduino IDE!", + "titleWithVersion": "ยินดีต้อนรับสู่ Arduino IDE ใหม่ {0}!" + }, + "workspace": { + "alreadyExists": "'{0}' มีอยู่แล้ว" + } + }, + "theia": { + "core": { + "cannotConnectBackend": "ไม่สามารถเชื่อมต่อกับแบ็กแอนด์ได้", + "cannotConnectDaemon": "ไม่สามารถเชื่อมต่อกับ CLI daemon", + "couldNotSave": "ไม่สามารถบันทึกสเก็ตช์ได้ กรุณาคัดลอกงานที่ยังไม่ถูกบันทึกไปยังโปรแกรม Text Editor อื่นที่คุณใช้งาน และรีสตาร์ท IDE", + "daemonOffline": "CLI Daemon ออฟไลน์", + "offline": "ออฟไลน์", + "offlineText": "ออฟไลน์", + "quitTitle": "คุณแน่ใจว่าต้องการออกใช่หรือไม่" + }, + "editor": { + "unsavedTitle": "ไม่ได้บันทึก – {0}" + }, + "messages": { + "collapse": "พับ", + "expand": "ขยาย" + }, + "workspace": { + "deleteCloudSketch": "สเก็ตช์ในคลาวด์ '{0}' จะถูกลบออกถาวรจากเซิร์ฟเวอร์ของ Arduino และแคชท้องถิ่น การกระทำนี้ไม่สามารถย้อนกลับได้ คุณต้องการลบสเก็ตช์ปัจจุบันหรือไม่?", + "deleteCurrentSketch": " สเก็ตช์ '{0}' จะถูกลบออกถาวร การกระทำนี้ไม่สามารถย้อนกลับได้ คุณต้องการลบสเก็ตช์ปัจจุบันหรือไม่", + "fileNewName": "ชื่อสำหรับไฟล์ใหม่", + "invalidExtension": "{0} ไม่ใช่ส่วนขยายที่ถูกต้อง!", + "newFileName": "ชื่อใหม่สำหรับไฟล์" + } + } +} diff --git a/i18n/tr.json b/i18n/tr.json index 6df12a641..6e5b1e470 100644 --- a/i18n/tr.json +++ b/i18n/tr.json @@ -1,38 +1,51 @@ { "arduino": { "about": { - "detail": "Versiyon: {0}\nDate: {1}{2}\nCLI Versiyonu: {3}{4} [{5}]\n\n{6}", + "detail": "Versiyon: {0}\nTarih: {1}{2}\nCLI Versiyonu: {3}\n\n{4}", "label": "{0} Hakkında" }, + "account": { + "goToCloudEditor": "Bulut Düzenleyici'ye Git", + "goToIoTCloud": "IoT Bulut'a Git", + "goToProfile": "Profile Git", + "menuTitle": "Arduino Cloud" + }, "board": { "board": "Kart{0}", "boardConfigDialogTitle": "Başka Kart ve Port Seç", + "boardDataReloaded": "Kart bilgisi yeniden yüklendi.", "boardInfo": "Kart Bilgisi", + "boards": "kartlar", "configDialog1": "Bir eskiz yüklemek istiyorsanız Kart ve Port seçmelisiniz.", "configDialog2": "Sadece Kart seçerseniz eskizinizi derleyebilir, ancak yükleyemezsiniz.", "couldNotFindPreviouslySelected": "Kurulu '{1}' platformunda daha önce seçili kart '{0}' bulunamadı. Lütfen kullanmak istediğiniz kartı elle yeniden seçin. Şimdi tekrar seçmek istiyor musunuz?", - "disconnected": "Bağlantı Kesildi", + "editBoardsConfig": "Kart ve Portu Düzenle...", "getBoardInfo": "Kart Bilgisini Al", "inSketchbook": "(Eskiz Defteri'nde)", "installNow": "Mevcut seçili \"{2}\" kartı için \"{0} {1}\" çekirdeğinin kurulması gerekiyor. Bunu şimdi kurmak istiyor musunuz?", - "noFQBN": "FQBN seçili kart \"{0}\" için mevcut değil. İlgili çekirdeği kurdunuz mu?", + "noBoardsFound": "\"{0}\" için kart bulunamadı", + "noNativeSerialPort": "Yerel seri port, veri alınamıyor.", "noPortsDiscovered": "Port bulunamadı", - "noPortsSelected": "'{0}' kartı için port seçilmedi", - "noneSelected": "Kart seçilmedi.", + "nonSerialPort": "Seri port değil, veri alınamıyor.", "openBoardsConfig": "Başka Kart ve Port Seç", - "platformMissing": "Seçili '{0}' kart için platform kurulmadı.", "pleasePickBoard": "Lütfen seçtiğiniz porta bağlı kartı seçin.", "port": "Port{0}", - "portLabel": "Port{0}", + "ports": "portlar", "programmer": "Programlayıcı", + "reloadBoardData": "Kart Bilgisini Yeniden Yükle", "reselectLater": "Daha sonra tekrar seç", + "revertBoardsConfig": " '{1}''da bulunan '{0}''i kullan", "searchBoard": "Kart ara", "selectBoard": "Kart Seç", - "selectBoardForInfo": "Kart bilgisi almak için lütfen bir kart seçin.", + "selectBoardToReload": "Lütfen önce bir kart seçin.", "selectPortForInfo": "Kart bilgisi almak için lütfen bir port seçin.", "showAllAvailablePorts": "Etkinleştirildiğinde tüm mevcut portları görüntüler", + "showAllPorts": "Tüm portları göster", "succesfullyInstalledPlatform": "Platform başarıyla kuruldu {0}:{1}", - "succesfullyUninstalledPlatform": "Platform başarıyla kaldırıldı {0}:{1}" + "succesfullyUninstalledPlatform": "Platform başarıyla kaldırıldı {0}:{1}", + "typeOfPorts": "{0} portlar", + "unconfirmedBoard": "Doğrulanmamış kart", + "unknownBoard": "Bilinmeyen kart" }, "boardsManager": "Kart Yöneticisi", "boardsType": { @@ -77,14 +90,15 @@ "mouseError": "'Mouse' bulunamadı. Eskiziniz '#include <Mouse.h>' satırını içeriyor mu? " }, "cloud": { - "account": "Hesap", "chooseSketchVisibility": "Eskizinizin görünürlüğünü seçin", + "cloudSketchbook": "Bulut Eskiz Defteri", "connected": "Bağlandı", "continue": "Devam et", - "donePulling": "Çekme bitti: ‘{0}’.", - "donePushing": "Gönderme bitti: ‘{0}’.", + "donePulling": "Çekme bitti: '{0}'.", + "donePushing": "Gönderme bitti: '{0}'.", "embed": "Yerleştir:", "emptySketchbook": "Eskiz Defteriniz boş", + "goToCloud": "Buluta Git", "learnMore": "Daha fazlasını öğren", "link": "Bağlantı:", "notYetPulled": "Bulut'a gönderilemedi. Henüz çekilmemiş.", @@ -102,10 +116,9 @@ "pushSketch": "Eskizi Gönder", "pushSketchMsg": "Bu bir Herkese Açık Eskiz. Göndermeden önce tüm hassas bilgilerin arduino_secrets.h dosyaları içinde tanımlandığından emin olun. Eskizleri Paylaş panelinden gizli yapabilirsiniz.", "remote": "Uzak", - "remoteSketchbook": "Bulut Eskiz Defteri", "share": "Paylaş...", "shareSketch": "Eskizi Paylaş", - "showHideRemoveSketchbook": "Bulut Eskiz Defteri'ni Göster/Gizle", + "showHideSketchbook": "Bulut Eskiz Defteri'ni Göster/Gizle", "signIn": "GİRİŞ YAP", "signInToCloud": "Arduino Cloud'a giriş yap", "signOut": "Çıkış Yap", @@ -113,12 +126,23 @@ "syncEditSketches": "Arduino Cloud eskizlerinizi eşitleyin ve düzenleyin", "visitArduinoCloud": "Bulut Eskizleri oluşturmak için Arduino Cloud'u ziyaret edin." }, + "cloudSketch": { + "alreadyExists": "'{0}' adlı bulut eskiz zaten mevcut.", + "creating": "Bulut eskiz '{0}' oluşturuluyor...", + "new": "Yeni Bulut Eskiz", + "notFound": "Bulut eskiz '{0}' çekilemedi. Böyle bir eskiz yok.", + "pulling": "Eskiz defteri eşitleniyor, '{0}' çekiliyor...", + "pushing": "Eskiz defteri eşitleniyor, '{0}' gönderiliyor...", + "renaming": "Bulut eskiz adı '{0}' dan '{1}''a değiştiriliyor...", + "synchronizingSketchbook": "Eskiz defteri eşitleniyor..." + }, "common": { "all": "Tümü", "contributed": "Eklenen", "installManually": "Elle Kur", "later": "Daha sonra", "noBoardSelected": "Kart seçili değil", + "noSketchOpened": "Eskiz açılmadı", "notConnected": "[bağlı değil]", "offlineIndicator": "Çevrimdışı görünüyorsunuz. Arduino CLI internet bağlantısı olmadan gerekli kaynakları indiremeyebilir ve hatalı çalışabilir. Lütfen internete bağlanın ve uygulamayı yeniden başlatın.", "oldFormat": "'{0}' hala eski `.pde` biçimini kullanıyor. Yeni `.ino` uzantısına geçmek istiyor musunuz?", @@ -126,11 +150,13 @@ "processing": "Processing", "recommended": "Önerilen", "retired": "Emekli", + "selectManually": "Elle Seç", "selectedOn": "- {0}", "serialMonitor": "Seri Port Ekranı", "type": "Tür", "unknown": "Bilinmeyen", - "updateable": "Güncellenebilir" + "updateable": "Güncellenebilir", + "userAbort": "Kullanıcı iptali" }, "compile": { "error": "Derleme hatası: {0}" @@ -138,22 +164,49 @@ "component": { "boardsIncluded": "Bu pakete dahil kartlar:", "by": "-", + "clickToOpen": "Tarayıca açmak için tıkla: {0}", "filterSearch": "Aramayı Filtrele...", - "install": "KUR", + "install": "Kur", + "installLatest": "En Yeniyi Kur", + "installVersion": "{0}'i kur", + "installed": "{0} kuruldu", "moreInfo": "Daha fazla bilgi", + "otherVersions": "Diğer Sürümler", + "remove": "Kaldır", + "title": "{0} / {1}", "uninstall": "Kaldır", "uninstallMsg": "{0} kaldırılsın mı?", - "version": "Versiyon {0}" + "update": "Güncelle" + }, + "configuration": { + "cli": { + "inaccessibleDirectory": "'{0}': {1} konumundaki eskiz defterine erişilemedi" + } + }, + "connectionStatus": { + "connectionLost": "Bağlantı koptu. Bulut eskiz işlemleri ve güncellemeleri kullanılamayacak." }, "contributions": { "addFile": "Dosya Ekle", "fileAdded": "Eskize bir dosya eklendi.", + "plotter": { + "couldNotOpen": "Seri Çizici açılamadı" + }, "replaceTitle": "Değiştir" }, + "core": { + "compilerWarnings": { + "all": "Tümü", + "default": "Varsayılan", + "more": "Daha fazla", + "none": "Hiçbiri" + } + }, "coreContribution": { "copyError": "Hata mesajlarını kopyala", "noBoardSelected": "Kart seçili değil. Lütfen Araçlar > Kart menüsünden Arduino kartınızı seçin." }, + "createCloudCopy": "Eskizi Bulut'a Gönder", "daemon": { "restart": "Arthizmeti Yeniden Başlat", "start": "Arthizmeti Başlat", @@ -162,8 +215,15 @@ "debug": { "debugWithMessage": "Debug - {0}", "debuggingNotSupported": "Debug '{0}' tarafından desteklenmiyor", + "getDebugInfo": "Hata ayıklama bilgisi alınıyor...", "noPlatformInstalledFor": "'{0}' için platform kurulmadı", - "optimizeForDebugging": "Debug için Optimize et" + "optimizeForDebugging": "Debug için Optimize et", + "sketchIsNotCompiled": "Hata ayıklama -debug- oturumuna başlamadan önce '{0}' eskizi doğrulanmalıdır. Lütfen eskizi doğrulayın ve hata ayıklamayı yeniden başlatın. Eskizi şimdi doğrulamak ister misiniz?" + }, + "developer": { + "clearBoardList": "Kart Listesi Geçmişini Temizle", + "clearBoardsConfig": "Kart ve Port Seçimini Temizle", + "dumpBoardList": "Kart Listesini Boşalt" }, "dialog": { "dontAskAgain": "Tekrar sorma" @@ -180,10 +240,6 @@ "previousError": "Önceki Hata", "revealError": "Gösterim Hatası" }, - "electron": { - "couldNotSave": "Eskiz kaydedilemedi. Lütfen kaydedilmeyen işinizi favori metin düzenleyicinize kopyalayın ve IDE'yi yeniden başlatın.", - "unsavedChanges": "Kaydedilmemiş değişiklikler kaybedilecek." - }, "examples": { "builtInExamples": "Dahili örnekler", "couldNotInitializeExamples": "Dahili örnekler bulunamadı.", @@ -201,7 +257,7 @@ "selectBoard": "Kart Seç", "selectVersion": "Firmware versiyonunu seç", "successfullyInstalled": "Firmware başarıyla kuruldu.", - "updater": "WiFi101 / WiFiNINA Firmware Güncelleyici" + "updater": "Firmware Güncelleyici" }, "help": { "environment": "Ortam", @@ -219,6 +275,9 @@ "checkForUpdates": "Arduino IDE Güncellemelerini kontrol et", "closeAndInstallButton": "Kapat ve Kur", "closeToInstallNotice": "Yazılımı kapatın ve güncellemeyi makinanıza yükleyin.", + "donateLinkIconTitle": "bağış sayfasını aç", + "donateLinkText": "bizi desteklemek için bağış yap", + "donateText": "Açık kaynak aşktır, {0}", "downloadButton": "İndir", "downloadingNotice": "Arduino IDE'nin son sürümü indiriliyor.", "errorCheckingForUpdates": "Arduino IDE güncellemelerini kontrol ederken hata oluştu.{0}", @@ -232,16 +291,20 @@ "updateAvailable": "Güncelleme Mevcut", "versionDownloaded": "Arduino IDE {0} indirildi." }, + "installable": { + "libraryInstallFailed": "Kütüphane kurulamadı: '{0}{1}'.", + "platformInstallFailed": "Platform kurulamadı: '{0}{1}'." + }, "library": { "addZip": ".ZIP Kütüphanesi Ekle...", "arduinoLibraries": "Arduino kütüphaneleri", "contributedLibraries": "Eklenmiş kütüphaneler", - "dependenciesForLibrary": "{0}:{1} kütüphanesi için gereklilikler", "include": "Kütüphane Ekle", "installAll": "Tümünü kur", + "installLibraryDependencies": "Kütüphane gerekliliklerini kur", "installMissingDependencies": "Tüm eksik gereklilikleri kurmak ister misiniz?", "installOneMissingDependency": "Eksik gereklilikleri kurmak istiyor musunuz?", - "installOnly": "Sadece {0}'u kur", + "installWithoutDependencies": "Gereklilikler olmadan kur", "installedSuccessfully": "{0}:{1} kütüphanesi başarıyla kuruldu", "libraryAlreadyExists": "Kütüphane zaten mevcut. Üzerine yazmak istiyor musunuz?", "manageLibraries": "Kütüphaneleri Yönet...", @@ -278,9 +341,23 @@ "tools": "Araçlar" }, "monitor": { + "alreadyConnectedError": " {0} {1} portuna bağlanılamadı. Zaten bağlı.", + "baudRate": "{0} baud", + "connectionFailedError": "{0} {1} portuna bağlanılamadı.", + "connectionFailedErrorWithDetails": "{0} {1} {2} portuna bağlanılamadı.", + "connectionTimeout": "Zaman aşımı. IDE başarılı bağlantıdan sonra ekrandan 'başarılı' mesajını almadı", + "missingConfigurationError": " {0} {1} portuna bağlanılamadı. Ekran yapılandırması eksik.", + "notConnectedError": " {0} {1} portuna bağlı değil.", "unableToCloseWebSocket": "Websocket kapatılamadı ", "unableToConnectToWebSocket": "Websocket'e bağlanılamadı" }, + "newCloudSketch": { + "newSketchTitle": "Yeni Bulut Eskiz'in adı" + }, + "portProtocol": { + "network": "Ağ", + "serial": "Seri" + }, "preferences": { "additionalManagerURLs": "Ek Kart Yöneticisi URL'leri", "auth.audience": "OAuth2 audience.", @@ -297,6 +374,7 @@ "cloud.pull.warn": "Kullanıcılar bir bulut eskizini çekmeden önce uyarılacaksa açın. Varsayılan: Açık.", "cloud.push.warn": "Kullanıcılar bir bulut eskizini göndermeden önce uyarılacaksa açın. Varsayılan: Açık.", "cloud.pushpublic.warn": "Kullanıcılar buluta herkese açık bir eskiz yüklemeden önce uyarılacaksa açın. Varsayılan: Açık.", + "cloud.sharedSpaceId": "Eskiz defterinin yükleneceği paylaşılan Arduino Cloud alanı ID'si. Boş bırakılırsa özel alanınız seçilir.", "cloud.sketchSyncEndpoint": "Ana yapıdan eskizler çekmek veya göndermek için son nokta kullanılır. Varsayılan: Arduino Cloud API.", "compile": "derle", "compile.experimental": "IDE'nin birden fazla derleme hatasını kontrol etmesini istiyorsanız açın. Varsayılan olarak kapalı.", @@ -314,29 +392,50 @@ "invalid.editorFontSize": "Hatalı editör yazı tipi boyutu. Pozitif bir tam sayı olmalı.", "invalid.sketchbook.location": "Hatalı eskiz defteri konumu: {0}", "invalid.theme": "Hatalı tema.", + "language.asyncWorkers": "Arduino Language Server (clangd) tarafından kullanılan asenkron işlem sayısı. Arkaplan dizinleticisi de bu kadar işlem kullanır. Asgari değer 0, azami ise 8. 0 olduğu zaman dil sunucusu mevcut olan tüm çekirdekleri kullanır. Varsayılan değer 0.", "language.log": "Arduino Language Server eskiz klasörüne log dosyaları oluşturacaksa True. Aksi takdirde false. Varsayılan: false.", "language.realTimeDiagnostics": "Açılırsa, dil sunucusu editöre yazarken gerçek zamanlı kontroller sağlar. Varsayılan olarak kapalıdır.", "manualProxy": "Elle vekil ayarlama", + "monitor": { + "dockPanel": "Uygulama kabuğunda _{0}_ aracının konumlanacağı alan. Altta veya sağda yer alabilir. Varsayılan konum: \"{1}\"" + }, "network": "Ağ", "newSketchbookLocation": "Yeni eskiz defteri konumu seç", + "noCliConfig": "CLI yapılandırması yüklenemedi", "noProxy": "Vekil yok", + "proxySettings": { + "hostname": "Host adı", + "password": "Parola", + "port": "Port numarası", + "username": "Kullanıcı adı" + }, "showVerbose": "Ayrıntılı çıktıyı görüntüle", + "sketch": { + "inoBlueprint": "Örnek `.ino` dosyasının tam dosya yoludur. Açıldığında IDE'de oluşturulan her yeni eskizde bu örnek dosya içeriği kullanılır. Açılmadığında eskizler varsayılan Arduino içeriği ile oluşturulur. Ulaşılamayan örnek dosyalar yoksayılır. Bu ayarın etkili olması için **IDE'nin yeniden başlatılması** gerekir." + }, "sketchbook.location": "Eskiz Defteri konumu", "sketchbook.showAllFiles": "Tüm eskiz dosyalarını eskiz içinde görüntülemek için açın. Varsayılan: kapalı.", - "survey.notification": "Bir anket bulunduğunda kullanıcılara gösterilecekse açın. Varsayılan olarak açıktır.", "unofficialBoardSupport": "Desteklenmeyen kart destek URL'leri listesi için tıklayın", "upload": "yükle", + "upload.autoVerify": "Açıldığında IDE yükleme öncesinde kodu otomatik olarak doğrular. Varsayılan olarak açıktır. Bu değer kapalı olduğunda, IDE ikili dosyayı karta yüklemeden önce tekrar derlemez. Bu ayarı sadece gerçekten ne yaptığınızı biliyor olduğunuz durumlarda kapatmanız önerilir.", "upload.verbose": " Ayrıntılı yükleme çıktısı için açın. Varsayılan: Kapalı", + "upload.verify": "Yüklemeden sonra, kart üzerindeki belleğin içeriğini yüklenen ikili dosya ile doğrula.", "verifyAfterUpload": "Yüklemeden sonra kodu doğrula", "window.autoScale": "Kullanıcı arayüzü yazı tipi boyutu ile otomatik olarak ölçeklenecekse açın", - "window.zoomLevel": "Pencerenin yakınlaştırma seviyesini ayarlar. Orijinal boyut 0'dır ve her yukarı artış (örn. 1) veya düşüş (örn. -1) %20 daha büyük veya daha küçük anlamına gelir. Aynı zamanda yakınlaştırma seviyesini daha hassas ayarlamak için ondalıklar da girebilirsiniz." + "window.zoomLevel": { + "deprecationMessage": "Kullanımdan kalktı. Yerine 'window.zoomLevel' kullanın." + } + }, + "renameCloudSketch": { + "renameSketchTitle": "Bulut Eskiz'in yeni adı" }, "replaceMsg": "{0}'un mevcut versiyonu değiştirilsin mi?", "selectZip": "Eklemek istediğiniz kütüphaneyi içeren ZIP dosyasını seçin", "serial": { "autoscroll": "Otomatik Kaydırma", "carriageReturn": "Satır Başı", - "message": "Mesaj ({0} + Mesaj göndermek için Enter '{1}' / '{2}')", + "connecting": "'{1}' üzerindeki '{0}' bağlantısı kuruluyor...", + "message": "Mesaj ('{0}' - '{1}''a mesaj göndermek için Enter'a basın)", "newLine": "Yeni Satır", "newLineCarriageReturn": "NL ve CR ile Birlikte", "noLineEndings": "Satır Sonu Yok", @@ -348,24 +447,34 @@ "sketch": { "archiveSketch": "Eskizi Arşivle", "cantOpen": "\"{0}\" klasörü zaten mevcut. Eskiz açılamadı.", - "close": "Eskizi kapatmak istediğinizden emin misiniz?", "compile": "Eskiz derleniyor...", "configureAndUpload": "Ayarla ve Yükle", "createdArchive": "'{0}' arşivi oluşturuldu.", "doneCompiling": "Derleme bitti.", "doneUploading": "Yükleme bitti.", + "editInvalidSketchFolderLocationQuestion": "Eskizi farklı bir konuma kaydetmeyi denemek ister misiniz?", + "editInvalidSketchFolderQuestion": "Eskizi farklı bir isimle kaydetmeyi denemek ister misiniz?", "exportBinary": "Derlenmiş Dosyayı Dışa Aktar", + "invalidCloudSketchName": "İsim bir harf, rakam veya altçizgi ile başlamalı, harfler, rakamlar, orta çizgi, nokta veya altçizgi ile devam etmelidir. Azami uzunluk 36 karakterdir.", + "invalidSketchFolderLocationDetails": "Bir eskizi kendi içindeki bir klasöre kaydedemezsiniz.", + "invalidSketchFolderLocationMessage": "Hatalı eskiz klasörü konumu: {0}", + "invalidSketchFolderNameMessage": "Hatalı eskiz klasörü adı: {0}", + "invalidSketchName": "İsim bir harf, rakam veya altçizgi ile başlamalı, harfler, rakamlar, orta çizgi, nokta veya altçizgi ile devam etmelidir. Azami uzunluk 63 karakterdir.", "moving": "Taşınıyor", "movingMsg": "\"{0}\" dosyasının \"{1}\" isminde bir eskiz klasörünün içinde olması gerekiyor.\nKlasörü oluştur, dosyayı taşı ve devam et?", - "new": "Yeni", + "new": "Yeni Eskiz", + "noTrailingPeriod": "Dosya adı nokta ile bitemez", "openFolder": "Klasörü Aç", "openRecent": "Yakın Geçmiş", "openSketchInNewWindow": "Eskizi Yeni Pencerede Aç", + "reservedFilename": "'{0}' rezerve bir isimdir, kullanılamaz.", "saveFolderAs": "Eskiz klasörünü farklı kaydet...", "saveSketch": "Daha sonra tekrar açmak için eskizinizi kaydedin.", "saveSketchAs": "Eskiz klasörünü farklı kaydet...", "showFolder": "Eskiz Klasörünü Göster", "sketch": "Eskiz", + "sketchAlreadyContainsThisFileError": "Eskizde zaten '{0}' isminde bir dosya var", + "sketchAlreadyContainsThisFileMessage": "\"{0}\" eskizi \"{1}\" olarak kaydedilemedi. {2}", "sketchbook": "Eskiz Defteri", "titleLocalSketchbook": "Yerel Eskiz Defteri", "titleSketchbook": "Eskiz Defteri", @@ -376,10 +485,26 @@ "verify": "Doğrula", "verifyOrCompile": "Doğrula/Derle" }, - "survey": { - "answerSurvey": "Anketi yanıtla", - "dismissSurvey": "Tekrar gösterme", - "surveyMessage": "Lütfen bu çok kısa anketi yanıtlayarak gelişmemize yardım edin. Topluluğumuza değer veriyoruz e destekçilerimizi biraz daha iyi tanımak isteriz." + "sketchbook": { + "newCloudSketch": "Yeni Bulut Eskiz", + "newSketch": "Yeni Eskiz" + }, + "theme": { + "currentThemeNotFound": "Mevcut seçili tema bulunamadı: {0}. Arduino IDE kayıp olanın yerine uyumlu dahili bir tane seçti.", + "dark": "Koyu", + "deprecated": "{0} (kaldırıldı)", + "hc": "Koyu Yüksek Karşıtlık", + "hcLight": "Açık Yüksek Karşıtlık", + "light": "Açık", + "user": "{0} (kullanıcı)" + }, + "title": { + "cloud": "Bulut" + }, + "updateIndexes": { + "updateIndexes": "Katalogları Güncelle", + "updateLibraryIndex": "Kütüphane Kataloğunu Güncelle", + "updatePackageIndex": "Paket Kataloğunu Güncelle" }, "upload": { "error": "{0} hata: {1}" @@ -388,11 +513,27 @@ "cancel": "İptal", "enterField": "{0} gir", "upload": "Yükle" + }, + "validateSketch": { + "abortFixMessage": "Eskiz hala hatalı. Kalan sorunları çözmek ister misiniz? '{0}' butonuna tıklarsanız yeni bir eskiz açılır.", + "abortFixTitle": "Hatalı eskiz", + "renameSketchFileMessage": "'{0}' adlı eskiz kullanılamaz. {1} Eskiz dosyasını şimdi yeniden adlandırmak ister misiniz?", + "renameSketchFileTitle": "Hatalı eskiz dosya adı", + "renameSketchFolderMessage": "'{0}' eskizi kullanılamaz. {1} Bu mesajdan kurtulmak için eskizi yeniden adlandırın. Eskizi şimdi yeniden adlandırmak istiyor musunuz?", + "renameSketchFolderTitle": "Hatalı eskiz adı" + }, + "versionWelcome": { + "cancelButton": "Belki sonra", + "donateButton": "Şimdi bağış yap", + "donateMessage": "Arduino, yazılımı herkes için ücretsiz ve açık kaynaklı tutmaya adanmıştır. Bağışınız yeni özellikler geliştirmemize, kütüphaneleri daha iyi yapmamıza ve dünya çapındaki milyonlarca kullanıcıyı desteklememize yardım eder.", + "donateMessage2": "Lütfen özgür açık kaynaklı Arduino IDE üzerindeki çalışmalarımızı desteklemeyi gözden geçirin.", + "title": "Arduino IDE'nin yeni sürümüne hoş geldiniz!", + "titleWithVersion": "Yeni Arduino IDE'ye hoş geldin {0}!" + }, + "workspace": { + "alreadyExists": "'{0}' zaten mevcut." } }, - "cloud": { - "GoToCloud": "BULUTA GİT" - }, "theia": { "core": { "cannotConnectBackend": "Ana yapıya bağlanılamadı.", @@ -400,13 +541,9 @@ "couldNotSave": "Eskiz kaydedilemedi. Lütfen kaydedilmeyen işinizi favori metin düzenleyicinize kopyalayın ve IDE'yi yeniden başlatın.", "daemonOffline": "CLI Daemon Çevrimdışı", "offline": "Çevrimdışı", + "offlineText": "Çevrimdışı", "quitTitle": "Çıkmak istediğinizden emin misiniz?" }, - "debug": { - "start": "Başla...", - "startError": "Debug oturumunu başlatırken bir hata oluştu, daha fazla bilgi için logları kontrol edin.", - "typeNotSupported": "\"{0}\" debug oturum tipi desteklenmiyor." - }, "editor": { "unsavedTitle": "Kaydedilmedi – {0}" }, @@ -415,10 +552,10 @@ "expand": "Genişlet" }, "workspace": { - "deleteCurrentSketch": "Mevcut eskizi silmek istiyor musunuz?", + "deleteCloudSketch": "'{0}' bulut eskizi Arduino sunucularından ve yerel geçici saklamadan kalıcı olarak silinecek. Bu işlem geri alınamaz. Mevcut eskizi silmek istiyor musunuz?", + "deleteCurrentSketch": "'{0}' eskiz kalıcı olarak silinecek. Bu işlem geri alınamaz. Mevcut eskizi silmek istiyor musunuz?", "fileNewName": "Yeni dosya için isim", - "invalidExtension": ".{0} geçerli bir uzantı değil", - "invalidFilename": "Hatalı dosya adı.", + "invalidExtension": ".{0} geçerli bir uzantı değil", "newFileName": "Dosya için yeni isim" } } diff --git a/i18n/uk.json b/i18n/uk.json new file mode 100644 index 000000000..621c9bba1 --- /dev/null +++ b/i18n/uk.json @@ -0,0 +1,562 @@ +{ + "arduino": { + "about": { + "detail": "Версія: {0}\nДата: {1}{2}\nВерсія CLI: {3}\n\n{4}", + "label": "Про {0}" + }, + "account": { + "goToCloudEditor": "Перейти в Хмарний Редактор", + "goToIoTCloud": "Перейти в IoT Хмару", + "goToProfile": "Перейти в Профіль", + "menuTitle": "Arduino Хмара" + }, + "board": { + "board": "Плата {0}", + "boardConfigDialogTitle": "Оберіть іншу плату або порт", + "boardDataReloaded": "Board data reloaded.", + "boardInfo": "Інформація про плату", + "boards": "плати", + "configDialog1": "Оберіть плату та порт якщо бажаєте завантажити скетч", + "configDialog2": "Якщо вибрати лише плату, ви зможете скомпілювати, але не завантажити свій ескіз.", + "couldNotFindPreviouslySelected": "Не вдалося знайти раніше обрану плату '{0}' на встановленій платформі '{1}'. Будь ласка, вручну оберіть плату, яку хочете використовувати. Бажаєте повторно вибрати її зараз?", + "editBoardsConfig": "Змінити Плату та Порт...", + "getBoardInfo": "Отримати інформацію про плату", + "inSketchbook": "(у книзі скетчів)", + "installNow": "Для обраної плати \"{2}\", має бути встановлено ядро \"{0} {1}\". Хочете встановити його зараз?", + "noBoardsFound": "Для \"{0}\" не знайдено плат", + "noNativeSerialPort": "Послідовний порт, не може отримати інформацію.", + "noPortsDiscovered": "Порти не знайдено", + "nonSerialPort": "Не-послідовний порт, не може отримати інформацію.", + "openBoardsConfig": "Оберіть іншу плату або порт", + "pleasePickBoard": "Будь ласка, оберіть підключену плату до порта, який ви вибрали.", + "port": "Порт{0}", + "ports": "порти", + "programmer": "Програматор", + "reloadBoardData": "Reload Board Data", + "reselectLater": "Переобрати пізніше", + "revertBoardsConfig": "Використовувати '{0}' знайдену на '{1}'", + "searchBoard": "Шукати плату", + "selectBoard": "Оберіть плату", + "selectBoardToReload": "Please select a board first.", + "selectPortForInfo": "Оберіть порт для оновлення інформації про плату.", + "showAllAvailablePorts": "Відображати усі доступні порти коли увімкнено", + "showAllPorts": "Показати всі порти", + "succesfullyInstalledPlatform": "Успішно встановлено платформу {0}:{1}", + "succesfullyUninstalledPlatform": "Успішно видалено платформу {0}:{1}", + "typeOfPorts": "{0} порти", + "unconfirmedBoard": "Неперевірена плата", + "unknownBoard": "Невідома плата" + }, + "boardsManager": "Менеджер плат", + "boardsType": { + "arduinoCertified": "Сертифіковано Arduino" + }, + "bootloader": { + "burnBootloader": "Записати загрузчик", + "burningBootloader": "Завантаження загрузчика...", + "doneBurningBootloader": "Завантажено загрузчика завершено." + }, + "burnBootloader": { + "error": "Помилка при завантаженні загрузчика: {0}" + }, + "certificate": { + "addNew": "Додати Новий", + "addURL": "Додайте URL для отримання SSL сертифікату", + "boardAtPort": "{0} в {1}", + "certificatesUploaded": "Сертифікат завантажено.", + "enterURL": "Введіть URL", + "noSupportedBoardConnected": "Підключена плата, що не підтримується", + "openContext": "Відкрити контекст", + "remove": "Видалити ", + "selectBoard": "Оберіть плату ...", + "selectCertificateToUpload": "1. Оберіть сертифікат для завантаження", + "selectDestinationBoardToUpload": "2. Обрати плату та завантажити сертифікат", + "upload": "Завантажити", + "uploadFailed": "Невдале завантаження. Спробуйте знову.", + "uploadRootCertificates": "Завантажити кореневі сертифікати SSL", + "uploadingCertificates": "Завантаження сертифікатів." + }, + "checkForUpdates": { + "checkForUpdates": "Перевірити оновлення Arduino", + "installAll": "Встановити все", + "noUpdates": "Нема доступних оновлень.", + "promptUpdateBoards": "Доступні оновлення для плат.", + "promptUpdateLibraries": "Доступні оновлення бібліотек.", + "updatingBoards": "Оновлення плат...", + "updatingLibraries": "Оновлення бібліотек..." + }, + "cli-error-parser": { + "keyboardError": "'Клавіатура' не знайдено. Чи містить скетч рядок '#include <Keyboard.h>'?", + "mouseError": "'Миша' не знайдено. Чи містить скетч рядок '#include <Mouse.h>'?" + }, + "cloud": { + "chooseSketchVisibility": "Виберіть видимість вашого скетчу:", + "cloudSketchbook": "Хмарна Книга Скетчів", + "connected": "Під'єднано", + "continue": "Продовжити", + "donePulling": "Отримано '{0}'.", + "donePushing": "Відправлено '{0}'.", + "embed": "Вбудовано:", + "emptySketchbook": "Ваша книга скетчів пуста", + "goToCloud": "Перейти в Хмару", + "learnMore": "Дізнатися більше", + "link": "Посилання:", + "notYetPulled": "Не можливо відправити у Хмару. Ще не отримано.", + "offline": "Відключено", + "openInCloudEditor": "Відкрити у Хмарному Редакторі", + "options": "Опції...", + "privateVisibility": "Приватно. Тільки ви можете бачити скетч. ", + "profilePicture": "Зображення профіля", + "publicVisibility": "Публічно. Будь-хто за посиланням, може бачити скетч.", + "pull": "Отримати", + "pullFirst": "Спочатку треба отримати, щоб мати мажливість надсилати в Хмару.", + "pullSketch": "Отримати скетч", + "pullSketchMsg": "Отримання цього скетчу з Хмари, призведе до заміщення локальної версії. Бажаєте продовжити?", + "push": "Надіслати", + "pushSketch": "Надіслати скетч", + "pushSketchMsg": "Це публічний скетч. Перед надсиланням переконайтеся, що він не містить конфіденційну інформацію у файлі arduino_secrets.h. Ви можете зробити скетч приватним на панелі «Поділитися».", + "remote": "Пульт", + "share": "Поділитися...", + "shareSketch": "Поділитися скетчем", + "showHideSketchbook": "Показати/Сховати Хмарну книгу скетчів", + "signIn": "Вхід", + "signInToCloud": "Вхід в Хмару Arduino", + "signOut": "Вихід", + "sync": "Синхронізувати", + "syncEditSketches": "Синхроніхувати та редагувати скетчі в Хмарі Arduino", + "visitArduinoCloud": "Перейти в Хмару Arduino, щоб створити хмарні скетчі" + }, + "cloudSketch": { + "alreadyExists": "Хмарний скетч '{0}' вже існує.", + "creating": "Створення хмарного скетчу '{0}'...", + "new": "Новий хмарний скетч", + "notFound": "Не можливо підтягнути хмарний скетч '{0}'. Він не існує.", + "pulling": "Синхронізація книги скетчів, отримання '{0}'...", + "pushing": "Синхронізація книги скетчів, надсилання '{0}'...", + "renaming": "Перейменування хмарного скетча з '{0}' на '{1}'...", + "synchronizingSketchbook": "Синхронізація книги скетчів" + }, + "common": { + "all": "Всі", + "contributed": "Внесено", + "installManually": "Встановити вручну", + "later": "Пізніше", + "noBoardSelected": "Не обрана плата", + "noSketchOpened": "Нема відкритих скетчів", + "notConnected": "[не підключено]", + "offlineIndicator": "Здається, ви відключені від мережі. Без підключення до Інтернету Arduino CLI не може завантажити необхідні ресурси. Підключіться до Інтернету та перезапустіть програму.", + "oldFormat": "'{0}' досі використовує старий формат `.pde`. Бажаєте перейти на нове розширення `.ino` ?", + "partner": "Партнер", + "processing": "Обробляється", + "recommended": "Рекомендовано", + "retired": "Застаріло", + "selectManually": "Оберіть вручну", + "selectedOn": "на {0}", + "serialMonitor": "Монітор порту", + "type": "Тіп", + "unknown": "Невідомо", + "updateable": "Можливість оновлення", + "userAbort": "Переривання користувача" + }, + "compile": { + "error": "Помилка компілятора: {0}" + }, + "component": { + "boardsIncluded": "Плати в цьому пакунку:", + "by": "за", + "clickToOpen": "Натисніть, щоб відкрити браузер: {0}", + "filterSearch": "Фільтри пошуку...", + "install": "Встановити", + "installLatest": "Встановити новіші", + "installVersion": "Встановити {0}", + "installed": "{0} встановлено", + "moreInfo": "Більше інформації ", + "otherVersions": "Інші Версії", + "remove": "Видалити ", + "title": "{0} з {1}", + "uninstall": "Видалити", + "uninstallMsg": "Бажаєте видалити {0}?", + "update": "Оновити" + }, + "configuration": { + "cli": { + "inaccessibleDirectory": "Відсутній доступ до книги скетчів на '{0}': {1}" + } + }, + "connectionStatus": { + "connectionLost": "З'єднання розірване. Дії та оновлення з хмарним скетчем неможливі." + }, + "contributions": { + "addFile": "Додати Файл", + "fileAdded": "Один файл додано до скетчу.", + "plotter": { + "couldNotOpen": "Неможливо відкрити плотер" + }, + "replaceTitle": "Замінити " + }, + "core": { + "compilerWarnings": { + "all": "Все", + "default": "По замовчуванню", + "more": "Більше", + "none": "Немає" + } + }, + "coreContribution": { + "copyError": "Скопіювати помилку", + "noBoardSelected": "Плата не вибрана. Будь ласка, виберіть свою плату Arduino в меню Інструменти > Плата." + }, + "createCloudCopy": "Надіслати скетч в Хмару", + "daemon": { + "restart": "Перезапуск служби", + "start": "Запуск служби", + "stop": "Спинення служби" + }, + "debug": { + "debugWithMessage": "Налагодження - {0}", + "debuggingNotSupported": "Налагодження не підтримується з '{0}'", + "getDebugInfo": "Отримання інформації про налагодження...", + "noPlatformInstalledFor": "Не встановлення платформа для '{0}'", + "optimizeForDebugging": "Оптимізація для налагодження", + "sketchIsNotCompiled": "Скетч'{0}' повинен бути перевірений до початку налагодження. Будь ласка, перевірте скетч та запустіть налагодження знову. Бажаєте перевірити скетч зараз?" + }, + "developer": { + "clearBoardList": "Очистити список історії плат", + "clearBoardsConfig": "Очистити вибір Плат та Портів", + "dumpBoardList": "Дамп списку плат" + }, + "dialog": { + "dontAskAgain": "Не питати знову" + }, + "editor": { + "autoFormat": "Автоформат", + "commentUncomment": "Закоментувати/Розкоментувати", + "copyForForum": "Копіювати для форуму (Markdown)", + "decreaseFontSize": "Збільшити розмір шрифта", + "decreaseIndent": "Зменшити відступ", + "increaseFontSize": "Зменшити розмір шрифта", + "increaseIndent": "Збільшити відступ", + "nextError": "Наступна помилка", + "previousError": "Попередня помилка", + "revealError": "Розгорнути помилку" + }, + "examples": { + "builtInExamples": "Вбудовані приклади", + "couldNotInitializeExamples": "Помилка ініціалізації вбудованих прикладів", + "customLibrary": "Приклади з Користувацьких бібліотек", + "for": "Приклади для {0}", + "forAny": "Приклади для будь-якої плати", + "menu": "Приклади" + }, + "firmware": { + "checkUpdates": "Перевірити Оновлення", + "failedInstall": "Помилка при встановленні. Спробуйте знову.", + "install": "Встановити", + "installingFirmware": "Встановлення прошивки.", + "overwriteSketch": "Встановлення замінить скетч в платі.", + "selectBoard": "Оберіть плату", + "selectVersion": "Оберіть версію прошивки", + "successfullyInstalled": "Прошивку успішно встановлено.", + "updater": "Оновлювач прошивки" + }, + "help": { + "environment": "Оточення", + "faq": "Часті питання", + "findInReference": "Знайти в описі", + "gettingStarted": "Розпочнемо", + "keyword": "Введіть кодове слово", + "privacyPolicy": "Політика безпеки", + "reference": "Посилання", + "search": "Шукати на Arduino.cc", + "troubleshooting": "Вирішення проблем", + "visit": "Відвідати Arduino.cc" + }, + "ide-updater": { + "checkForUpdates": "Перевірка оновлень Arduino IDE", + "closeAndInstallButton": "Закрити та Встановити", + "closeToInstallNotice": "Закрийте програму та встановіть оновлення.", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", + "downloadButton": "Завантажити", + "downloadingNotice": "Завантажити останню версію Arduino IDE.", + "errorCheckingForUpdates": "Помилка під час перевірки оновлень Arduino IDE {0}", + "goToDownloadButton": "Перейти до завантаження ", + "goToDownloadPage": "Знайдено оновлення Arduino IDE, але його не вдається завантажити та встановити автоматично. Будь ласка, перейдіть на сторінку завантажень.", + "ideUpdaterDialog": "Оновлення ПЗ", + "newVersionAvailable": "Нова версія Arduino IDE ({0}) доступна для завантаження.", + "noUpdatesAvailable": "Нема доступних оновлень для Arduino IDE", + "notNowButton": "Не зараз", + "skipVersionButton": "Пропустити Версію", + "updateAvailable": "Доступне оновлення", + "versionDownloaded": "Arduino IDE {0} було завантажено" + }, + "installable": { + "libraryInstallFailed": "Помилка при встановленні бібліотеки: '{0}{1}'.", + "platformInstallFailed": "Помилка при встановленні платформи: '{0}{1}'." + }, + "library": { + "addZip": "Додати .ZIP бібліотеку...", + "arduinoLibraries": "Бібліотеки Arduino", + "contributedLibraries": "Додані бібліотеки", + "include": "Включити бібліотеку", + "installAll": "Встановити все", + "installLibraryDependencies": "Встановлення залежностей бібліотеки", + "installMissingDependencies": "Ви бажаєте встановити всі залежності для бібліотеки?", + "installOneMissingDependency": "Ви бажаєте встановити залежності, яких не вистачає?", + "installWithoutDependencies": "Встановити без залажностей", + "installedSuccessfully": "Бібліотеку успішно встановлено {0}:{1}", + "libraryAlreadyExists": "Бібліотеку вже зареєєстровано. Бажаєте її заміниити?", + "manageLibraries": "Керування бібліотеками...", + "namedLibraryAlreadyExists": "Тека бібліотеки з назвою {0} вже існує. Бажаєте перезаписати її?", + "needsMultipleDependencies": "Бібліотека <b>{0}:{1}</b> вимагає наступні залежності, які не встановлені:", + "needsOneDependency": "Ббліотека <b>{0}:{1}</b> вимагає інші залежності, які ще не встановлені:", + "overwriteExistingLibrary": "Бажаєте замінити існуючу бібліотеку?", + "successfullyInstalledZipLibrary": "Бібліотека успішно встановлена з {0} архіву", + "title": "Менеджер бібліотек", + "uninstalledSuccessfully": "Бібліотеку успішно видалено {0}:{1}", + "zipLibrary": "Бібліотеки " + }, + "librarySearchProperty": { + "topic": "Тема" + }, + "libraryTopic": { + "communication": "Спілкування", + "dataProcessing": "Обробка даних", + "dataStorage": "Сховище даних", + "deviceControl": "Керування пристроєм", + "display": "Дісплей", + "other": "Інше", + "sensors": "Сенсори", + "signalInputOutput": "Сигнал Вхід/Вихід", + "timing": "Період часу", + "uncategorized": "Без категорії" + }, + "libraryType": { + "installed": "Встановлено " + }, + "menu": { + "advanced": "Додатково", + "sketch": "Скетч", + "tools": "Інструменти" + }, + "monitor": { + "alreadyConnectedError": "Не можливо підключитися до {0} {1} порту. Він вже зайнятий.", + "baudRate": "{0} бод", + "connectionFailedError": "Не можливо підключитися до {0} {1} порту.", + "connectionFailedErrorWithDetails": "{0} Не можливо підключитися до {1} {2} порту.", + "connectionTimeout": "Таймаут. IDE не отримало повідомлення 'Про успіх' від монітора після підключення до нього.", + "missingConfigurationError": "Не можливо підключитися до {0} {1} порту. Невизначені параметри монітору.", + "notConnectedError": "Відсутнє підключення до {0} {1} порту.", + "unableToCloseWebSocket": "Неможливо закрити websocket", + "unableToConnectToWebSocket": "Неможливо підключитися до websocket" + }, + "newCloudSketch": { + "newSketchTitle": "Ім'я нового хмарного скетча" + }, + "portProtocol": { + "network": "Мережа", + "serial": "Послідовний" + }, + "preferences": { + "additionalManagerURLs": "Додаткові URL-адреси менеджера плат", + "auth.audience": "Спільнота OAuth2", + "auth.clientID": "Ідентифікатор клієнта OAuth2", + "auth.domain": "Домен OAuth2", + "auth.registerUri": "URI для реєстрації нового користувача", + "automatic": "Автоматично", + "board.certificates": "Перелік сертифікатів, які можуть бути завантажені на плату", + "browse": "Підбір", + "checkForUpdate": "Отримання сповіщень про доступні оновлення для IDE, плат та бібліотек. Потрібне перезапуск програми після зміни. \"Так\" за замовчуванням. ", + "choose": "Вибір", + "cli.daemonDebug": "Увімкніть журнал налагодження викликів gRPC до Arduino CLI. Щоб цей параметр набув чинності, потрібно перезапустити IDE. \"Ні\" за замовчуванням.", + "cloud.enabled": "\"Так\", якщо синхронізація скетча доступна. \"Так\" за замовчуванням. ", + "cloud.pull.warn": "\"Так\", якщо треба попередження перед отриманням хмарного скетчу. \"Так\" за замовчуванням. ", + "cloud.push.warn": "\"Так\", якщо треба попередження перед надсиланням хмарного скетчу. \"Так\" за замовчуванням.", + "cloud.pushpublic.warn": "\"Так\", якщо треба попередження перед надсиланням публічного скетча в хмару. \"Так\" за замовчуванням.", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", + "cloud.sketchSyncEndpoint": "Призначення для надсилання та отримання скетчів з серверної частини. За замовчуванням вказує на API хмари Arduino.", + "compile": "компіляція", + "compile.experimental": "\"Так\", якщо IDE може отримати декілька помилок компілятора. \"Ні\" за замовчуванням", + "compile.revealRange": "Спосіб відображення помилок компілятора в редакторі після невдалої перевірки/завантаження. Можливі значення: 'auto': Прокручує вертикально та розгортає рядок. 'center': Прокручує вертикально та разгортає рядок по центру. 'top': Прокручує вертикально та розгортає з розташованням ближче до верхньої частини вікна перегляду, 'centerIfOutsideViewport': Прокручує вертикально та розгортає рядок, центруючи вертикально, лише якщо він виходить за межі вікна перегляду. Значення за замовчуванням '{0}'.", + "compile.verbose": "\"Так\" для розширенного виводу компілятора. \"Ні\" за замовчуванням", + "compile.warnings": "Вказує gcc, який рівень попередження використовувати. За замовчуванням встановлено \"None\".", + "compilerWarnings": "Застереження компілятора", + "editorFontSize": "Розмір шрифта редактора", + "editorQuickSuggestions": "Швидкі підказки редактора", + "enterAdditionalURLs": "Введіть додаткові URL-адреси, по одній для кожного рядка", + "files.inside.sketches": "Відображати файли в середені скетчів", + "ide.updateBaseUrl": "Основна URL-адреса, з якої можна завантажити оновлення. За замовчуванням \"https://downloads.arduino.cc/arduino-ide\"", + "ide.updateChannel": "Вибір канала оновлень. 'Стабільні' - для стабільних релізів, 'Нічні' - найновіші збірки.", + "interfaceScale": "Масштаб інтерфейсу", + "invalid.editorFontSize": "Хибний розмір шрифта редактора. Значення повинно бути цілим числом.", + "invalid.sketchbook.location": "Хибний шлях до книги скетчів: {0}", + "invalid.theme": "Недійсна тема.", + "language.asyncWorkers": "Кількість асинхронних процесів, які використовуються мовним сервером Arduino (clangd). Фоновий індекс також використовує цю кількість процесів. Мінімальне значення дорівнює 0, а максимальне – 8. Коли воно дорівнює 0, мовний сервер використовує всі доступні ядра. Значення за замовчуванням — 0.", + "language.log": "\"Так\", якщо треба генерувати log-файли журналу в папці скетча. В іншому випадку \"Ні\". За замовчуванням це \"Ні\". ", + "language.realTimeDiagnostics": "Якщо \"Так\", перевірка синтаксису відбувається в режимі реального часу. Під час введення тексту в редакторі. Знчення замовчуванням - \"Ні\".", + "manualProxy": "Налаштування проксі вручну", + "monitor": { + "dockPanel": "Розташування віджетів _{0}_ . Можливі варіанти - \"Внизу\" або \"Справа\". Зазамовчуванням це \"{1}\"." + }, + "network": "Мережа", + "newSketchbookLocation": "Оберіть новий шлях до книги скетчів", + "noCliConfig": "Неможливо прочитати конфігурацію клієнта CLI", + "noProxy": "Нема проксі", + "proxySettings": { + "hostname": "Ім'я хоста", + "password": "Пароль", + "port": "Номер порту", + "username": "Ім'я користувача" + }, + "showVerbose": "Показувати докладний вивід протягом", + "sketch": { + "inoBlueprint": "Абсолютний шлях файлової системи до шаблону проекта `.ino`. Якщо значення вказане, він буде використовуватися кожен раз при створенні новго скетча. Якщо значення пусте, скетчі будуть згенеровані Arduino в форматі за замовчуванням. Недоступні файли ігноруються. **Потрібно перезапустити IDE**, щоб цей параметр набув чинності." + }, + "sketchbook.location": "Шлях до книги скетчів", + "sketchbook.showAllFiles": "\"Так\" для відображення усіх файлів скетчу в середені скетчу. \"Ні\" за замовчуванням.", + "unofficialBoardSupport": "Клацніть, щоб переглянути список неофіційних форумів підтримки", + "upload": "завантажити", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", + "upload.verbose": "\"Так\" для докладного виводу процесу завантаження. \"Ні\" за замовчуванням.", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", + "verifyAfterUpload": "Перевіряти код після завантаження", + "window.autoScale": "\"Так\", якщо інтерфейс користувача автоматично масштабується відповідно до розміру шрифту.", + "window.zoomLevel": { + "deprecationMessage": "Застаріле. Натомість використовуйте 'window.zoomLevel'." + } + }, + "renameCloudSketch": { + "renameSketchTitle": "Нове ім'я для хмарного скетча" + }, + "replaceMsg": "Замінити існуючу версію на {0}?", + "selectZip": "Оберіть zip-файл що містить бібліотеку, яку треба додати", + "serial": { + "autoscroll": "Автопрокручування", + "carriageReturn": "Повернення коретки", + "connecting": "Підключення до '{0}' на '{1}'...", + "message": "Повідомлення (Введіть повідомлення для відправки до '{0}' на '{1}')", + "newLine": "Новий рядок", + "newLineCarriageReturn": "Обидва \"Новий рядок\" та \"Повернення коретки\"", + "noLineEndings": "Без закінчення рядка", + "notConnected": "Не підключено. Оберіть плату та порт для автоматичного підключення.", + "openSerialPlotter": "Послідовний плотер", + "timestamp": "Мітка часу", + "toggleTimestamp": "Перемкнути мітку часу" + }, + "sketch": { + "archiveSketch": "Архів скетчів", + "cantOpen": "Папка з ім'ям \"{0}\" вже існує. Неможливо відкрити скетч.", + "compile": "Компіляція скетча...", + "configureAndUpload": "Налаштувати та завантажити", + "createdArchive": "Створення архіву '{0}'.", + "doneCompiling": "Компіляцію завершено.", + "doneUploading": "Завантаження завершено.", + "editInvalidSketchFolderLocationQuestion": "Бажаєте спробувати зберегти скетч в іншому місці?", + "editInvalidSketchFolderQuestion": "Бажаєте спробувати зберегти скетч під іншою назвою?", + "exportBinary": "Експортувати скомпільований двійковий файл", + "invalidCloudSketchName": "Ім’я має починатися з літери, цифри або підкреслення, за якими слідують літери, цифри, тире, крапки та підкреслення. Максимальна довжина – 36 символів.", + "invalidSketchFolderLocationDetails": "Не можна зберегти скетч у папці всередині самого себе.", + "invalidSketchFolderLocationMessage": "Недійсний шлях папки скетча: '{0}'", + "invalidSketchFolderNameMessage": "Хибна назва папки скетча: '{0}'", + "invalidSketchName": "Ім’я має починатися з літери, цифри або підкреслення, за якими слідують літери, цифри, тире, крапки та підкреслення. Максимальна довжина – 63 символи.", + "moving": "Пересування", + "movingMsg": "Файл \"{0}\" має бути в середені папки з ім'ям \"{1}\".\nСтворити папку, пересунути туди файл та продовжити?", + "new": "Новий скетч", + "noTrailingPeriod": "Ім'я файла не може закінчуватися крапкою", + "openFolder": "Відкрити папку", + "openRecent": "Відкрити останній", + "openSketchInNewWindow": "Відкрити скетч у новому вікні", + "reservedFilename": "'{0}' це зарезервоване ім'я файла", + "saveFolderAs": "Зберігти папку скетча як...", + "saveSketch": "Збережіть свій скетч, щоб відкрити його пізніше.", + "saveSketchAs": "Зберігти папку скетча як...", + "showFolder": "Показати папку скетча", + "sketch": "Скетч", + "sketchAlreadyContainsThisFileError": "Скетч вже містить файл з назвою '{0}'", + "sketchAlreadyContainsThisFileMessage": "Помилка при збереженні скетча \"{0}\" як \"{1}\". {2}", + "sketchbook": "Книга скетчів", + "titleLocalSketchbook": "Локальна книга скетчів", + "titleSketchbook": "Книга скетчів", + "upload": "Завантажити", + "uploadUsingProgrammer": "Завантажити за допомогою програматора", + "uploading": "Завантаження..", + "userFieldsNotFoundError": "Не вдається знайти поля користувача для підключеної плати", + "verify": "Перевірити ", + "verifyOrCompile": "Перевірка/Компіляція" + }, + "sketchbook": { + "newCloudSketch": "Новий хмарний скетч", + "newSketch": "Новий скетч" + }, + "theme": { + "currentThemeNotFound": "Не вдалося знайти поточну вибрану тему: {0}. Arduino IDE вибрала вбудовану тему, сумісну з відсутньою.", + "dark": "Темна", + "deprecated": "{0} (застарілий)", + "hc": "Темна. Високий контраст", + "hcLight": "Світла. Високий контарст", + "light": "Світла", + "user": "{0} (користувач)" + }, + "title": { + "cloud": "Хмара" + }, + "updateIndexes": { + "updateIndexes": "Оновлення індексів", + "updateLibraryIndex": "Оновлення індексів бібліотек", + "updatePackageIndex": "Оновлення індексів пакунків" + }, + "upload": { + "error": "{0} помилка: {1}" + }, + "userFields": { + "cancel": "Відміна ", + "enterField": "Ввід{0}", + "upload": "Завантажити" + }, + "validateSketch": { + "abortFixMessage": "Скетч досі містить помилки. Бажаєте виправити помилки? Натиснувши '{0}', буде відкрито новий скетч.", + "abortFixTitle": "Неправильний скетч", + "renameSketchFileMessage": "Файл скетча '{0}' не може бути використаний. {1} Бажаєте перейменувати файл зараз?", + "renameSketchFileTitle": "Помилка в імені файла скетча ", + "renameSketchFolderMessage": "Скетч '{0}' не може бути використаний. {1} Щоб позбутися цього повідомлення, перейменуйте скетч. Бажаєте перейменувати скетч зараз?", + "renameSketchFolderTitle": "Помилка в назві скетча" + }, + "versionWelcome": { + "cancelButton": "Maybe later", + "donateButton": "Donate now", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Welcome to a new version of the Arduino IDE!", + "titleWithVersion": "Welcome to the new Arduino IDE {0}!" + }, + "workspace": { + "alreadyExists": "'{0}' вже існує." + } + }, + "theia": { + "core": { + "cannotConnectBackend": "Неможливо підключитися до серверної частини.", + "cannotConnectDaemon": "Неможливо підключитися до CLI-служби", + "couldNotSave": "Не вдалося зберегти скетч. Скопіюйте незбережену роботу у свій улюблений текстовий редактор і перезапустіть IDE.", + "daemonOffline": "CLI-служба вимкнена", + "offline": "Відключено", + "offlineText": "Відключено", + "quitTitle": "Ви впевнені що хочети вийти?" + }, + "editor": { + "unsavedTitle": "Незбережений – {0}" + }, + "messages": { + "collapse": "Згорнути ", + "expand": "Розгорнути " + }, + "workspace": { + "deleteCloudSketch": "Хмарний скетч '{0}' буде назавжди видалено з серверів Arduino та локальних кешів. Ця дія незворотна. Ви бажаєте видалити поточний скетч?", + "deleteCurrentSketch": "Скетч '{0}' буде остаточно видалено. Ця дія незворотна. Ви бажаєте видалити поточний скетч?", + "fileNewName": "Ім'я для нового файлу", + "invalidExtension": ".{0} це хибне розширення", + "newFileName": "Нове ім'я файлу" + } + } +} diff --git a/i18n/uk_UA.json b/i18n/uk_UA.json deleted file mode 100644 index 459770646..000000000 --- a/i18n/uk_UA.json +++ /dev/null @@ -1,334 +0,0 @@ -{ - "arduino": { - "common": { - "offlineIndicator": "You appear to be offline. Without an Internet connection, the Arduino CLI might not be able to download the required resources and could cause malfunction. Please connect to the Internet and restart the application.", - "noBoardSelected": "No board selected", - "selectedOn": "on {0}", - "notConnected": "[not connected]", - "serialMonitor": "Serial Monitor", - "oldFormat": "The '{0}' still uses the old `.pde` format. Do you want to switch to the new `.ino` extension?", - "later": "Later", - "selectBoard": "Select Board", - "unknown": "Unknown", - "processing": "Processing", - "saveChangesToSketch": "Do you want to save changes to this sketch before closing?", - "loseChanges": "If you don't save, your changes will be lost." - }, - "menu": { - "sketch": "Sketch", - "tools": "Tools" - }, - "debug": { - "optimizeForDebugging": "Optimize for Debugging", - "debugWithMessage": "Debug - {0}", - "noPlatformInstalledFor": "Platform is not installed for '{0}'", - "debuggingNotSupported": "Debugging is not supported by '{0}'" - }, - "preferences": { - "language.log": "True if the Arduino Language Server should generate log files into the sketch folder. Otherwise, false. It's false by default.", - "compile.verbose": "True for verbose compile output. False by default", - "compile.warnings": "Tells gcc which warning level to use. It's 'None' by default", - "upload.verbose": "True for verbose upload output. False by default.", - "window.autoScale": "True if the user interface automatically scales with the font size.", - "window.zoomLevel": "Adjust the zoom level of the window. The original size is 0 and each increment above (e.g. 1) or below (e.g. -1) represents zooming 20% larger or smaller. You can also enter decimals to adjust the zoom level with a finer granularity.", - "ide.autoUpdate": "True to enable automatic update checks. The IDE will check for updates automatically and periodically.", - "board.certificates": "List of certificates that can be uploaded to boards", - "sketchbook.showAllFiles": "True to show all sketch files inside the sketch. It is false by default.", - "cloud.enabled": "True if the sketch sync functions are enabled. Defaults to true.", - "cloud.pull.warn": "True if users should be warned before pulling a cloud sketch. Defaults to true.", - "cloud.push.warn": "True if users should be warned before pushing a cloud sketch. Defaults to true.", - "cloud.pushpublic.warn": "True if users should be warned before pushing a public sketch to the cloud. Defaults to true.", - "cloud.sketchSyncEnpoint": "The endpoint used to push and pull sketches from a backend. By default it points to Arduino Cloud API.", - "auth.clientID": "The OAuth2 client ID.", - "auth.domain": "The OAuth2 domain.", - "auth.audience": "The OAuth2 audience.", - "auth.registerUri": "The URI used to register a new user.", - "network": "Network", - "sketchbook.location": "Sketchbook location", - "browse": "Browse", - "files.inside.sketches": "Show files inside Sketches", - "editorFontSize": "Editor font size", - "interfaceScale": "Interface scale", - "showVerbose": "Show verbose output during", - "compilerWarnings": "Compiler warnings", - "automatic": "Automatic", - "compile": "compile", - "upload": "upload", - "verifyAfterUpload": "Verify code after upload", - "checkForUpdates": "Check for updates on startup", - "editorQuickSuggestions": "Editor Quick Suggestions", - "additionalManagerURLs": "Additional Boards Manager URLs", - "noProxy": "No proxy", - "manualProxy": "Manual proxy configuration", - "newSketchbookLocation": "Select new sketchbook location", - "choose": "Choose", - "enterAdditionalURLs": "Enter additional URLs, one for each row", - "unofficialBoardSupport": "Click for a list of unofficial board support URLs", - "invalid.sketchbook.location": "Invalid sketchbook location: {0}", - "invalid.editorFontSize": "Invalid editor font size. It must be a positive integer.", - "invalid.theme": "Invalid theme." - }, - "cloud": { - "signIn": "SIGN IN", - "signOut": "Sign Out", - "chooseSketchVisibility": "Choose visibility of your Sketch:", - "privateVisibility": "Private. Only you can view the Sketch.", - "publicVisibility": "Public. Anyone with the link can view the Sketch.", - "link": "Link:", - "embed": "Embed:", - "cloudSketchbook": "Cloud Sketchbook", - "shareSketch": "Share Sketch", - "showHideRemoveSketchbook": "Show/Hide Remote Sketchbook", - "pullSketch": "Pull Sketch", - "openInCloudEditor": "Open in Cloud Editor", - "options": "Options...", - "share": "Share...", - "remote": "Remote", - "emptySketchbook": "Your Sketchbook is empty", - "visitArduinoCloud": "Visit Arduino Cloud to create Cloud Sketches.", - "signInToCloud": "Sign in to Arduino Cloud", - "syncEditSketches": "Sync and edit your Arduino Cloud Sketches", - "learnMore": "Learn more", - "continue": "Continue", - "pushSketch": "Push Sketch", - "pushSketchMsg": "This is a Public Sketch. Before pushing, make sure any sensitive information is defined in arduino_secrets.h files. You can make a Sketch private from the Share panel.", - "pull": "Pull", - "pullSketchMsg": "Pulling this Sketch from the Cloud will overwrite its local version. Are you sure you want to continue?", - "donePulling": "Done pulling ‘{0}’.", - "notYetPulled": "Cannot push to Cloud. It is not yet pulled.", - "push": "Push", - "pullFirst": "You have to pull first to be able to push to the Cloud.", - "donePushing": "Done pushing ‘{0}’.", - "connected": "Connected", - "offline": "Offline", - "profilePicture": "Profile picture" - }, - "board": { - "installManually": "Install Manually", - "installNow": "The \"{0} {1}\" core has to be installed for the currently selected \"{2}\" board. Do you want to install it now?", - "configDialogTitle": "Select Other Board & Port", - "configDialog1": "Select both a Board and a Port if you want to upload a sketch.", - "configDialog2": "If you only select a Board you will be able just to compile, but not to upload your sketch.", - "pleasePickBoard": "Please pick a board connected to the port you have selected.", - "showAllAvailablePorts": "Shows all available ports when enabled", - "programmer": "Programmer", - "succesfullyInstalledPlatform": "Successfully installed platform {0}:{1}", - "succesfullyUninstalledPlatform": "Successfully uninstalled platform {0}:{1}", - "couldNotFindPreviouslySelected": "Could not find previously selected board '{0}' in installed platform '{1}'. Please manually reselect the board you want to use. Do you want to reselect it now?", - "reselectLater": "Reselect later", - "noneSelected": "No boards selected.", - "noPortsSelected": "No ports selected for board: '{0}'.", - "noFQBN": "The FQBN is not available for the selected board \"{0}\". Do you have the corresponding core installed?", - "openBoardsConfig": "Select other board and port…", - "boardListItem": "{0} at {1}", - "selectBoardForInfo": "Please select a board to obtain board info.", - "platformMissing": "The platform for the selected '{0}' board is not installed.", - "selectPortForInfo": "Please select a port to obtain board info.", - "boardInfo": "Board Info", - "board": "Board{0}", - "port": "Port{0}", - "getBoardInfo": "Get Board Info", - "inSketchbook": " (in Sketchbook)" - }, - "boardsManager": "Boards Manager", - "about": { - "label": "About {0}", - "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}{4} [{5}]\n\n{6}" - }, - "contributions": { - "addFile": "Add File", - "replaceTitle": "Replace", - "fileAdded": "One file added to the sketch." - }, - "replaceMsg": "Replace the existing version of {0}?", - "library": { - "addZip": "Add .ZIP Library...", - "zipLibrary": "Library", - "overwriteExistingLibrary": "Do you want to overwrite the existing library?", - "successfullyInstalledZipLibrary": "Successfully installed library from {0} archive", - "namedLibraryAlreadyExists": "A library folder named {0} already exists. Do you want to overwrite it?", - "libraryAlreadyExists": "A library already exists. Do you want to overwrite it?", - "include": "Include Library", - "manageLibraries": "Manage Libraries...", - "arduinoLibraries": "Arduino libraries", - "contributedLibraries": "Contributed libraries", - "title": "Library Manager", - "needsOneDependency": "The library <b>{0}:{1}</b> needs another dependency currently not installed:", - "needsMultipleDependencies": "The library <b>{0}:{1}</b> needs some other dependencies currently not installed:", - "installOneMissingDependency": "Would you like to install the missing dependency?", - "installMissingDependencies": "Would you like to install all the missing dependencies?", - "dependenciesForLibrary": "Dependencies for library {0}:{1}", - "installAll": "Install all", - "installOnly": "Install {0} only", - "installedSuccessfully": "Successfully installed library {0}:{1}", - "uninstalledSuccessfully": "Successfully uninstalled library {0}:{1}" - }, - "selectZip": "Select a zip file containing the library you'd like to add", - "sketch": { - "archiveSketch": "Archive Sketch", - "saveSketchAs": "Save sketch folder as...", - "createdArchive": "Created archive '{0}'.", - "new": "New", - "openRecent": "Open Recent", - "showFolder": "Show Sketch Folder", - "sketch": "Sketch", - "moving": "Moving", - "movingMsg": "The file \"{0}\" needs to be inside a sketch folder named as \"{1}\".\nCreate this folder, move the file, and continue?", - "cantOpen": "A folder named \"{0}\" already exists. Can't open sketch.", - "saveFolderAs": "Save sketch folder as...", - "sketchbook": "Sketchbook", - "upload": "Upload", - "uploadUsingProgrammer": "Upload Using Programmer", - "userFieldsNotFoundError": "Can't find user fields for connected board", - "doneUploading": "Done uploading.", - "configureAndUpload": "Configure And Upload", - "verifyOrCompile": "Verify/Compile", - "exportBinary": "Export Compiled Binary", - "verify": "Verify", - "doneCompiling": "Done compiling.", - "couldNotConnectToSerial": "Could not reconnect to serial port. {0}", - "openSketchInNewWindow": "Open Sketch in New Window", - "openFolder": "Open Folder", - "titleLocalSketchbook": "Local Sketchbook", - "titleSketchbook": "Sketchbook", - "close": "Are you sure you want to close the sketch?" - }, - "bootloader": { - "burnBootloader": "Burn Bootloader", - "doneBurningBootloader": "Done burning bootloader." - }, - "editor": { - "copyForForum": "Copy for Forum (Markdown)", - "commentUncomment": "Comment/Uncomment", - "increaseIndent": "Increase Indent", - "decreaseIndent": "Decrease Indent", - "increaseFontSize": "Increase Font Size", - "decreaseFontSize": "Decrease Font Size", - "autoFormat": "Auto Format" - }, - "examples": { - "menu": "Examples", - "couldNotInitializeExamples": "Could not initialize built-in examples.", - "builtInExamples": "Built-in examples", - "customLibrary": "Examples from Custom Libraries", - "for": "Examples for {0}", - "forAny": "Examples for any board" - }, - "help": { - "search": "Search on Arduino.cc", - "keyword": "Type a keyword", - "gettingStarted": "Getting Started", - "environment": "Environment", - "troubleshooting": "Troubleshooting", - "reference": "Reference", - "findInReference": "Find in Reference", - "faq": "Frequently Asked Questions", - "visit": "Visit Arduino.cc" - }, - "certificate": { - "uploadRootCertificates": "Upload SSL Root Certificates", - "openContext": "Open context", - "remove": "Remove", - "upload": "Upload", - "addURL": "Add URL to fetch SSL certificate", - "enterURL": "Enter URL", - "selectCertificateToUpload": "1. Select certificate to upload", - "addNew": "Add New", - "selectDestinationBoardToUpload": "2. Select destination board and upload certificate", - "uploadingCertificates": "Uploading certificates.", - "certificatesUploaded": "Certificates uploaded.", - "uploadFailed": "Upload failed. Please try again.", - "selectBoard": "Select a board...", - "boardAtPort": "{0} at {1}", - "noSupportedBoardConnected": "No supported board connected" - }, - "firmware": { - "updater": "WiFi101 / WiFiNINA Firmware Updater", - "selectBoard": "Select Board", - "checkUpdates": "Check Updates", - "selectVersion": "Select firmware version", - "install": "Install", - "overwriteSketch": "Installation will overwrite the Sketch on the board.", - "installingFirmware": "Installing firmware.", - "successfullyInstalled": "Firmware succesfully installed.", - "failedInstall": "Installation failed. Please try again." - }, - "dialog": { - "dontAskAgain": "Don't ask again" - }, - "userFields": { - "cancel": "Cancel", - "upload": "Upload" - }, - "serial": { - "toggleTimestamp": "Toggle Timestamp", - "autoscroll": "Autoscroll", - "timestamp": "Timestamp", - "noLineEndings": "No Line Ending", - "newLine": "New Line", - "carriageReturn": "Carriage Return", - "newLineCarriageReturn": "Both NL & CR", - "notConnected": "Not connected. Select a board and a port to connect automatically.", - "message": "Message ({0} + Enter to send message to '{1}' on '{2}'", - "connectionBusy": "Connection failed. Serial port is busy: {0}", - "disconnected": "Disconnected {0} from {1}.", - "unexpectedError": "Unexpected error. Reconnecting {0} on port {1}.", - "failedReconnect": "Failed to reconnect {0} to serial port after 10 consecutive attempts. The {1} serial port is busy.", - "reconnect": "Reconnecting {0} to {1} in {2} seconds..." - }, - "component": { - "uninstall": "Uninstall", - "uninstallMsg": "Do you want to uninstall {0}?", - "by": "by", - "version": "Version {0}", - "moreInfo": "More info", - "install": "INSTALL", - "filterSearch": "Filter your search..." - }, - "electron": { - "couldNotSave": "Could not save the sketch. Please copy your unsaved work into your favorite text editor, and restart the IDE.", - "unsavedChanges": "Any unsaved changes will not be saved." - }, - "compile": { - "error": "Compilation error: {0}" - }, - "upload": { - "error": "{0} error: {1}" - }, - "burnBootloader": { - "error": "Error while burning the bootloader: {0}" - } - }, - "theia": { - "core": { - "couldNotSave": "Could not save the sketch. Please copy your unsaved work into your favorite text editor, and restart the IDE.", - "offline": "Offline", - "daemonOffline": "CLI Daemon Offline", - "cannotConnectBackend": "Cannot connect to the backend.", - "cannotConnectDaemon": "Cannot connect to the CLI daemon." - }, - "debug": { - "start": "Start...", - "typeNotSupported": "The debug session type \"{0}\" is not supported.", - "startError": "There was an error starting the debug session, check the logs for more details." - }, - "editor": { - "unsavedTitle": "Unsaved – {0}" - }, - "messages": { - "expand": "Expand", - "collapse": "Collapse" - }, - "workspace": { - "fileNewName": "Name for new file", - "invalidFilename": "Invalid filename.", - "invalidExtension": ".{0} is not a valid extension", - "newFileName": "New name for file", - "deleteCurrentSketch": "Do you want to delete the current sketch?", - "sketchDirectoryError": "There was an error creating the sketch directory. See the log for more details. The application will probably not work as expected." - } - }, - "cloud": { - "GoToCloud": "GO TO CLOUD" - } -} diff --git a/i18n/vi.json b/i18n/vi.json index e988ac844..87e5215d4 100644 --- a/i18n/vi.json +++ b/i18n/vi.json @@ -1,38 +1,51 @@ { "arduino": { "about": { - "detail": "Phiên bản: {0}\nNgày: {1}{2}\nPhiên bản CLI: {3}{4} [{5}]\n\n{6}", + "detail": "Phiên bản: {0}\nNgày: {1}{2}\nPhiên bản CLI: {3}\n\n{4}", "label": "Về {0}" }, + "account": { + "goToCloudEditor": "Chuyển đến Trình chỉnh sửa đám mây", + "goToIoTCloud": "Truy cập Đám mây IoT", + "goToProfile": "Chuyển đến hồ sơ", + "menuTitle": "Đám mây Arduino" + }, "board": { "board": "Bo mạch {0}", - "boardConfigDialogTitle": "Select Other Board and Port", + "boardConfigDialogTitle": "Chọn Bảng và Cổng khác", + "boardDataReloaded": "Board data reloaded.", "boardInfo": "Thông tin bo mạch", + "boards": "bảng", "configDialog1": "Chọn đồng thời một bo mạch và một cổng nếu bạn muốn nạp một sketch.", "configDialog2": "Nếu bạn chỉ chọn một bo mạch thì bạn sẽ có khả năng biên dịch, nhưng không thể nạp sketch của bạn lên.", "couldNotFindPreviouslySelected": "Không thể tìm thấy bo mạch '{0}' được chọn trước đó trong nền tảng '{1}' đã được cài đặt. Hãy chọn lại thủ công bo mạch mà bạn muốn dùng. Bạn có muốn chọn lại ngay?", - "disconnected": "Disconnected", + "editBoardsConfig": "Thiết lập Bảng và Cổng...", "getBoardInfo": "Lấy thông tin bo mạch", "inSketchbook": "(trong Sketchbook)", "installNow": "Nhân \"{0} {1}\" phải được cài đặt cho bo mạch \"{2}\" đang được chọn. Bạn có muốn cài đặt ngay?", - "noFQBN": "Không có FQBN khả dụng cho bo mạch \"{0}\" được chọn. Bạn đã cài đặt nhân tương ứng chưa?", - "noPortsDiscovered": "No ports discovered", - "noPortsSelected": "Không có cổng được chọn cho bo mạch: '{0}'.", - "noneSelected": "Không có bo mạch được chọn.", + "noBoardsFound": "No boards found for \"{0}\"", + "noNativeSerialPort": "Cổng nối tiếp gốc, không thể lấy thông tin.", + "noPortsDiscovered": "Không có cổng nào được phát hiện", + "nonSerialPort": "Cổng không nối tiếp, không thể lấy thông tin.", "openBoardsConfig": "Chọn bo mạch và cổng khác...", - "platformMissing": "Nền tảng cho bo mạch '{0}' được chọn chưa được cài đặt.", "pleasePickBoard": "Hãy chọn một bo mạch được kết nối tới cổng mà bạn đã chọn.", "port": "Cổng {0}", - "portLabel": "Port: {0}", + "ports": "cổng", "programmer": "Programmer", + "reloadBoardData": "Reload Board Data", "reselectLater": "Chọn lại sau", - "searchBoard": "Search board", + "revertBoardsConfig": "Use '{0}' discovered on '{1}'", + "searchBoard": "Tìm kiếm bảng", "selectBoard": "Lựa chọn bo mạch", - "selectBoardForInfo": "Hãy chọn một bo mạch để lấy thông tin.", + "selectBoardToReload": "Please select a board first.", "selectPortForInfo": "Hãy chọn một cổng để lấy thông tin bo mạch.", "showAllAvailablePorts": "Hiển thị tất cả các cổng khả dụng khi được kích hoạt", + "showAllPorts": "Hiển thị tất cả các cổng", "succesfullyInstalledPlatform": "Hoàn tất cài đặt nền tảng {0}:{1}", - "succesfullyUninstalledPlatform": "Hoàn tất gỡ cài đặt nền tảng {0}:{1}" + "succesfullyUninstalledPlatform": "Hoàn tất gỡ cài đặt nền tảng {0}:{1}", + "typeOfPorts": "{0}Cổng", + "unconfirmedBoard": "Unconfirmed board", + "unknownBoard": "Bảng không xác định" }, "boardsManager": "Trình quản lý bo mạch", "boardsType": { @@ -64,27 +77,28 @@ "uploadingCertificates": "Đang nạp các chứng chỉ." }, "checkForUpdates": { - "checkForUpdates": "Check for Arduino Updates", - "installAll": "Install All", + "checkForUpdates": "Kiểm tra bản cập nhật", + "installAll": "Cài đặt tất cả", "noUpdates": "There are no recent updates available.", "promptUpdateBoards": "Updates are available for some of your boards.", "promptUpdateLibraries": "Updates are available for some of your libraries.", - "updatingBoards": "Updating boards...", - "updatingLibraries": "Updating libraries..." + "updatingBoards": "Đang cập nhật bảng...", + "updatingLibraries": "Đang cập nhật thư viện..." }, "cli-error-parser": { - "keyboardError": "'Keyboard' not found. Does your sketch include the line '#include <Keyboard.h>'?", - "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" + "keyboardError": "Không tìm thấy 'Keyboard'. Dự án của bạn có khai báo '<Keyboard.h>' chưa?", + "mouseError": "Không tìm thấy 'Mouse'. Dự án của bạn có khai báo '<Mouse.h> chưa?" }, "cloud": { - "account": "Account", "chooseSketchVisibility": "Chọn khả năng hiển thị của Sketch của bạn:", + "cloudSketchbook": "Cloud Sketchbook", "connected": "Đã kết nối", "continue": "Tiếp tục", - "donePulling": "Hoàn tất tải xuống '{0}'.", - "donePushing": "Hoàn tất đẩy lên '{0}'.", + "donePulling": "Pulling thành công{0}", + "donePushing": "Pushing thành công{0}", "embed": "Nhúng: ", "emptySketchbook": "Sketchbook của bạn đang trống", + "goToCloud": "Chuyển đến đám mây", "learnMore": "Tìm hiểu thêm", "link": "Liên kết:", "notYetPulled": "Không thể đẩy lên Cloud. Nó chưa được tải xuống.", @@ -102,35 +116,47 @@ "pushSketch": "Đẩy sketch lên", "pushSketchMsg": "Đây là sketch công khai. Trước khi đẩy lên, đảm bảo rằng tất cả các thông tin nhậy cảm được xác định trong tệp arduino_secrets.h. Bạn có thể tạo một sketch riêng tư từ bảng Chia sẻ.", "remote": "Từ xa", - "remoteSketchbook": "Remote Sketchbook", "share": "Chia sẻ...", "shareSketch": "Chia sẻ sketch.", - "showHideRemoveSketchbook": "Hiển thị/Ẩn Remote Sketchbook", + "showHideSketchbook": "Show/Hide Cloud Sketchbook", "signIn": "Đăng Nhập", "signInToCloud": "Đăng nhập vào Arduino Cloud", "signOut": "Đăng Xuất", - "sync": "Sync", + "sync": "Đồng bộ hóa", "syncEditSketches": "Đồng bộ và chỉnh sửa các Arduino Cloud Sketch của bạn", "visitArduinoCloud": "Truy cập Arduino Cloud để tạo Cloud Sketch." }, + "cloudSketch": { + "alreadyExists": "Cloud sketch '{0}' already exists.", + "creating": "Creating cloud sketch '{0}'...", + "new": "Bản phác thảo đám mây mới", + "notFound": "Could not pull the cloud sketch '{0}'. It does not exist.", + "pulling": "Synchronizing sketchbook, pulling '{0}'...", + "pushing": "Synchronizing sketchbook, pushing '{0}'...", + "renaming": "Renaming cloud sketch from '{0}' to '{1}'...", + "synchronizingSketchbook": "Synchronizing sketchbook..." + }, "common": { - "all": "All", - "contributed": "Contributed", + "all": "Tất cả", + "contributed": "Đóng góp", "installManually": "Cài thủ công", "later": "Để sau", "noBoardSelected": "Không có bo mạch được chọn", + "noSketchOpened": "Không có dự án nào được mở", "notConnected": "[Chưa được kết nối]", "offlineIndicator": "Bạn dường như đang ngoại tuyến. Không có kết nối mạng, Arduino CLI có thể sẽ không thể tải về những tài nguyên cần thiết và có thể sẽ gây ra sự cố. Hãy kết nối Internet và khởi động lại ứng dụng.", "oldFormat": "'{0}' vẫn đang sử dụng đuôi '.pde' cũ. Bạn có muốn chuyển sang đuôi '.ino' mới hơn không?", - "partner": "Partner", + "partner": "Đối tác", "processing": "Đang sử lý", - "recommended": "Recommended", + "recommended": "Khuyến khích", "retired": "Retired", + "selectManually": "Select Manually", "selectedOn": "tại {0}", "serialMonitor": "Serial Monitor", - "type": "Type", + "type": "Kiểu", "unknown": "Không xác định", - "updateable": "Updatable" + "updateable": "Có thể cập nhật", + "userAbort": "User abort" }, "compile": { "error": "Lỗi biên dịch: {0}" @@ -138,22 +164,49 @@ "component": { "boardsIncluded": "Boards included in this package:", "by": "bởi", + "clickToOpen": "Nhấn để mở trên trình duyệt:{0}", "filterSearch": "Lọc kết quả tìm kiếm của bạn...", - "install": "CÀI ĐẶT", + "install": "Cài đặt", + "installLatest": "Cài đặt mới nhất", + "installVersion": "Cài đặt{0}", + "installed": "{0}Đã cài đặt", "moreInfo": "Thêm thông tin", + "otherVersions": "Các phiên bản khác", + "remove": "Loại bỏ", + "title": "{0} by {1}", "uninstall": "Gỡ cài đặt", "uninstallMsg": "Bạn có muốn gỡ cài đặt {0}?", - "version": "Phiên bản {0}" + "update": "Cập nhập" + }, + "configuration": { + "cli": { + "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" + } + }, + "connectionStatus": { + "connectionLost": "Connection lost. Cloud sketch actions and updates won't be available." }, "contributions": { "addFile": "Thêm tệp...", "fileAdded": "Một tệp đã được thêm vào sketch.", + "plotter": { + "couldNotOpen": "Couldn't open serial plotter" + }, "replaceTitle": "Thay thế" }, + "core": { + "compilerWarnings": { + "all": "Tất cả", + "default": "Mặc định", + "more": "More", + "none": "None" + } + }, "coreContribution": { - "copyError": "Copy error messages", - "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." + "copyError": "Sao chép lỗi", + "noBoardSelected": "Không có board được chọn. Hãy vào Tools > Board để chọn board Arduino." }, + "createCloudCopy": "Đẩy dự án lên Cloud", "daemon": { "restart": "Restart Daemon", "start": "Start Daemon", @@ -162,8 +215,15 @@ "debug": { "debugWithMessage": "Sửa lỗi - {0}", "debuggingNotSupported": "Sửa lỗi không hỗ trợ bởi '{0}'", + "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "Nền tảng chưa được cài đặt cho '{0}'", - "optimizeForDebugging": "Tối ưu hóa cho sửa lỗi" + "optimizeForDebugging": "Tối ưu hóa cho sửa lỗi", + "sketchIsNotCompiled": "Sketch '{0}' must be verified before starting a debug session. Please verify the sketch and start debugging again. Do you want to verify the sketch now?" + }, + "developer": { + "clearBoardList": "Clear the Board List History", + "clearBoardsConfig": "Clear the Board and Port Selection", + "dumpBoardList": "Dump the Board List" }, "dialog": { "dontAskAgain": "Đừng hỏi lại" @@ -180,10 +240,6 @@ "previousError": "Previous Error", "revealError": "Reveal Error" }, - "electron": { - "couldNotSave": "Không thể lưu sketch. Hãy sao chép tất cả những phần việc chưa được lưu lại vào trình chỉnh sửa văn bản yêu thích của bạn, và khởi động lại IDE.", - "unsavedChanges": "Tất cả các thay đổi chưa được lưu sẽ không được lưu lại." - }, "examples": { "builtInExamples": "Ví dụ được tích hợp sẵn", "couldNotInitializeExamples": "Không thể khởi tạo các ví dụ tích hợp sẵn.", @@ -201,7 +257,7 @@ "selectBoard": "Lựa chọn bo mạch", "selectVersion": "Chọn phiên bản firmware ", "successfullyInstalled": "Hoàn tất cài đặt firmware.", - "updater": "Trình cập nhật firmware cho WiFi101 / WiFiNINA" + "updater": "Cập nhật Frmware" }, "help": { "environment": "Môi trường", @@ -216,9 +272,12 @@ "visit": "Truy cập Arduino.cc" }, "ide-updater": { - "checkForUpdates": "Check for Arduino IDE Updates", + "checkForUpdates": "Kiểm tra bản cập nhật phần mềm", "closeAndInstallButton": "Đóng và cài đặt", "closeToInstallNotice": "Đóng ứng dụng và cài đặt bản cập nhật mới nhất lên máy bạn.", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", "downloadButton": "Tải về", "downloadingNotice": "Đang tải về bản mới nhất của Arduino IDE.", "errorCheckingForUpdates": "Có lỗi xảy ra trong quá trình kiểm tra cập nhật Arduino IDE.\n{0}", @@ -232,16 +291,20 @@ "updateAvailable": "Cập nhật khả dụng", "versionDownloaded": "Arduino IDE {0} đã được tải về." }, + "installable": { + "libraryInstallFailed": "Cài thư viện {0}{1} không thành công", + "platformInstallFailed": "Failed to install platform: '{0}{1}'." + }, "library": { "addZip": "Thêm thư viện đuôi .ZIP...", "arduinoLibraries": "Thư viện Arduino", "contributedLibraries": "Thư viện cộng đồng đóng góp", - "dependenciesForLibrary": "Thư viện bổ trợ cho thư viện {0}:{1}", "include": "Thêm thư viện", - "installAll": "Cài tất cả", + "installAll": "Cài đặt tất cả", + "installLibraryDependencies": "Install library dependencies", "installMissingDependencies": "Bạn có muốn cài tất cả các thư viện bổ trợ còn thiếu không?", "installOneMissingDependency": "Bạn có muốn cài thư viện bổ trợ còn thiếu không?", - "installOnly": "Chỉ cài {0}", + "installWithoutDependencies": "Install without dependencies", "installedSuccessfully": "Hoàn tất cài đặt thư viện {0}:{1}", "libraryAlreadyExists": "Đã tồn tại một thư viện. Bạn có muốn ghi đè lên nó?", "manageLibraries": "Quản lý thư viện...", @@ -258,29 +321,43 @@ "topic": "Topic" }, "libraryTopic": { - "communication": "Communication", + "communication": "Giao tiếp", "dataProcessing": "Data Processing", - "dataStorage": "Data Storage", - "deviceControl": "Device Control", - "display": "Display", - "other": "Other", - "sensors": "Sensors", - "signalInputOutput": "Signal Input/Output", + "dataStorage": "Lưu trữ dữ liệu", + "deviceControl": "Điều khiển thiết bị", + "display": "Hiển thị", + "other": "Khác", + "sensors": "Cảm biến", + "signalInputOutput": "Tín hiệu vào/ra", "timing": "Timing", - "uncategorized": "Uncategorized" + "uncategorized": "Chưa được phân loại." }, "libraryType": { - "installed": "Installed" + "installed": "Đã cài đặt" }, "menu": { - "advanced": "Advanced", + "advanced": "Nâng cao", "sketch": "Sketch", "tools": "Công cụ" }, "monitor": { + "alreadyConnectedError": "Could not connect to {0} {1} port. Already connected.", + "baudRate": "{0} baud", + "connectionFailedError": "Không thể kết nối tới cổng {0}{1}.", + "connectionFailedErrorWithDetails": "{0} Could not connect to {1} {2} port.", + "connectionTimeout": "Timeout. The IDE has not received the 'success' message from the monitor after successfully connecting to it", + "missingConfigurationError": "Could not connect to {0} {1} port. The monitor configuration is missing.", + "notConnectedError": "Not connected to {0} {1} port.", "unableToCloseWebSocket": "Unable to close websocket", "unableToConnectToWebSocket": "Unable to connect to websocket" }, + "newCloudSketch": { + "newSketchTitle": "Name of the new Cloud Sketch" + }, + "portProtocol": { + "network": "Mạng", + "serial": "Serial" + }, "preferences": { "additionalManagerURLs": "Địa chỉ URLs của các trình quản lý thêm bo mạch", "auth.audience": "Khán giả OAuth2.", @@ -297,6 +374,7 @@ "cloud.pull.warn": "'True' nếu người dùng muốn được cảnh báo trước khi tải xuống một cloud sketch. Mặc định là 'true'.", "cloud.push.warn": "'True' nếu người dùng muốn được cảnh báo trước khi đẩy lên lên một cloud sketch. Mặc định là 'true'.", "cloud.pushpublic.warn": "'True' nếu người dùng muốn được cảnh báo trước khi đẩy lên lên một sketch công khai lên đám mây. Mặc định là 'true'.", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", "cloud.sketchSyncEndpoint": "Đầu cuối đùng dể đẩy lên và tải xuống sketch từ backend. Mặc định chỉ đến Arduino Cloud API.", "compile": "biên dịch", "compile.experimental": "True if the IDE should handle multiple compiler errors. False by default", @@ -314,29 +392,50 @@ "invalid.editorFontSize": "Cỡ chữ trình biên dịch không hợp lệ. Bắt buộc phải là số nguyên dương.", "invalid.sketchbook.location": "Địa điểm sketchbook không hợp lệ: {0}", "invalid.theme": "Chủ đề không hợp lệ.", + "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", "language.log": "'True' nếu như muốn Arduino Language Server tạo tệp log vào trong thư mục chứa sketch. Nếu không thì là 'false'. Mặc định là 'false'.", "language.realTimeDiagnostics": "If true, the language server provides real-time diagnostics when typing in the editor. It's false by default.", "manualProxy": "Cấu hình proxy thủ công", + "monitor": { + "dockPanel": "The area of the application shell where the _{0}_ widget will reside. It is either \"bottom\" or \"right\". It defaults to \"{1}\"." + }, "network": "Mạng", "newSketchbookLocation": "Chọn địa điểm lưu sketchbook mới", + "noCliConfig": "Could not load the CLI configuration", "noProxy": "Không có proxy", + "proxySettings": { + "hostname": "Host name", + "password": "Mật khẩu", + "port": "Số cổng", + "username": "Tài khoản" + }, "showVerbose": "Hiển thị đầu ra chi tiết trong khi", + "sketch": { + "inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect." + }, "sketchbook.location": "Địa điểm chứa sketchbook", "sketchbook.showAllFiles": "'True' để hiển thị tất cả các tệp sketch trong sketch. Mặc định là 'false'.", - "survey.notification": "True if users should be notified if a survey is available. True by default.", "unofficialBoardSupport": "Nhấp vào đây để hiển thị danh sách các URLs hỗ trợ các bo mạch không chính thức", "upload": "nạp ", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", "upload.verbose": "'True' để bật đầu ra nạp lệnh chi tiết (verbose upload output). Mặc định là 'false'", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "Xác minh mã sau khi nạp", "window.autoScale": "'True' nếu giao diện người dùng tự động thay đổi theo cỡ chữ.", - "window.zoomLevel": "Điều chỉnh mức thu phóng của của sổ. Kích thước mặc định là 0 và cứ mỗi mức tăng (+1) hoặc giảm (-1) tượng trưng cho việc thu phóng 20% lớn hơn hoặc nhỏ hơn. Bạn cũng có thể sử dụng số thập phân để thay đổi mức thu phóng với độ chi tiết tốt hơn." + "window.zoomLevel": { + "deprecationMessage": "Deprecated. Use 'window.zoomLevel' instead." + } + }, + "renameCloudSketch": { + "renameSketchTitle": "Tên mới cho dự án Cloud" }, "replaceMsg": "Thay thế phiên bản hiện tại của {0}?", "selectZip": "Chọn một tệp zip chứa thư viện mà bạn muốn cài", "serial": { "autoscroll": "Tự động cuộn", "carriageReturn": "Về đầu dòng", - "message": "Nhắn tin ({0} + Enter để gửi tin nhắn tới '{1}' trên cổng '{2}')", + "connecting": "Connecting to '{0}' on '{1}'...", + "message": "Message (Enter to send message to '{0}' on '{1}')", "newLine": "Dòng mới", "newLineCarriageReturn": "Vừa xuống dòng & về đầu dòng", "noLineEndings": "Không có kết thúc dòng", @@ -348,38 +447,64 @@ "sketch": { "archiveSketch": "Nén sketch", "cantOpen": "Một thư mục tên \"{0}\" đã tồn tại. Không thể mở sketch.", - "close": "Bạn có chắc muốn đóng sketch này không?", "compile": "Compiling sketch...", - "configureAndUpload": "Cấu hình và nạp", + "configureAndUpload": "Configure and Upload", "createdArchive": "Đã tạo tệp nén '{0]'.", "doneCompiling": "Biên dịch hoàn tất.", "doneUploading": "Nạp hoàn tất.", + "editInvalidSketchFolderLocationQuestion": "Do you want to try saving the sketch to a different location?", + "editInvalidSketchFolderQuestion": "Do you want to try saving the sketch with a different name?", "exportBinary": "Xuất tệp nhị phân đã biên dịch", + "invalidCloudSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", + "invalidSketchFolderLocationDetails": "You cannot save a sketch into a folder inside itself.", + "invalidSketchFolderLocationMessage": "Vị trí thư mục dự án {0} không hợp lệ", + "invalidSketchFolderNameMessage": "Tên thư mục dự án {0} không hợp lệ", + "invalidSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", "moving": "Chuyển", "movingMsg": "Tệp \"{0}\" cần phải được chứa trong thư mục sketch tên \"{1}\".\nTạo thư mục này, chuyển tệp tin vào đó, và tiếp tục?", - "new": "Tạo mới", + "new": "Bản phác thảo mới", + "noTrailingPeriod": "Tên file không thể kết túc bằng dấu chấm", "openFolder": "Mở thư mục", "openRecent": "Mở gần đây", "openSketchInNewWindow": "Mở sketch trong cửa sổ mới", + "reservedFilename": "'{0}' is a reserved filename.", "saveFolderAs": "Lưu thư mục sketch như là...", - "saveSketch": "Save your sketch to open it again later.", + "saveSketch": "Lưu dự án của bạn để mở vào lần sau.", "saveSketchAs": "Lưu thư mục sketch như là...", "showFolder": "Hiện thư mục sketch", "sketch": "Sketch", + "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", + "sketchAlreadyContainsThisFileMessage": "Lưu dự án \"{0}\" thành \"{1}\" không thành công.{2}", "sketchbook": "Sketchbook", "titleLocalSketchbook": "Sketchbook cục bộ", "titleSketchbook": "Sketchbook", "upload": "Nạp", "uploadUsingProgrammer": "Nạp sử dụng Programmer", - "uploading": "Uploading...", + "uploading": "Đang tải lên...", "userFieldsNotFoundError": "Không thể tìm thấy các trường người dùng cho bo mạch đã kết nối", "verify": "Xác thực", "verifyOrCompile": "Xác thực/Biên dịch" }, - "survey": { - "answerSurvey": "Answer survey", - "dismissSurvey": "Don't show again", - "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." + "sketchbook": { + "newCloudSketch": "Bản phác thảo đám mây mới", + "newSketch": "Bản phác thảo mới" + }, + "theme": { + "currentThemeNotFound": "Could not find the currently selected theme: {0}. Arduino IDE has picked a built-in theme compatible with the missing one.", + "dark": "Tối", + "deprecated": "{0}(Không được dùng nữa)", + "hc": "Độ tương phản tối cao", + "hcLight": "Độ tương phản cao nhẹ", + "light": "Sáng", + "user": "{0}(người dùng)" + }, + "title": { + "cloud": "Đám mây" + }, + "updateIndexes": { + "updateIndexes": "Update Indexes", + "updateLibraryIndex": "Update Library Index", + "updatePackageIndex": "Update Package Index" }, "upload": { "error": "Lỗi {0}: {1}" @@ -388,11 +513,27 @@ "cancel": "Hủy", "enterField": "Enter {0}", "upload": "Nạp" + }, + "validateSketch": { + "abortFixMessage": "The sketch is still invalid. Do you want to fix the remaining problems? By clicking '{0}', a new sketch will open.", + "abortFixTitle": "Bản phác thảo không hợp lệ", + "renameSketchFileMessage": "The sketch file '{0}' cannot be used. {1} Do you want to rename the sketch file now?", + "renameSketchFileTitle": "Tên tệp phác thảo không hợp lệ", + "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", + "renameSketchFolderTitle": "Tên bản phác thảo không hợp lệ" + }, + "versionWelcome": { + "cancelButton": "Maybe later", + "donateButton": "Donate now", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Welcome to a new version of the Arduino IDE!", + "titleWithVersion": "Welcome to the new Arduino IDE {0}!" + }, + "workspace": { + "alreadyExists": "'{0}'đã tồn tại." } }, - "cloud": { - "GoToCloud": "ĐI ĐẾN CLOUD" - }, "theia": { "core": { "cannotConnectBackend": "Không thể kết nối đến backend.", @@ -400,12 +541,8 @@ "couldNotSave": "Không thể lưu sketch. Hãy sao chép tất cả những phần việc chưa được lưu lại vào trình chỉnh sửa văn bản yêu thích của bạn, và khởi động lại IDE.", "daemonOffline": "Trình chạy nền CLI ngoại tuyến", "offline": "Ngoại tuyến", - "quitTitle": "Are you sure you want to quit?" - }, - "debug": { - "start": "Bắt đầu...", - "startError": "Có lỗi xảy ra khi khởi chạy phiên sửa lỗi, hãy kiểm tra log để biết thêm chi tiết.", - "typeNotSupported": "Phiên gỡ lỗi loại \"{0}\" không được hỗ trợ." + "offlineText": "Ngoại tuyến", + "quitTitle": "Bạn có chắc bạn muốn thoát khỏi?" }, "editor": { "unsavedTitle": "Chưa được lưu – {0}" @@ -415,10 +552,10 @@ "expand": "Mở rộng" }, "workspace": { - "deleteCurrentSketch": "Bạn có muốn xóa sketch hiện tại?", + "deleteCloudSketch": "The cloud sketch '{0}' will be permanently deleted from the Arduino servers and the local caches. This action is irreversible. Do you want to delete the current sketch?", + "deleteCurrentSketch": "The sketch '{0}' will be permanently deleted. This action is irreversible. Do you want to delete the current sketch?", "fileNewName": "Tên cho tệp mới", "invalidExtension": ".{0} không phải đuôi mở rộng hợp lệ", - "invalidFilename": "Tên tệp không hợp lệ.", "newFileName": "Tên mới cho tệp" } } diff --git a/i18n/zh-Hant.json b/i18n/zh-Hant.json new file mode 100644 index 000000000..d5af38d46 --- /dev/null +++ b/i18n/zh-Hant.json @@ -0,0 +1,562 @@ +{ + "arduino": { + "about": { + "detail": "版本: {0}\n日期: {1}{2}\n命令列版本: {3}\n\n{4}", + "label": "關於 {0}" + }, + "account": { + "goToCloudEditor": "前往雲端編輯器", + "goToIoTCloud": "前往物聯網雲", + "goToProfile": "到個人資訊", + "menuTitle": "Arduino雲" + }, + "board": { + "board": "{0} 開發板", + "boardConfigDialogTitle": "選擇其他開發板及連接埠", + "boardDataReloaded": "Board data reloaded.", + "boardInfo": "開發板資訊", + "boards": "開發板", + "configDialog1": "若要上傳 Sketch 請選擇開發板及連接埠", + "configDialog2": "單選擇開發板只能編譯,不能上傳", + "couldNotFindPreviouslySelected": "已安装平台{1}中找不到您選的開發板{0}。請手動選擇。你想選擇嗎?", + "editBoardsConfig": "編輯開發板和連接埠", + "getBoardInfo": "取得開發板資訊", + "inSketchbook": "(在 sketchbook 內)", + "installNow": "選取的 {2} 開發板必須安裝 {0} {1} 核心程式,要現在安裝嗎?", + "noBoardsFound": "開發板 {0} 未找到", + "noNativeSerialPort": "無法獲得序列埠的資訊。", + "noPortsDiscovered": "未找到連接埠", + "nonSerialPort": "非序列埠,無法取得資訊。", + "openBoardsConfig": "選擇其他開發板及連接埠", + "pleasePickBoard": "請選擇已連接上的開發版", + "port": "連接埠: {0}", + "ports": "連接埠", + "programmer": "燒錄器", + "reloadBoardData": "Reload Board Data", + "reselectLater": "請稍後再選擇", + "revertBoardsConfig": "使用在 '{1}' 發現的 '{0}'", + "searchBoard": "搜尋開發板", + "selectBoard": "選擇開發版", + "selectBoardToReload": "Please select a board first.", + "selectPortForInfo": "請選定連接埠以便取得開發板的資訊", + "showAllAvailablePorts": "當開啟時,顯示所有可用的埠", + "showAllPorts": "顯示所有連接埠", + "succesfullyInstalledPlatform": "成功安裝平台 {0}:{1}", + "succesfullyUninstalledPlatform": "成功卸載平台 {0}:{1}", + "typeOfPorts": "{0}連接埠", + "unconfirmedBoard": "未知的開發板", + "unknownBoard": "未知的開發版" + }, + "boardsManager": "開發板管理員", + "boardsType": { + "arduinoCertified": "Arduino 認證" + }, + "bootloader": { + "burnBootloader": "燒錄 Bootloader", + "burningBootloader": "正在燒錄 bootloader ...", + "doneBurningBootloader": "Bootloader 燒錄完成" + }, + "burnBootloader": { + "error": "燒錄 Bootloader 時出現錯誤:{0}" + }, + "certificate": { + "addNew": "新增", + "addURL": "加入 URL 以提取 SSL 憑証", + "boardAtPort": "{0} 在 {1}", + "certificatesUploaded": "憑証已上傳", + "enterURL": "輸入網址", + "noSupportedBoardConnected": "已接上未被支援的開發板", + "openContext": "開啟內文", + "remove": "移除", + "selectBoard": "選擇開發板...", + "selectCertificateToUpload": "1. 選擇憑証上傳", + "selectDestinationBoardToUpload": "2. 選擇開發板並上傳憑証", + "upload": "上傳", + "uploadFailed": "上傳失敗, 請再試一次", + "uploadRootCertificates": "上傳SSL根憑証", + "uploadingCertificates": "上傳憑証中..." + }, + "checkForUpdates": { + "checkForUpdates": "檢查 Arduino 更新", + "installAll": "全部安装", + "noUpdates": "没有更新版。", + "promptUpdateBoards": "部分開發板有更新檔。", + "promptUpdateLibraries": "部分程式庫有更新檔。", + "updatingBoards": "更新開發板中...", + "updatingLibraries": "更新程式庫中..." + }, + "cli-error-parser": { + "keyboardError": "找不到 'Keyboard',請檢查是否缺少 '#include <Keyboard.h>'。", + "mouseError": "找不到 'Mouse',請檢查是否缺少 '#include <Mouse.h>'。" + }, + "cloud": { + "chooseSketchVisibility": "選擇 sketch 的透明度:", + "cloudSketchbook": "雲 sketchbook", + "connected": "已連線", + "continue": "繼續", + "donePulling": "已完成讀取 '{0}' 。", + "donePushing": "已完成推送 '{0}' 。", + "embed": "嵌入:", + "emptySketchbook": "您的 sketchbook 是空的", + "goToCloud": "前往雲端", + "learnMore": "了解更多", + "link": "鏈結:", + "notYetPulled": "無法推送到雲端。尚未被讀取。", + "offline": "離線", + "openInCloudEditor": "在雲編輯器中打開", + "options": "選項...", + "privateVisibility": "私人的。只有你可以查看 sketch。", + "profilePicture": "頭像", + "publicVisibility": "公開的。有連結的人都可以查看 sketch。", + "pull": "讀取", + "pullFirst": "須先讀取才能推送到雲。", + "pullSketch": "讀取 sketch", + "pullSketchMsg": "從雲端中讀取這 sketch 將會覆寫本地端的版本。確定要繼續嗎?", + "push": "推送", + "pushSketch": "推送 sketch", + "pushSketchMsg": "這是公開的 sketch,在推送前,請確認所有敏感資訊已在arduino_secrets.h 內。在分享介面裏可將 sketch 改為私人。", + "remote": "遠端", + "share": "分享...", + "shareSketch": "分享 sketch", + "showHideSketchbook": "顯示/隱藏雲 sketchbook", + "signIn": "登入", + "signInToCloud": "登入Arduino 雲", + "signOut": "登出", + "sync": "同步", + "syncEditSketches": "同步和編輯 Arduino 雲內的 sketch", + "visitArduinoCloud": "前往Arduino 雲以新增雲 sketch。" + }, + "cloudSketch": { + "alreadyExists": "雲 sketch '{0}' 已存在。", + "creating": "建立雲 sketch '{0}'...", + "new": "新增雲 sketch", + "notFound": "雲 sketch '{0}' 不存在, 無法拉取。", + "pulling": "同步 sketchbook, 拉取 '{0}' ...", + "pushing": "同步 sketchbook, 推送 '{0}' ...", + "renaming": "重新命名雲 sketch '{0}' 成 '{1}' ...", + "synchronizingSketchbook": "同步 sketchbook ..." + }, + "common": { + "all": "全部", + "contributed": "已貢獻", + "installManually": "手動安裝", + "later": "稍後", + "noBoardSelected": "未選取開發板", + "noSketchOpened": "未開啟 sketch", + "notConnected": "[未連接]", + "offlineIndicator": "您目前處於離線狀態,在沒有網路的情況下,Arduino命令列介面將無法下載需要的資源,並可能導致錯誤。請連接至網路並重新啟動程式。", + "oldFormat": "'{0}'仍然使用舊的 `.pde` 格式,要切換成新版 `.ino` 嗎?", + "partner": "合作夥伴", + "processing": "資料處理中", + "recommended": "推薦", + "retired": "不再支援", + "selectManually": "手動選取", + "selectedOn": "在 {0}", + "serialMonitor": "序列埠監控窗", + "type": "類型", + "unknown": "未知", + "updateable": "可更新", + "userAbort": "User abort" + }, + "compile": { + "error": "編譯錯誤:{0} " + }, + "component": { + "boardsIncluded": "本套件內建的開發版:", + "by": "提供者:", + "clickToOpen": "點擊以瀏覽器開啟:{0}", + "filterSearch": "篩選搜尋結果...", + "install": "安裝", + "installLatest": "安装最新版本", + "installVersion": "安裝 {0}", + "installed": "{0}已安裝", + "moreInfo": "詳細資訊", + "otherVersions": "其它版本", + "remove": "移除", + "title": "{0} / {1}", + "uninstall": "卸載", + "uninstallMsg": "你要卸載 {0}?", + "update": "更新" + }, + "configuration": { + "cli": { + "inaccessibleDirectory": "無法存取 sketchbook 內的 '{0}' :{1}" + } + }, + "connectionStatus": { + "connectionLost": "失去連線,無法使用雲 sketch 或更新。" + }, + "contributions": { + "addFile": "加入檔案", + "fileAdded": "一個檔案加入 Sketch", + "plotter": { + "couldNotOpen": "無法開啟繪圖儀。" + }, + "replaceTitle": "取代" + }, + "core": { + "compilerWarnings": { + "all": "全部", + "default": "預設", + "more": "更多", + "none": "無" + } + }, + "coreContribution": { + "copyError": "複製錯誤訊息", + "noBoardSelected": "未選取開發版。請從 工具 > 開發版 中選取開發版" + }, + "createCloudCopy": "推送 sketch 至雲端。", + "daemon": { + "restart": "重啟背景程式", + "start": "啟動背景程式", + "stop": "停止背景程式" + }, + "debug": { + "debugWithMessage": "除錯 - {0}", + "debuggingNotSupported": "'{0}' 不支援除錯功能。", + "getDebugInfo": "取得除錯資訊...", + "noPlatformInstalledFor": "平台未安裝給'{0}'", + "optimizeForDebugging": "除錯最佳化", + "sketchIsNotCompiled": "Sketch '{0}' 在除錯前必須已驗證過。請先驗證 sketch 後再除錯。要現在驗證 sketch 嗎?" + }, + "developer": { + "clearBoardList": "清除開發板歷史清單", + "clearBoardsConfig": "清除已選取的開發板及連接埠", + "dumpBoardList": "列出開發板清單" + }, + "dialog": { + "dontAskAgain": "不要再詢問" + }, + "editor": { + "autoFormat": "自動格式", + "commentUncomment": "備註/撤除備註", + "copyForForum": "複製到論壇(Markdowm)", + "decreaseFontSize": "縮小字體", + "decreaseIndent": "減少縮排", + "increaseFontSize": "加大字體", + "increaseIndent": "增加縮排", + "nextError": "下一個錯誤", + "previousError": "上一個錯誤", + "revealError": "顯示錯誤" + }, + "examples": { + "builtInExamples": "內建範例", + "couldNotInitializeExamples": "無法初始內建的範例", + "customLibrary": "客製程式庫的範例", + "for": "{0} 的範例", + "forAny": "適用各種開發板的範例", + "menu": "範例" + }, + "firmware": { + "checkUpdates": "檢查更新", + "failedInstall": "安裝失敗, 請再試一次", + "install": "安裝", + "installingFirmware": "安裝韌體", + "overwriteSketch": "安裝將覆寫開發板上的 Sketch", + "selectBoard": "選擇開發版", + "selectVersion": "選擇韌體版本", + "successfullyInstalled": "韌體安裝成功", + "updater": "韌體更新" + }, + "help": { + "environment": "環境", + "faq": "常見問題", + "findInReference": "搜尋參考文件", + "gettingStarted": "入門教學", + "keyword": "輸入關鍵字", + "privacyPolicy": "隱私政策", + "reference": "參考文件", + "search": "在 Arduino.cc 搜尋", + "troubleshooting": "故障排除", + "visit": "造訪 Arduino.cc" + }, + "ide-updater": { + "checkForUpdates": "檢查 Arduino IDE 更新", + "closeAndInstallButton": "關閉並安裝。", + "closeToInstallNotice": "關閉本程式後安裝更新。", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", + "downloadButton": "下載", + "downloadingNotice": "正在下載最新版本的Arduino IDE。", + "errorCheckingForUpdates": "檢查 Arduino IDE 更新時發生錯誤。\n{0}", + "goToDownloadButton": "前往下載", + "goToDownloadPage": "Arduino IDE 有更新版本, 但我們無法自動下載安裝, 請至下載頁面下載最新的版本。", + "ideUpdaterDialog": "軟體更新", + "newVersionAvailable": "Arduino IDE 有新版本({0})可供下載。", + "noUpdatesAvailable": "Arduino IDE 沒更新檔。", + "notNowButton": "現在不要", + "skipVersionButton": "略過這個版本", + "updateAvailable": "有更新檔。", + "versionDownloaded": "Arduino IDE{0}下載完成。" + }, + "installable": { + "libraryInstallFailed": "程式庫 ' {0} {1}' : 安裝失敗。", + "platformInstallFailed": "平台安裝失敗: '{0} {1}' " + }, + "library": { + "addZip": "加入 .zip 程式庫 ...", + "arduinoLibraries": "Arduino 程式庫", + "contributedLibraries": "貢獻的程式庫", + "include": "程式庫", + "installAll": "安裝全部", + "installLibraryDependencies": "安裝相依的程式庫", + "installMissingDependencies": "要安裝缺少的相依程式嗎?", + "installOneMissingDependency": "要安裝缺少的相依程式庫嗎 ?", + "installWithoutDependencies": "不管相依性直接安裝", + "installedSuccessfully": "成功安裝程式庫 {0}:{1} ", + "libraryAlreadyExists": "程式庫已存在,要覆寫它嗎?", + "manageLibraries": "管理程式庫", + "namedLibraryAlreadyExists": "{0} 程式庫資料夾已存在,要覆寫它嗎?", + "needsMultipleDependencies": "程式庫<b>{0}:{1}</b>需要下列未安裝的相依程式:", + "needsOneDependency": "程式庫<b>{0}:{1}</b>需要其他未安装的相依程式:", + "overwriteExistingLibrary": "要覆寫既有的程式庫嗎?", + "successfullyInstalledZipLibrary": "從 {0} 成功安裝程式庫", + "title": "程式庫管理員", + "uninstalledSuccessfully": "成功卸載程式庫 {0}:{1}", + "zipLibrary": "程式庫" + }, + "librarySearchProperty": { + "topic": "主題" + }, + "libraryTopic": { + "communication": "交流", + "dataProcessing": "資料處理中", + "dataStorage": "資料儲存", + "deviceControl": "裝置控制", + "display": "顯示", + "other": "其他", + "sensors": "感測器", + "signalInputOutput": "訊號輸入/ 輸出", + "timing": "時序", + "uncategorized": "未分類" + }, + "libraryType": { + "installed": "已安装" + }, + "menu": { + "advanced": "進階", + "sketch": "Sketch", + "tools": "工具" + }, + "monitor": { + "alreadyConnectedError": "已連線,但無法連到{0} {1}埠。", + "baudRate": "{0}鮑率", + "connectionFailedError": "無法連接 {0} {1} 埠。", + "connectionFailedErrorWithDetails": "{0} 無法連接 {1} {2} 埠。", + "connectionTimeout": "逾時,IDE在連上監看視窗後未收到成功訊息。", + "missingConfigurationError": "無法連上 {0} {1} 埠,監看視窗設定遺失。", + "notConnectedError": "無法連上 {0} {1} 埠。", + "unableToCloseWebSocket": "無法關閉 websocket", + "unableToConnectToWebSocket": "無法連上 websocket" + }, + "newCloudSketch": { + "newSketchTitle": "新的雲端 Sketch 名" + }, + "portProtocol": { + "network": "網路", + "serial": "序列" + }, + "preferences": { + "additionalManagerURLs": "其他開發版管理員網址", + "auth.audience": "OAuth2 受眾", + "auth.clientID": "OAuth2 客户端 ID", + "auth.domain": "OAuth2 網域", + "auth.registerUri": "註冊新使用者的 URI", + "automatic": "自動", + "board.certificates": "可上傳到開發版的憑証列表", + "browse": "瀏覽", + "checkForUpdate": "接收 IDE、開發板和程式庫的更新通知。 更改後需要重啟 IDE。 預設:開啟。", + "choose": "選取", + "cli.daemonDebug": "啟用 Arduino CLI 內 gRPC 呼叫記錄。 需要重啟 IDE 才能生效。 預設:關閉。", + "cloud.enabled": "Sketch 同步, 預設:開啟。", + "cloud.pull.warn": "讀取雲端 sketch 前會警告使用者。預設: 開啟。", + "cloud.push.warn": "推送雲端 sketch 前會警告使用者。預設: 開啟。", + "cloud.pushpublic.warn": "推送公開的 sketch 到雲端前會警告使用者。預設: 開啟。", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", + "cloud.sketchSyncEndpoint": "用來從後台讀取或推送 sketch 的端點。預設: Arduino 雲 API。", + "compile": "編譯", + "compile.experimental": "IDE 處理多個編譯器錯誤。 預設: 關閉", + "compile.revealRange": "調整驗證/上傳失敗後編譯器錯誤訊息如何顯示。 可能的值:'auto':依需要垂直滾動並顯示一行。 'center':依需要垂直滾動並顯示垂直居中的一行。 'top':依需要垂直滾動並上方顯示一行,方便查看程式碼。 'centerIfOutsideViewport':依需要垂直滾動,僅當它在可視區外時才顯示垂直居中的一行。 預設為 '{0}'", + "compile.verbose": "輸出詳細編譯資訊。預設: 關閉", + "compile.warnings": "設定 gcc 警告等級, 預設為 'None'", + "compilerWarnings": "編譯器警告", + "editorFontSize": "編輯器字體大小", + "editorQuickSuggestions": "編輯器快速建議", + "enterAdditionalURLs": "輸入其他網址, 每列一個", + "files.inside.sketches": "顯示 sketch 裏面的檔案", + "ide.updateBaseUrl": "下載更新的網址, 預設為:'https://downloads.arduino.cc/arduino-ide'", + "ide.updateChannel": "取得更新的版本釋出頻道, 'stable' 表示為穩定的版本, 'nightly' 則是最新的開發中版本。", + "interfaceScale": "使用者介面縮放比例", + "invalid.editorFontSize": "無效的編輯器字體大小, 必須是正整數。", + "invalid.sketchbook.location": "無效的 sketchbook 位置:{0}", + "invalid.theme": "無效的佈景主題。", + "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", + "language.log": "Arduino語言伺服器會自動在 sketch 內產生日誌檔。預設為關閉。", + "language.realTimeDiagnostics": "語言服務器提供即時診斷。預設關閉。", + "manualProxy": "手動設定代理伺服器", + "monitor": { + "dockPanel": "程式 _{0}_ 區塊位置. 不是在 \"下方\" 或 \"右側\". 預設: \"{1}\"." + }, + "network": "網路", + "newSketchbookLocation": "選取新的 sketchbook 位置", + "noCliConfig": "無法載入CLI 命令列設定。", + "noProxy": "不使用代理伺服器", + "proxySettings": { + "hostname": "主機名稱", + "password": "密碼", + "port": "埠號", + "username": "使用者名稱" + }, + "showVerbose": "在以下階段顯示詳細輸出", + "sketch": { + "inoBlueprint": "\".ino \"藍圖文件的絕對檔案系統路徑。如有指定,藍圖文件的內容將被用在每個新增的 sketch 上。如果沒特別指定,sketch 將以內預設的Arduino內容生成。無法訪問的藍圖文件將被忽略。 **需要重啟 IDE** 本設定才會生效。" + }, + "sketchbook.location": "sketchbook 位置", + "sketchbook.showAllFiles": "顯示 sketch 內全部檔案。預設: false。", + "unofficialBoardSupport": "點擊來取得非官方開發版的支援網址", + "upload": "上傳", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", + "upload.verbose": "上傳時輸出的詳細資訊。預設: False", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", + "verifyAfterUpload": "上傳後驗證程式碼", + "window.autoScale": "使用者介面隨字體大小自動縮放。", + "window.zoomLevel": { + "deprecationMessage": "已棄用。請改用 'window.zoomLevel' 。" + } + }, + "renameCloudSketch": { + "renameSketchTitle": "雲 sketch 的新名稱" + }, + "replaceMsg": "取代現有的 {0} 版本?", + "selectZip": "選擇內含程式庫的 zip 檔", + "serial": { + "autoscroll": "自動捲動", + "carriageReturn": "內有 CR", + "connecting": "連接到 '{1}' 上的 '{0}' ...", + "message": "訊息 (按 Enter 鍵將訊息發送到 {1} 上的 {0})", + "newLine": "換行", + "newLineCarriageReturn": "NL和CR字元", + "noLineEndings": "沒有斷行字元", + "notConnected": "未連上。請選擇開發板及連接埠後自動連接", + "openSerialPlotter": "序列埠監控窗", + "timestamp": "時間戳記", + "toggleTimestamp": "切換是否加入時間戳記" + }, + "sketch": { + "archiveSketch": "sketch 歸檔", + "cantOpen": "已有 \"{0}\" 資料夾, 無法開啟 sketch", + "compile": "編譯 sketch...", + "configureAndUpload": "設定並上傳", + "createdArchive": "已歸檔{0}。", + "doneCompiling": "編譯完成", + "doneUploading": "上傳完畢", + "editInvalidSketchFolderLocationQuestion": "想要把 sketch 儲存在不同地方嗎?", + "editInvalidSketchFolderQuestion": "想要把 sketch 存為不同檔名嗎?", + "exportBinary": "匯出已編譯的二進位碼", + "invalidCloudSketchName": "命名必須以字母、數字或底線開頭,後面接字母、數字、破折號、點、底線。最長 36個字元。", + "invalidSketchFolderLocationDetails": "不能把 sketch 儲存到它自身內部的資料夾裡。", + "invalidSketchFolderLocationMessage": "無效的 sketch 資料夾位置: '{0}' ", + "invalidSketchFolderNameMessage": "無效的 sketch 資料夾名稱: '{0}' ", + "invalidSketchName": "命名必須以字母、數字或底線為開頭,後面跟著字母、數字、破折號、點、底線。最長 63 字元。", + "moving": "移動", + "movingMsg": "檔案{0}需放在sketch 資料夾的{1}內 ,\n要建立資料夾並移動檔案嗎?", + "new": "新增 sketch", + "noTrailingPeriod": "檔名不能以逗號字元結尾", + "openFolder": "開啟資料夾", + "openRecent": "開啟最近的", + "openSketchInNewWindow": "在新視窗開啟 sketch", + "reservedFilename": "'{0}' 為保留檔名。", + "saveFolderAs": "另存 Sketch 資料夾為", + "saveSketch": "儲存 sketch 以便下次再打開它。", + "saveSketchAs": "另存 Sketch 資料夾為", + "showFolder": "顯示 Sketch 資料夾", + "sketch": "Sketch", + "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", + "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", + "sketchbook": "Sketchbook", + "titleLocalSketchbook": "本地端的 Sketchbook", + "titleSketchbook": "Sketchbook", + "upload": "上傳", + "uploadUsingProgrammer": "使用燒錄器上傳", + "uploading": "正在上傳...", + "userFieldsNotFoundError": "找不到已連接開發版中的用戶欄", + "verify": "驗證", + "verifyOrCompile": "驗證/編譯" + }, + "sketchbook": { + "newCloudSketch": "新增雲 sketch", + "newSketch": "新增 sketch" + }, + "theme": { + "currentThemeNotFound": "找不到目前選擇的主題:{0} 。 Arduino IDE 挑選了一個內建的相容主題。", + "dark": "暗色", + "deprecated": "{0} (已棄用)", + "hc": "深色高對比", + "hcLight": "亮色高對比", + "light": "亮色", + "user": "{0} (使用者)" + }, + "title": { + "cloud": "雲端" + }, + "updateIndexes": { + "updateIndexes": "更新索引", + "updateLibraryIndex": "更新程式庫索引", + "updatePackageIndex": "更新套件索引" + }, + "upload": { + "error": "{0} 錯誤:{1}" + }, + "userFields": { + "cancel": "取消", + "enterField": "輸入 {0}", + "upload": "上傳" + }, + "validateSketch": { + "abortFixMessage": "Sketch 仍是無效的。你想修復這問題嗎?點擊 '{0}' ,會開啟新的 Sketch 。", + "abortFixTitle": "無效的 sketch", + "renameSketchFileMessage": "Sketch '{0}' 無法被使用。 {1} 想立即更改 sketch 的檔名嗎?", + "renameSketchFileTitle": "無效的 sketch 檔名", + "renameSketchFolderMessage": "Sketch '{0}' 無法被使用。 {1} 要擺脫這則訊息,請更改 sketch 檔名。要現在更改檔名嗎?", + "renameSketchFolderTitle": "無效的 sketch 檔名" + }, + "versionWelcome": { + "cancelButton": "Maybe later", + "donateButton": "Donate now", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Welcome to a new version of the Arduino IDE!", + "titleWithVersion": "Welcome to the new Arduino IDE {0}!" + }, + "workspace": { + "alreadyExists": "'{0}'已存在。" + } + }, + "theia": { + "core": { + "cannotConnectBackend": "無法連上後端", + "cannotConnectDaemon": "無法連上命令列 CLI 背景程式", + "couldNotSave": "無法儲存 sketch,請複製未存檔的成果到你偏好的文字編輯器中, 再重啟 IDE", + "daemonOffline": "CLI 命令列背景程式離線", + "offline": "離線", + "offlineText": "離線", + "quitTitle": "確定要退出嗎?" + }, + "editor": { + "unsavedTitle": "{0} – 尚未儲存" + }, + "messages": { + "collapse": "收折", + "expand": "展開" + }, + "workspace": { + "deleteCloudSketch": "雲 sketch '{0}' 將從Arduino 伺服器和本機暫存中永久刪除。這個動作是不可逆的。確定要刪除 Sketch 嗎?", + "deleteCurrentSketch": "sketch '{0}' 將被永久刪除。這個動作是不可逆的。確定要刪除 sketch 嗎?", + "fileNewName": "新檔案名稱", + "invalidExtension": ".{0} 不是符合規則的副檔名", + "newFileName": "新檔案名稱" + } + } +} diff --git a/i18n/zh.json b/i18n/zh.json index dcb23bdab..2b489266a 100644 --- a/i18n/zh.json +++ b/i18n/zh.json @@ -1,38 +1,51 @@ { "arduino": { "about": { - "detail": "版本:{0}\n日期:{1}{2}\nCLI 版本:{3}{4}[{5}]{6}", + "detail": "版本:{0}\n日期:{1}{2}\nCLI 版本:{3}\n\n{4}", "label": "关于 {0}" }, + "account": { + "goToCloudEditor": "转到云编辑器", + "goToIoTCloud": "转到物联网云", + "goToProfile": "转到个人资料", + "menuTitle": "Arduino Cloud" + }, "board": { "board": "开发板 {0}", "boardConfigDialogTitle": "选择其他开发板和端口", + "boardDataReloaded": "Board data reloaded.", "boardInfo": "开发板信息", + "boards": "开发板", "configDialog1": "如果要上传项目,请选择开发板和端口。", "configDialog2": "如果你只选择了开发板,你可以编译项目,但不能上传项目。", "couldNotFindPreviouslySelected": "在安装的平台 ‘{1}’ 中找不到以前选择的开发板 ‘{0}’。请手动选择要使用的开发板。你想现在重新选择它吗?", - "disconnected": "已断开", + "editBoardsConfig": "编辑开发板和端口……", "getBoardInfo": "获得开发板信息", "inSketchbook": "(在项目文件夹中)", "installNow": "必须为当前选定的 {2} 开发板板安装 “{0}{1}” 内核。你想现在安装吗?", - "noFQBN": "FQBN 不可用于所选开发板 “{0}”。你是否安装了相应的内核?", + "noBoardsFound": "没有找到 “{0}” 相关开发板", + "noNativeSerialPort": "本地串行端口,无法获取信息。", "noPortsDiscovered": "未发现端口", - "noPortsSelected": "没有为开发板选择端口:‘{0}’。", - "noneSelected": "未选择任何开发板。", + "nonSerialPort": "非串行端口,无法获取信息。", "openBoardsConfig": "选择其他开发板和接口......", - "platformMissing": "未安装所选 ‘{0}’ 开发板的平台。", "pleasePickBoard": "请选择要连接的开发板。", "port": "端口 {0}", - "portLabel": "端口:{0}", + "ports": "端口", "programmer": "编程器", + "reloadBoardData": "Reload Board Data", "reselectLater": "稍后重新选择", + "revertBoardsConfig": "使用在 '{1}' 上发现的 '{0}'", "searchBoard": "搜索开发坂", "selectBoard": "选择开发板", - "selectBoardForInfo": "请选择一个开发板以获取开发板信息。", + "selectBoardToReload": "Please select a board first.", "selectPortForInfo": "请选择一个端口以获取开发板信息。", "showAllAvailablePorts": "启用时显示所有可用端口", + "showAllPorts": "显示所有端口", "succesfullyInstalledPlatform": "已成功安装平台 {0}:{1}", - "succesfullyUninstalledPlatform": "已成功卸载平台 {0}:{1}" + "succesfullyUninstalledPlatform": "已成功卸载平台 {0}:{1}", + "typeOfPorts": "{0} 端口", + "unconfirmedBoard": "没有经过确认的开发板", + "unknownBoard": "未知开发板" }, "boardsManager": "开发板管理器", "boardsType": { @@ -40,7 +53,7 @@ }, "bootloader": { "burnBootloader": "烧录引导程序", - "burningBootloader": "正在烧录引导程序。。。", + "burningBootloader": "正在烧录引导程序…", "doneBurningBootloader": "完成烧录引导程序。" }, "burnBootloader": { @@ -77,14 +90,15 @@ "mouseError": "没有找到 ‘Mouse’,请检查您的项目是否包含 ‘#include<Mouse.h>’?" }, "cloud": { - "account": "账户", "chooseSketchVisibility": "选择项目的可见性:", + "cloudSketchbook": "云项目文件夹", "connected": "已连接", "continue": "继续", - "donePulling": "已完成拉取 ‘{0}’。", - "donePushing": "已完成推送 ‘{0}’。", + "donePulling": "拉取完成 ‘{0}’。", + "donePushing": "推送完成 ‘{0}’。", "embed": "嵌入:", "emptySketchbook": "你的项目文件夹是空的", + "goToCloud": "前往 Cloud", "learnMore": "查看更多", "link": "链接:", "notYetPulled": "无法推送到 Cloud。未被拉取。", @@ -102,10 +116,9 @@ "pushSketch": "推送项目", "pushSketchMsg": "这是公开的项目。推送前,确保在 arduino_secrets.h 中明确了所有敏感信息。可以从共享界面将项目设为私人项目。", "remote": "远程", - "remoteSketchbook": "远程项目文件夹", "share": "共享......", "shareSketch": "共享项目", - "showHideRemoveSketchbook": "显示/隐藏远程项目文件夹", + "showHideSketchbook": "显示 / 隐藏云端项目", "signIn": "登录", "signInToCloud": "登录 Arduino Cloud", "signOut": "退出登录", @@ -113,24 +126,37 @@ "syncEditSketches": "同步和编辑 Arduino Cloud 项目", "visitArduinoCloud": "访问 Arduino Cloud 以创建云项目。" }, + "cloudSketch": { + "alreadyExists": "云端项目 '{0}' 已经存在。", + "creating": "正在创建云端项目 '{0}'...", + "new": "新的云端项目", + "notFound": "无法拉取云端项目 '{0}'。它并不存在。", + "pulling": "正在同步远程项目文件夹,拉取“{0}”中...", + "pushing": "同步项目中,正在推送 '{0}'...", + "renaming": "将云端项目从 '{0}' 重命名为 '{1}'...", + "synchronizingSketchbook": "同步项目中..." + }, "common": { "all": "全部", "contributed": "已贡献", "installManually": "手动安装", "later": "之后", "noBoardSelected": "没有选择开发板", + "noSketchOpened": "未打开项目", "notConnected": "[没有连接]", "offlineIndicator": "你似乎处于离线状态。如果没有网络连接,Arduino CLI 可能无法下载所需的资源,并可能导致故障。请连接网络并重新启动程序。", "oldFormat": "‘{0}’ 仍然使用旧的 ‘.pde’ 格式。是否要切换到新的 ‘.ino’ 扩展?", "partner": "合作伙伴", "processing": "正在处理中", "recommended": "推荐", - "retired": "Retired", - "selectedOn": "on {0}", + "retired": "不再支持的", + "selectManually": "手动选择", + "selectedOn": "在{0}上", "serialMonitor": "串口监视器", "type": "类型", "unknown": "未知", - "updateable": "可更新" + "updateable": "可更新", + "userAbort": "用户终止" }, "compile": { "error": "编译错误:{0}" @@ -138,22 +164,49 @@ "component": { "boardsIncluded": "包含在此包中的开发板:", "by": "by", - "filterSearch": "筛选搜索结果......", + "clickToOpen": "单击以在浏览器中打开:{0}", + "filterSearch": "筛选搜索结果…", "install": "安装", + "installLatest": "安装最新版本", + "installVersion": "安装 {0}", + "installed": "{0} 已安装", "moreInfo": "更多信息", + "otherVersions": "其他版本", + "remove": "移除", + "title": "{0} by {1}", "uninstall": "卸载", "uninstallMsg": "是否要卸载 {0}?", - "version": "版本 {0}" + "update": "更新" + }, + "configuration": { + "cli": { + "inaccessibleDirectory": "无法访问位于 ‘{0}’ 的项目文件夹:{1}。" + } + }, + "connectionStatus": { + "connectionLost": "连接丢失。云项目操作和更新操作将不可用。" }, "contributions": { "addFile": "添加文件", "fileAdded": "将一个文件添加到项目中。", + "plotter": { + "couldNotOpen": "无法打开串口绘图仪" + }, "replaceTitle": "替换" }, + "core": { + "compilerWarnings": { + "all": "全部", + "default": "默认", + "more": "较多", + "none": "无" + } + }, "coreContribution": { "copyError": "复制错误信息", "noBoardSelected": "未选择开发板。请从工具 > 板菜单中选择您的 Arduino 开发板。" }, + "createCloudCopy": "推送项目到云端", "daemon": { "restart": "重启守护进程", "start": "启动守护进程", @@ -162,8 +215,15 @@ "debug": { "debugWithMessage": "调试 - {0}", "debuggingNotSupported": "‘{0}’ 不支持调试", + "getDebugInfo": "正在获取调试信息。。。", "noPlatformInstalledFor": "‘{0}’ 平台未安装", - "optimizeForDebugging": "调试优化" + "optimizeForDebugging": "调试优化", + "sketchIsNotCompiled": "项目 '{0}' 在开始调试会话之前必须经过验证。请验证草图并重新开始调试。你现在要验证草图吗?" + }, + "developer": { + "clearBoardList": "清除开发板的历史列表", + "clearBoardsConfig": "清除已经选择的开发板和连接端口", + "dumpBoardList": "列出开发板列表" }, "dialog": { "dontAskAgain": "不要再请求" @@ -180,10 +240,6 @@ "previousError": "上一个错误", "revealError": "显示错误" }, - "electron": { - "couldNotSave": "无法保存项目。请将未保存的工作复制到你喜爱的文本编辑器中,然后重新启动 IDE。", - "unsavedChanges": "将不会保存任何未保存的更改。" - }, "examples": { "builtInExamples": "内置示例", "couldNotInitializeExamples": "无法初始化内置示例。", @@ -201,7 +257,7 @@ "selectBoard": "选择开发板", "selectVersion": "选择固件版本", "successfullyInstalled": "固件成功安装", - "updater": "WiFi101 / WiFiNINA 固件更新程序" + "updater": "固件更新" }, "help": { "environment": "环境", @@ -219,6 +275,9 @@ "checkForUpdates": "检查 Arduino IDE 更新", "closeAndInstallButton": "关闭并安装", "closeToInstallNotice": "关闭软件并安装更新。", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", "downloadButton": "下载", "downloadingNotice": "正在下载 Arduino IDE 的最新版本。", "errorCheckingForUpdates": "检查 Arduino IDE 更新时出错。{0}", @@ -232,16 +291,20 @@ "updateAvailable": "IDE 可更新。", "versionDownloaded": "Arduino IDE {0} 已经下载。" }, + "installable": { + "libraryInstallFailed": "库文件 '{0}{1}' 安装失败", + "platformInstallFailed": "平台安装失败:'{0}{1}'" + }, "library": { "addZip": "添加 .ZIP 库...", - "arduinoLibraries": "arduino 库", + "arduinoLibraries": "Arduino 库", "contributedLibraries": "贡献库", - "dependenciesForLibrary": "{0} 库的依赖:{1}", - "include": "包含库", + "include": "导入库", "installAll": "全部安装", + "installLibraryDependencies": "安装库的依赖", "installMissingDependencies": "是否安装所有缺少的依赖?", "installOneMissingDependency": "是否安装缺少的依赖?", - "installOnly": "仅安装 {0}", + "installWithoutDependencies": "仅安装库 (跳过依赖)", "installedSuccessfully": "已成功安装 {0} 库:{1}", "libraryAlreadyExists": "库已经存在。是否要覆盖它?", "manageLibraries": "管理库...", @@ -258,7 +321,7 @@ "topic": "话题" }, "libraryTopic": { - "communication": "Communication", + "communication": "交流", "dataProcessing": "数据处理", "dataStorage": "数据存储", "deviceControl": "设备控制", @@ -270,7 +333,7 @@ "uncategorized": "未分类" }, "libraryType": { - "installed": "安装" + "installed": "已安装" }, "menu": { "advanced": "高级设置", @@ -278,9 +341,23 @@ "tools": "工具" }, "monitor": { + "alreadyConnectedError": "无法连接至 {0} {1} 端口。已有连接。", + "baudRate": "波特率 {0}", + "connectionFailedError": "无法连接至 {0} {1} 端口。", + "connectionFailedErrorWithDetails": "{0} 无法连接至 {1} {2} 端口。", + "connectionTimeout": "超时。IDE 在连接到监视器后,没有收到“成功”消息", + "missingConfigurationError": "无法连接至 {0} {1} 端口。监视器配置缺失。", + "notConnectedError": "没有连接至 {0} {1} 端口。", "unableToCloseWebSocket": "无法关闭 websocket", "unableToConnectToWebSocket": "无法连接 websocket" }, + "newCloudSketch": { + "newSketchTitle": "新云端项目的名称" + }, + "portProtocol": { + "network": "网络", + "serial": "串口" + }, "preferences": { "additionalManagerURLs": "其他开发板管理器地址", "auth.audience": "OAuth2 受众。", @@ -290,13 +367,14 @@ "automatic": " 自动调整", "board.certificates": "可上传到开发板的证书列表", "browse": "浏览", - "checkForUpdate": "接收 IDE、开发板和库的可用更新通知。更改后需要重启IDE。默认情况为开启。", + "checkForUpdate": "接收 IDE、开发板和库的可用更新通知。更改后需要重启 IDE。默认情况为开启。", "choose": "选择", "cli.daemonDebug": "启用对 Arduino CLI 的 gRPC 调用的调试记录。该设置需要重新启动 IDE 才能生效。默认不启用。", "cloud.enabled": "True 则启用项目同步功能。默认为 True。", - "cloud.pull.warn": "True 则在拉取cloud项目之前警告用户。默认为 True。", + "cloud.pull.warn": "True 则在拉取 cloud 项目之前警告用户。默认为 True。", "cloud.push.warn": "True 则在推送 cloud 项目之前警告用户。默认为 True。", "cloud.pushpublic.warn": "True 则将公开项目推送到 cloud 中之前警告用户。默认为 True。", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", "cloud.sketchSyncEndpoint": "用于从后台推送项目的端点。默认情况下,它指向 Arduino Cloud API。", "compile": "编译", "compile.experimental": "True 则 IDE 处理多个编译器错误。默认为 False。", @@ -314,29 +392,50 @@ "invalid.editorFontSize": "编辑器字体大小无效。它必须是正整数。", "invalid.sketchbook.location": "无效的项目文件夹地址:{0}", "invalid.theme": "无效的主题。", + "language.asyncWorkers": "Arduino 语言服务器(clangd)使用的异步工作线程数。 后台索引也使用相同数量的工作线程。 最小值为 0,最大值为 8。 当值为 0 时,语言服务器将使用所有可用的核心。 默认值为 0。", "language.log": "True 则 Arduino Language Server 将日志文件生成到项目文件夹中。默认为 False。", "language.realTimeDiagnostics": " True 则 language server 在编辑器中输入时提供实时诊断。默认为 False。", "manualProxy": "手动配置代理", + "monitor": { + "dockPanel": "_{0}_窗口小部件所在的应用程序shell区域不是在 \"bottom\" 或 \"bottom\"。默认为 \"{1}\"。" + }, "network": "网络", "newSketchbookLocation": "选择新的项目文件夹地址", + "noCliConfig": "无法加载 CLI 配置", "noProxy": "无代理", + "proxySettings": { + "hostname": "主机名", + "password": "密码", + "port": "端口号", + "username": "用户名" + }, "showVerbose": "显示详细输出", + "sketch": { + "inoBlueprint": "指定默认 “.ino” 模板文件的绝对路径。如果指定,则该模板文件的内容将被用于 IDE 创建的每一个新 sketch。如果未指定,则使用Arduino默认的内容来创建新 sketch。不可用的模板文件将被自动忽略。**需要重启IDE** 以使此设置生效。" + }, "sketchbook.location": "项目文件夹地址", "sketchbook.showAllFiles": "True 则显示项目中的所有项目文件。默认情况下为 False。", - "survey.notification": "True 则在有调查时应通知用户。默认为 True。", "unofficialBoardSupport": "点击获取支持的非官方开发板地址列表", "upload": "上传", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", "upload.verbose": "True 则输出详细上传信息。默认情况下为 False。", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "上传后验证代码", "window.autoScale": "True 则用户界面随字体大小自动缩放。", - "window.zoomLevel": "调整窗口的缩放级别。默认缩放级别为 0,大于(例如 1)或小于(例如 -1)的每个增量表示放大或缩小 20%。输入小数可以更精细的调整缩放级别。" + "window.zoomLevel": { + "deprecationMessage": "已弃用。请改用“window.zoomLevel”。" + } + }, + "renameCloudSketch": { + "renameSketchTitle": "云端项目的新名称" }, "replaceMsg": "是否替换 {0} 的现有版本?", "selectZip": "选择包含要添加的库的 zip 文件", "serial": { "autoscroll": "自动滚屏", "carriageReturn": "回车", - "message": "消息({0}+Enter 将消息发送到 {2} 上的 {1})", + "connecting": "在 '{1}' 上连接至 '{0}' 中……", + "message": "消息(按回车将消息发送到“{1}”上的“{0}”)", "newLine": "换行", "newLineCarriageReturn": "换行 和 回车 两者都是", "noLineEndings": "没有结束符", @@ -348,38 +447,64 @@ "sketch": { "archiveSketch": "项目存档", "cantOpen": "“{0}” 文件夹已存在。无法打开项目。", - "close": "是否确实要关闭项目?", - "compile": "正在编译项目。。。", - "configureAndUpload": "配置和上传", + "compile": "正在编译项目…", + "configureAndUpload": "配置并上传", "createdArchive": "已创建存档 ‘{0}’。", "doneCompiling": "编译完成", "doneUploading": "上传完成", + "editInvalidSketchFolderLocationQuestion": "你想试试把项目保存到不同的位置吗?", + "editInvalidSketchFolderQuestion": "你想尝试用不同的名字保存项目吗?", "exportBinary": "导出已编译的二进制文件", + "invalidCloudSketchName": "名称必须以字母、数字或下划线开头,后面接着字母、数字、破折号、点和下划线。最大长度为 36 个字符。", + "invalidSketchFolderLocationDetails": "你不能把一个项目保存到它本身的一个文件夹里。", + "invalidSketchFolderLocationMessage": "无效的项目文件夹位置: '{0}'", + "invalidSketchFolderNameMessage": "无效的项目文件夹名称:'{0}'", + "invalidSketchName": "名称必须以字母、数字或下划线开头,后面接着字母、数字、破折号、点和下划线。最大长度为 63 个字符。", "moving": "移动", "movingMsg": "“{0}” 文件需要位于 “{1}” 项目文件夹中。\n创建此文件夹,移动文件,然后继续?", - "new": "新建", + "new": "新建项目", + "noTrailingPeriod": "文件名不能以点结尾", "openFolder": "打开文件夹", "openRecent": "打开最近", "openSketchInNewWindow": "在新窗口打开项目", - "saveFolderAs": "将项目文件夹另存为。。。", + "reservedFilename": "'{0}' 是一个保留的文件名。", + "saveFolderAs": "将项目文件夹另存为…", "saveSketch": "保存你的项目,以便以后再次打开它。", - "saveSketchAs": "将项目文件夹另存为。。。", + "saveSketchAs": "将项目文件夹另存为…", "showFolder": "显示项目文件夹", "sketch": "项目", + "sketchAlreadyContainsThisFileError": "该项目已包含一个名为 '{0}' 的文件。", + "sketchAlreadyContainsThisFileMessage": "保存项目 “{0}” 为 “{1}” 失败。{2}", "sketchbook": "项目文件夹", "titleLocalSketchbook": "本地项目文件夹", "titleSketchbook": "项目文件夹", "upload": "上传", "uploadUsingProgrammer": "使用编程器上传", - "uploading": "正在上传。。。", + "uploading": "正在上传…", "userFieldsNotFoundError": "找不到已连接开发板的用户字段", "verify": "验证", "verifyOrCompile": "验证/编译" }, - "survey": { - "answerSurvey": "回答问卷", - "dismissSurvey": "不要再显示", - "surveyMessage": "请回答这份很短的调查来帮助我们改进。我们重视我们的社区,也希望能够更好地了解我们的支持者。" + "sketchbook": { + "newCloudSketch": "新的云端项目", + "newSketch": "新建项目" + }, + "theme": { + "currentThemeNotFound": "找不到当前选中的主题:{0}。Arduino IDE 已选择一个与缺失者兼容的内置主题。", + "dark": "暗黑", + "deprecated": "{0} (已弃用)", + "hc": "深色高对比度", + "hcLight": "浅色高对比度", + "light": "明亮", + "user": "{0}(用户)" + }, + "title": { + "cloud": "云" + }, + "updateIndexes": { + "updateIndexes": "更新索引", + "updateLibraryIndex": "更新库索引", + "updatePackageIndex": "更新包索引" }, "upload": { "error": "{0} 错误:{1}" @@ -388,11 +513,27 @@ "cancel": "取消", "enterField": "输入 {0}", "upload": "上传" + }, + "validateSketch": { + "abortFixMessage": "项目仍然是无效的。你想解决剩下的问题吗?通过点击 '{0}',一个新的项目将被打开。", + "abortFixTitle": "无效的项目", + "renameSketchFileMessage": "项目文件 '{0}' 不能使用。{1} 你想现在重新命名项目文件吗?", + "renameSketchFileTitle": "无效的项目文件名", + "renameSketchFolderMessage": "不能使用项目 '{0}'。 '{1}' 要删除此消息,请重命名项目。 现在要重命名项目吗?", + "renameSketchFolderTitle": "无效的项目名" + }, + "versionWelcome": { + "cancelButton": "Maybe later", + "donateButton": "Donate now", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Welcome to a new version of the Arduino IDE!", + "titleWithVersion": "Welcome to the new Arduino IDE {0}!" + }, + "workspace": { + "alreadyExists": "'{0}' 已经存在。" } }, - "cloud": { - "GoToCloud": "前往 CLOUD" - }, "theia": { "core": { "cannotConnectBackend": "无法连接后台。", @@ -400,13 +541,9 @@ "couldNotSave": "无法保存项目。请将未保存的工作复制到您喜爱的文本编辑器中,然后重新启动 IDE。", "daemonOffline": "CLI 守护进程离线", "offline": "离线", + "offlineText": "离线", "quitTitle": "你确定你要退出吗?" }, - "debug": { - "start": "开始...", - "startError": "启动调试会话时出错,请检查日志以了解更多详细信息。", - "typeNotSupported": "不支持调试会话的类型 “{0}”。" - }, "editor": { "unsavedTitle": "未保存–{0}" }, @@ -415,10 +552,10 @@ "expand": "扩展" }, "workspace": { - "deleteCurrentSketch": "是否要删除当前项目?", + "deleteCloudSketch": "云端项目 '{0}' 将从 Arduino 服务器和本地缓存中被永久删除。这个操作是不可逆的。你想删除当前的项目吗?", + "deleteCurrentSketch": "项目 '{0}' 将被永久删除。这个操作是不可逆的。你想删除当前的项目吗?", "fileNewName": "新文件的名称", "invalidExtension": ".{0} 不是有效扩展名", - "invalidFilename": "无效的文件名。", "newFileName": "文件的新名称" } } diff --git a/i18n/zh_TW.json b/i18n/zh_TW.json index cbb5194be..b0aa30c67 100644 --- a/i18n/zh_TW.json +++ b/i18n/zh_TW.json @@ -1,194 +1,250 @@ { "arduino": { "about": { - "detail": "版本:1{0},日期:2{1},命令列版本:{3}{4}[{5}] {6}", - "label": "關於 1[0]" + "detail": "版本: {0}\n日期: {1}{2}\nCLI 版本: {3}\n\n{4}", + "label": "關於 {0}" + }, + "account": { + "goToCloudEditor": "前往雲端編輯器", + "goToIoTCloud": "前往物聯網雲端", + "goToProfile": "前往個人資訊", + "menuTitle": "Arduino雲" }, "board": { - "board": "1{0} 開發板", - "boardConfigDialogTitle": "Select Other Board and Port", + "board": "{0} 開發板", + "boardConfigDialogTitle": "選擇其他開發板及連接埠", + "boardDataReloaded": "開發板資料已重新載入。", "boardInfo": "開發板資訊", - "configDialog1": "若要上傳 Sketch 請選擇一片板子及一個埠", - "configDialog2": "如果你只有選擇板子你可以編譯,但不能上傳 Sketch", - "couldNotFindPreviouslySelected": "在安装的平台{1}中找不到以前選擇的開發板{0}。請手動選擇要使用的開發板。你想現在重新選擇它吗?", - "disconnected": "斷開連接", + "boards": "開發板", + "configDialog1": "若要上傳 Sketch 請選擇開發板及連接埠", + "configDialog2": "單選擇開發板只能編譯,不能上傳", + "couldNotFindPreviouslySelected": "已安装平台{1}中找不到您選的開發板{0}。請手動選擇。你想選擇嗎?", + "editBoardsConfig": "編輯開發板和連接埠", "getBoardInfo": "取得開發板資訊", - "inSketchbook": "(在草稿資料夾中)", - "installNow": "必須為目前選定的 {2} 開發板安裝 1{0} 2{1} 核心程式,你要現在安裝嗎?", - "noFQBN": "FQBN無法用於所選擇的\"{0}\"開發版。你是否安裝了對應的核心?", - "noPortsDiscovered": "No ports discovered", - "noPortsSelected": "沒有選到 '{0}' 板的埠", - "noneSelected": "沒有選擇電路板", - "openBoardsConfig": "選擇其他的電路板或埠...", - "platformMissing": "選擇的'{0}'開發版平台並未安裝", - "pleasePickBoard": "請選擇要連接的開發版", - "port": "1{0} 埠", - "portLabel": "端口: {0}", + "inSketchbook": "(在 sketchbook 內)", + "installNow": "選取的 {2} 開發板必須安裝 {0} {1} 核心程式,要現在安裝嗎?", + "noBoardsFound": "開發板 {0} 未找到", + "noNativeSerialPort": "無法獲得序列埠的資訊。", + "noPortsDiscovered": "未找到連接埠", + "nonSerialPort": "非序列埠,無法取得資訊。", + "openBoardsConfig": "選擇其他開發板及連接埠", + "pleasePickBoard": "請選擇已連接上的開發板", + "port": "連接埠: {0}", + "ports": "連接埠", "programmer": "燒錄器", - "reselectLater": "請晚一點再選擇", - "searchBoard": "Search board", - "selectBoard": "選擇開發版", - "selectBoardForInfo": "請選擇電路板以取得板子的資訊", - "selectPortForInfo": "請選定一個埠,以便能取得板子的資訊", + "reloadBoardData": "重新載入開發板資料", + "reselectLater": "請稍後再選擇", + "revertBoardsConfig": "使用在 '{1}' 發現的 '{0}'", + "searchBoard": "搜尋開發板", + "selectBoard": "選擇開發板", + "selectBoardToReload": "請先選取開發板。", + "selectPortForInfo": "請選定連接埠以便取得開發板的資訊", "showAllAvailablePorts": "當開啟時,顯示所有可用的埠", - "succesfullyInstalledPlatform": "平台已成功安裝 1[0]:2[1]", - "succesfullyUninstalledPlatform": "平台已成功移除 1[0]:2[1]" - }, - "boardsManager": "開發板管理器", + "showAllPorts": "顯示所有連接埠", + "succesfullyInstalledPlatform": "成功安裝平台 {0}:{1}", + "succesfullyUninstalledPlatform": "成功卸載平台 {0}:{1}", + "typeOfPorts": "{0}連接埠", + "unconfirmedBoard": "未確認的開發板", + "unknownBoard": "未知的開發板" + }, + "boardsManager": "開發板管理員", "boardsType": { - "arduinoCertified": "Arduino Certified" + "arduinoCertified": "Arduino 認證" }, "bootloader": { "burnBootloader": "燒錄 Bootloader", - "burningBootloader": "正在燒錄引導程式...", + "burningBootloader": "正在燒錄 bootloader ...", "doneBurningBootloader": "Bootloader 燒錄完成" }, "burnBootloader": { - "error": "燒錄 1{0} Bootloader 時出現錯誤" + "error": "燒錄 Bootloader 時出現錯誤:{0}" }, "certificate": { - "addNew": "加入新的", - "addURL": "加入 URL 以提取 SSL 證書", + "addNew": "新增", + "addURL": "加入 URL 以提取 SSL 憑証", "boardAtPort": "{0}在{1}", - "certificatesUploaded": "證書已上傳", + "certificatesUploaded": "憑証已上傳", "enterURL": "輸入網址", - "noSupportedBoardConnected": "不支援目前連接的板子", - "openContext": "開啟context脈絡", + "noSupportedBoardConnected": "已接上未被支援的開發板", + "openContext": "開啟內文", "remove": "移除", "selectBoard": "選擇開發板", - "selectCertificateToUpload": "1. 選擇要上傳的證書", - "selectDestinationBoardToUpload": "2. 選擇目標的開發板並上傳證書", + "selectCertificateToUpload": "1. 選擇憑証上傳", + "selectDestinationBoardToUpload": "2. 選擇開發板並上傳憑証", "upload": "上傳", "uploadFailed": "上傳失敗,請再試一次", - "uploadRootCertificates": "上傳SSL根證書", - "uploadingCertificates": "上傳證書" + "uploadRootCertificates": "上傳SSL根憑証", + "uploadingCertificates": "上傳憑証中..." }, "checkForUpdates": { - "checkForUpdates": "Check for Arduino Updates", - "installAll": "Install All", - "noUpdates": "There are no recent updates available.", - "promptUpdateBoards": "Updates are available for some of your boards.", - "promptUpdateLibraries": "Updates are available for some of your libraries.", - "updatingBoards": "Updating boards...", - "updatingLibraries": "Updating libraries..." + "checkForUpdates": "檢查 Arduino 更新", + "installAll": "全部安裝", + "noUpdates": "沒有版本更新。", + "promptUpdateBoards": "部分開發板有更新檔。", + "promptUpdateLibraries": "部分函式庫有更新檔。", + "updatingBoards": "更新開發板中...", + "updatingLibraries": "更新函式庫中..." }, "cli-error-parser": { - "keyboardError": "'Keyboard' not found. Does your sketch include the line '#include <Keyboard.h>'?", - "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" + "keyboardError": "找不到 'Keyboard',請檢查是否缺少 '#include <Keyboard.h>'。", + "mouseError": "找不到 'Mouse',請檢查是否缺少 '#include <Mouse.h>'。" }, "cloud": { - "account": "帳戶", - "chooseSketchVisibility": "選擇草稿的能見度:", + "chooseSketchVisibility": "選擇 sketch 的透明度:", + "cloudSketchbook": "雲 sketchbook", "connected": "已連接", "continue": "繼續", - "donePulling": "完成讀取'{0}'。", - "donePushing": "完成更改'{0}'。", + "donePulling": "已完成讀取 '{0}' 。", + "donePushing": "已完成推送 '{0}' 。", "embed": "嵌入:", - "emptySketchbook": "您的草稿資料夾是空的", + "emptySketchbook": "您的 sketchbook 是空的", + "goToCloud": "前往雲端", "learnMore": "了解更多", - "link": "連結:", - "notYetPulled": "無法更改至雲端。尚未被讀取。", + "link": "鏈結:", + "notYetPulled": "無法推送到雲端。尚未被讀取。", "offline": "離線", - "openInCloudEditor": "在雲端編輯器中打開", + "openInCloudEditor": "在雲編輯器中打開", "options": "選項...", - "privateVisibility": "私人的。只有你可以查看草稿。", - "profilePicture": "頭像圖片", - "publicVisibility": "公開的。擁有連結的人都可以查看草稿。", + "privateVisibility": "私人的。只有你可以查看 sketch。", + "profilePicture": "頭像", + "publicVisibility": "公開的。有連結的人都可以查看 sketch。", "pull": "讀取", - "pullFirst": "您必些先讀取才能更改至Cloud。", - "pullSketch": "讀取草稿", - "pullSketchMsg": "從雲端中讀取這個草稿將會覆蓋本地的版本。你確定要繼續嗎?", - "push": "更改", - "pushSketch": "更改草稿", - "pushSketchMsg": "這是一個公開草稿,在更改前,請確認所有敏感資訊都定義在arduino_secrets.h中。可以在分享介面設定為私人草稿。", + "pullFirst": "須先讀取才能推送到雲。", + "pullSketch": "讀取 sketch", + "pullSketchMsg": "從雲端中讀取這 sketch 將會覆寫本地端的版本。確定要繼續嗎?", + "push": "推送", + "pushSketch": "推送 sketch", + "pushSketchMsg": "這是公開的 sketch,在推送前,請確認所有敏感資訊已在arduino_secrets.h 內。在分享介面裏可將 sketch 改為私人。", "remote": "遠端", - "remoteSketchbook": "Remote Sketchbook", "share": "分享...", - "shareSketch": "分享草稿", - "showHideRemoveSketchbook": "顯示/隱藏遠端草稿資料夾", + "shareSketch": "分享 sketch", + "showHideSketchbook": "顯示/隱藏雲 sketchbook", "signIn": "登入", - "signInToCloud": "登入Arduino Cloud", + "signInToCloud": "登入Arduino 雲", "signOut": "登出", "sync": "同步", - "syncEditSketches": "同步和編輯您的Arduino Clou草稿", - "visitArduinoCloud": "前往Arduino Cloud建立雲端草稿。" + "syncEditSketches": "同步和編輯 Arduino 雲內的 sketch", + "visitArduinoCloud": "前往Arduino 雲以新增雲 sketch。" + }, + "cloudSketch": { + "alreadyExists": "雲 sketch '{0}' 已存在。", + "creating": "建立雲 sketch '{0}'...", + "new": "新增雲 sketch", + "notFound": "雲 sketch '{0}' 不存在, 無法拉取。", + "pulling": "同步 sketchbook, 拉取 '{0}' ...", + "pushing": "同步 sketchbook, 推送 '{0}' ...", + "renaming": "重新命名雲 sketch '{0}' 成 '{1}' ...", + "synchronizingSketchbook": "同步 sketchbook ..." }, "common": { - "all": "All", - "contributed": "Contributed", + "all": "全部", + "contributed": "已貢獻", "installManually": "手動安裝", - "later": "稍後再說", - "noBoardSelected": "沒有選擇開發版", + "later": "稍後", + "noBoardSelected": "沒有選擇開發板", + "noSketchOpened": "未開啟 sketch", "notConnected": "[未連接]", "offlineIndicator": "您目前處於離線狀態,在沒有網路的情況下,Arduino命令列介面將無法下載需要的資源,並可能導致錯誤。請連接至網路並重新啟動程式。", - "oldFormat": "'{0}'仍然使用舊的 `.pde` 格式,是否要轉換至新的 `.ino` 擴充?", - "partner": "Partner", + "oldFormat": "'{0}'仍然使用舊的 `.pde` 格式,要切換成新版 `.ino` 嗎?", + "partner": "合作夥伴", "processing": "資料處理中", - "recommended": "Recommended", - "retired": "Retired", - "selectedOn": "在 1{0}", - "serialMonitor": "序列埠監控", - "type": "Type", + "recommended": "推薦", + "retired": "不再支援", + "selectManually": "手動選取", + "selectedOn": "在 {0}", + "serialMonitor": "序列埠監控窗", + "type": "類型", "unknown": "未知", - "updateable": "Updatable" + "updateable": "可更新", + "userAbort": "用戶中止" }, "compile": { - "error": "1{0} 編譯錯誤" + "error": "編譯錯誤:{0} " }, "component": { - "boardsIncluded": "Boards included in this package:", + "boardsIncluded": "本套件內建的開發板:", "by": "by", - "filterSearch": "過濾你的搜尋 ...", + "clickToOpen": "點擊以瀏覽器開啟:{0}", + "filterSearch": "篩選搜尋結果...", "install": "安裝", + "installLatest": "安装最新版本", + "installVersion": "安裝 {0}", + "installed": "{0}已安裝", "moreInfo": "更多資訊", - "uninstall": "移除安裝", - "uninstallMsg": "你要移除 1{0}?", - "version": "版本 1{0}" + "otherVersions": "其它版本", + "remove": "移除", + "title": "{0} / {1}", + "uninstall": "卸載", + "uninstallMsg": "你要卸載 {0}?", + "update": "更新" + }, + "configuration": { + "cli": { + "inaccessibleDirectory": "無法存取 sketchbook 內的 '{0}' :{1}" + } + }, + "connectionStatus": { + "connectionLost": "失去連線,無法使用雲 sketch 或更新。" }, "contributions": { "addFile": "加入檔案", - "fileAdded": "一個檔案加入到 Sketch", - "replaceTitle": "替代" + "fileAdded": "一個檔案加入 Sketch", + "plotter": { + "couldNotOpen": "無法開啟序列埠繪圖" + }, + "replaceTitle": "取代" + }, + "core": { + "compilerWarnings": { + "all": "全部", + "default": "預設", + "more": "更多", + "none": "無" + } }, "coreContribution": { - "copyError": "Copy error messages", - "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." + "copyError": "複製錯誤訊息", + "noBoardSelected": "未選取開發板。請從 工具 > 開發板 中選取開發板" }, + "createCloudCopy": "推送 sketch 至雲端。", "daemon": { - "restart": "Restart Daemon", - "start": "Start Daemon", - "stop": "Stop Daemon" + "restart": "重啟背景程式", + "start": "重啟背景程式", + "stop": "停止背景程式" }, "debug": { "debugWithMessage": "除錯 - {0}", "debuggingNotSupported": "'{0}'不支援除錯。", - "noPlatformInstalledFor": "未安裝'{0}'的平台", - "optimizeForDebugging": "除錯最佳化" + "getDebugInfo": "取得除錯資訊...", + "noPlatformInstalledFor": "平台未安裝給'{0}'", + "optimizeForDebugging": "除錯最佳化", + "sketchIsNotCompiled": "Sketch '{0}' 在除錯前必須已驗證過。請先驗證 sketch 後再除錯。要現在驗證 sketch 嗎?" + }, + "developer": { + "clearBoardList": "清除開發板歷史清單", + "clearBoardsConfig": "清除已選取的開發板及連接埠", + "dumpBoardList": "列出開發板清單" }, "dialog": { - "dontAskAgain": "請勿再次請求" + "dontAskAgain": "不要再詢問" }, "editor": { - "autoFormat": "自動格式化", - "commentUncomment": "備註/取消備註", + "autoFormat": "自動格式", + "commentUncomment": "備註/撤除備註", "copyForForum": "複製到論壇(Markdowm)", "decreaseFontSize": "縮小字體", "decreaseIndent": "減少縮排", "increaseFontSize": "加大字體", "increaseIndent": "增加縮排", - "nextError": "Next Error", - "previousError": "Previous Error", - "revealError": "Reveal Error" - }, - "electron": { - "couldNotSave": "無法儲存草稿,請複製你未存檔的工作到你偏好的文字編輯器中並重新啟動 IDE 整合開發環境", - "unsavedChanges": "任何沒有儲存的修改將不會被儲存" + "nextError": "下一個錯誤", + "previousError": "上一個錯誤", + "revealError": "顯示錯誤" }, "examples": { "builtInExamples": "內建範例", "couldNotInitializeExamples": "無法初始內建的範例", "customLibrary": "客製函式庫的範例", - "for": "1 {0} 的範例", + "for": "{0} 的範例", "forAny": "適用各種開發板的範例", "menu": "範例" }, @@ -197,229 +253,310 @@ "failedInstall": "安裝失敗,請再試一次", "install": "安裝", "installingFirmware": "安裝韌體", - "overwriteSketch": "安裝將覆寫到板子上的 Sketch", - "selectBoard": "選擇開發版", + "overwriteSketch": "安裝將覆寫開發板上的 Sketch", + "selectBoard": "選擇開發板", "selectVersion": "選擇韌體版本", - "successfullyInstalled": "成功安裝韌體", - "updater": "WiFi101 / WiFiNINA 韌體更新器" + "successfullyInstalled": "韌體安裝成功", + "updater": "韌體更新" }, "help": { "environment": "環境", - "faq": "常見問答集", - "findInReference": "在參考中搜尋", - "gettingStarted": "開始", + "faq": "常見問題", + "findInReference": "搜尋參考文件", + "gettingStarted": "入門教學", "keyword": "輸入關鍵字", "privacyPolicy": "隱私政策", - "reference": "參考", - "search": "在 Arduino.cc 上搜尋", + "reference": "參考文件", + "search": "在 Arduino.cc 搜尋", "troubleshooting": "故障排除", "visit": "造訪 Arduino.cc" }, "ide-updater": { - "checkForUpdates": "Check for Arduino IDE Updates", + "checkForUpdates": "檢查 Arduino IDE 更新", "closeAndInstallButton": "關閉並安裝。", - "closeToInstallNotice": "關閉軟體並安裝更新。", + "closeToInstallNotice": "關閉本程式後安裝更新。", + "donateLinkIconTitle": "開啟捐款頁面", + "donateLinkText": "捐款來支持我們", + "donateText": "公開程式碼就是愛, {0}", "downloadButton": "下載", "downloadingNotice": "正在下載最新版本的Arduino IDE。", - "errorCheckingForUpdates": "檢查Arduino IDE更新時發生錯誤。{0}", + "errorCheckingForUpdates": "檢查Arduino IDE更新時發生錯誤。\n{0}", "goToDownloadButton": "前往下載", - "goToDownloadPage": "Arduino IDE可以更新,但我們無法自動下載與安裝。請至下載頁面下載最新的版本。", + "goToDownloadPage": "Arduino IDE 有更新版本, 但我們無法自動下載安裝, 請至下載頁面下載最新的版本。", "ideUpdaterDialog": "軟體更新", "newVersionAvailable": "有新版本的Arduino IDE({0})可供下載。", - "noUpdatesAvailable": "Arduino IDE目前沒有更新的版本。", + "noUpdatesAvailable": "Arduino IDE 沒更新檔。", "notNowButton": "現在不要", - "skipVersionButton": "跳過這個版本", - "updateAvailable": "有可用的更新。", + "skipVersionButton": "略過這個版本", + "updateAvailable": "有更新檔。", "versionDownloaded": "Arduino IDE{0}下載完成。" }, + "installable": { + "libraryInstallFailed": "函式庫 ' {0} {1}' : 安裝失敗。", + "platformInstallFailed": "平台安裝失敗: '{0} {1}' " + }, "library": { "addZip": "加入 .zip 函式庫 ...", - "arduinoLibraries": "Arduino函式庫", - "contributedLibraries": "貢獻函式庫", - "dependenciesForLibrary": "與 1{0}:2{1} 函式庫相依", - "include": "含括函式庫", + "arduinoLibraries": "Arduino 函式庫", + "contributedLibraries": "貢獻的函式庫", + "include": "函式庫", "installAll": "全部安裝", - "installMissingDependencies": "是否安裝所有缺少的附屬程式?", - "installOneMissingDependency": "是否安裝缺少的附屬程式?", - "installOnly": "只安裝 1[0]", - "installedSuccessfully": "成功安裝 1{0}:2{1} 函式庫", - "libraryAlreadyExists": "函式庫已經存在,你要覆寫它嗎?", + "installLibraryDependencies": "安裝相依的函式庫", + "installMissingDependencies": "要安裝缺少的相依程式嗎?", + "installOneMissingDependency": "要安裝缺少的相依函式庫嗎 ?", + "installWithoutDependencies": "不管相依性直接安裝", + "installedSuccessfully": "成功安裝函式庫 {0}:{1} ", + "libraryAlreadyExists": "函式庫已存在,要覆寫它嗎?", "manageLibraries": "管理函式庫", - "namedLibraryAlreadyExists": "函式庫的資料夾名稱 1{0} 已經存在,你要覆寫它嗎?", - "needsMultipleDependencies": "函式庫<b>{0}:{1}</b>需要一些未安装的附屬程式:", - "needsOneDependency": "函式庫<b>{0}:{1}</b>需要一些未安装的附屬程式:", - "overwriteExistingLibrary": "你要覆寫既有的函式庫嗎?", - "successfullyInstalledZipLibrary": "從 1{0} 歸檔成功安裝函式庫", - "title": "函式庫管理器", - "uninstalledSuccessfully": "成功移除安裝的 1{0}:2{1} 函式庫", + "namedLibraryAlreadyExists": "{0} 函式庫資料夾已存在,要覆寫它嗎?", + "needsMultipleDependencies": "函式庫<b>{0}:{1}</b>需要下列未安裝的相依程式:", + "needsOneDependency": "函式庫<b>{0}:{1}</b>需要其他未安装的相依程式:", + "overwriteExistingLibrary": "要覆寫既有的函式庫嗎?", + "successfullyInstalledZipLibrary": "從 {0} 成功安裝函式庫", + "title": "函式庫管理員", + "uninstalledSuccessfully": "成功卸載函式庫 {0}:{1}", "zipLibrary": "函式庫" }, "librarySearchProperty": { - "topic": "Topic" + "topic": "主題" }, "libraryTopic": { - "communication": "Communication", - "dataProcessing": "Data Processing", - "dataStorage": "Data Storage", - "deviceControl": "Device Control", - "display": "Display", - "other": "Other", - "sensors": "Sensors", - "signalInputOutput": "Signal Input/Output", - "timing": "Timing", - "uncategorized": "Uncategorized" + "communication": "交流", + "dataProcessing": "資料處理", + "dataStorage": "資料儲存", + "deviceControl": "設備管理", + "display": "顯示", + "other": "其它", + "sensors": "感測器", + "signalInputOutput": "訊號輸入/ 輸出", + "timing": "定時", + "uncategorized": "未分類" }, "libraryType": { - "installed": "Installed" + "installed": "安裝" }, "menu": { - "advanced": "Advanced", - "sketch": "草稿", + "advanced": "進階設定", + "sketch": "Sketch", "tools": "工具" }, "monitor": { - "unableToCloseWebSocket": "Unable to close websocket", - "unableToConnectToWebSocket": "Unable to connect to websocket" + "alreadyConnectedError": "已連線,但無法連到{0} {1}埠。", + "baudRate": "{0}鮑率", + "connectionFailedError": "無法連接 {0} {1} 埠。", + "connectionFailedErrorWithDetails": "{0} 無法連接 {1} {2} 埠。", + "connectionTimeout": "逾時,IDE在連上監看視窗後未收到成功訊息。", + "missingConfigurationError": "無法連上 {0} {1} 埠,監看視窗設定遺失。", + "notConnectedError": "無法連上 {0} {1} 埠。", + "unableToCloseWebSocket": "無法關閉 websocket", + "unableToConnectToWebSocket": "無法連上 websocket" + }, + "newCloudSketch": { + "newSketchTitle": "新的雲端 Sketch 名稱" + }, + "portProtocol": { + "network": "網路", + "serial": "序列" }, "preferences": { - "additionalManagerURLs": "其他開發版管理器網址", + "additionalManagerURLs": "其他開發板管理器網址", "auth.audience": "OAuth2閱聽者", "auth.clientID": "OAuth2客戶端ID", - "auth.domain": "OAuth2域", - "auth.registerUri": "用於註冊新使用者的地址", + "auth.domain": "OAuth2 網域", + "auth.registerUri": "註冊新使用者的 URI", "automatic": "自動調整", - "board.certificates": "可上傳至開發版的證書列表", + "board.certificates": "可上傳到開發板的憑証列表", "browse": "瀏覽", - "checkForUpdate": "Receive notifications of available updates for the IDE, boards, and libraries. Requires an IDE restart after change. It's true by default.", + "checkForUpdate": "接收 IDE、開發板和函式庫的更新通知。 更改後需要重啟 IDE。 預設:開啟。", "choose": "選擇", - "cli.daemonDebug": "Enable debug logging of the gRPC calls to the Arduino CLI. A restart of the IDE is needed for this setting to take effect. It's false by default.", - "cloud.enabled": "True則啟用草稿同步功能。預設為true。", - "cloud.pull.warn": "True則在取出雲端草稿時警告使用者。預設為true。", - "cloud.push.warn": "True則在更改雲端草稿時警告使用者。預設為True。", - "cloud.pushpublic.warn": "True則在更改一個公開草稿到雲端時警告使用者。預設為true", - "cloud.sketchSyncEndpoint": "用來從後台更改與取出草稿的端點。預設的端點是指向Arduino Cloud API。", + "cli.daemonDebug": "啟用 Arduino CLI 內 gRPC 呼叫記錄。 需要重啟 IDE 才能生效。 預設:關閉。", + "cloud.enabled": "Sketch 同步, 預設:開啟。", + "cloud.pull.warn": "讀取雲端 sketch 前會警告使用者。預設: 開啟。", + "cloud.push.warn": "推送雲端 sketch 前會警告使用者。預設: 開啟。", + "cloud.pushpublic.warn": "推送公開的 sketch 到雲端前會警告使用者。預設: 開啟。", + "cloud.sharedSpaceId": "用來載入 sketchbook 的 Arduino 雲共享空間帳號。如留白,只會使用您的私人空間。", + "cloud.sketchSyncEndpoint": "用來從後台讀取或推送 sketch 的端點。預設: Arduino 雲 API。", "compile": "編譯", - "compile.experimental": "True if the IDE should handle multiple compiler errors. False by default", - "compile.revealRange": "Adjusts how compiler errors are revealed in the editor after a failed verify/upload. Possible values: 'auto': Scroll vertically as necessary and reveal a line. 'center': Scroll vertically as necessary and reveal a line centered vertically. 'top': Scroll vertically as necessary and reveal a line close to the top of the viewport, optimized for viewing a code definition. 'centerIfOutsideViewport': Scroll vertically as necessary and reveal a line centered vertically only if it lies outside the viewport. The default value is '{0}'.", - "compile.verbose": "True則輸出詳細編譯資訊。預設為False", + "compile.experimental": "IDE 處理多個編譯器錯誤。 預設: 關閉", + "compile.revealRange": "調整驗證/上傳失敗後編譯器錯誤訊息如何顯示。 可能的值:'auto':依需要垂直滾動並顯示一行。 'center':依需要垂直滾動並顯示垂直居中的一行。 'top':依需要垂直滾動並上方顯示一行,方便查看程式碼。 'centerIfOutsideViewport':依需要垂直滾動,僅當它在可視區外時才顯示垂直居中的一行。 預設為 '{0}'", + "compile.verbose": "輸出詳細編譯資訊。預設: 關閉", "compile.warnings": "設定gcc警告等級。預設為'None'", "compilerWarnings": "編譯器警告", "editorFontSize": "編輯器字體大小", "editorQuickSuggestions": "編輯器快速建議", "enterAdditionalURLs": "輸入其他網址,每行一個", - "files.inside.sketches": "顯示草稿中的檔案", - "ide.updateBaseUrl": "The base URL where to download updates from. Defaults to 'https://downloads.arduino.cc/arduino-ide'", + "files.inside.sketches": "顯示 sketch 裏面的檔案", + "ide.updateBaseUrl": "下載更新的網址, 預設為:'https://downloads.arduino.cc/arduino-ide'", "ide.updateChannel": "前往版本釋出頻道獲取更新。 'stable'表示為穩定的版本, 'nightly' 則是最新的開發版本。", "interfaceScale": "介面比例", "invalid.editorFontSize": "無效的編輯器字體大小。它必須是正整數。", - "invalid.sketchbook.location": "無效的草稿資料夾位置:{0}", + "invalid.sketchbook.location": "無效的 sketchbook 位置:{0}", "invalid.theme": "無效的主題。", - "language.log": "True則Arduino語言伺服器會自動在草稿資料夾產生日誌檔案。預設為false。", - "language.realTimeDiagnostics": "If true, the language server provides real-time diagnostics when typing in the editor. It's false by default.", - "manualProxy": "手動設置代理", + "language.asyncWorkers": "Arduino 語言伺服器 (clangd) 執行緒數目. 背景索引也使用相同的數目. 最小為 0, 最大s 8. 當設定為 0 時 , 將使用全部可用核心數. 預設為 0.", + "language.log": "Arduino語言伺服器會自動在 sketch 內產生日誌檔。預設為關閉。", + "language.realTimeDiagnostics": "語言服務器提供即時診斷。預設關閉。", + "manualProxy": "手動設定代理伺服器", + "monitor": { + "dockPanel": "程式 _{0}_ 區塊位置. 不是在 \"下方\" 或 \"右側\". 預設: \"{1}\"." + }, "network": "網路", - "newSketchbookLocation": "選取新的草稿資料夾位置", + "newSketchbookLocation": "選取新的 sketchbook 位置", + "noCliConfig": "無法載入CLI 命令列設定。", "noProxy": "無代理", + "proxySettings": { + "hostname": "主機名稱", + "password": "密碼", + "port": "埠號", + "username": "使用者名稱" + }, "showVerbose": "顯示詳細輸出", - "sketchbook.location": "草稿資料夾位置", - "sketchbook.showAllFiles": "True則顯示所有草稿中的草稿檔案。預設為false。", - "survey.notification": "True if users should be notified if a survey is available. True by default.", - "unofficialBoardSupport": "點擊以取得支援非官方開發版的網址列表", + "sketch": { + "inoBlueprint": "\".ino \"藍圖文件的絕對檔案系統路徑。如有指定,藍圖文件的內容將被用在每個新增的 sketch 上。如果沒特別指定,sketch 將以內預設的Arduino內容生成。無法訪問的藍圖文件將被忽略。 **需要重啟 IDE** 本設定才會生效。" + }, + "sketchbook.location": "sketchbook 位置", + "sketchbook.showAllFiles": "顯示 sketch 內全部檔案。預設: false。", + "unofficialBoardSupport": "點擊來取得非官方開發板的支援網址", "upload": "上傳", - "upload.verbose": "True則輸出詳細上傳資訊。預設為False", - "verifyAfterUpload": "上傳後驗證程式", - "window.autoScale": "True則使用者介面隨字體大小自動縮放。", - "window.zoomLevel": "調整視窗的縮放大小。預設大小為0,增加(例如1)或者減少(例如-1)代表縮放增加或減少20%。可以自行輸入小數調整更精細的大小。" - }, - "replaceMsg": "取代 1{0} 的現有版本?", - "selectZip": "選擇要加入函示庫的zip檔案", + "upload.autoVerify": "預設為是,IDE會在上載前自動驗証。如選否,IDE在上載前不會重編譯程式碼。強烈建議除非你知道自己在幹嘛才這麼做。", + "upload.verbose": "上傳時輸出的詳細資訊。預設: False", + "upload.verify": "上載後,驗証開發板上的記憶體內容和上傳的二進位碼是一致的。", + "verifyAfterUpload": "上傳後驗證程式碼", + "window.autoScale": "使用者介面隨字體大小自動縮放。", + "window.zoomLevel": { + "deprecationMessage": "已棄用。請改用 'window.zoomLevel' 。" + } + }, + "renameCloudSketch": { + "renameSketchTitle": "雲 sketch 的新名稱" + }, + "replaceMsg": "取代現有的 {0} 版本?", + "selectZip": "選擇內含函式庫的 zip 檔", "serial": { - "autoscroll": "自動滾頁面", - "carriageReturn": "回車", - "message": "訊息 (1{0}+Enter將訊息發送到'{2}'上的2{1})", + "autoscroll": "自動捲動", + "carriageReturn": "內有 CR", + "connecting": "連接到 '{1}' 上的 '{0}' ...", + "message": "訊息 (按 Enter 鍵將訊息發送到 {1} 上的 {0})", "newLine": "換行", - "newLineCarriageReturn": "兩者都是NL和CR", - "noLineEndings": "沒有斷行符號", - "notConnected": "未有連接,請選擇開發板、埠以自動連接", - "openSerialPlotter": "串口繪圖視窗", - "timestamp": "時戳/時間戳記", + "newLineCarriageReturn": "NL和CR字元", + "noLineEndings": "沒有斷行字元", + "notConnected": "未連上。請選擇開發板及連接埠後自動連接", + "openSerialPlotter": "序列埠繪圖", + "timestamp": "時間戳記", "toggleTimestamp": "切換時戳" }, "sketch": { - "archiveSketch": "儲存草稿", - "cantOpen": "命名為\"{0}\"的資料夾已存在。無法開啟草稿。", - "close": "你確定要關閉 Sketch?", - "compile": "Compiling sketch...", - "configureAndUpload": "組態配置並上傳", - "createdArchive": "已創建文件{0}。", + "archiveSketch": "sketch 歸檔", + "cantOpen": "已有 \"{0}\" 資料夾, 無法開啟 sketch", + "compile": "編譯 sketch...", + "configureAndUpload": "設定並上傳", + "createdArchive": "已歸檔{0}。", "doneCompiling": "編譯完成", "doneUploading": "上傳完畢", - "exportBinary": "會出已編譯的二進位檔", + "editInvalidSketchFolderLocationQuestion": "想要把 sketch 儲存在不同地方嗎?", + "editInvalidSketchFolderQuestion": "想要把 sketch 存為不同檔名嗎?", + "exportBinary": "匯出已編譯的二進位碼", + "invalidCloudSketchName": "命名必須以字母、數字或底線開頭,後面接字母、數字、破折號、點、底線。最長 36個字元。", + "invalidSketchFolderLocationDetails": "不能把 sketch 儲存到它自身內部的資料夾裡。", + "invalidSketchFolderLocationMessage": "無效的 sketch 資料夾位置: '{0}' ", + "invalidSketchFolderNameMessage": "無效的 sketch 資料夾名稱: '{0}' ", + "invalidSketchName": "命名必須以字母、數字或底線為開頭,後面跟著字母、數字、破折號、點、底線。最長 63 字元。", "moving": "移動", - "movingMsg": "\"{0}\"必須在命名為\"{1}\"的草稿資料夾中。建立這個資料夾,移動草稿並繼續?", - "new": "新增", + "movingMsg": "檔案{0}需放在sketch 資料夾的{1}內 ,\n要建立資料夾並移動檔案嗎?", + "new": "新增 sketch", + "noTrailingPeriod": "檔名不能以逗號字元結尾", "openFolder": "打開資料夾", "openRecent": "開啟最近的", - "openSketchInNewWindow": "在新視窗開啟草稿", - "saveFolderAs": "另存 Sketch 資料夾", - "saveSketch": "Save your sketch to open it again later.", - "saveSketchAs": "另存 Sketch 資料夾", + "openSketchInNewWindow": "在新視窗開啟 sketch", + "reservedFilename": "'{0}' 為保留檔名。", + "saveFolderAs": "另存 Sketch 資料夾為", + "saveSketch": "儲存 sketch 以便下次再打開它。", + "saveSketchAs": "另存 Sketch 資料夾為", "showFolder": "顯示 Sketch 資料夾", - "sketch": "草稿", - "sketchbook": "草稿資料夾", - "titleLocalSketchbook": "本地草稿資料夾", - "titleSketchbook": "草稿資料夾", + "sketch": "Sketch", + "sketchAlreadyContainsThisFileError": "sketch 已包含 '{0}' 檔", + "sketchAlreadyContainsThisFileMessage": "將 sketch \"{0}\" 存成 \"{1}\". {2} 失敗", + "sketchbook": "Sketchbook", + "titleLocalSketchbook": "本地端的 Sketchbook", + "titleSketchbook": "Sketchbook", "upload": "上傳", "uploadUsingProgrammer": "使用燒錄器上傳", "uploading": "上傳...", - "userFieldsNotFoundError": "找不到已連接開發版中的用戶字段", + "userFieldsNotFoundError": "找不到已連接開發板中的用戶欄", "verify": "驗證", "verifyOrCompile": "驗證/編譯" }, - "survey": { - "answerSurvey": "Answer survey", - "dismissSurvey": "Don't show again", - "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." + "sketchbook": { + "newCloudSketch": "新增雲 sketch", + "newSketch": "新增 sketch" + }, + "theme": { + "currentThemeNotFound": "找不到目前選擇的主題:{0} 。 Arduino IDE 挑選了一個內建的相容主題。", + "dark": "暗", + "deprecated": "{0} (已棄用)", + "hc": "深色高對比", + "hcLight": "亮色高對比", + "light": "亮", + "user": "{0} (使用者)" + }, + "title": { + "cloud": "雲端" + }, + "updateIndexes": { + "updateIndexes": "更新索引", + "updateLibraryIndex": "更新函式庫索引", + "updatePackageIndex": "更新套件索引" }, "upload": { - "error": "1 [0] 錯誤:2 [1]" + "error": "{0} 錯誤:{1}" }, "userFields": { "cancel": "取消", - "enterField": "Enter {0}", + "enterField": "輸入 {0}", "upload": "上傳" + }, + "validateSketch": { + "abortFixMessage": "Sketch 仍是無效的。你想修復這問題嗎?點擊 '{0}' ,會開啟新的 Sketch 。", + "abortFixTitle": "無效的 sketch", + "renameSketchFileMessage": "Sketch '{0}' 無法被使用。 {1} 想立即更改 sketch 的檔名嗎?", + "renameSketchFileTitle": "無效的 sketch 檔名", + "renameSketchFolderMessage": "Sketch '{0}' 無法被使用。 {1} 要擺脫這則訊息,請更改 sketch 檔名。要現在更改檔名嗎?", + "renameSketchFolderTitle": "無效的 sketch 檔名" + }, + "versionWelcome": { + "cancelButton": "讓我考慮一下", + "donateButton": "現在捐", + "donateMessage": "Arduino 致力讓軟體保持自由並對大家開放程式碼,您的捐款可以幫助我們開發新功能、改善程式庫及對全球數百萬用戶的支持。", + "donateMessage2": "期盼您考慮支持我們對自由軟體 Arduino IDE 所做的努力。", + "title": "歡迎使用新版 Arduino IDE !", + "titleWithVersion": "歡迎使用新版 Arduino IDE {0} !" + }, + "workspace": { + "alreadyExists": "'{0}'已存在。" } }, - "cloud": { - "GoToCloud": "前往雲端" - }, "theia": { "core": { - "cannotConnectBackend": "無法連接後端", - "cannotConnectDaemon": "無法連接命令列 (CLI) 常駐程式", - "couldNotSave": "無法儲存草稿,請複製你未存檔的工作到你偏好的文字編輯器中並重新啟動 IDE 整合開發環境", - "daemonOffline": "CLI 命令列常駐程式離線", + "cannotConnectBackend": "無法連上後端", + "cannotConnectDaemon": "無法連上命令列 CLI 背景程式", + "couldNotSave": "無法儲存 sketch,請複製未存檔的成果到你偏好的文字編輯器中, 再重啟 IDE", + "daemonOffline": "CLI 命令列背景程式離線", "offline": "離線", - "quitTitle": "你確定要退出嗎?" - }, - "debug": { - "start": "開始 ....", - "startError": "除錯階段出現錯誤,更多細節請檢查日誌內容", - "typeNotSupported": "不支援 \" 1{0} \" 除錯階段型態" + "offlineText": "離線", + "quitTitle": "確定要退出嗎?" }, "editor": { - "unsavedTitle": "1[0] –尚未儲存" + "unsavedTitle": "{0} – 尚未儲存" }, "messages": { - "collapse": "崩潰", - "expand": "延伸" + "collapse": "收折", + "expand": "展開" }, "workspace": { - "deleteCurrentSketch": "你要刪除現行的草稿嗎?", - "fileNewName": "給予檔案新名稱", + "deleteCloudSketch": "雲 sketch '{0}' 將從Arduino 伺服器和本機暫存中永久刪除。這個動作是不可逆的。確定要刪除 Sketch 嗎?", + "deleteCurrentSketch": "sketch '{0}' 將被永久刪除。這個動作是不可逆的。確定要刪除 sketch 嗎?", + "fileNewName": "新檔案名稱", "invalidExtension": ".{0} 不是合法的副檔名", - "invalidFilename": "不合法的檔案名稱", - "newFileName": "給予檔案新名稱" + "newFileName": "新檔案名稱" } } } diff --git a/lerna.json b/lerna.json index 8c300cb7a..13216973d 100644 --- a/lerna.json +++ b/lerna.json @@ -1,11 +1,10 @@ { "lerna": "2.4.0", "version": "independent", - "useWorkspaces": true, "npmClient": "yarn", "command": { "run": { "stream": true } } -} \ No newline at end of file +} diff --git a/package.json b/package.json index 0e0b28e37..8b5356b49 100644 --- a/package.json +++ b/package.json @@ -1,55 +1,65 @@ { "name": "arduino-ide", - "version": "2.0.0", + "version": "2.3.7", "description": "Arduino IDE", "repository": "https://github.com/arduino/arduino-ide.git", "author": "Arduino SA", "license": "AGPL-3.0-or-later", "private": true, "engines": { - "node": ">=14.0.0 <15" + "node": ">=18.17.0 <21" + }, + "resolutions": { + "@theia/cli/@babel/traverse": "^7.23.2", + "@theia/cli/@theia/application-package/nano": "^10.1.3", + "**/@theia/application-manager/node-abi": "^3.0.0", + "**/@theia/core/msgpackr": "^1.10.1", + "**/@types/react-dom": "18.3.1", + "**/@types/react": "18.3.1", + "**/inversify": "6.0.2", + "**/ip": "^2.0.1", + "**/perfect-scrollbar": "1.5.5", + "nx/axios": "^1.6.7" }, "devDependencies": { - "@theia/cli": "1.25.0", - "@types/sinon": "^2.3.5", - "@types/jsdom": "^11.0.4", - "@typescript-eslint/eslint-plugin": "^4.27.0", - "@typescript-eslint/parser": "^4.27.0", - "cross-env": "^7.0.2", - "eslint": "^7.28.0", - "eslint-config-prettier": "^8.3.0", - "eslint-plugin-prettier": "^3.4.0", - "eslint-plugin-react": "^7.24.0", - "eslint-plugin-react-hooks": "^4.2.0", - "eslint-plugin-unused-imports": "^1.1.1", + "@theia/cli": "1.57.0", + "@typescript-eslint/eslint-plugin": "^5.59.0", + "@typescript-eslint/parser": "^5.59.0", + "@xhmikosr/downloader": "^13.0.1", + "eslint": "^8.39.0", + "eslint-config-prettier": "^8.8.0", + "eslint-plugin-prettier": "^4.2.1", + "eslint-plugin-react": "^7.32.2", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-unused-imports": "^2.0.0", "husky": "^6.0.0", "ignore-styles": "^5.0.1", - "lerna": "^3.20.2", + "js-yaml": "4.1.0", + "lerna": "^7.1.4", "lint-staged": "^11.0.0", - "node-gyp": "^9.0.0", + "node-fetch": "^2.6.1", + "node-gyp": "^9.3.0", "prettier": "^2.3.1", "reflect-metadata": "^0.1.10", - "rimraf": "^2.6.1", + "rimraf": "^5.0.0", "semver": "^7.3.2", - "typescript": "~4.5.5", - "jsdom": "^11.5.1", "style-dictionary": "^3.7.0", + "typescript": "^5.4.5", "xhr2": "^0.2.1" }, - "resolutions": { - "@types/react": "16.14.25" - }, "scripts": { - "prepare": "lerna run prepare && yarn download:plugins", - "cleanup": "npx rimraf ./**/node_modules && rm -rf ./node_modules ./.browser_modules ./arduino-ide-extension/build ./arduino-ide-extension/downloads ./arduino-ide-extension/Examples ./arduino-ide-extension/lib ./browser-app/lib ./browser-app/src-gen ./browser-app/gen-webpack.config.js ./electron-app/lib ./electron-app/src-gen ./electron-app/gen-webpack.config.js", + "prepare": "lerna run prepare", + "cleanup": "rimraf ./**/node_modules && rm -rf ./node_modules ./.browser_modules ./arduino-ide-extension/build ./arduino-ide-extension/downloads ./arduino-ide-extension/Examples ./arduino-ide-extension/lib ./electron-app/lib ./electron-app/src-gen ./electron-app/gen-webpack.config.js", "rebuild:browser": "theia rebuild:browser", "rebuild:electron": "theia rebuild:electron", "start": "yarn --cwd ./electron-app start", "watch": "lerna run watch --parallel", + "build": "lerna run build", + "build:dev": "lerna run build:dev", "test": "lerna run test", - "download:plugins": "theia download:plugins", + "test:slow": "lerna run test:slow", "update:version": "node ./scripts/update-version.js", - "i18n:generate": "theia nls-extract -e vscode -f \"+(arduino-ide-extension|browser-app|electron-app|plugins)/**/*.ts?(x)\" -o ./i18n/en.json", + "i18n:generate": "theia nls-extract -e vscode -f \"+(arduino-ide-extension|electron-app|plugins)/**/*.ts?(x)\" -o ./i18n/en.json", "i18n:check": "yarn i18n:generate && git add -N ./i18n && git diff --exit-code ./i18n", "i18n:push": "node ./scripts/i18n/transifex-push.js ./i18n/en.json", "i18n:pull": "node ./scripts/i18n/transifex-pull.js ./i18n/", @@ -69,26 +79,6 @@ }, "workspaces": [ "arduino-ide-extension", - "electron-app", - "browser-app" - ], - "theiaPluginsDir": "plugins", - "theiaPlugins": { - "vscode-builtin-cpp": "https://open-vsx.org/api/vscode/cpp/1.52.1/file/vscode.cpp-1.52.1.vsix", - "vscode-arduino-tools": "https://downloads.arduino.cc/vscode-arduino-tools/vscode-arduino-tools-0.0.2-beta.5.vsix", - "vscode-builtin-json": "https://open-vsx.org/api/vscode/json/1.46.1/file/vscode.json-1.46.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", - "cortex-debug": "https://open-vsx.org/api/marus25/cortex-debug/0.3.10/file/marus25.cortex-debug-0.3.10.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-fr": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-fr/1.69.0/file/MS-CEINTL.vscode-language-pack-fr-1.69.0.vsix", - "vscode-language-pack-zh-hans": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-zh-hans/1.69.0/file/MS-CEINTL.vscode-language-pack-zh-hans-1.69.0.vsix", - "vscode-language-pack-de": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-de/1.69.0/file/MS-CEINTL.vscode-language-pack-de-1.69.0.vsix", - "vscode-language-pack-ja": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-ja/1.69.0/file/MS-CEINTL.vscode-language-pack-ja-1.69.0.vsix", - "vscode-language-pack-tr": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-tr/1.69.0/file/MS-CEINTL.vscode-language-pack-tr-1.69.0.vsix", - "vscode-language-pack-it": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-it/1.69.0/file/MS-CEINTL.vscode-language-pack-it-1.69.0.vsix", - "vscode-language-pack-ru": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-ru/1.69.0/file/MS-CEINTL.vscode-language-pack-ru-1.69.0.vsix", - "vscode-language-pack-es": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-es/1.69.0/file/MS-CEINTL.vscode-language-pack-es-1.69.0.vsix", - "vscode-language-pack-pt-BR": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-pt-BR/1.69.0/file/MS-CEINTL.vscode-language-pack-pt-BR-1.69.0.vsix", - "vscode-language-pack-cs": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-cs/1.69.0/file/MS-CEINTL.vscode-language-pack-cs-1.69.0.vsix" - } + "electron-app" + ] } diff --git a/scripts/i18n/transifex-pull.js b/scripts/i18n/transifex-pull.js index 4f1f3fcc3..31c61d66b 100644 --- a/scripts/i18n/transifex-pull.js +++ b/scripts/i18n/transifex-pull.js @@ -1,10 +1,10 @@ // @ts-check const transifex = require('./transifex'); +const path = require('path'); +const fs = require('node:fs/promises'); const util = require('util'); -const shell = require('shelljs'); -const fetch = require('node-fetch'); -const download = require('download'); +const { default: fetch } = require('node-fetch'); const getLanguages = async (organization, project) => { const url = transifex.url( @@ -12,8 +12,8 @@ const getLanguages = async (organization, project) => { ); const json = await fetch(url, { headers: transifex.authHeader() }) .catch(err => { - shell.echo(err); - shell.exit(1); + console.error(err) + process.exit(1); }) .then(res => res.json()); let languages = []; @@ -44,8 +44,8 @@ const requestTranslationDownload = async (relationships) => { body: JSON.stringify(data) }) .catch(err => { - shell.echo(err); - shell.exit(1); + console.error(err) + process.exit(1); }) .then(res => res.json()); @@ -54,19 +54,20 @@ const requestTranslationDownload = async (relationships) => { const getTranslationDownloadStatus = async (language, downloadRequestId) => { // The download request status must be asked from time to time, if it's - // still pending we try again using exponentional backoff starting from 2.5 seconds. + // still pending we try again using exponential backoff starting from 2.5 seconds. let backoffMs = 2500; while (true) { const url = transifex.url( util.format('resource_translations_async_downloads/%s', downloadRequestId) ); + /** @type {import('node-fetch').RequestInit} */ const options = { headers: transifex.authHeader(), redirect: 'manual' }; const res = await fetch(url, options).catch(err => { - shell.echo(err); - shell.exit(1); + console.error(err) + process.exit(1); }); if (res.status === 303) { @@ -99,12 +100,21 @@ const getTranslationDownloadStatus = async (language, downloadRequestId) => { const { organization, project, resource } = await transifex.credentials(); const translationsDirectory = process.argv[2]; if (!translationsDirectory) { - shell.echo('Translations directory not specified'); - shell.exit(1); + console.error('Translations directory not specified') + process.exit(1); } const languages = await getLanguages(organization, project); - shell.echo('translations found:', languages.join(', ')); + console.log('translations found:', languages.join(', ')); + + // Remove data managed on Transifex to avoid accumulation of vestigial files + const translationFilenames = await fs.readdir(translationsDirectory); + for (const filename of translationFilenames) { + if (filename === 'en.json' || !filename.endsWith('.json')) { + continue; + } + await fs.unlink(path.join(translationsDirectory, filename)); + } let downloadIds = []; for (const language of languages) { @@ -130,10 +140,11 @@ const getTranslationDownloadStatus = async (language, downloadRequestId) => { const res = await Promise.all( downloadIds.map(d => getTranslationDownloadStatus(d['language'], d['id'])) ).catch(err => { - shell.echo(err); - shell.exit(1); + console.error(err) + process.exit(1); }); + const { default: download } = await import('@xhmikosr/downloader'); await Promise.all( res.map(r => { return download(r['downloadUrl'], translationsDirectory, { @@ -141,9 +152,9 @@ const getTranslationDownloadStatus = async (language, downloadRequestId) => { }); }) ).catch(err => { - shell.echo(err); - shell.exit(1); + console.error(err) + process.exit(1); }); - shell.echo('Translation files downloaded.'); + console.log('Translation files downloaded.'); })(); diff --git a/scripts/i18n/transifex-push.js b/scripts/i18n/transifex-push.js index 3eb9248f9..fbf34fb5a 100644 --- a/scripts/i18n/transifex-push.js +++ b/scripts/i18n/transifex-push.js @@ -1,9 +1,8 @@ // @ts-check const transifex = require('./transifex'); -const fetch = require('node-fetch'); +const { default: fetch } = require('node-fetch'); const fs = require('fs'); -const shell = require('shelljs'); const util = require('util'); const uploadSourceFile = async (organization, project, resource, filePath) => { @@ -31,8 +30,8 @@ const uploadSourceFile = async (organization, project, resource, filePath) => { headers['Content-Type'] = 'application/vnd.api+json'; const json = await fetch(url, { method: 'POST', headers, body: JSON.stringify(data) }) .catch(err => { - shell.echo(err); - shell.exit(1); + console.error(err) + process.exit(1); }) .then(res => res.json()); @@ -48,8 +47,8 @@ const getSourceUploadStatus = async (uploadId) => { while (true) { const json = await fetch(url, { headers }) .catch(err => { - shell.echo(err); - shell.exit(1); + console.error(err) + process.exit(1); }) .then(res => res.json()); @@ -76,21 +75,21 @@ const getSourceUploadStatus = async (uploadId) => { const { organization, project, resource } = await transifex.credentials(); const sourceFile = process.argv[2]; if (!sourceFile) { - shell.echo('Translation source file not specified'); - shell.exit(1); + console.error('Translation source file not specified') + process.exit(1); } const uploadId = await uploadSourceFile(organization, project, resource, sourceFile) .catch(err => { - shell.echo(err); - shell.exit(1); + console.error(err) + process.exit(1); }); await getSourceUploadStatus(uploadId) .catch(err => { - shell.echo(err); - shell.exit(1); + console.error(err) + process.exit(1); }); - shell.echo("Translation source file uploaded"); + console.log("Translation source file uploaded"); })() \ No newline at end of file diff --git a/scripts/i18n/transifex.js b/scripts/i18n/transifex.js index b174feb26..963869cf0 100644 --- a/scripts/i18n/transifex.js +++ b/scripts/i18n/transifex.js @@ -1,15 +1,14 @@ // @ts-check -const shell = require('shelljs'); const util = require('util'); const TRANSIFEX_ENDPOINT = 'https://rest.api.transifex.com/'; const apiKey = () => { const apiKey = process.env.TRANSIFEX_API_KEY; - if (apiKey === '') { - shell.echo('missing TRANSIFEX_API_KEY environment variable'); - shell.exit(1) + if (!apiKey) { + console.error('missing TRANSIFEX_API_KEY environment variable'); + process.exit(1); } return apiKey } @@ -19,19 +18,19 @@ exports.credentials = async () => { const project = process.env.TRANSIFEX_PROJECT; const resource = process.env.TRANSIFEX_RESOURCE; - if (organization === '') { - shell.echo('missing TRANSIFEX_ORGANIZATION environment variable'); - shell.exit(1) + if (!organization) { + console.error('missing TRANSIFEX_ORGANIZATION environment variable'); + process.exit(1); } - if (project === '') { - shell.echo('missing TRANSIFEX_PROJECT environment variable'); - shell.exit(1) + if (!project) { + console.error('missing TRANSIFEX_PROJECT environment variable'); + process.exit(1); } - if (resource === '') { - shell.echo('missing TRANSIFEX_RESOURCE environment variable'); - shell.exit(1) + if (!resource) { + console.error('missing TRANSIFEX_RESOURCE environment variable'); + process.exit(1); } return { organization, project, resource } diff --git a/scripts/merge-channel-files.js b/scripts/merge-channel-files.js new file mode 100644 index 000000000..aa5cc2400 --- /dev/null +++ b/scripts/merge-channel-files.js @@ -0,0 +1,73 @@ +// @ts-check + +const yaml = require('js-yaml'); +const fs = require('fs'); +const path = require('path'); + +if (process.argv.includes('--help') || process.argv.includes('-h')) { + console.log( + `Usage: +merge-channel-files.js [FLAG]... + +Merge the "channel update info files" used by electron-updater. + +Flags: + --channel <name> The name of the update channel. + -h, --help Print help for the script + --input <path> The path of the folder that contains the files to merge. +` + ); + process.exit(0); +} + +const channelFlagIndex = process.argv.indexOf('--channel'); +if (channelFlagIndex < 0) { + console.error('Missing required --channel flag'); + process.exit(1); +} +const channel = process.argv[channelFlagIndex + 1]; +if (!channel) { + console.error('--channel value must be set'); + process.exit(1); +} + +const inputFlagIndex = process.argv.indexOf('--input'); +if (inputFlagIndex < 0) { + console.error('Missing required --input flag'); + process.exit(1); +} +const channelFilesFolder = process.argv[inputFlagIndex + 1]; +if (!channelFilesFolder) { + console.error('--input value must be set'); + process.exit(1); +} + +// Staging file filename suffixes are named according to `runner.arch`. +// https://docs.github.com/en/actions/learn-github-actions/contexts#runner-context +const x86ChannelFilePath = path.join( + channelFilesFolder, + channel + '-mac-X64.yml' +); +const arm64ChannelFilePath = path.join( + channelFilesFolder, + channel + '-mac-ARM64.yml' +); + +const x86Data = yaml.load( + fs.readFileSync(x86ChannelFilePath, { encoding: 'utf8' }) +); +const arm64Data = yaml.load( + fs.readFileSync(arm64ChannelFilePath, { encoding: 'utf8' }) +); + +const mergedData = x86Data; +mergedData['files'] = mergedData['files'].concat(arm64Data['files']); + +fs.writeFileSync( + path.join(channelFilesFolder, channel + '-mac.yml'), + yaml.dump(mergedData, { lineWidth: -1 }) +); + +// Clean up by removing staging files. +fs.rmSync(x86ChannelFilePath); +fs.rmSync(arm64ChannelFilePath); diff --git a/scripts/package.sh b/scripts/package.sh new file mode 100755 index 000000000..18197e2c2 --- /dev/null +++ b/scripts/package.sh @@ -0,0 +1,12 @@ +#!/bin/bash -i + +set -e + +yarn install --immutable \ +&& yarn --cwd arduino-ide-extension build \ +&& yarn test \ +&& yarn --cwd arduino-ide-extension test:slow \ +&& yarn --cwd arduino-ide-extension lint \ +&& yarn --cwd electron-app rebuild \ +&& yarn --cwd electron-app build \ +&& yarn --cwd electron-app package diff --git a/scripts/sort-dependencies b/scripts/sort-dependencies new file mode 100755 index 000000000..b2b556207 --- /dev/null +++ b/scripts/sort-dependencies @@ -0,0 +1,26 @@ +#!/usr/bin/env node + +// Sorts the dependencies and devDependencies in the package.json without yarn. +// Usage `./scripts/sort-dependencies ./path/to/package.json` + +const { promises: fs } = require('fs'); +const { join, isAbsolute } = require('path'); +const arg = process.argv.slice(2).pop(); +const path = isAbsolute(arg) ? arg : join(process.cwd(), arg); +fs.readFile(path, { encoding: 'utf8' }).then((raw) => { + const json = JSON.parse(raw); + ['dependencies', 'devDependencies'].forEach((prop) => { + const value = json[prop]; + if (value) { + json[prop] = Array.from(Object.entries(value)) + .sort(([left], [right]) => left.localeCompare(right)) + .reduce((acc, [key, value]) => { + acc[key] = value; + return acc; + }, {}); + } + }); + fs.writeFile(path, JSON.stringify(json, null, 2) + '\n', { + encoding: 'utf8', + }); +}); diff --git a/scripts/themes/theme-tokens-pull.js b/scripts/themes/theme-tokens-pull.js index b0e9238cc..117a4a196 100644 --- a/scripts/themes/theme-tokens-pull.js +++ b/scripts/themes/theme-tokens-pull.js @@ -6,13 +6,13 @@ const JSONBIN_ID = process.env.JSONBIN_ID; const destFolder = './scripts/themes/tokens'; -if (!fs.existsSync(destFolder)){ +if (!fs.existsSync(destFolder)) { fs.mkdirSync(destFolder); } let req = new XMLHttpRequest(); -req.open('GET', 'https://api.jsonbin.io/v3/b/'+ JSONBIN_ID +'/latest', true); +req.open('GET', 'https://api.jsonbin.io/v3/b/' + JSONBIN_ID + '/latest', true); req.setRequestHeader('X-Master-Key', JSONBIN_MASTER_KEY); req.send(); diff --git a/scripts/update-version.js b/scripts/update-version.js index f504e5258..e787dba44 100644 --- a/scripts/update-version.js +++ b/scripts/update-version.js @@ -6,42 +6,54 @@ const semver = require('semver'); const targetVersion = process.argv.slice(2).shift(); const repoRootPath = path.join(__dirname, '..'); -const { version: currentVersion } = require(path.join(repoRootPath, 'package.json')); +const { version: currentVersion } = require(path.join( + repoRootPath, + 'package.json' +)); if (!targetVersion) { - console.error('Target version was not specified. Target version must be a valid semver. Use: `yarn update:version x.y.z` to update the versions.'); - process.exit(1); + console.error( + 'Target version was not specified. Target version must be a valid semver. Use: `yarn update:version x.y.z` to update the versions.' + ); + process.exit(1); } if (!semver.valid(targetVersion)) { - console.error(`Target version '${targetVersion}' is not a valid semver. Use: \`yarn update:version x.y.z\` to update the versions.`); - process.exit(1); + console.error( + `Target version '${targetVersion}' is not a valid semver. Use: \`yarn update:version x.y.z\` to update the versions.` + ); + process.exit(1); } if (!semver.gt(targetVersion, currentVersion)) { - console.error(`Target version '${targetVersion}' must be greater than the current version '${currentVersion}'.`); - process.exit(1); + console.error( + `Target version '${targetVersion}' must be greater than the current version '${currentVersion}'.` + ); + process.exit(1); } -console.log(`🛠️ Updating current version from '${currentVersion}' to '${targetVersion}':`); +console.log( + `🛠️ Updating current version from '${currentVersion}' to '${targetVersion}':` +); for (const toUpdate of [ - path.join(repoRootPath, 'package.json'), - path.join(repoRootPath, 'electron-app', 'package.json'), - path.join(repoRootPath, 'browser-app', 'package.json'), - path.join(repoRootPath, 'arduino-ide-extension', 'package.json') + path.join(repoRootPath, 'package.json'), + path.join(repoRootPath, 'electron-app', 'package.json'), + path.join(repoRootPath, 'arduino-ide-extension', 'package.json'), ]) { - process.stdout.write(` Updating ${toUpdate}'...`); - const pkg = require(toUpdate); - pkg.version = targetVersion; - if ('dependencies' in pkg) { - for (const dep of Object.keys(pkg['dependencies'])) { - if (dep.startsWith('arduino-ide-')) { - pkg['dependencies'][dep] = targetVersion; - } - } + process.stdout.write(` Updating ${toUpdate}'...`); + const pkg = require(toUpdate); + pkg.version = targetVersion; + if ('dependencies' in pkg) { + for (const dep of Object.keys(pkg['dependencies'])) { + if (dep.startsWith('arduino-ide-')) { + pkg['dependencies'][dep] = targetVersion; + } } - fs.writeFileSync(toUpdate, JSON.stringify(pkg, null, 2) + '\n'); - process.stdout.write(` ✅ Done.\n`); + } + fs.writeFileSync(toUpdate, JSON.stringify(pkg, null, 2) + '\n'); + process.stdout.write(` ✅ Done.\n`); } -console.log(`Done. The new version is '${targetVersion}' now. Commit your changes and tag the code for the release. 🚢`); +console.log( + `Done. The new version is '${targetVersion}' now. Commit your changes and tag the code for the release. 🚢` +); diff --git a/static/screenshot.png b/static/screenshot.png index 254f4373f..a0c93a815 100644 Binary files a/static/screenshot.png and b/static/screenshot.png differ diff --git a/yarn.lock b/yarn.lock index 84393eeff..87c12c1f0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,1866 +2,1229 @@ # yarn lockfile v1 -"@ampproject/remapping@^2.1.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" - integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== +"7zip-bin@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/7zip-bin/-/7zip-bin-5.1.1.tgz#9274ec7460652f9c632c59addf24efb1684ef876" + integrity sha512-sAP4LldeWNz0lNzmTird3uWfFDWWTeg6V/MsmyyLR9X1idwKBWIgt/ZvinqQldJm3LecKEs1emkbquO6PCiLVQ== + +"7zip-bin@~5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/7zip-bin/-/7zip-bin-5.2.0.tgz#7a03314684dd6572b7dfa89e68ce31d60286854d" + integrity sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A== + +"7zip-min@^1.4.4": + version "1.4.5" + resolved "https://registry.yarnpkg.com/7zip-min/-/7zip-min-1.4.5.tgz#5d6962ae5f3539fbdf8083a0a9ea2ac353b9ef6d" + integrity sha512-S+FzNwJFKF5LgQYs+hPQo+qeffdi+259Ak63rWEfkHP9arsU8gbe5K+4HscuWN1ih1lP1gTjDNPddbU0qhPtHQ== dependencies: - "@jridgewell/gen-mapping" "^0.1.0" - "@jridgewell/trace-mapping" "^0.3.9" + "7zip-bin" "5.1.1" -"@babel/code-frame@7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" - integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== +"@ampproject/remapping@^2.2.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== dependencies: - "@babel/highlight" "^7.10.4" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" - integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.26.2": + version "7.26.2" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85" + integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== dependencies: - "@babel/highlight" "^7.16.7" + "@babel/helper-validator-identifier" "^7.25.9" + js-tokens "^4.0.0" + picocolors "^1.0.0" -"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.17.10": - version "7.17.10" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.10.tgz#711dc726a492dfc8be8220028b1b92482362baab" - integrity sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw== +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.26.5", "@babel/compat-data@^7.26.8": + version "7.26.8" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.8.tgz#821c1d35641c355284d4a870b8a4a7b0c141e367" + integrity sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ== "@babel/core@^7.10.0": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.17.12.tgz#b4eb2d7ebc3449b062381644c93050db545b70ee" - integrity sha512-44ODe6O1IVz9s2oJE3rZ4trNNKTX9O7KpQpfAP4t8QII/zwrVRHL7i2pxhqtcY7tqMLrrKfMlBKnm1QlrRFs5w== - dependencies: - "@ampproject/remapping" "^2.1.0" - "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.17.12" - "@babel/helper-compilation-targets" "^7.17.10" - "@babel/helper-module-transforms" "^7.17.12" - "@babel/helpers" "^7.17.9" - "@babel/parser" "^7.17.12" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.17.12" - "@babel/types" "^7.17.12" - convert-source-map "^1.7.0" + version "7.26.10" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.10.tgz#5c876f83c8c4dcb233ee4b670c0606f2ac3000f9" + integrity sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.26.2" + "@babel/generator" "^7.26.10" + "@babel/helper-compilation-targets" "^7.26.5" + "@babel/helper-module-transforms" "^7.26.0" + "@babel/helpers" "^7.26.10" + "@babel/parser" "^7.26.10" + "@babel/template" "^7.26.9" + "@babel/traverse" "^7.26.10" + "@babel/types" "^7.26.10" + convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" - json5 "^2.2.1" - semver "^6.3.0" - -"@babel/generator@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.12.tgz#5970e6160e9be0428e02f4aba62d8551ec366cc8" - integrity sha512-V49KtZiiiLjH/CnIW6OjJdrenrGoyh6AmKQ3k2AZFKozC1h846Q4NYlZ5nqAigPDUXfGzC88+LOUuG8yKd2kCw== - dependencies: - "@babel/types" "^7.17.12" - "@jridgewell/gen-mapping" "^0.3.0" - jsesc "^2.5.1" - -"@babel/helper-annotate-as-pure@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz#bb2339a7534a9c128e3102024c60760a3a7f3862" - integrity sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-builder-binary-assignment-operator-visitor@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz#38d138561ea207f0f69eb1626a418e4f7e6a580b" - integrity sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA== - dependencies: - "@babel/helper-explode-assignable-expression" "^7.16.7" - "@babel/types" "^7.16.7" - -"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.7", "@babel/helper-compilation-targets@^7.17.10": - version "7.17.10" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.10.tgz#09c63106d47af93cf31803db6bc49fef354e2ebe" - integrity sha512-gh3RxjWbauw/dFiU/7whjd0qN9K6nPJMqe6+Er7rOavFh0CQUSwhAE3IcTho2rywPJFxej6TUUHDkWcYI6gGqQ== - dependencies: - "@babel/compat-data" "^7.17.10" - "@babel/helper-validator-option" "^7.16.7" - browserslist "^4.20.2" - semver "^6.3.0" - -"@babel/helper-create-class-features-plugin@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.12.tgz#d4f8393fc4838cbff6b7c199af5229aee16d07cf" - integrity sha512-sZoOeUTkFJMyhqCei2+Z+wtH/BehW8NVKQt7IRUQlRiOARuXymJYfN/FCcI8CvVbR0XVyDM6eLFOlR7YtiXnew== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-function-name" "^7.17.9" - "@babel/helper-member-expression-to-functions" "^7.17.7" - "@babel/helper-optimise-call-expression" "^7.16.7" - "@babel/helper-replace-supers" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" - -"@babel/helper-create-regexp-features-plugin@^7.16.7", "@babel/helper-create-regexp-features-plugin@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.12.tgz#bb37ca467f9694bbe55b884ae7a5cc1e0084e4fd" - integrity sha512-b2aZrV4zvutr9AIa6/gA3wsZKRwTKYoDxYiFKcESS3Ug2GTXzwBEvMuuFLhCQpEnRXs1zng4ISAXSUxxKBIcxw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - regexpu-core "^5.0.1" - -"@babel/helper-define-polyfill-provider@^0.3.1": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz#52411b445bdb2e676869e5a74960d2d3826d2665" - integrity sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA== + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/generator@^7.26.10": + version "7.26.10" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.10.tgz#a60d9de49caca16744e6340c3658dfef6138c3f7" + integrity sha512-rRHT8siFIXQrAYOYqZQVsAr8vJ+cBNqcVAY6m5V8/4QqzaPl+zDBe6cLEPRDuNOUf3ww8RfJVlOyQMoSI+5Ang== + dependencies: + "@babel/parser" "^7.26.10" + "@babel/types" "^7.26.10" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^3.0.2" + +"@babel/helper-annotate-as-pure@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz#d8eac4d2dc0d7b6e11fa6e535332e0d3184f06b4" + integrity sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g== + dependencies: + "@babel/types" "^7.25.9" + +"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.25.9", "@babel/helper-compilation-targets@^7.26.5": + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz#75d92bb8d8d51301c0d49e52a65c9a7fe94514d8" + integrity sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA== + dependencies: + "@babel/compat-data" "^7.26.5" + "@babel/helper-validator-option" "^7.25.9" + browserslist "^4.24.0" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-create-class-features-plugin@^7.25.9": + version "7.26.9" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.26.9.tgz#d6f83e3039547fbb39967e78043cd3c8b7820c71" + integrity sha512-ubbUqCofvxPRurw5L8WTsCLSkQiVpov4Qx0WMA+jUN+nXBK8ADPlJO1grkFw5CWKC5+sZSOfuGMdX1aI1iT9Sg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-member-expression-to-functions" "^7.25.9" + "@babel/helper-optimise-call-expression" "^7.25.9" + "@babel/helper-replace-supers" "^7.26.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" + "@babel/traverse" "^7.26.9" + semver "^6.3.1" + +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.25.9": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.26.3.tgz#5169756ecbe1d95f7866b90bb555b022595302a0" + integrity sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.9" + regexpu-core "^6.2.0" + semver "^6.3.1" + +"@babel/helper-define-polyfill-provider@^0.6.3": + version "0.6.3" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.3.tgz#f4f2792fae2ef382074bc2d713522cf24e6ddb21" + integrity sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg== dependencies: - "@babel/helper-compilation-targets" "^7.13.0" - "@babel/helper-module-imports" "^7.12.13" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/traverse" "^7.13.0" + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-plugin-utils" "^7.22.5" debug "^4.1.1" lodash.debounce "^4.0.8" resolve "^1.14.2" - semver "^6.1.2" -"@babel/helper-environment-visitor@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz#ff484094a839bde9d89cd63cba017d7aae80ecd7" - integrity sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag== - dependencies: - "@babel/types" "^7.16.7" +"@babel/helper-member-expression-to-functions@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz#9dfffe46f727005a5ea29051ac835fb735e4c1a3" + integrity sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ== + dependencies: + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz#e7f8d20602ebdbf9ebbea0a0751fb0f2a4141715" + integrity sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw== + dependencies: + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/helper-module-transforms@^7.25.9", "@babel/helper-module-transforms@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz#8ce54ec9d592695e58d84cd884b7b5c6a2fdeeae" + integrity sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw== + dependencies: + "@babel/helper-module-imports" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + "@babel/traverse" "^7.25.9" -"@babel/helper-explode-assignable-expression@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz#12a6d8522fdd834f194e868af6354e8650242b7a" - integrity sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ== +"@babel/helper-optimise-call-expression@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz#3324ae50bae7e2ab3c33f60c9a877b6a0146b54e" + integrity sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ== dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-function-name@^7.16.7", "@babel/helper-function-name@^7.17.9": - version "7.17.9" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz#136fcd54bc1da82fcb47565cf16fd8e444b1ff12" - integrity sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg== + "@babel/types" "^7.25.9" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.25.9", "@babel/helper-plugin-utils@^7.26.5": + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz#18580d00c9934117ad719392c4f6585c9333cc35" + integrity sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg== + +"@babel/helper-remap-async-to-generator@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz#e53956ab3d5b9fb88be04b3e2f31b523afd34b92" + integrity sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw== dependencies: - "@babel/template" "^7.16.7" - "@babel/types" "^7.17.0" + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-wrap-function" "^7.25.9" + "@babel/traverse" "^7.25.9" -"@babel/helper-hoist-variables@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246" - integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg== +"@babel/helper-replace-supers@^7.25.9", "@babel/helper-replace-supers@^7.26.5": + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz#6cb04e82ae291dae8e72335dfe438b0725f14c8d" + integrity sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.25.9" + "@babel/helper-optimise-call-expression" "^7.25.9" + "@babel/traverse" "^7.26.5" + +"@babel/helper-skip-transparent-expression-wrappers@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz#0b2e1b62d560d6b1954893fd2b705dc17c91f0c9" + integrity sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA== dependencies: - "@babel/types" "^7.16.7" + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/helper-string-parser@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz#1aabb72ee72ed35789b4bbcad3ca2862ce614e8c" + integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA== -"@babel/helper-member-expression-to-functions@^7.16.7", "@babel/helper-member-expression-to-functions@^7.17.7": - version "7.17.7" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz#a34013b57d8542a8c4ff8ba3f747c02452a4d8c4" - integrity sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw== - dependencies: - "@babel/types" "^7.17.0" +"@babel/helper-validator-identifier@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz#24b64e2c3ec7cd3b3c547729b8d16871f22cbdc7" + integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== -"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437" - integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg== - dependencies: - "@babel/types" "^7.16.7" +"@babel/helper-validator-option@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz#86e45bd8a49ab7e03f276577f96179653d41da72" + integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw== -"@babel/helper-module-transforms@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.17.12.tgz#bec00139520cb3feb078ef7a4578562480efb77e" - integrity sha512-t5s2BeSWIghhFRPh9XMn6EIGmvn8Lmw5RVASJzkIx1mSemubQQBNIZiQD7WzaFmaHIrjAec4x8z9Yx8SjJ1/LA== +"@babel/helper-wrap-function@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz#d99dfd595312e6c894bd7d237470025c85eea9d0" + integrity sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g== + dependencies: + "@babel/template" "^7.25.9" + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/helpers@^7.26.10": + version "7.26.10" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.26.10.tgz#6baea3cd62ec2d0c1068778d63cb1314f6637384" + integrity sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g== + dependencies: + "@babel/template" "^7.26.9" + "@babel/types" "^7.26.10" + +"@babel/parser@^7.26.10", "@babel/parser@^7.26.9": + version "7.26.10" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.10.tgz#e9bdb82f14b97df6569b0b038edd436839c57749" + integrity sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA== dependencies: - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-module-imports" "^7.16.7" - "@babel/helper-simple-access" "^7.17.7" - "@babel/helper-split-export-declaration" "^7.16.7" - "@babel/helper-validator-identifier" "^7.16.7" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.17.12" - "@babel/types" "^7.17.12" - -"@babel/helper-optimise-call-expression@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz#a34e3560605abbd31a18546bd2aad3e6d9a174f2" - integrity sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.17.12", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz#86c2347da5acbf5583ba0a10aed4c9bf9da9cf96" - integrity sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA== - -"@babel/helper-remap-async-to-generator@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz#29ffaade68a367e2ed09c90901986918d25e57e3" - integrity sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-wrap-function" "^7.16.8" - "@babel/types" "^7.16.8" - -"@babel/helper-replace-supers@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz#e9f5f5f32ac90429c1a4bdec0f231ef0c2838ab1" - integrity sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw== - dependencies: - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-member-expression-to-functions" "^7.16.7" - "@babel/helper-optimise-call-expression" "^7.16.7" - "@babel/traverse" "^7.16.7" - "@babel/types" "^7.16.7" - -"@babel/helper-simple-access@^7.17.7": - version "7.17.7" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz#aaa473de92b7987c6dfa7ce9a7d9674724823367" - integrity sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA== - dependencies: - "@babel/types" "^7.17.0" - -"@babel/helper-skip-transparent-expression-wrappers@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz#0ee3388070147c3ae051e487eca3ebb0e2e8bb09" - integrity sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw== - dependencies: - "@babel/types" "^7.16.0" - -"@babel/helper-split-export-declaration@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b" - integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-validator-identifier@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" - integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== - -"@babel/helper-validator-option@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" - integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== - -"@babel/helper-wrap-function@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz#58afda087c4cd235de92f7ceedebca2c41274200" - integrity sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw== - dependencies: - "@babel/helper-function-name" "^7.16.7" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.16.8" - "@babel/types" "^7.16.8" - -"@babel/helpers@^7.17.9": - version "7.17.9" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.17.9.tgz#b2af120821bfbe44f9907b1826e168e819375a1a" - integrity sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q== - dependencies: - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.17.9" - "@babel/types" "^7.17.0" - -"@babel/highlight@^7.10.4", "@babel/highlight@^7.16.7": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.17.12.tgz#257de56ee5afbd20451ac0a75686b6b404257351" - integrity sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg== - dependencies: - "@babel/helper-validator-identifier" "^7.16.7" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/parser@^7.16.7", "@babel/parser@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.12.tgz#36c2ed06944e3691ba82735fc4cf62d12d491a23" - integrity sha512-FLzHmN9V3AJIrWfOpvRlZCeVg/WLdicSnTMsLur6uDj9TT8ymUlG9XxURdW/XvuygK+2CW0poOJABdA4m/YKxA== - -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.17.12.tgz#1dca338caaefca368639c9ffb095afbd4d420b1e" - integrity sha512-xCJQXl4EeQ3J9C4yOmpTrtVGmzpm2iSzyxbkZHw7UCnZBftHpF/hpII80uWVyVrc40ytIClHjgWGTG1g/yB+aw== - dependencies: - "@babel/helper-plugin-utils" "^7.17.12" - -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.17.12.tgz#0d498ec8f0374b1e2eb54b9cb2c4c78714c77753" - integrity sha512-/vt0hpIw0x4b6BLKUkwlvEoiGZYYLNZ96CzyHYPbtG2jZGz6LBe7/V+drYrc/d+ovrF9NBi0pmtvmNb/FsWtRQ== - dependencies: - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" - "@babel/plugin-proposal-optional-chaining" "^7.17.12" - -"@babel/plugin-proposal-async-generator-functions@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.17.12.tgz#094a417e31ce7e692d84bab06c8e2a607cbeef03" - integrity sha512-RWVvqD1ooLKP6IqWTA5GyFVX2isGEgC5iFxKzfYOIy/QEFdxYyCybBDtIGjipHpb9bDWHzcqGqFakf+mVmBTdQ== - dependencies: - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/helper-remap-async-to-generator" "^7.16.8" - "@babel/plugin-syntax-async-generators" "^7.8.4" - -"@babel/plugin-proposal-class-properties@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.17.12.tgz#84f65c0cc247d46f40a6da99aadd6438315d80a4" - integrity sha512-U0mI9q8pW5Q9EaTHFPwSVusPMV/DV9Mm8p7csqROFLtIE9rBF5piLqyrBGigftALrBcsBGu4m38JneAe7ZDLXw== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.17.12" - "@babel/helper-plugin-utils" "^7.17.12" - -"@babel/plugin-proposal-class-static-block@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.12.tgz#947f09dd496322c9543ec3b318bf52b4d9833334" - integrity sha512-8ILyDG6eL14F8iub97dVc8q35Md0PJYAnA5Kz9NACFOkt6ffCcr0FISyUPKHsvuAy36fkpIitxZ9bVYPFMGQHA== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.17.12" - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - -"@babel/plugin-proposal-dynamic-import@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz#c19c897eaa46b27634a00fee9fb7d829158704b2" - integrity sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - -"@babel/plugin-proposal-export-namespace-from@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.17.12.tgz#b22864ccd662db9606edb2287ea5fd1709f05378" - integrity sha512-j7Ye5EWdwoXOpRmo5QmRyHPsDIe6+u70ZYZrd7uz+ebPYFKfRcLcNu3Ro0vOlJ5zuv8rU7xa+GttNiRzX56snQ== - dependencies: - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - -"@babel/plugin-proposal-json-strings@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.17.12.tgz#f4642951792437233216d8c1af370bb0fbff4664" - integrity sha512-rKJ+rKBoXwLnIn7n6o6fulViHMrOThz99ybH+hKHcOZbnN14VuMnH9fo2eHE69C8pO4uX1Q7t2HYYIDmv8VYkg== - dependencies: - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/plugin-syntax-json-strings" "^7.8.3" - -"@babel/plugin-proposal-logical-assignment-operators@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.17.12.tgz#c64a1bcb2b0a6d0ed2ff674fd120f90ee4b88a23" - integrity sha512-EqFo2s1Z5yy+JeJu7SFfbIUtToJTVlC61/C7WLKDntSw4Sz6JNAIfL7zQ74VvirxpjB5kz/kIx0gCcb+5OEo2Q== - dependencies: - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - -"@babel/plugin-proposal-nullish-coalescing-operator@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.17.12.tgz#1e93079bbc2cbc756f6db6a1925157c4a92b94be" - integrity sha512-ws/g3FSGVzv+VH86+QvgtuJL/kR67xaEIF2x0iPqdDfYW6ra6JF3lKVBkWynRLcNtIC1oCTfDRVxmm2mKzy+ag== + "@babel/types" "^7.26.10" + +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz#cc2e53ebf0a0340777fff5ed521943e253b4d8fe" + integrity sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - -"@babel/plugin-proposal-numeric-separator@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz#d6b69f4af63fb38b6ca2558442a7fb191236eba9" - integrity sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw== + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/traverse" "^7.25.9" + +"@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz#af9e4fb63ccb8abcb92375b2fcfe36b60c774d30" + integrity sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - -"@babel/plugin-proposal-object-rest-spread@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.12.tgz#f94a91715a7f2f8cfb3c06af820c776440bc0148" - integrity sha512-6l9cO3YXXRh4yPCPRA776ZyJ3RobG4ZKJZhp7NDRbKIOeV3dBPG8FXCF7ZtiO2RTCIOkQOph1xDDcc01iWVNjQ== + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz#e8dc26fcd616e6c5bf2bd0d5a2c151d4f92a9137" + integrity sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz#807a667f9158acac6f6164b4beb85ad9ebc9e1d1" + integrity sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g== dependencies: - "@babel/compat-data" "^7.17.10" - "@babel/helper-compilation-targets" "^7.17.10" - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.17.12" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" + "@babel/plugin-transform-optional-chaining" "^7.25.9" + +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz#de7093f1e7deaf68eadd7cc6b07f2ab82543269e" + integrity sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/traverse" "^7.25.9" + +"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": + version "7.21.0-placeholder-for-preset-env.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" + integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== + +"@babel/plugin-syntax-import-assertions@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz#620412405058efa56e4a564903b79355020f445f" + integrity sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-syntax-import-attributes@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz#3b1412847699eea739b4f2602c74ce36f6b0b0f7" + integrity sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" + integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-proposal-optional-catch-binding@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz#c623a430674ffc4ab732fd0a0ae7722b67cb74cf" - integrity sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA== +"@babel/plugin-transform-arrow-functions@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz#7821d4410bee5daaadbb4cdd9a6649704e176845" + integrity sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-proposal-optional-chaining@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.17.12.tgz#f96949e9bacace3a9066323a5cf90cfb9de67174" - integrity sha512-7wigcOs/Z4YWlK7xxjkvaIw84vGhDv/P1dFGQap0nHkc8gFKY/r+hXc8Qzf5k1gY7CvGIcHqAnOagVKJJ1wVOQ== +"@babel/plugin-transform-async-generator-functions@^7.26.8": + version "7.26.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.26.8.tgz#5e3991135e3b9c6eaaf5eff56d1ae5a11df45ff8" + integrity sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/helper-plugin-utils" "^7.26.5" + "@babel/helper-remap-async-to-generator" "^7.25.9" + "@babel/traverse" "^7.26.8" -"@babel/plugin-proposal-private-methods@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.17.12.tgz#c2ca3a80beb7539289938da005ad525a038a819c" - integrity sha512-SllXoxo19HmxhDWm3luPz+cPhtoTSKLJE9PXshsfrOzBqs60QP0r8OaJItrPhAj0d7mZMnNF0Y1UUggCDgMz1A== +"@babel/plugin-transform-async-to-generator@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz#c80008dacae51482793e5a9c08b39a5be7e12d71" + integrity sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ== dependencies: - "@babel/helper-create-class-features-plugin" "^7.17.12" - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-module-imports" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-remap-async-to-generator" "^7.25.9" -"@babel/plugin-proposal-private-property-in-object@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.17.12.tgz#b02efb7f106d544667d91ae97405a9fd8c93952d" - integrity sha512-/6BtVi57CJfrtDNKfK5b66ydK2J5pXUKBKSPD2G1whamMuEnZWgoOIfO8Vf9F/DoD4izBLD/Au4NMQfruzzykg== +"@babel/plugin-transform-block-scoped-functions@^7.26.5": + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.26.5.tgz#3dc4405d31ad1cbe45293aa57205a6e3b009d53e" + integrity sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ== dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-create-class-features-plugin" "^7.17.12" - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/helper-plugin-utils" "^7.26.5" -"@babel/plugin-proposal-unicode-property-regex@^7.17.12", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.17.12.tgz#3dbd7a67bd7f94c8238b394da112d86aaf32ad4d" - integrity sha512-Wb9qLjXf3ZazqXA7IvI7ozqRIXIGPtSo+L5coFmEkhTQK18ao4UDDD0zdTGAarmbLj2urpRwrc6893cu5Bfh0A== +"@babel/plugin-transform-block-scoping@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz#c33665e46b06759c93687ca0f84395b80c0473a1" + integrity sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.17.12" - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-syntax-async-generators@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== +"@babel/plugin-transform-class-properties@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz#a8ce84fedb9ad512549984101fa84080a9f5f51f" + integrity sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q== dependencies: - "@babel/helper-plugin-utils" "^7.8.0" + "@babel/helper-create-class-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-syntax-class-properties@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" - integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== +"@babel/plugin-transform-class-static-block@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz#6c8da219f4eb15cae9834ec4348ff8e9e09664a0" + integrity sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-create-class-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-syntax-class-static-block@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" - integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== +"@babel/plugin-transform-classes@^7.10.0", "@babel/plugin-transform-classes@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz#7152457f7880b593a63ade8a861e6e26a4469f52" + integrity sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-replace-supers" "^7.25.9" + "@babel/traverse" "^7.25.9" + globals "^11.1.0" -"@babel/plugin-syntax-dynamic-import@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" - integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== +"@babel/plugin-transform-computed-properties@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz#db36492c78460e534b8852b1d5befe3c923ef10b" + integrity sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA== dependencies: - "@babel/helper-plugin-utils" "^7.8.0" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/template" "^7.25.9" -"@babel/plugin-syntax-export-namespace-from@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" - integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== +"@babel/plugin-transform-destructuring@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz#966ea2595c498224340883602d3cfd7a0c79cea1" + integrity sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-syntax-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== +"@babel/plugin-transform-dotall-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz#bad7945dd07734ca52fe3ad4e872b40ed09bb09a" + integrity sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA== dependencies: - "@babel/helper-plugin-utils" "^7.8.0" + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" - integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== +"@babel/plugin-transform-duplicate-keys@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz#8850ddf57dce2aebb4394bb434a7598031059e6d" + integrity sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== +"@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz#6f7259b4de127721a08f1e5165b852fcaa696d31" + integrity sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog== dependencies: - "@babel/helper-plugin-utils" "^7.8.0" + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-syntax-numeric-separator@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" - integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== +"@babel/plugin-transform-dynamic-import@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz#23e917de63ed23c6600c5dd06d94669dce79f7b8" + integrity sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-syntax-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== +"@babel/plugin-transform-exponentiation-operator@^7.26.3": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz#e29f01b6de302c7c2c794277a48f04a9ca7f03bc" + integrity sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ== dependencies: - "@babel/helper-plugin-utils" "^7.8.0" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-syntax-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" - integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== +"@babel/plugin-transform-export-namespace-from@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz#90745fe55053394f554e40584cda81f2c8a402a2" + integrity sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww== dependencies: - "@babel/helper-plugin-utils" "^7.8.0" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-syntax-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== +"@babel/plugin-transform-for-of@^7.26.9": + version "7.26.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.26.9.tgz#27231f79d5170ef33b5111f07fe5cafeb2c96a56" + integrity sha512-Hry8AusVm8LW5BVFgiyUReuoGzPUpdHQQqJY5bZnbbf+ngOHWuCuYFKw/BqaaWlvEUrF91HMhDtEaI1hZzNbLg== dependencies: - "@babel/helper-plugin-utils" "^7.8.0" + "@babel/helper-plugin-utils" "^7.26.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" -"@babel/plugin-syntax-private-property-in-object@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" - integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== +"@babel/plugin-transform-function-name@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz#939d956e68a606661005bfd550c4fc2ef95f7b97" + integrity sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/traverse" "^7.25.9" -"@babel/plugin-syntax-top-level-await@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" - integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== +"@babel/plugin-transform-json-strings@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz#c86db407cb827cded902a90c707d2781aaa89660" + integrity sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-arrow-functions@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.17.12.tgz#dddd783b473b1b1537ef46423e3944ff24898c45" - integrity sha512-PHln3CNi/49V+mza4xMwrg+WGYevSF1oaiXaC2EQfdp4HWlSjRsrDXWJiQBKpP7749u6vQ9mcry2uuFOv5CXvA== +"@babel/plugin-transform-literals@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz#1a1c6b4d4aa59bc4cad5b6b3a223a0abd685c9de" + integrity sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-async-to-generator@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.17.12.tgz#dbe5511e6b01eee1496c944e35cdfe3f58050832" - integrity sha512-J8dbrWIOO3orDzir57NRsjg4uxucvhby0L/KZuGsWDj0g7twWK3g7JhJhOrXtuXiw8MeiSdJ3E0OW9H8LYEzLQ== +"@babel/plugin-transform-logical-assignment-operators@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz#b19441a8c39a2fda0902900b306ea05ae1055db7" + integrity sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q== dependencies: - "@babel/helper-module-imports" "^7.16.7" - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/helper-remap-async-to-generator" "^7.16.8" - -"@babel/plugin-transform-block-scoped-functions@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz#4d0d57d9632ef6062cdf354bb717102ee042a620" - integrity sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-block-scoping@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.17.12.tgz#68fc3c4b3bb7dfd809d97b7ed19a584052a2725c" - integrity sha512-jw8XW/B1i7Lqwqj2CbrViPcZijSxfguBWZP2aN59NHgxUyO/OcO1mfdCxH13QhN5LbWhPkX+f+brKGhZTiqtZQ== - dependencies: - "@babel/helper-plugin-utils" "^7.17.12" - -"@babel/plugin-transform-classes@^7.10.0", "@babel/plugin-transform-classes@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.17.12.tgz#da889e89a4d38375eeb24985218edeab93af4f29" - integrity sha512-cvO7lc7pZat6BsvH6l/EGaI8zpl8paICaoGk+7x7guvtfak/TbIf66nYmJOH13EuG0H+Xx3M+9LQDtSvZFKXKw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-function-name" "^7.17.9" - "@babel/helper-optimise-call-expression" "^7.16.7" - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/helper-replace-supers" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" - globals "^11.1.0" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-computed-properties@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.17.12.tgz#bca616a83679698f3258e892ed422546e531387f" - integrity sha512-a7XINeplB5cQUWMg1E/GI1tFz3LfK021IjV1rj1ypE+R7jHm+pIHmHl25VNkZxtx9uuYp7ThGk8fur1HHG7PgQ== +"@babel/plugin-transform-member-expression-literals@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz#63dff19763ea64a31f5e6c20957e6a25e41ed5de" + integrity sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-destructuring@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.12.tgz#0861d61e75e2401aca30f2570d46dfc85caacf35" - integrity sha512-P8pt0YiKtX5UMUL5Xzsc9Oyij+pJE6JuC+F1k0/brq/OOGs5jDa1If3OY0LRWGvJsJhI+8tsiecL3nJLc0WTlg== +"@babel/plugin-transform-modules-amd@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz#49ba478f2295101544abd794486cd3088dddb6c5" + integrity sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-module-transforms" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-dotall-regex@^7.16.7", "@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz#6b2d67686fab15fb6a7fd4bd895d5982cfc81241" - integrity sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ== +"@babel/plugin-transform-modules-commonjs@^7.26.3": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz#8f011d44b20d02c3de44d8850d971d8497f981fb" + integrity sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-module-transforms" "^7.26.0" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-duplicate-keys@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.17.12.tgz#a09aa709a3310013f8e48e0e23bc7ace0f21477c" - integrity sha512-EA5eYFUG6xeerdabina/xIoB95jJ17mAkR8ivx6ZSu9frKShBjpOGZPn511MTDTkiCO+zXnzNczvUM69YSf3Zw== +"@babel/plugin-transform-modules-systemjs@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz#8bd1b43836269e3d33307151a114bcf3ba6793f8" + integrity sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-module-transforms" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + "@babel/traverse" "^7.25.9" -"@babel/plugin-transform-exponentiation-operator@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz#efa9862ef97e9e9e5f653f6ddc7b665e8536fe9b" - integrity sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA== +"@babel/plugin-transform-modules-umd@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz#6710079cdd7c694db36529a1e8411e49fcbf14c9" + integrity sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-module-transforms" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-for-of@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.17.12.tgz#5397c22554ec737a27918e7e7e0e7b679b05f5ec" - integrity sha512-76lTwYaCxw8ldT7tNmye4LLwSoKDbRCBzu6n/DcK/P3FOR29+38CIIaVIZfwol9By8W/QHORYEnYSLuvcQKrsg== +"@babel/plugin-transform-named-capturing-groups-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz#454990ae6cc22fd2a0fa60b3a2c6f63a38064e6a" + integrity sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-function-name@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz#5ab34375c64d61d083d7d2f05c38d90b97ec65cf" - integrity sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA== +"@babel/plugin-transform-new-target@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz#42e61711294b105c248336dcb04b77054ea8becd" + integrity sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ== dependencies: - "@babel/helper-compilation-targets" "^7.16.7" - "@babel/helper-function-name" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-literals@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.17.12.tgz#97131fbc6bbb261487105b4b3edbf9ebf9c830ae" - integrity sha512-8iRkvaTjJciWycPIZ9k9duu663FT7VrBdNqNgxnVXEFwOIp55JWcZd23VBRySYbnS3PwQ3rGiabJBBBGj5APmQ== +"@babel/plugin-transform-nullish-coalescing-operator@^7.26.6": + version "7.26.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.26.6.tgz#fbf6b3c92cb509e7b319ee46e3da89c5bedd31fe" + integrity sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.26.5" -"@babel/plugin-transform-member-expression-literals@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz#6e5dcf906ef8a098e630149d14c867dd28f92384" - integrity sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw== +"@babel/plugin-transform-numeric-separator@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz#bfed75866261a8b643468b0ccfd275f2033214a1" + integrity sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-modules-amd@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.17.12.tgz#08ec1f10f854c15bb3b44952e60f1fc126d7d481" - integrity sha512-p5rt9tB5Ndcc2Za7CeNxVf7YAjRcUMR6yi8o8tKjb9KhRkEvXwa+C0hj6DA5bVDkKRxB0NYhMUGbVKoFu4+zEA== +"@babel/plugin-transform-object-rest-spread@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz#0203725025074164808bcf1a2cfa90c652c99f18" + integrity sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg== dependencies: - "@babel/helper-module-transforms" "^7.17.12" - "@babel/helper-plugin-utils" "^7.17.12" - babel-plugin-dynamic-import-node "^2.3.3" + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-transform-parameters" "^7.25.9" -"@babel/plugin-transform-modules-commonjs@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.12.tgz#37691c7404320d007288edd5a2d8600bcef61c34" - integrity sha512-tVPs6MImAJz+DiX8Y1xXEMdTk5Lwxu9jiPjlS+nv5M2A59R7+/d1+9A8C/sbuY0b3QjIxqClkj6KAplEtRvzaA== +"@babel/plugin-transform-object-super@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz#385d5de135162933beb4a3d227a2b7e52bb4cf03" + integrity sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A== dependencies: - "@babel/helper-module-transforms" "^7.17.12" - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/helper-simple-access" "^7.17.7" - babel-plugin-dynamic-import-node "^2.3.3" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-replace-supers" "^7.25.9" -"@babel/plugin-transform-modules-systemjs@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.17.12.tgz#e631b151b99d25401cd9679476cc35e6e5bbc7d4" - integrity sha512-NVhDb0q00hqZcuLduUf/kMzbOQHiocmPbIxIvk23HLiEqaTKC/l4eRxeC7lO63M72BmACoiKOcb9AkOAJRerpw== +"@babel/plugin-transform-optional-catch-binding@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz#10e70d96d52bb1f10c5caaac59ac545ea2ba7ff3" + integrity sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g== dependencies: - "@babel/helper-hoist-variables" "^7.16.7" - "@babel/helper-module-transforms" "^7.17.12" - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/helper-validator-identifier" "^7.16.7" - babel-plugin-dynamic-import-node "^2.3.3" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-modules-umd@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.17.12.tgz#b37be3ecf198c1fea10e6268461729ced05644e1" - integrity sha512-BnsPkrUHsjzZGpnrmJeDFkOMMljWFHPjDc9xDcz71/C+ybF3lfC3V4m3dwXPLZrE5b3bgd4V+3/Pj+3620d7IA== +"@babel/plugin-transform-optional-chaining@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz#e142eb899d26ef715435f201ab6e139541eee7dd" + integrity sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A== dependencies: - "@babel/helper-module-transforms" "^7.17.12" - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" -"@babel/plugin-transform-named-capturing-groups-regex@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.17.12.tgz#9c4a5a5966e0434d515f2675c227fd8cc8606931" - integrity sha512-vWoWFM5CKaTeHrdUJ/3SIOTRV+MBVGybOC9mhJkaprGNt5demMymDW24yC74avb915/mIRe3TgNb/d8idvnCRA== +"@babel/plugin-transform-parameters@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz#b856842205b3e77e18b7a7a1b94958069c7ba257" + integrity sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.17.12" - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-new-target@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.17.12.tgz#10842cd605a620944e81ea6060e9e65c265742e3" - integrity sha512-CaOtzk2fDYisbjAD4Sd1MTKGVIpRtx9bWLyj24Y/k6p4s4gQ3CqDGJauFJxt8M/LEx003d0i3klVqnN73qvK3w== +"@babel/plugin-transform-private-methods@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz#847f4139263577526455d7d3223cd8bda51e3b57" + integrity sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-create-class-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-object-super@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz#ac359cf8d32cf4354d27a46867999490b6c32a94" - integrity sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw== +"@babel/plugin-transform-private-property-in-object@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz#9c8b73e64e6cc3cbb2743633885a7dd2c385fe33" + integrity sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-replace-supers" "^7.16.7" + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-create-class-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-parameters@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.17.12.tgz#eb467cd9586ff5ff115a9880d6fdbd4a846b7766" - integrity sha512-6qW4rWo1cyCdq1FkYri7AHpauchbGLXpdwnYsfxFb+KtddHENfsY5JZb35xUwkK5opOLcJ3BNd2l7PhRYGlwIA== +"@babel/plugin-transform-property-literals@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz#d72d588bd88b0dec8b62e36f6fda91cedfe28e3f" + integrity sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-property-literals@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz#2dadac85155436f22c696c4827730e0fe1057a55" - integrity sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw== +"@babel/plugin-transform-regenerator@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz#03a8a4670d6cebae95305ac6defac81ece77740b" + integrity sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.25.9" + regenerator-transform "^0.15.2" -"@babel/plugin-transform-regenerator@^7.17.9": - version "7.17.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.17.9.tgz#0a33c3a61cf47f45ed3232903683a0afd2d3460c" - integrity sha512-Lc2TfbxR1HOyn/c6b4Y/b6NHoTb67n/IoWLxTu4kC7h4KQnWlhCq2S8Tx0t2SVvv5Uu87Hs+6JEJ5kt2tYGylQ== +"@babel/plugin-transform-regexp-modifiers@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz#2f5837a5b5cd3842a919d8147e9903cc7455b850" + integrity sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw== dependencies: - regenerator-transform "^0.15.0" + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-reserved-words@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.17.12.tgz#7dbd349f3cdffba751e817cf40ca1386732f652f" - integrity sha512-1KYqwbJV3Co03NIi14uEHW8P50Md6KqFgt0FfpHdK6oyAHQVTosgPuPSiWud1HX0oYJ1hGRRlk0fP87jFpqXZA== +"@babel/plugin-transform-reserved-words@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz#0398aed2f1f10ba3f78a93db219b27ef417fb9ce" + integrity sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-transform-runtime@^7.10.0": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.17.12.tgz#5dc79735c4038c6f4fc0490f68f2798ce608cadd" - integrity sha512-xsl5MeGjWnmV6Ui9PfILM2+YRpa3GqLOrczPpXV3N2KCgQGU+sU8OfzuMbjkIdfvZEZIm+3y0V7w58sk0SGzlw== + version "7.26.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.26.10.tgz#6b4504233de8238e7d666c15cde681dc62adff87" + integrity sha512-NWaL2qG6HRpONTnj4JvDU6th4jYeZOJgu3QhmFTCihib0ermtOJqktA5BduGm3suhhVe9EMP9c9+mfJ/I9slqw== dependencies: - "@babel/helper-module-imports" "^7.16.7" - "@babel/helper-plugin-utils" "^7.17.12" - babel-plugin-polyfill-corejs2 "^0.3.0" - babel-plugin-polyfill-corejs3 "^0.5.0" - babel-plugin-polyfill-regenerator "^0.3.0" - semver "^6.3.0" + "@babel/helper-module-imports" "^7.25.9" + "@babel/helper-plugin-utils" "^7.26.5" + babel-plugin-polyfill-corejs2 "^0.4.10" + babel-plugin-polyfill-corejs3 "^0.11.0" + babel-plugin-polyfill-regenerator "^0.6.1" + semver "^6.3.1" + +"@babel/plugin-transform-shorthand-properties@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz#bb785e6091f99f826a95f9894fc16fde61c163f2" + integrity sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-spread@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz#24a35153931b4ba3d13cec4a7748c21ab5514ef9" + integrity sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" -"@babel/plugin-transform-shorthand-properties@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz#e8549ae4afcf8382f711794c0c7b6b934c5fbd2a" - integrity sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg== +"@babel/plugin-transform-sticky-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz#c7f02b944e986a417817b20ba2c504dfc1453d32" + integrity sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-spread@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.17.12.tgz#c112cad3064299f03ea32afed1d659223935d1f5" - integrity sha512-9pgmuQAtFi3lpNUstvG9nGfk9DkrdmWNp9KeKPFmuZCpEnxRzYlS8JgwPjYj+1AWDOSvoGN0H30p1cBOmT/Svg== +"@babel/plugin-transform-template-literals@^7.26.8": + version "7.26.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.26.8.tgz#966b15d153a991172a540a69ad5e1845ced990b5" + integrity sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + "@babel/helper-plugin-utils" "^7.26.5" -"@babel/plugin-transform-sticky-regex@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz#c84741d4f4a38072b9a1e2e3fd56d359552e8660" - integrity sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw== +"@babel/plugin-transform-typeof-symbol@^7.26.7": + version "7.26.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.26.7.tgz#d0e33acd9223744c1e857dbd6fa17bd0a3786937" + integrity sha512-jfoTXXZTgGg36BmhqT3cAYK5qkmqvJpvNrPhaK/52Vgjhw4Rq29s9UqpWWV0D6yuRmgiFH/BUVlkl96zJWqnaw== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.26.5" -"@babel/plugin-transform-template-literals@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.17.12.tgz#4aec0a18f39dd86c442e1d077746df003e362c6e" - integrity sha512-kAKJ7DX1dSRa2s7WN1xUAuaQmkTpN+uig4wCKWivVXIObqGbVTUlSavHyfI2iZvz89GFAMGm9p2DBJ4Y1Tp0hw== +"@babel/plugin-transform-unicode-escapes@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz#a75ef3947ce15363fccaa38e2dd9bc70b2788b82" + integrity sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-typeof-symbol@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.17.12.tgz#0f12f57ac35e98b35b4ed34829948d42bd0e6889" - integrity sha512-Q8y+Jp7ZdtSPXCThB6zjQ74N3lj0f6TDh1Hnf5B+sYlzQ8i5Pjp8gW0My79iekSpT4WnI06blqP6DT0OmaXXmw== +"@babel/plugin-transform-unicode-property-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz#a901e96f2c1d071b0d1bb5dc0d3c880ce8f53dd3" + integrity sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-unicode-escapes@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz#da8717de7b3287a2c6d659750c964f302b31ece3" - integrity sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q== +"@babel/plugin-transform-unicode-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz#5eae747fe39eacf13a8bd006a4fb0b5d1fa5e9b1" + integrity sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-unicode-regex@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz#0f7aa4a501198976e25e82702574c34cfebe9ef2" - integrity sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q== +"@babel/plugin-transform-unicode-sets-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz#65114c17b4ffc20fa5b163c63c70c0d25621fabe" + integrity sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" "@babel/preset-env@^7.10.0": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.17.12.tgz#b81ae0bb762b683d68b07b6d2d4020ccbef8d67a" - integrity sha512-Kke30Rj3Lmcx97bVs71LO0s8M6FmJ7tUAQI9fNId62rf0cYG1UAWwdNO9/sE0/pLEahAw1MqMorymoD12bj5Fg== - dependencies: - "@babel/compat-data" "^7.17.10" - "@babel/helper-compilation-targets" "^7.17.10" - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/helper-validator-option" "^7.16.7" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.17.12" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.17.12" - "@babel/plugin-proposal-async-generator-functions" "^7.17.12" - "@babel/plugin-proposal-class-properties" "^7.17.12" - "@babel/plugin-proposal-class-static-block" "^7.17.12" - "@babel/plugin-proposal-dynamic-import" "^7.16.7" - "@babel/plugin-proposal-export-namespace-from" "^7.17.12" - "@babel/plugin-proposal-json-strings" "^7.17.12" - "@babel/plugin-proposal-logical-assignment-operators" "^7.17.12" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.17.12" - "@babel/plugin-proposal-numeric-separator" "^7.16.7" - "@babel/plugin-proposal-object-rest-spread" "^7.17.12" - "@babel/plugin-proposal-optional-catch-binding" "^7.16.7" - "@babel/plugin-proposal-optional-chaining" "^7.17.12" - "@babel/plugin-proposal-private-methods" "^7.17.12" - "@babel/plugin-proposal-private-property-in-object" "^7.17.12" - "@babel/plugin-proposal-unicode-property-regex" "^7.17.12" - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-class-properties" "^7.12.13" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-transform-arrow-functions" "^7.17.12" - "@babel/plugin-transform-async-to-generator" "^7.17.12" - "@babel/plugin-transform-block-scoped-functions" "^7.16.7" - "@babel/plugin-transform-block-scoping" "^7.17.12" - "@babel/plugin-transform-classes" "^7.17.12" - "@babel/plugin-transform-computed-properties" "^7.17.12" - "@babel/plugin-transform-destructuring" "^7.17.12" - "@babel/plugin-transform-dotall-regex" "^7.16.7" - "@babel/plugin-transform-duplicate-keys" "^7.17.12" - "@babel/plugin-transform-exponentiation-operator" "^7.16.7" - "@babel/plugin-transform-for-of" "^7.17.12" - "@babel/plugin-transform-function-name" "^7.16.7" - "@babel/plugin-transform-literals" "^7.17.12" - "@babel/plugin-transform-member-expression-literals" "^7.16.7" - "@babel/plugin-transform-modules-amd" "^7.17.12" - "@babel/plugin-transform-modules-commonjs" "^7.17.12" - "@babel/plugin-transform-modules-systemjs" "^7.17.12" - "@babel/plugin-transform-modules-umd" "^7.17.12" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.17.12" - "@babel/plugin-transform-new-target" "^7.17.12" - "@babel/plugin-transform-object-super" "^7.16.7" - "@babel/plugin-transform-parameters" "^7.17.12" - "@babel/plugin-transform-property-literals" "^7.16.7" - "@babel/plugin-transform-regenerator" "^7.17.9" - "@babel/plugin-transform-reserved-words" "^7.17.12" - "@babel/plugin-transform-shorthand-properties" "^7.16.7" - "@babel/plugin-transform-spread" "^7.17.12" - "@babel/plugin-transform-sticky-regex" "^7.16.7" - "@babel/plugin-transform-template-literals" "^7.17.12" - "@babel/plugin-transform-typeof-symbol" "^7.17.12" - "@babel/plugin-transform-unicode-escapes" "^7.16.7" - "@babel/plugin-transform-unicode-regex" "^7.16.7" - "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.17.12" - babel-plugin-polyfill-corejs2 "^0.3.0" - babel-plugin-polyfill-corejs3 "^0.5.0" - babel-plugin-polyfill-regenerator "^0.3.0" - core-js-compat "^3.22.1" - semver "^6.3.0" - -"@babel/preset-modules@^0.1.5": - version "0.1.5" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" - integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== + version "7.26.9" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.26.9.tgz#2ec64e903d0efe743699f77a10bdf7955c2123c3" + integrity sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ== + dependencies: + "@babel/compat-data" "^7.26.8" + "@babel/helper-compilation-targets" "^7.26.5" + "@babel/helper-plugin-utils" "^7.26.5" + "@babel/helper-validator-option" "^7.25.9" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.25.9" + "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.25.9" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.25.9" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.25.9" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.25.9" + "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" + "@babel/plugin-syntax-import-assertions" "^7.26.0" + "@babel/plugin-syntax-import-attributes" "^7.26.0" + "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" + "@babel/plugin-transform-arrow-functions" "^7.25.9" + "@babel/plugin-transform-async-generator-functions" "^7.26.8" + "@babel/plugin-transform-async-to-generator" "^7.25.9" + "@babel/plugin-transform-block-scoped-functions" "^7.26.5" + "@babel/plugin-transform-block-scoping" "^7.25.9" + "@babel/plugin-transform-class-properties" "^7.25.9" + "@babel/plugin-transform-class-static-block" "^7.26.0" + "@babel/plugin-transform-classes" "^7.25.9" + "@babel/plugin-transform-computed-properties" "^7.25.9" + "@babel/plugin-transform-destructuring" "^7.25.9" + "@babel/plugin-transform-dotall-regex" "^7.25.9" + "@babel/plugin-transform-duplicate-keys" "^7.25.9" + "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.25.9" + "@babel/plugin-transform-dynamic-import" "^7.25.9" + "@babel/plugin-transform-exponentiation-operator" "^7.26.3" + "@babel/plugin-transform-export-namespace-from" "^7.25.9" + "@babel/plugin-transform-for-of" "^7.26.9" + "@babel/plugin-transform-function-name" "^7.25.9" + "@babel/plugin-transform-json-strings" "^7.25.9" + "@babel/plugin-transform-literals" "^7.25.9" + "@babel/plugin-transform-logical-assignment-operators" "^7.25.9" + "@babel/plugin-transform-member-expression-literals" "^7.25.9" + "@babel/plugin-transform-modules-amd" "^7.25.9" + "@babel/plugin-transform-modules-commonjs" "^7.26.3" + "@babel/plugin-transform-modules-systemjs" "^7.25.9" + "@babel/plugin-transform-modules-umd" "^7.25.9" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.25.9" + "@babel/plugin-transform-new-target" "^7.25.9" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.26.6" + "@babel/plugin-transform-numeric-separator" "^7.25.9" + "@babel/plugin-transform-object-rest-spread" "^7.25.9" + "@babel/plugin-transform-object-super" "^7.25.9" + "@babel/plugin-transform-optional-catch-binding" "^7.25.9" + "@babel/plugin-transform-optional-chaining" "^7.25.9" + "@babel/plugin-transform-parameters" "^7.25.9" + "@babel/plugin-transform-private-methods" "^7.25.9" + "@babel/plugin-transform-private-property-in-object" "^7.25.9" + "@babel/plugin-transform-property-literals" "^7.25.9" + "@babel/plugin-transform-regenerator" "^7.25.9" + "@babel/plugin-transform-regexp-modifiers" "^7.26.0" + "@babel/plugin-transform-reserved-words" "^7.25.9" + "@babel/plugin-transform-shorthand-properties" "^7.25.9" + "@babel/plugin-transform-spread" "^7.25.9" + "@babel/plugin-transform-sticky-regex" "^7.25.9" + "@babel/plugin-transform-template-literals" "^7.26.8" + "@babel/plugin-transform-typeof-symbol" "^7.26.7" + "@babel/plugin-transform-unicode-escapes" "^7.25.9" + "@babel/plugin-transform-unicode-property-regex" "^7.25.9" + "@babel/plugin-transform-unicode-regex" "^7.25.9" + "@babel/plugin-transform-unicode-sets-regex" "^7.25.9" + "@babel/preset-modules" "0.1.6-no-external-plugins" + babel-plugin-polyfill-corejs2 "^0.4.10" + babel-plugin-polyfill-corejs3 "^0.11.0" + babel-plugin-polyfill-regenerator "^0.6.1" + core-js-compat "^3.40.0" + semver "^6.3.1" + +"@babel/preset-modules@0.1.6-no-external-plugins": + version "0.1.6-no-external-plugins" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a" + integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" - "@babel/plugin-transform-dotall-regex" "^7.4.4" "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.10.0", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": - version "7.17.9" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.9.tgz#d19fbf802d01a8cb6cf053a64e472d42c434ba72" - integrity sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg== - dependencies: - regenerator-runtime "^0.13.4" - -"@babel/template@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" - integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== - dependencies: - "@babel/code-frame" "^7.16.7" - "@babel/parser" "^7.16.7" - "@babel/types" "^7.16.7" - -"@babel/traverse@^7.13.0", "@babel/traverse@^7.16.7", "@babel/traverse@^7.16.8", "@babel/traverse@^7.17.12", "@babel/traverse@^7.17.9": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.17.12.tgz#011874d2abbca0ccf1adbe38f6f7a4ff1747599c" - integrity sha512-zULPs+TbCvOkIFd4FrG53xrpxvCBwLIgo6tO0tJorY7YV2IWFxUfS/lXDJbGgfyYt9ery/Gxj2niwttNnB0gIw== - dependencies: - "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.17.12" - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-function-name" "^7.17.9" - "@babel/helper-hoist-variables" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" - "@babel/parser" "^7.17.12" - "@babel/types" "^7.17.12" - debug "^4.1.0" +"@babel/runtime@^7.0.0", "@babel/runtime@^7.10.0", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": + version "7.26.10" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.26.10.tgz#a07b4d8fa27af131a633d7b3524db803eb4764c2" + integrity sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw== + dependencies: + regenerator-runtime "^0.14.0" + +"@babel/template@^7.25.9", "@babel/template@^7.26.9": + version "7.26.9" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.26.9.tgz#4577ad3ddf43d194528cff4e1fa6b232fa609bb2" + integrity sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA== + dependencies: + "@babel/code-frame" "^7.26.2" + "@babel/parser" "^7.26.9" + "@babel/types" "^7.26.9" + +"@babel/traverse@^7.23.2", "@babel/traverse@^7.25.9", "@babel/traverse@^7.26.10", "@babel/traverse@^7.26.5", "@babel/traverse@^7.26.8", "@babel/traverse@^7.26.9": + version "7.26.10" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.10.tgz#43cca33d76005dbaa93024fae536cc1946a4c380" + integrity sha512-k8NuDrxr0WrPH5Aupqb2LCVURP/S0vBEn5mK6iH+GIYob66U5EtoZvcdudR2jQ4cmTwhEwW1DLB+Yyas9zjF6A== + dependencies: + "@babel/code-frame" "^7.26.2" + "@babel/generator" "^7.26.10" + "@babel/parser" "^7.26.10" + "@babel/template" "^7.26.9" + "@babel/types" "^7.26.10" + debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.17.12", "@babel/types@^7.4.4": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.12.tgz#1210690a516489c0200f355d87619157fbbd69a0" - integrity sha512-rH8i29wcZ6x9xjzI5ILHL/yZkbQnCERdHlogKuIb4PUr7do4iT8DPekrTbBLWTnRQm6U0GYABbTMSzijmEqlAg== +"@babel/types@^7.25.9", "@babel/types@^7.26.10", "@babel/types@^7.26.9", "@babel/types@^7.4.4": + version "7.26.10" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.10.tgz#396382f6335bd4feb65741eacfc808218f859259" + integrity sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ== dependencies: - "@babel/helper-validator-identifier" "^7.16.7" - to-fast-properties "^2.0.0" + "@babel/helper-string-parser" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + +"@develar/schema-utils@~2.6.5": + version "2.6.5" + resolved "https://registry.yarnpkg.com/@develar/schema-utils/-/schema-utils-2.6.5.tgz#3ece22c5838402419a6e0425f85742b961d9b6c6" + integrity sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig== + dependencies: + ajv "^6.12.0" + ajv-keywords "^3.4.1" "@discoveryjs/json-ext@^0.5.0": version "0.5.7" resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== -"@electron/get@^1.12.4", "@electron/get@^1.13.0": - version "1.14.1" - resolved "https://registry.yarnpkg.com/@electron/get/-/get-1.14.1.tgz#16ba75f02dffb74c23965e72d617adc721d27f40" - integrity sha512-BrZYyL/6m0ZXz/lDxy/nlVhQz+WF+iPS6qXolEU8atw7h6v1aYkjwJZ63m+bJMBTxDE66X+r2tPS4a/8C82sZw== +"@electron/asar@^3.2.1": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@electron/asar/-/asar-3.3.1.tgz#cd14e897770d9844673dd7c1dc8944e086e1e0ea" + integrity sha512-WtpC/+34p0skWZiarRjLAyqaAX78DofhDxnREy/V5XHfu1XEXbFCSSMcDQ6hNCPJFaPy8/NnUgYuf9uiCkvKPg== + dependencies: + commander "^5.0.0" + glob "^7.1.6" + minimatch "^3.0.4" + +"@electron/get@^2.0.0": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@electron/get/-/get-2.0.3.tgz#fba552683d387aebd9f3fcadbcafc8e12ee4f960" + integrity sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ== dependencies: debug "^4.1.1" env-paths "^2.2.0" fs-extra "^8.1.0" - got "^9.6.0" + got "^11.8.5" progress "^2.0.3" semver "^6.2.0" sumchecker "^3.0.1" optionalDependencies: global-agent "^3.0.0" - global-tunnel-ng "^2.7.1" -"@electron/remote@^2.0.1 <2.0.4 || >2.0.4": - version "2.0.8" - resolved "https://registry.yarnpkg.com/@electron/remote/-/remote-2.0.8.tgz#85ff321f0490222993207106e2f720273bb1a5c3" - integrity sha512-P10v3+iFCIvEPeYzTWWGwwHmqWnjoh8RYnbtZAb3RlQefy4guagzIwcWtfftABIfm6JJTNQf4WPSKWZOpLmHXw== - -"@emotion/cache@^10.0.27", "@emotion/cache@^10.0.9": - version "10.0.29" - resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-10.0.29.tgz#87e7e64f412c060102d589fe7c6dc042e6f9d1e0" - integrity sha512-fU2VtSVlHiF27empSbxi1O2JFdNWZO+2NFHfwO0pxgTep6Xa3uGb+3pVKfLww2l/IBGLNEZl5Xf/++A4wAYDYQ== - dependencies: - "@emotion/sheet" "0.9.4" - "@emotion/stylis" "0.8.5" - "@emotion/utils" "0.11.3" - "@emotion/weak-memoize" "0.2.5" - -"@emotion/core@^10.0.9": - version "10.3.1" - resolved "https://registry.yarnpkg.com/@emotion/core/-/core-10.3.1.tgz#4021b6d8b33b3304d48b0bb478485e7d7421c69d" - integrity sha512-447aUEjPIm0MnE6QYIaFz9VQOHSXf4Iu6EWOIqq11EAPqinkSZmfymPTmlOE3QjLv846lH4JVZBUOtwGbuQoww== - dependencies: - "@babel/runtime" "^7.5.5" - "@emotion/cache" "^10.0.27" - "@emotion/css" "^10.0.27" - "@emotion/serialize" "^0.11.15" - "@emotion/sheet" "0.9.4" - "@emotion/utils" "0.11.3" - -"@emotion/css@^10.0.27", "@emotion/css@^10.0.9": - version "10.0.27" - resolved "https://registry.yarnpkg.com/@emotion/css/-/css-10.0.27.tgz#3a7458198fbbebb53b01b2b87f64e5e21241e14c" - integrity sha512-6wZjsvYeBhyZQYNrGoR5yPMYbMBNEnanDrqmsqS1mzDm1cOTu12shvl2j4QHNS36UaTE0USIJawCH9C8oW34Zw== - dependencies: - "@emotion/serialize" "^0.11.15" - "@emotion/utils" "0.11.3" - babel-plugin-emotion "^10.0.27" - -"@emotion/hash@0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413" - integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow== - -"@emotion/memoize@0.7.4": - version "0.7.4" - resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.4.tgz#19bf0f5af19149111c40d98bb0cf82119f5d9eeb" - integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw== - -"@emotion/serialize@^0.11.15", "@emotion/serialize@^0.11.16": - version "0.11.16" - resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-0.11.16.tgz#dee05f9e96ad2fb25a5206b6d759b2d1ed3379ad" - integrity sha512-G3J4o8by0VRrO+PFeSc3js2myYNOXVJ3Ya+RGVxnshRYgsvErfAOglKAiy1Eo1vhzxqtUvjCyS5gtewzkmvSSg== - dependencies: - "@emotion/hash" "0.8.0" - "@emotion/memoize" "0.7.4" - "@emotion/unitless" "0.7.5" - "@emotion/utils" "0.11.3" - csstype "^2.5.7" - -"@emotion/sheet@0.9.4": - version "0.9.4" - resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-0.9.4.tgz#894374bea39ec30f489bbfc3438192b9774d32e5" - integrity sha512-zM9PFmgVSqBw4zL101Q0HrBVTGmpAxFZH/pYx/cjJT5advXguvcgjHFTCaIO3enL/xr89vK2bh0Mfyj9aa0ANA== - -"@emotion/stylis@0.8.5": - version "0.8.5" - resolved "https://registry.yarnpkg.com/@emotion/stylis/-/stylis-0.8.5.tgz#deacb389bd6ee77d1e7fcaccce9e16c5c7e78e04" - integrity sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ== - -"@emotion/unitless@0.7.5": - version "0.7.5" - resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed" - integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== - -"@emotion/utils@0.11.3": - version "0.11.3" - resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-0.11.3.tgz#a759863867befa7e583400d322652a3f44820924" - integrity sha512-0o4l6pZC+hI88+bzuaX/6BgOvQVhbt2PfmxauVaYOGgbsAw14wdKyvMCZXnsnsHys94iadcF+RG/wZyx6+ZZBw== - -"@emotion/weak-memoize@0.2.5": - version "0.2.5" - resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz#8eed982e2ee6f7f4e44c253e12962980791efd46" - integrity sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA== - -"@eslint/eslintrc@^0.4.3": - version "0.4.3" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" - integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== +"@electron/notarize@2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@electron/notarize/-/notarize-2.2.1.tgz#d0aa6bc43cba830c41bfd840b85dbe0e273f59fe" + integrity sha512-aL+bFMIkpR0cmmj5Zgy0LMKEpgy43/hw5zadEArgmAMWWlKc5buwFvFT9G/o/YJkvXAJm5q3iuTuLaiaXW39sg== dependencies: - ajv "^6.12.4" debug "^4.1.1" - espree "^7.3.0" - globals "^13.9.0" - ignore "^4.0.6" - import-fresh "^3.2.1" - js-yaml "^3.13.1" - minimatch "^3.0.4" - strip-json-comments "^3.1.1" - -"@evocateur/libnpmaccess@^3.1.2": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@evocateur/libnpmaccess/-/libnpmaccess-3.1.2.tgz#ecf7f6ce6b004e9f942b098d92200be4a4b1c845" - integrity sha512-KSCAHwNWro0CF2ukxufCitT9K5LjL/KuMmNzSu8wuwN2rjyKHD8+cmOsiybK+W5hdnwc5M1SmRlVCaMHQo+3rg== - dependencies: - "@evocateur/npm-registry-fetch" "^4.0.0" - aproba "^2.0.0" - figgy-pudding "^3.5.1" - get-stream "^4.0.0" - npm-package-arg "^6.1.0" - -"@evocateur/libnpmpublish@^1.2.2": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@evocateur/libnpmpublish/-/libnpmpublish-1.2.2.tgz#55df09d2dca136afba9c88c759ca272198db9f1a" - integrity sha512-MJrrk9ct1FeY9zRlyeoyMieBjGDG9ihyyD9/Ft6MMrTxql9NyoEx2hw9casTIP4CdqEVu+3nQ2nXxoJ8RCXyFg== - dependencies: - "@evocateur/npm-registry-fetch" "^4.0.0" - aproba "^2.0.0" - figgy-pudding "^3.5.1" - get-stream "^4.0.0" - lodash.clonedeep "^4.5.0" - normalize-package-data "^2.4.0" - npm-package-arg "^6.1.0" - semver "^5.5.1" - ssri "^6.0.1" - -"@evocateur/npm-registry-fetch@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@evocateur/npm-registry-fetch/-/npm-registry-fetch-4.0.0.tgz#8c4c38766d8d32d3200fcb0a83f064b57365ed66" - integrity sha512-k1WGfKRQyhJpIr+P17O5vLIo2ko1PFLKwoetatdduUSt/aQ4J2sJrJwwatdI5Z3SiYk/mRH9S3JpdmMFd/IK4g== - dependencies: - JSONStream "^1.3.4" - bluebird "^3.5.1" - figgy-pudding "^3.4.1" - lru-cache "^5.1.1" - make-fetch-happen "^5.0.0" - npm-package-arg "^6.1.0" - safe-buffer "^5.1.2" - -"@evocateur/pacote@^9.6.3": - version "9.6.5" - resolved "https://registry.yarnpkg.com/@evocateur/pacote/-/pacote-9.6.5.tgz#33de32ba210b6f17c20ebab4d497efc6755f4ae5" - integrity sha512-EI552lf0aG2nOV8NnZpTxNo2PcXKPmDbF9K8eCBFQdIZwHNGN/mi815fxtmUMa2wTa1yndotICIDt/V0vpEx2w== - dependencies: - "@evocateur/npm-registry-fetch" "^4.0.0" - bluebird "^3.5.3" - cacache "^12.0.3" - chownr "^1.1.2" - figgy-pudding "^3.5.1" - get-stream "^4.1.0" - glob "^7.1.4" - infer-owner "^1.0.4" - lru-cache "^5.1.1" - make-fetch-happen "^5.0.0" - minimatch "^3.0.4" - minipass "^2.3.5" - mississippi "^3.0.0" - mkdirp "^0.5.1" - normalize-package-data "^2.5.0" - npm-package-arg "^6.1.0" - npm-packlist "^1.4.4" - npm-pick-manifest "^3.0.0" - osenv "^0.1.5" - promise-inflight "^1.0.1" - promise-retry "^1.1.1" - protoduck "^5.0.1" - rimraf "^2.6.3" - safe-buffer "^5.2.0" - semver "^5.7.0" - ssri "^6.0.1" - tar "^4.4.10" - unique-filename "^1.1.1" - which "^1.3.1" - -"@gar/promisify@^1.0.1", "@gar/promisify@^1.1.3": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" - integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== - -"@grpc/grpc-js@^1.6.7": - version "1.6.7" - resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.6.7.tgz#4c4fa998ff719fe859ac19fe977fdef097bb99aa" - integrity sha512-eBM03pu9hd3VqDQG+kHahiG1x80RGkkqqRb1Pchcwqej/KkAH95gAvKs6laqaHCycYaPK+TKuNQnOz9UXYA8qw== - dependencies: - "@grpc/proto-loader" "^0.6.4" - "@types/node" ">=12.12.47" + fs-extra "^9.0.1" + promise-retry "^2.0.1" -"@grpc/proto-loader@^0.6.4": - version "0.6.12" - resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.6.12.tgz#459b619b8b9b67794bf0d1cb819653a38c63e164" - integrity sha512-filTVbETFnxb9CyRX98zN18ilChTuf/C5scZ2xyaOTp0EHGq0/ufX8rjqXUcSb1Gpv7eZq4M2jDvbh9BogKnrg== +"@electron/osx-sign@1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@electron/osx-sign/-/osx-sign-1.0.5.tgz#0af7149f2fce44d1a8215660fd25a9fb610454d8" + integrity sha512-k9ZzUQtamSoweGQDV2jILiRIHUu7lYlJ3c6IEmjv1hC17rclE+eb9U+f6UFlOOETo0JzY1HNlXy4YOlCvl+Lww== dependencies: - "@types/long" "^4.0.1" - lodash.camelcase "^4.3.0" - long "^4.0.0" - protobufjs "^6.10.0" - yargs "^16.2.0" + compare-version "^0.1.2" + debug "^4.3.4" + fs-extra "^10.0.0" + isbinaryfile "^4.0.8" + minimist "^1.2.6" + plist "^3.0.5" -"@humanwhocodes/config-array@^0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" - integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== +"@electron/universal@1.5.1": + version "1.5.1" + resolved "https://registry.yarnpkg.com/@electron/universal/-/universal-1.5.1.tgz#f338bc5bcefef88573cf0ab1d5920fac10d06ee5" + integrity sha512-kbgXxyEauPJiQQUNG2VgUeyfQNFk6hBF11ISN2PNI6agUgPl55pv4eQmaqHzTAzchBvqZ2tQuRVaPStGf0mxGw== dependencies: - "@humanwhocodes/object-schema" "^1.2.0" - debug "^4.1.1" + "@electron/asar" "^3.2.1" + "@malept/cross-spawn-promise" "^1.1.0" + debug "^4.3.1" + dir-compare "^3.0.0" + fs-extra "^9.0.1" minimatch "^3.0.4" + plist "^3.0.4" -"@humanwhocodes/object-schema@^1.2.0": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" - integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== - -"@jridgewell/gen-mapping@^0.1.0": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" - integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== - dependencies: - "@jridgewell/set-array" "^1.0.0" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@jridgewell/gen-mapping@^0.3.0": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz#cf92a983c83466b8c0ce9124fadeaf09f7c66ea9" - integrity sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg== +"@emotion/babel-plugin@^11.13.5": + version "11.13.5" + resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz#eab8d65dbded74e0ecfd28dc218e75607c4e7bc0" + integrity sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ== dependencies: - "@jridgewell/set-array" "^1.0.0" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/resolve-uri@^3.0.3": - version "3.0.7" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz#30cd49820a962aff48c8fffc5cd760151fca61fe" - integrity sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA== - -"@jridgewell/set-array@^1.0.0": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.1.tgz#36a6acc93987adcf0ba50c66908bd0b70de8afea" - integrity sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ== - -"@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.13" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz#b6461fb0c2964356c469e115f504c95ad97ab88c" - integrity sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w== + "@babel/helper-module-imports" "^7.16.7" + "@babel/runtime" "^7.18.3" + "@emotion/hash" "^0.9.2" + "@emotion/memoize" "^0.9.0" + "@emotion/serialize" "^1.3.3" + babel-plugin-macros "^3.1.0" + convert-source-map "^1.5.0" + escape-string-regexp "^4.0.0" + find-root "^1.1.0" + source-map "^0.5.7" + stylis "4.2.0" -"@jridgewell/trace-mapping@^0.3.9": - version "0.3.13" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz#dcfe3e95f224c8fe97a87a5235defec999aa92ea" - integrity sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w== +"@emotion/cache@^11.14.0", "@emotion/cache@^11.4.0": + version "11.14.0" + resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.14.0.tgz#ee44b26986eeb93c8be82bb92f1f7a9b21b2ed76" + integrity sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA== dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@lerna/add@3.21.0": - version "3.21.0" - resolved "https://registry.yarnpkg.com/@lerna/add/-/add-3.21.0.tgz#27007bde71cc7b0a2969ab3c2f0ae41578b4577b" - integrity sha512-vhUXXF6SpufBE1EkNEXwz1VLW03f177G9uMOFMQkp6OJ30/PWg4Ekifuz9/3YfgB2/GH8Tu4Lk3O51P2Hskg/A== - dependencies: - "@evocateur/pacote" "^9.6.3" - "@lerna/bootstrap" "3.21.0" - "@lerna/command" "3.21.0" - "@lerna/filter-options" "3.20.0" - "@lerna/npm-conf" "3.16.0" - "@lerna/validation-error" "3.13.0" - dedent "^0.7.0" - npm-package-arg "^6.1.0" - p-map "^2.1.0" - semver "^6.2.0" - -"@lerna/bootstrap@3.21.0": - version "3.21.0" - resolved "https://registry.yarnpkg.com/@lerna/bootstrap/-/bootstrap-3.21.0.tgz#bcd1b651be5b0970b20d8fae04c864548123aed6" - integrity sha512-mtNHlXpmvJn6JTu0KcuTTPl2jLsDNud0QacV/h++qsaKbhAaJr/FElNZ5s7MwZFUM3XaDmvWzHKaszeBMHIbBw== - dependencies: - "@lerna/command" "3.21.0" - "@lerna/filter-options" "3.20.0" - "@lerna/has-npm-version" "3.16.5" - "@lerna/npm-install" "3.16.5" - "@lerna/package-graph" "3.18.5" - "@lerna/pulse-till-done" "3.13.0" - "@lerna/rimraf-dir" "3.16.5" - "@lerna/run-lifecycle" "3.16.2" - "@lerna/run-topologically" "3.18.5" - "@lerna/symlink-binary" "3.17.0" - "@lerna/symlink-dependencies" "3.17.0" - "@lerna/validation-error" "3.13.0" - dedent "^0.7.0" - get-port "^4.2.0" - multimatch "^3.0.0" - npm-package-arg "^6.1.0" - npmlog "^4.1.2" - p-finally "^1.0.0" - p-map "^2.1.0" - p-map-series "^1.0.0" - p-waterfall "^1.0.0" - read-package-tree "^5.1.6" - semver "^6.2.0" + "@emotion/memoize" "^0.9.0" + "@emotion/sheet" "^1.4.0" + "@emotion/utils" "^1.4.2" + "@emotion/weak-memoize" "^0.4.0" + stylis "4.2.0" -"@lerna/changed@3.21.0": - version "3.21.0" - resolved "https://registry.yarnpkg.com/@lerna/changed/-/changed-3.21.0.tgz#108e15f679bfe077af500f58248c634f1044ea0b" - integrity sha512-hzqoyf8MSHVjZp0gfJ7G8jaz+++mgXYiNs9iViQGA8JlN/dnWLI5sWDptEH3/B30Izo+fdVz0S0s7ydVE3pWIw== - dependencies: - "@lerna/collect-updates" "3.20.0" - "@lerna/command" "3.21.0" - "@lerna/listable" "3.18.5" - "@lerna/output" "3.13.0" +"@emotion/hash@^0.9.2": + version "0.9.2" + resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.2.tgz#ff9221b9f58b4dfe61e619a7788734bd63f6898b" + integrity sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g== -"@lerna/check-working-tree@3.16.5": - version "3.16.5" - resolved "https://registry.yarnpkg.com/@lerna/check-working-tree/-/check-working-tree-3.16.5.tgz#b4f8ae61bb4523561dfb9f8f8d874dd46bb44baa" - integrity sha512-xWjVBcuhvB8+UmCSb5tKVLB5OuzSpw96WEhS2uz6hkWVa/Euh1A0/HJwn2cemyK47wUrCQXtczBUiqnq9yX5VQ== +"@emotion/memoize@^0.9.0": + version "0.9.0" + resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.9.0.tgz#745969d649977776b43fc7648c556aaa462b4102" + integrity sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ== + +"@emotion/react@^11.8.1": + version "11.14.0" + resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.14.0.tgz#cfaae35ebc67dd9ef4ea2e9acc6cd29e157dd05d" + integrity sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA== + dependencies: + "@babel/runtime" "^7.18.3" + "@emotion/babel-plugin" "^11.13.5" + "@emotion/cache" "^11.14.0" + "@emotion/serialize" "^1.3.3" + "@emotion/use-insertion-effect-with-fallbacks" "^1.2.0" + "@emotion/utils" "^1.4.2" + "@emotion/weak-memoize" "^0.4.0" + hoist-non-react-statics "^3.3.1" + +"@emotion/serialize@^1.3.3": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.3.3.tgz#d291531005f17d704d0463a032fe679f376509e8" + integrity sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA== dependencies: - "@lerna/collect-uncommitted" "3.16.5" - "@lerna/describe-ref" "3.16.5" - "@lerna/validation-error" "3.13.0" + "@emotion/hash" "^0.9.2" + "@emotion/memoize" "^0.9.0" + "@emotion/unitless" "^0.10.0" + "@emotion/utils" "^1.4.2" + csstype "^3.0.2" -"@lerna/child-process@3.16.5": - version "3.16.5" - resolved "https://registry.yarnpkg.com/@lerna/child-process/-/child-process-3.16.5.tgz#38fa3c18064aa4ac0754ad80114776a7b36a69b2" - integrity sha512-vdcI7mzei9ERRV4oO8Y1LHBZ3A5+ampRKg1wq5nutLsUA4mEBN6H7JqjWOMY9xZemv6+kATm2ofjJ3lW5TszQg== - dependencies: - chalk "^2.3.1" - execa "^1.0.0" - strong-log-transformer "^2.0.0" +"@emotion/sheet@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.4.0.tgz#c9299c34d248bc26e82563735f78953d2efca83c" + integrity sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg== -"@lerna/clean@3.21.0": - version "3.21.0" - resolved "https://registry.yarnpkg.com/@lerna/clean/-/clean-3.21.0.tgz#c0b46b5300cc3dae2cda3bec14b803082da3856d" - integrity sha512-b/L9l+MDgE/7oGbrav6rG8RTQvRiZLO1zTcG17zgJAAuhlsPxJExMlh2DFwJEVi2les70vMhHfST3Ue1IMMjpg== - dependencies: - "@lerna/command" "3.21.0" - "@lerna/filter-options" "3.20.0" - "@lerna/prompt" "3.18.5" - "@lerna/pulse-till-done" "3.13.0" - "@lerna/rimraf-dir" "3.16.5" - p-map "^2.1.0" - p-map-series "^1.0.0" - p-waterfall "^1.0.0" - -"@lerna/cli@3.18.5": - version "3.18.5" - resolved "https://registry.yarnpkg.com/@lerna/cli/-/cli-3.18.5.tgz#c90c461542fcd35b6d5b015a290fb0dbfb41d242" - integrity sha512-erkbxkj9jfc89vVs/jBLY/fM0I80oLmJkFUV3Q3wk9J3miYhP14zgVEBsPZY68IZlEjT6T3Xlq2xO1AVaatHsA== - dependencies: - "@lerna/global-options" "3.13.0" - dedent "^0.7.0" - npmlog "^4.1.2" - yargs "^14.2.2" - -"@lerna/collect-uncommitted@3.16.5": - version "3.16.5" - resolved "https://registry.yarnpkg.com/@lerna/collect-uncommitted/-/collect-uncommitted-3.16.5.tgz#a494d61aac31cdc7aec4bbe52c96550274132e63" - integrity sha512-ZgqnGwpDZiWyzIQVZtQaj9tRizsL4dUOhuOStWgTAw1EMe47cvAY2kL709DzxFhjr6JpJSjXV5rZEAeU3VE0Hg== - dependencies: - "@lerna/child-process" "3.16.5" - chalk "^2.3.1" - figgy-pudding "^3.5.1" - npmlog "^4.1.2" - -"@lerna/collect-updates@3.20.0": - version "3.20.0" - resolved "https://registry.yarnpkg.com/@lerna/collect-updates/-/collect-updates-3.20.0.tgz#62f9d76ba21a25b7d9fbf31c02de88744a564bd1" - integrity sha512-qBTVT5g4fupVhBFuY4nI/3FSJtQVcDh7/gEPOpRxoXB/yCSnT38MFHXWl+y4einLciCjt/+0x6/4AG80fjay2Q== - dependencies: - "@lerna/child-process" "3.16.5" - "@lerna/describe-ref" "3.16.5" - minimatch "^3.0.4" - npmlog "^4.1.2" - slash "^2.0.0" +"@emotion/unitless@^0.10.0": + version "0.10.0" + resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.10.0.tgz#2af2f7c7e5150f497bdabd848ce7b218a27cf745" + integrity sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg== -"@lerna/command@3.21.0": - version "3.21.0" - resolved "https://registry.yarnpkg.com/@lerna/command/-/command-3.21.0.tgz#9a2383759dc7b700dacfa8a22b2f3a6e190121f7" - integrity sha512-T2bu6R8R3KkH5YoCKdutKv123iUgUbW8efVjdGCDnCMthAQzoentOJfDeodBwn0P2OqCl3ohsiNVtSn9h78fyQ== - dependencies: - "@lerna/child-process" "3.16.5" - "@lerna/package-graph" "3.18.5" - "@lerna/project" "3.21.0" - "@lerna/validation-error" "3.13.0" - "@lerna/write-log-file" "3.13.0" - clone-deep "^4.0.1" - dedent "^0.7.0" - execa "^1.0.0" - is-ci "^2.0.0" - npmlog "^4.1.2" - -"@lerna/conventional-commits@3.22.0": - version "3.22.0" - resolved "https://registry.yarnpkg.com/@lerna/conventional-commits/-/conventional-commits-3.22.0.tgz#2798f4881ee2ef457bdae027ab7d0bf0af6f1e09" - integrity sha512-z4ZZk1e8Mhz7+IS8NxHr64wyklHctCJyWpJKEZZPJiLFJ8yKto/x38O80R10pIzC0rr8Sy/OsjSH4bl0TbbgqA== - dependencies: - "@lerna/validation-error" "3.13.0" - conventional-changelog-angular "^5.0.3" - conventional-changelog-core "^3.1.6" - conventional-recommended-bump "^5.0.0" - fs-extra "^8.1.0" - get-stream "^4.0.0" - lodash.template "^4.5.0" - npm-package-arg "^6.1.0" - npmlog "^4.1.2" - pify "^4.0.1" - semver "^6.2.0" +"@emotion/use-insertion-effect-with-fallbacks@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz#8a8cb77b590e09affb960f4ff1e9a89e532738bf" + integrity sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg== -"@lerna/create-symlink@3.16.2": - version "3.16.2" - resolved "https://registry.yarnpkg.com/@lerna/create-symlink/-/create-symlink-3.16.2.tgz#412cb8e59a72f5a7d9463e4e4721ad2070149967" - integrity sha512-pzXIJp6av15P325sgiIRpsPXLFmkisLhMBCy4764d+7yjf2bzrJ4gkWVMhsv4AdF0NN3OyZ5jjzzTtLNqfR+Jw== - dependencies: - "@zkochan/cmd-shim" "^3.1.0" - fs-extra "^8.1.0" - npmlog "^4.1.2" - -"@lerna/create@3.22.0": - version "3.22.0" - resolved "https://registry.yarnpkg.com/@lerna/create/-/create-3.22.0.tgz#d6bbd037c3dc5b425fe5f6d1b817057c278f7619" - integrity sha512-MdiQQzCcB4E9fBF1TyMOaAEz9lUjIHp1Ju9H7f3lXze5JK6Fl5NYkouAvsLgY6YSIhXMY8AHW2zzXeBDY4yWkw== - dependencies: - "@evocateur/pacote" "^9.6.3" - "@lerna/child-process" "3.16.5" - "@lerna/command" "3.21.0" - "@lerna/npm-conf" "3.16.0" - "@lerna/validation-error" "3.13.0" - camelcase "^5.0.0" - dedent "^0.7.0" - fs-extra "^8.1.0" - globby "^9.2.0" - init-package-json "^1.10.3" - npm-package-arg "^6.1.0" - p-reduce "^1.0.0" - pify "^4.0.1" - semver "^6.2.0" - slash "^2.0.0" - validate-npm-package-license "^3.0.3" - validate-npm-package-name "^3.0.0" - whatwg-url "^7.0.0" +"@emotion/utils@^1.4.2": + version "1.4.2" + resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.4.2.tgz#6df6c45881fcb1c412d6688a311a98b7f59c1b52" + integrity sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA== -"@lerna/describe-ref@3.16.5": - version "3.16.5" - resolved "https://registry.yarnpkg.com/@lerna/describe-ref/-/describe-ref-3.16.5.tgz#a338c25aaed837d3dc70b8a72c447c5c66346ac0" - integrity sha512-c01+4gUF0saOOtDBzbLMFOTJDHTKbDFNErEY6q6i9QaXuzy9LNN62z+Hw4acAAZuJQhrVWncVathcmkkjvSVGw== - dependencies: - "@lerna/child-process" "3.16.5" - npmlog "^4.1.2" +"@emotion/weak-memoize@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz#5e13fac887f08c44f76b0ccaf3370eb00fec9bb6" + integrity sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg== -"@lerna/diff@3.21.0": - version "3.21.0" - resolved "https://registry.yarnpkg.com/@lerna/diff/-/diff-3.21.0.tgz#e6df0d8b9916167ff5a49fcb02ac06424280a68d" - integrity sha512-5viTR33QV3S7O+bjruo1SaR40m7F2aUHJaDAC7fL9Ca6xji+aw1KFkpCtVlISS0G8vikUREGMJh+c/VMSc8Usw== +"@eslint-community/eslint-utils@^4.2.0": + version "4.5.1" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.5.1.tgz#b0fc7e06d0c94f801537fd4237edc2706d3b8e4c" + integrity sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w== dependencies: - "@lerna/child-process" "3.16.5" - "@lerna/command" "3.21.0" - "@lerna/validation-error" "3.13.0" - npmlog "^4.1.2" + eslint-visitor-keys "^3.4.3" -"@lerna/exec@3.21.0": - version "3.21.0" - resolved "https://registry.yarnpkg.com/@lerna/exec/-/exec-3.21.0.tgz#17f07533893cb918a17b41bcc566dc437016db26" - integrity sha512-iLvDBrIE6rpdd4GIKTY9mkXyhwsJ2RvQdB9ZU+/NhR3okXfqKc6py/24tV111jqpXTtZUW6HNydT4dMao2hi1Q== - dependencies: - "@lerna/child-process" "3.16.5" - "@lerna/command" "3.21.0" - "@lerna/filter-options" "3.20.0" - "@lerna/profiler" "3.20.0" - "@lerna/run-topologically" "3.18.5" - "@lerna/validation-error" "3.13.0" - p-map "^2.1.0" - -"@lerna/filter-options@3.20.0": - version "3.20.0" - resolved "https://registry.yarnpkg.com/@lerna/filter-options/-/filter-options-3.20.0.tgz#0f0f5d5a4783856eece4204708cc902cbc8af59b" - integrity sha512-bmcHtvxn7SIl/R9gpiNMVG7yjx7WyT0HSGw34YVZ9B+3xF/83N3r5Rgtjh4hheLZ+Q91Or0Jyu5O3Nr+AwZe2g== - dependencies: - "@lerna/collect-updates" "3.20.0" - "@lerna/filter-packages" "3.18.0" - dedent "^0.7.0" - figgy-pudding "^3.5.1" - npmlog "^4.1.2" +"@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1": + version "4.12.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" + integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== -"@lerna/filter-packages@3.18.0": - version "3.18.0" - resolved "https://registry.yarnpkg.com/@lerna/filter-packages/-/filter-packages-3.18.0.tgz#6a7a376d285208db03a82958cfb8172e179b4e70" - integrity sha512-6/0pMM04bCHNATIOkouuYmPg6KH3VkPCIgTfQmdkPJTullERyEQfNUKikrefjxo1vHOoCACDpy65JYyKiAbdwQ== +"@eslint/eslintrc@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" + integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== dependencies: - "@lerna/validation-error" "3.13.0" - multimatch "^3.0.0" - npmlog "^4.1.2" + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.6.0" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" -"@lerna/get-npm-exec-opts@3.13.0": - version "3.13.0" - resolved "https://registry.yarnpkg.com/@lerna/get-npm-exec-opts/-/get-npm-exec-opts-3.13.0.tgz#d1b552cb0088199fc3e7e126f914e39a08df9ea5" - integrity sha512-Y0xWL0rg3boVyJk6An/vurKzubyJKtrxYv2sj4bB8Mc5zZ3tqtv0ccbOkmkXKqbzvNNF7VeUt1OJ3DRgtC/QZw== - dependencies: - npmlog "^4.1.2" +"@eslint/js@8.57.1": + version "8.57.1" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2" + integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== -"@lerna/get-packed@3.16.0": - version "3.16.0" - resolved "https://registry.yarnpkg.com/@lerna/get-packed/-/get-packed-3.16.0.tgz#1b316b706dcee86c7baa55e50b087959447852ff" - integrity sha512-AjsFiaJzo1GCPnJUJZiTW6J1EihrPkc2y3nMu6m3uWFxoleklsSCyImumzVZJssxMi3CPpztj8LmADLedl9kXw== +"@floating-ui/core@^1.6.0": + version "1.6.9" + resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.6.9.tgz#64d1da251433019dafa091de9b2886ff35ec14e6" + integrity sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw== dependencies: - fs-extra "^8.1.0" - ssri "^6.0.1" - tar "^4.4.8" - -"@lerna/github-client@3.22.0": - version "3.22.0" - resolved "https://registry.yarnpkg.com/@lerna/github-client/-/github-client-3.22.0.tgz#5d816aa4f76747ed736ae64ff962b8f15c354d95" - integrity sha512-O/GwPW+Gzr3Eb5bk+nTzTJ3uv+jh5jGho9BOqKlajXaOkMYGBELEAqV5+uARNGWZFvYAiF4PgqHb6aCUu7XdXg== - dependencies: - "@lerna/child-process" "3.16.5" - "@octokit/plugin-enterprise-rest" "^6.0.1" - "@octokit/rest" "^16.28.4" - git-url-parse "^11.1.2" - npmlog "^4.1.2" - -"@lerna/gitlab-client@3.15.0": - version "3.15.0" - resolved "https://registry.yarnpkg.com/@lerna/gitlab-client/-/gitlab-client-3.15.0.tgz#91f4ec8c697b5ac57f7f25bd50fe659d24aa96a6" - integrity sha512-OsBvRSejHXUBMgwWQqNoioB8sgzL/Pf1pOUhHKtkiMl6aAWjklaaq5HPMvTIsZPfS6DJ9L5OK2GGZuooP/5c8Q== - dependencies: - node-fetch "^2.5.0" - npmlog "^4.1.2" - whatwg-url "^7.0.0" - -"@lerna/global-options@3.13.0": - version "3.13.0" - resolved "https://registry.yarnpkg.com/@lerna/global-options/-/global-options-3.13.0.tgz#217662290db06ad9cf2c49d8e3100ee28eaebae1" - integrity sha512-SlZvh1gVRRzYLVluz9fryY1nJpZ0FHDGB66U9tFfvnnxmueckRQxLopn3tXj3NU1kc3QANT2I5BsQkOqZ4TEFQ== - -"@lerna/has-npm-version@3.16.5": - version "3.16.5" - resolved "https://registry.yarnpkg.com/@lerna/has-npm-version/-/has-npm-version-3.16.5.tgz#ab83956f211d8923ea6afe9b979b38cc73b15326" - integrity sha512-WL7LycR9bkftyqbYop5rEGJ9sRFIV55tSGmbN1HLrF9idwOCD7CLrT64t235t3t4O5gehDnwKI5h2U3oxTrF8Q== - dependencies: - "@lerna/child-process" "3.16.5" - semver "^6.2.0" + "@floating-ui/utils" "^0.2.9" -"@lerna/import@3.22.0": - version "3.22.0" - resolved "https://registry.yarnpkg.com/@lerna/import/-/import-3.22.0.tgz#1a5f0394f38e23c4f642a123e5e1517e70d068d2" - integrity sha512-uWOlexasM5XR6tXi4YehODtH9Y3OZrFht3mGUFFT3OIl2s+V85xIGFfqFGMTipMPAGb2oF1UBLL48kR43hRsOg== +"@floating-ui/dom@^1.0.1": + version "1.6.13" + resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.6.13.tgz#a8a938532aea27a95121ec16e667a7cbe8c59e34" + integrity sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w== dependencies: - "@lerna/child-process" "3.16.5" - "@lerna/command" "3.21.0" - "@lerna/prompt" "3.18.5" - "@lerna/pulse-till-done" "3.13.0" - "@lerna/validation-error" "3.13.0" - dedent "^0.7.0" - fs-extra "^8.1.0" - p-map-series "^1.0.0" + "@floating-ui/core" "^1.6.0" + "@floating-ui/utils" "^0.2.9" -"@lerna/info@3.21.0": - version "3.21.0" - resolved "https://registry.yarnpkg.com/@lerna/info/-/info-3.21.0.tgz#76696b676fdb0f35d48c83c63c1e32bb5e37814f" - integrity sha512-0XDqGYVBgWxUquFaIptW2bYSIu6jOs1BtkvRTWDDhw4zyEdp6q4eaMvqdSap1CG+7wM5jeLCi6z94wS0AuiuwA== - dependencies: - "@lerna/command" "3.21.0" - "@lerna/output" "3.13.0" - envinfo "^7.3.1" +"@floating-ui/utils@^0.2.9": + version "0.2.9" + resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.9.tgz#50dea3616bc8191fb8e112283b49eaff03e78429" + integrity sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg== -"@lerna/init@3.21.0": - version "3.21.0" - resolved "https://registry.yarnpkg.com/@lerna/init/-/init-3.21.0.tgz#1e810934dc8bf4e5386c031041881d3b4096aa5c" - integrity sha512-6CM0z+EFUkFfurwdJCR+LQQF6MqHbYDCBPyhu/d086LRf58GtYZYj49J8mKG9ktayp/TOIxL/pKKjgLD8QBPOg== - dependencies: - "@lerna/child-process" "3.16.5" - "@lerna/command" "3.21.0" - fs-extra "^8.1.0" - p-map "^2.1.0" - write-json-file "^3.2.0" +"@gar/promisify@^1.1.3": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" + integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== -"@lerna/link@3.21.0": - version "3.21.0" - resolved "https://registry.yarnpkg.com/@lerna/link/-/link-3.21.0.tgz#8be68ff0ccee104b174b5bbd606302c2f06e9d9b" - integrity sha512-tGu9GxrX7Ivs+Wl3w1+jrLi1nQ36kNI32dcOssij6bg0oZ2M2MDEFI9UF2gmoypTaN9uO5TSsjCFS7aR79HbdQ== +"@grpc/grpc-js@^1.8.14": + version "1.13.0" + resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.13.0.tgz#69c229eacb77f3468afa9d375c23dc9b694d1af9" + integrity sha512-pMuxInZjUnUkgMT2QLZclRqwk2ykJbIU05aZgPgJYXEpN9+2I7z7aNwcjWZSycRPl232FfhPszyBFJyOxTHNog== dependencies: - "@lerna/command" "3.21.0" - "@lerna/package-graph" "3.18.5" - "@lerna/symlink-dependencies" "3.17.0" - p-map "^2.1.0" - slash "^2.0.0" + "@grpc/proto-loader" "^0.7.13" + "@js-sdsl/ordered-map" "^4.4.2" -"@lerna/list@3.21.0": - version "3.21.0" - resolved "https://registry.yarnpkg.com/@lerna/list/-/list-3.21.0.tgz#42f76fafa56dea13b691ec8cab13832691d61da2" - integrity sha512-KehRjE83B1VaAbRRkRy6jLX1Cin8ltsrQ7FHf2bhwhRHK0S54YuA6LOoBnY/NtA8bHDX/Z+G5sMY78X30NS9tg== - dependencies: - "@lerna/command" "3.21.0" - "@lerna/filter-options" "3.20.0" - "@lerna/listable" "3.18.5" - "@lerna/output" "3.13.0" - -"@lerna/listable@3.18.5": - version "3.18.5" - resolved "https://registry.yarnpkg.com/@lerna/listable/-/listable-3.18.5.tgz#e82798405b5ed8fc51843c8ef1e7a0e497388a1a" - integrity sha512-Sdr3pVyaEv5A7ZkGGYR7zN+tTl2iDcinryBPvtuv20VJrXBE8wYcOks1edBTcOWsPjCE/rMP4bo1pseyk3UTsg== - dependencies: - "@lerna/query-graph" "3.18.5" - chalk "^2.3.1" - columnify "^1.5.4" - -"@lerna/log-packed@3.16.0": - version "3.16.0" - resolved "https://registry.yarnpkg.com/@lerna/log-packed/-/log-packed-3.16.0.tgz#f83991041ee77b2495634e14470b42259fd2bc16" - integrity sha512-Fp+McSNBV/P2mnLUYTaSlG8GSmpXM7krKWcllqElGxvAqv6chk2K3c2k80MeVB4WvJ9tRjUUf+i7HUTiQ9/ckQ== - dependencies: - byte-size "^5.0.1" - columnify "^1.5.4" - has-unicode "^2.0.1" - npmlog "^4.1.2" - -"@lerna/npm-conf@3.16.0": - version "3.16.0" - resolved "https://registry.yarnpkg.com/@lerna/npm-conf/-/npm-conf-3.16.0.tgz#1c10a89ae2f6c2ee96962557738685300d376827" - integrity sha512-HbO3DUrTkCAn2iQ9+FF/eisDpWY5POQAOF1m7q//CZjdC2HSW3UYbKEGsSisFxSfaF9Z4jtrV+F/wX6qWs3CuA== +"@grpc/proto-loader@^0.7.13": + version "0.7.13" + resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.7.13.tgz#f6a44b2b7c9f7b609f5748c6eac2d420e37670cf" + integrity sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw== dependencies: - config-chain "^1.1.11" - pify "^4.0.1" + lodash.camelcase "^4.3.0" + long "^5.0.0" + protobufjs "^7.2.5" + yargs "^17.7.2" -"@lerna/npm-dist-tag@3.18.5": - version "3.18.5" - resolved "https://registry.yarnpkg.com/@lerna/npm-dist-tag/-/npm-dist-tag-3.18.5.tgz#9ef9abb7c104077b31f6fab22cc73b314d54ac55" - integrity sha512-xw0HDoIG6HreVsJND9/dGls1c+lf6vhu7yJoo56Sz5bvncTloYGLUppIfDHQr4ZvmPCK8rsh0euCVh2giPxzKQ== +"@humanwhocodes/config-array@^0.13.0": + version "0.13.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz#fb907624df3256d04b9aa2df50d7aa97ec648748" + integrity sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw== dependencies: - "@evocateur/npm-registry-fetch" "^4.0.0" - "@lerna/otplease" "3.18.5" - figgy-pudding "^3.5.1" - npm-package-arg "^6.1.0" - npmlog "^4.1.2" + "@humanwhocodes/object-schema" "^2.0.3" + debug "^4.3.1" + minimatch "^3.0.5" -"@lerna/npm-install@3.16.5": - version "3.16.5" - resolved "https://registry.yarnpkg.com/@lerna/npm-install/-/npm-install-3.16.5.tgz#d6bfdc16f81285da66515ae47924d6e278d637d3" - integrity sha512-hfiKk8Eku6rB9uApqsalHHTHY+mOrrHeWEs+gtg7+meQZMTS3kzv4oVp5cBZigndQr3knTLjwthT/FX4KvseFg== - dependencies: - "@lerna/child-process" "3.16.5" - "@lerna/get-npm-exec-opts" "3.13.0" - fs-extra "^8.1.0" - npm-package-arg "^6.1.0" - npmlog "^4.1.2" - signal-exit "^3.0.2" - write-pkg "^3.1.0" +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@lerna/npm-publish@3.18.5": - version "3.18.5" - resolved "https://registry.yarnpkg.com/@lerna/npm-publish/-/npm-publish-3.18.5.tgz#240e4039959fd9816b49c5b07421e11b5cb000af" - integrity sha512-3etLT9+2L8JAx5F8uf7qp6iAtOLSMj+ZYWY6oUgozPi/uLqU0/gsMsEXh3F0+YVW33q0M61RpduBoAlOOZnaTg== - dependencies: - "@evocateur/libnpmpublish" "^1.2.2" - "@lerna/otplease" "3.18.5" - "@lerna/run-lifecycle" "3.16.2" - figgy-pudding "^3.5.1" - fs-extra "^8.1.0" - npm-package-arg "^6.1.0" - npmlog "^4.1.2" - pify "^4.0.1" - read-package-json "^2.0.13" - -"@lerna/npm-run-script@3.16.5": - version "3.16.5" - resolved "https://registry.yarnpkg.com/@lerna/npm-run-script/-/npm-run-script-3.16.5.tgz#9c2ec82453a26c0b46edc0bb7c15816c821f5c15" - integrity sha512-1asRi+LjmVn3pMjEdpqKJZFT/3ZNpb+VVeJMwrJaV/3DivdNg7XlPK9LTrORuKU4PSvhdEZvJmSlxCKyDpiXsQ== - dependencies: - "@lerna/child-process" "3.16.5" - "@lerna/get-npm-exec-opts" "3.13.0" - npmlog "^4.1.2" - -"@lerna/otplease@3.18.5": - version "3.18.5" - resolved "https://registry.yarnpkg.com/@lerna/otplease/-/otplease-3.18.5.tgz#b77b8e760b40abad9f7658d988f3ea77d4fd0231" - integrity sha512-S+SldXAbcXTEDhzdxYLU0ZBKuYyURP/ND2/dK6IpKgLxQYh/z4ScljPDMyKymmEvgiEJmBsPZAAPfmNPEzxjog== - dependencies: - "@lerna/prompt" "3.18.5" - figgy-pudding "^3.5.1" - -"@lerna/output@3.13.0": - version "3.13.0" - resolved "https://registry.yarnpkg.com/@lerna/output/-/output-3.13.0.tgz#3ded7cc908b27a9872228a630d950aedae7a4989" - integrity sha512-7ZnQ9nvUDu/WD+bNsypmPG5MwZBwu86iRoiW6C1WBuXXDxM5cnIAC1m2WxHeFnjyMrYlRXM9PzOQ9VDD+C15Rg== - dependencies: - npmlog "^4.1.2" - -"@lerna/pack-directory@3.16.4": - version "3.16.4" - resolved "https://registry.yarnpkg.com/@lerna/pack-directory/-/pack-directory-3.16.4.tgz#3eae5f91bdf5acfe0384510ed53faddc4c074693" - integrity sha512-uxSF0HZeGyKaaVHz5FroDY9A5NDDiCibrbYR6+khmrhZtY0Bgn6hWq8Gswl9iIlymA+VzCbshWIMX4o2O8C8ng== - dependencies: - "@lerna/get-packed" "3.16.0" - "@lerna/package" "3.16.0" - "@lerna/run-lifecycle" "3.16.2" - figgy-pudding "^3.5.1" - npm-packlist "^1.4.4" - npmlog "^4.1.2" - tar "^4.4.10" - temp-write "^3.4.0" - -"@lerna/package-graph@3.18.5": - version "3.18.5" - resolved "https://registry.yarnpkg.com/@lerna/package-graph/-/package-graph-3.18.5.tgz#c740e2ea3578d059e551633e950690831b941f6b" - integrity sha512-8QDrR9T+dBegjeLr+n9WZTVxUYUhIUjUgZ0gvNxUBN8S1WB9r6H5Yk56/MVaB64tA3oGAN9IIxX6w0WvTfFudA== - dependencies: - "@lerna/prerelease-id-from-version" "3.16.0" - "@lerna/validation-error" "3.13.0" - npm-package-arg "^6.1.0" - npmlog "^4.1.2" - semver "^6.2.0" +"@humanwhocodes/object-schema@^2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" + integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== -"@lerna/package@3.16.0": - version "3.16.0" - resolved "https://registry.yarnpkg.com/@lerna/package/-/package-3.16.0.tgz#7e0a46e4697ed8b8a9c14d59c7f890e0d38ba13c" - integrity sha512-2lHBWpaxcBoiNVbtyLtPUuTYEaB/Z+eEqRS9duxpZs6D+mTTZMNy6/5vpEVSCBmzvdYpyqhqaYjjSLvjjr5Riw== - dependencies: - load-json-file "^5.3.0" - npm-package-arg "^6.1.0" - write-pkg "^3.1.0" +"@hutson/parse-repository-url@^3.0.0": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz#98c23c950a3d9b6c8f0daed06da6c3af06981340" + integrity sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q== -"@lerna/prerelease-id-from-version@3.16.0": - version "3.16.0" - resolved "https://registry.yarnpkg.com/@lerna/prerelease-id-from-version/-/prerelease-id-from-version-3.16.0.tgz#b24bfa789f5e1baab914d7b08baae9b7bd7d83a1" - integrity sha512-qZyeUyrE59uOK8rKdGn7jQz+9uOpAaF/3hbslJVFL1NqF9ELDTqjCPXivuejMX/lN4OgD6BugTO4cR7UTq/sZA== +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== dependencies: - semver "^6.2.0" + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" -"@lerna/profiler@3.20.0": - version "3.20.0" - resolved "https://registry.yarnpkg.com/@lerna/profiler/-/profiler-3.20.0.tgz#0f6dc236f4ea8f9ea5f358c6703305a4f32ad051" - integrity sha512-bh8hKxAlm6yu8WEOvbLENm42i2v9SsR4WbrCWSbsmOElx3foRnMlYk7NkGECa+U5c3K4C6GeBbwgqs54PP7Ljg== +"@jest/schemas@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" + integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== dependencies: - figgy-pudding "^3.5.1" - fs-extra "^8.1.0" - npmlog "^4.1.2" - upath "^1.2.0" + "@sinclair/typebox" "^0.27.8" -"@lerna/project@3.21.0": - version "3.21.0" - resolved "https://registry.yarnpkg.com/@lerna/project/-/project-3.21.0.tgz#5d784d2d10c561a00f20320bcdb040997c10502d" - integrity sha512-xT1mrpET2BF11CY32uypV2GPtPVm6Hgtha7D81GQP9iAitk9EccrdNjYGt5UBYASl4CIDXBRxwmTTVGfrCx82A== +"@jridgewell/gen-mapping@^0.3.5": + version "0.3.8" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz#4f0e06362e01362f823d348f1872b08f666d8142" + integrity sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA== dependencies: - "@lerna/package" "3.16.0" - "@lerna/validation-error" "3.13.0" - cosmiconfig "^5.1.0" - dedent "^0.7.0" - dot-prop "^4.2.0" - glob-parent "^5.0.0" - globby "^9.2.0" - load-json-file "^5.3.0" - npmlog "^4.1.2" - p-map "^2.1.0" - resolve-from "^4.0.0" - write-json-file "^3.2.0" - -"@lerna/prompt@3.18.5": - version "3.18.5" - resolved "https://registry.yarnpkg.com/@lerna/prompt/-/prompt-3.18.5.tgz#628cd545f225887d060491ab95df899cfc5218a1" - integrity sha512-rkKj4nm1twSbBEb69+Em/2jAERK8htUuV8/xSjN0NPC+6UjzAwY52/x9n5cfmpa9lyKf/uItp7chCI7eDmNTKQ== - dependencies: - inquirer "^6.2.0" - npmlog "^4.1.2" - -"@lerna/publish@3.22.1": - version "3.22.1" - resolved "https://registry.yarnpkg.com/@lerna/publish/-/publish-3.22.1.tgz#b4f7ce3fba1e9afb28be4a1f3d88222269ba9519" - integrity sha512-PG9CM9HUYDreb1FbJwFg90TCBQooGjj+n/pb3gw/eH5mEDq0p8wKdLFe0qkiqUkm/Ub5C8DbVFertIo0Vd0zcw== - dependencies: - "@evocateur/libnpmaccess" "^3.1.2" - "@evocateur/npm-registry-fetch" "^4.0.0" - "@evocateur/pacote" "^9.6.3" - "@lerna/check-working-tree" "3.16.5" - "@lerna/child-process" "3.16.5" - "@lerna/collect-updates" "3.20.0" - "@lerna/command" "3.21.0" - "@lerna/describe-ref" "3.16.5" - "@lerna/log-packed" "3.16.0" - "@lerna/npm-conf" "3.16.0" - "@lerna/npm-dist-tag" "3.18.5" - "@lerna/npm-publish" "3.18.5" - "@lerna/otplease" "3.18.5" - "@lerna/output" "3.13.0" - "@lerna/pack-directory" "3.16.4" - "@lerna/prerelease-id-from-version" "3.16.0" - "@lerna/prompt" "3.18.5" - "@lerna/pulse-till-done" "3.13.0" - "@lerna/run-lifecycle" "3.16.2" - "@lerna/run-topologically" "3.18.5" - "@lerna/validation-error" "3.13.0" - "@lerna/version" "3.22.1" - figgy-pudding "^3.5.1" - fs-extra "^8.1.0" - npm-package-arg "^6.1.0" - npmlog "^4.1.2" - p-finally "^1.0.0" - p-map "^2.1.0" - p-pipe "^1.2.0" - semver "^6.2.0" + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" -"@lerna/pulse-till-done@3.13.0": - version "3.13.0" - resolved "https://registry.yarnpkg.com/@lerna/pulse-till-done/-/pulse-till-done-3.13.0.tgz#c8e9ce5bafaf10d930a67d7ed0ccb5d958fe0110" - integrity sha512-1SOHpy7ZNTPulzIbargrgaJX387csN7cF1cLOGZiJQA6VqnS5eWs2CIrG8i8wmaUavj2QlQ5oEbRMVVXSsGrzA== - dependencies: - npmlog "^4.1.2" +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== -"@lerna/query-graph@3.18.5": - version "3.18.5" - resolved "https://registry.yarnpkg.com/@lerna/query-graph/-/query-graph-3.18.5.tgz#df4830bb5155273003bf35e8dda1c32d0927bd86" - integrity sha512-50Lf4uuMpMWvJ306be3oQDHrWV42nai9gbIVByPBYJuVW8dT8O8pA3EzitNYBUdLL9/qEVbrR0ry1HD7EXwtRA== - dependencies: - "@lerna/package-graph" "3.18.5" - figgy-pudding "^3.5.1" +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== -"@lerna/resolve-symlink@3.16.0": - version "3.16.0" - resolved "https://registry.yarnpkg.com/@lerna/resolve-symlink/-/resolve-symlink-3.16.0.tgz#37fc7095fabdbcf317c26eb74e0d0bde8efd2386" - integrity sha512-Ibj5e7njVHNJ/NOqT4HlEgPFPtPLWsO7iu59AM5bJDcAJcR96mLZ7KGVIsS2tvaO7akMEJvt2P+ErwCdloG3jQ== +"@jridgewell/source-map@^0.3.3": + version "0.3.6" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.6.tgz#9d71ca886e32502eb9362c9a74a46787c36df81a" + integrity sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ== dependencies: - fs-extra "^8.1.0" - npmlog "^4.1.2" - read-cmd-shim "^1.0.1" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" -"@lerna/rimraf-dir@3.16.5": - version "3.16.5" - resolved "https://registry.yarnpkg.com/@lerna/rimraf-dir/-/rimraf-dir-3.16.5.tgz#04316ab5ffd2909657aaf388ea502cb8c2f20a09" - integrity sha512-bQlKmO0pXUsXoF8lOLknhyQjOZsCc0bosQDoX4lujBXSWxHVTg1VxURtWf2lUjz/ACsJVDfvHZbDm8kyBk5okA== - dependencies: - "@lerna/child-process" "3.16.5" - npmlog "^4.1.2" - path-exists "^3.0.0" - rimraf "^2.6.2" +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== -"@lerna/run-lifecycle@3.16.2": - version "3.16.2" - resolved "https://registry.yarnpkg.com/@lerna/run-lifecycle/-/run-lifecycle-3.16.2.tgz#67b288f8ea964db9ea4fb1fbc7715d5bbb0bce00" - integrity sha512-RqFoznE8rDpyyF0rOJy3+KjZCeTkO8y/OB9orPauR7G2xQ7PTdCpgo7EO6ZNdz3Al+k1BydClZz/j78gNCmL2A== +"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== dependencies: - "@lerna/npm-conf" "3.16.0" - figgy-pudding "^3.5.1" - npm-lifecycle "^3.1.2" - npmlog "^4.1.2" + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" -"@lerna/run-topologically@3.18.5": - version "3.18.5" - resolved "https://registry.yarnpkg.com/@lerna/run-topologically/-/run-topologically-3.18.5.tgz#3cd639da20e967d7672cb88db0f756b92f2fdfc3" - integrity sha512-6N1I+6wf4hLOnPW+XDZqwufyIQ6gqoPfHZFkfWlvTQ+Ue7CuF8qIVQ1Eddw5HKQMkxqN10thKOFfq/9NQZ4NUg== - dependencies: - "@lerna/query-graph" "3.18.5" - figgy-pudding "^3.5.1" - p-queue "^4.0.0" +"@js-sdsl/ordered-map@^4.4.2": + version "4.4.2" + resolved "https://registry.yarnpkg.com/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz#9299f82874bab9e4c7f9c48d865becbfe8d6907c" + integrity sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw== -"@lerna/run@3.21.0": - version "3.21.0" - resolved "https://registry.yarnpkg.com/@lerna/run/-/run-3.21.0.tgz#2a35ec84979e4d6e42474fe148d32e5de1cac891" - integrity sha512-fJF68rT3veh+hkToFsBmUJ9MHc9yGXA7LSDvhziAojzOb0AI/jBDp6cEcDQyJ7dbnplba2Lj02IH61QUf9oW0Q== - dependencies: - "@lerna/command" "3.21.0" - "@lerna/filter-options" "3.20.0" - "@lerna/npm-run-script" "3.16.5" - "@lerna/output" "3.13.0" - "@lerna/profiler" "3.20.0" - "@lerna/run-topologically" "3.18.5" - "@lerna/timer" "3.13.0" - "@lerna/validation-error" "3.13.0" - p-map "^2.1.0" - -"@lerna/symlink-binary@3.17.0": - version "3.17.0" - resolved "https://registry.yarnpkg.com/@lerna/symlink-binary/-/symlink-binary-3.17.0.tgz#8f8031b309863814883d3f009877f82e38aef45a" - integrity sha512-RLpy9UY6+3nT5J+5jkM5MZyMmjNHxZIZvXLV+Q3MXrf7Eaa1hNqyynyj4RO95fxbS+EZc4XVSk25DGFQbcRNSQ== - dependencies: - "@lerna/create-symlink" "3.16.2" - "@lerna/package" "3.16.0" - fs-extra "^8.1.0" - p-map "^2.1.0" +"@leichtgewicht/ip-codec@^2.0.1": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz#4fc56c15c580b9adb7dc3c333a134e540b44bfb1" + integrity sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw== -"@lerna/symlink-dependencies@3.17.0": - version "3.17.0" - resolved "https://registry.yarnpkg.com/@lerna/symlink-dependencies/-/symlink-dependencies-3.17.0.tgz#48d6360e985865a0e56cd8b51b308a526308784a" - integrity sha512-KmjU5YT1bpt6coOmdFueTJ7DFJL4H1w5eF8yAQ2zsGNTtZ+i5SGFBWpb9AQaw168dydc3s4eu0W0Sirda+F59Q== +"@lerna/child-process@7.4.2": + version "7.4.2" + resolved "https://registry.yarnpkg.com/@lerna/child-process/-/child-process-7.4.2.tgz#a2fd013ac2150dc288270d3e0d0b850c06bec511" + integrity sha512-je+kkrfcvPcwL5Tg8JRENRqlbzjdlZXyaR88UcnCdNW0AJ1jX9IfHRys1X7AwSroU2ug8ESNC+suoBw1vX833Q== dependencies: - "@lerna/create-symlink" "3.16.2" - "@lerna/resolve-symlink" "3.16.0" - "@lerna/symlink-binary" "3.17.0" - fs-extra "^8.1.0" - p-finally "^1.0.0" - p-map "^2.1.0" - p-map-series "^1.0.0" - -"@lerna/timer@3.13.0": - version "3.13.0" - resolved "https://registry.yarnpkg.com/@lerna/timer/-/timer-3.13.0.tgz#bcd0904551db16e08364d6c18e5e2160fc870781" - integrity sha512-RHWrDl8U4XNPqY5MQHkToWS9jHPnkLZEt5VD+uunCKTfzlxGnRCr3/zVr8VGy/uENMYpVP3wJa4RKGY6M0vkRw== - -"@lerna/validation-error@3.13.0": - version "3.13.0" - resolved "https://registry.yarnpkg.com/@lerna/validation-error/-/validation-error-3.13.0.tgz#c86b8f07c5ab9539f775bd8a54976e926f3759c3" - integrity sha512-SiJP75nwB8GhgwLKQfdkSnDufAaCbkZWJqEDlKOUPUvVOplRGnfL+BPQZH5nvq2BYSRXsksXWZ4UHVnQZI/HYA== - dependencies: - npmlog "^4.1.2" - -"@lerna/version@3.22.1": - version "3.22.1" - resolved "https://registry.yarnpkg.com/@lerna/version/-/version-3.22.1.tgz#9805a9247a47ee62d6b81bd9fa5fb728b24b59e2" - integrity sha512-PSGt/K1hVqreAFoi3zjD0VEDupQ2WZVlVIwesrE5GbrL2BjXowjCsTDPqblahDUPy0hp6h7E2kG855yLTp62+g== - dependencies: - "@lerna/check-working-tree" "3.16.5" - "@lerna/child-process" "3.16.5" - "@lerna/collect-updates" "3.20.0" - "@lerna/command" "3.21.0" - "@lerna/conventional-commits" "3.22.0" - "@lerna/github-client" "3.22.0" - "@lerna/gitlab-client" "3.15.0" - "@lerna/output" "3.13.0" - "@lerna/prerelease-id-from-version" "3.16.0" - "@lerna/prompt" "3.18.5" - "@lerna/run-lifecycle" "3.16.2" - "@lerna/run-topologically" "3.18.5" - "@lerna/validation-error" "3.13.0" - chalk "^2.3.1" - dedent "^0.7.0" - load-json-file "^5.3.0" - minimatch "^3.0.4" - npmlog "^4.1.2" - p-map "^2.1.0" - p-pipe "^1.2.0" - p-reduce "^1.0.0" - p-waterfall "^1.0.0" - semver "^6.2.0" - slash "^2.0.0" - temp-write "^3.4.0" - write-json-file "^3.2.0" - -"@lerna/write-log-file@3.13.0": - version "3.13.0" - resolved "https://registry.yarnpkg.com/@lerna/write-log-file/-/write-log-file-3.13.0.tgz#b78d9e4cfc1349a8be64d91324c4c8199e822a26" - integrity sha512-RibeMnDPvlL8bFYW5C8cs4mbI3AHfQef73tnJCQ/SgrXZHehmHnsyWUiE7qDQCAo+B1RfTapvSyFF69iPj326A== + chalk "^4.1.0" + execa "^5.0.0" + strong-log-transformer "^2.1.0" + +"@lerna/create@7.4.2": + version "7.4.2" + resolved "https://registry.yarnpkg.com/@lerna/create/-/create-7.4.2.tgz#f845fad1480e46555af98bd39af29571605dddc9" + integrity sha512-1wplFbQ52K8E/unnqB0Tq39Z4e+NEoNrpovEnl6GpsTUrC6WDp8+w0Le2uCBV0hXyemxChduCkLz4/y1H1wTeg== + dependencies: + "@lerna/child-process" "7.4.2" + "@npmcli/run-script" "6.0.2" + "@nx/devkit" ">=16.5.1 < 17" + "@octokit/plugin-enterprise-rest" "6.0.1" + "@octokit/rest" "19.0.11" + byte-size "8.1.1" + chalk "4.1.0" + clone-deep "4.0.1" + cmd-shim "6.0.1" + columnify "1.6.0" + conventional-changelog-core "5.0.1" + conventional-recommended-bump "7.0.1" + cosmiconfig "^8.2.0" + dedent "0.7.0" + execa "5.0.0" + fs-extra "^11.1.1" + get-stream "6.0.0" + git-url-parse "13.1.0" + glob-parent "5.1.2" + globby "11.1.0" + graceful-fs "4.2.11" + has-unicode "2.0.1" + ini "^1.3.8" + init-package-json "5.0.0" + inquirer "^8.2.4" + is-ci "3.0.1" + is-stream "2.0.0" + js-yaml "4.1.0" + libnpmpublish "7.3.0" + load-json-file "6.2.0" + lodash "^4.17.21" + make-dir "4.0.0" + minimatch "3.0.5" + multimatch "5.0.0" + node-fetch "2.6.7" + npm-package-arg "8.1.1" + npm-packlist "5.1.1" + npm-registry-fetch "^14.0.5" + npmlog "^6.0.2" + nx ">=16.5.1 < 17" + p-map "4.0.0" + p-map-series "2.1.0" + p-queue "6.6.2" + p-reduce "^2.1.0" + pacote "^15.2.0" + pify "5.0.0" + read-cmd-shim "4.0.0" + read-package-json "6.0.4" + resolve-from "5.0.0" + rimraf "^4.4.1" + semver "^7.3.4" + signal-exit "3.0.7" + slash "^3.0.0" + ssri "^9.0.1" + strong-log-transformer "2.1.0" + tar "6.1.11" + temp-dir "1.0.0" + upath "2.0.1" + uuid "^9.0.0" + validate-npm-package-license "^3.0.4" + validate-npm-package-name "5.0.0" + write-file-atomic "5.0.1" + write-pkg "4.0.0" + yargs "16.2.0" + yargs-parser "20.2.4" + +"@malept/cross-spawn-promise@^1.1.0": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz#504af200af6b98e198bce768bc1730c6936ae01d" + integrity sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ== dependencies: - npmlog "^4.1.2" - write-file-atomic "^2.3.0" + cross-spawn "^7.0.1" "@malept/cross-spawn-promise@^2.0.0": version "2.0.0" @@ -1870,10 +1233,20 @@ dependencies: cross-spawn "^7.0.1" +"@malept/flatpak-bundler@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz#e8a32c30a95d20c2b1bb635cc580981a06389858" + integrity sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q== + dependencies: + debug "^4.1.1" + fs-extra "^9.0.0" + lodash "^4.17.15" + tmp-promise "^3.0.2" + "@mapbox/node-pre-gyp@^1.0.5": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.9.tgz#09a8781a3a036151cdebbe8719d6f8b25d4058bc" - integrity sha512-aDF3S3rK9Q2gey/WAttUlISduDItz5BU3306M9Eyv6/oS40aMprnopshtlKTykxRNIBEZuRMaZAnbrQ4QtKGyw== + version "1.0.11" + resolved "https://registry.yarnpkg.com/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz#417db42b7f5323d79e93b34a6d7a2a12c0df43fa" + integrity sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ== dependencies: detect-libc "^2.0.0" https-proxy-agent "^5.0.0" @@ -1885,13 +1258,35 @@ semver "^7.3.5" tar "^6.1.11" -"@mrmlnc/readdir-enhanced@^2.2.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" - integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g== - dependencies: - call-me-maybe "^1.0.1" - glob-to-regexp "^0.3.0" +"@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz#9edec61b22c3082018a79f6d1c30289ddf3d9d11" + integrity sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw== + +"@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz#33677a275204898ad8acbf62734fc4dc0b6a4855" + integrity sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw== + +"@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz#19edf7cdc2e7063ee328403c1d895a86dd28f4bb" + integrity sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg== + +"@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz#94fb0543ba2e28766c3fc439cabbe0440ae70159" + integrity sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw== + +"@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz#4a0609ab5fe44d07c9c60a11e4484d3c38bbd6e3" + integrity sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg== + +"@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz#0aa5502d547b57abfc4ac492de68e2006e417242" + integrity sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ== "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -1906,12 +1301,7 @@ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== -"@nodelib/fs.stat@^1.1.2": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" - integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== - -"@nodelib/fs.walk@^1.2.3": +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": version "1.2.8" resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== @@ -1919,45 +1309,164 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@npmcli/fs@^1.0.0": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-1.1.1.tgz#72f719fe935e687c56a4faecf3c03d06ba593257" - integrity sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ== +"@npmcli/fs@^2.1.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-2.1.2.tgz#a9e2541a4a2fec2e69c29b35e6060973da79b865" + integrity sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ== dependencies: - "@gar/promisify" "^1.0.1" + "@gar/promisify" "^1.1.3" semver "^7.3.5" -"@npmcli/fs@^2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-2.1.0.tgz#f2a21c28386e299d1a9fae8051d35ad180e33109" - integrity sha512-DmfBvNXGaetMxj9LTp8NAN9vEidXURrf5ZTslQzEAi/6GbW+4yjaLFQc6Tue5cpZ9Frlk4OBo/Snf1Bh/S7qTQ== +"@npmcli/fs@^3.1.0": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-3.1.1.tgz#59cdaa5adca95d135fc00f2bb53f5771575ce726" + integrity sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg== dependencies: - "@gar/promisify" "^1.1.3" semver "^7.3.5" -"@npmcli/move-file@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.1.2.tgz#1a82c3e372f7cae9253eb66d72543d6b8685c674" - integrity sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg== +"@npmcli/git@^4.0.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@npmcli/git/-/git-4.1.0.tgz#ab0ad3fd82bc4d8c1351b6c62f0fa56e8fe6afa6" + integrity sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ== dependencies: - mkdirp "^1.0.4" - rimraf "^3.0.2" + "@npmcli/promise-spawn" "^6.0.0" + lru-cache "^7.4.4" + npm-pick-manifest "^8.0.0" + proc-log "^3.0.0" + promise-inflight "^1.0.1" + promise-retry "^2.0.1" + semver "^7.3.5" + which "^3.0.0" + +"@npmcli/installed-package-contents@^2.0.1": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@npmcli/installed-package-contents/-/installed-package-contents-2.1.0.tgz#63048e5f6e40947a3a88dcbcb4fd9b76fdd37c17" + integrity sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w== + dependencies: + npm-bundled "^3.0.0" + npm-normalize-package-bin "^3.0.0" "@npmcli/move-file@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-2.0.0.tgz#417f585016081a0184cef3e38902cd917a9bbd02" - integrity sha512-UR6D5f4KEGWJV6BGPH3Qb2EtgH+t+1XQ1Tt85c7qicN6cezzuHPdZwwAxqZr4JLtnQu0LZsTza/5gmNmSl8XLg== + version "2.0.1" + resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-2.0.1.tgz#26f6bdc379d87f75e55739bab89db525b06100e4" + integrity sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ== dependencies: mkdirp "^1.0.4" rimraf "^3.0.2" -"@octokit/auth-token@^2.4.0", "@octokit/auth-token@^2.4.4": +"@npmcli/node-gyp@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz#101b2d0490ef1aa20ed460e4c0813f0db560545a" + integrity sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA== + +"@npmcli/promise-spawn@^6.0.0", "@npmcli/promise-spawn@^6.0.1": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz#c8bc4fa2bd0f01cb979d8798ba038f314cfa70f2" + integrity sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg== + dependencies: + which "^3.0.0" + +"@npmcli/run-script@6.0.2", "@npmcli/run-script@^6.0.0": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-6.0.2.tgz#a25452d45ee7f7fb8c16dfaf9624423c0c0eb885" + integrity sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA== + dependencies: + "@npmcli/node-gyp" "^3.0.0" + "@npmcli/promise-spawn" "^6.0.0" + node-gyp "^9.0.0" + read-package-json-fast "^3.0.0" + which "^3.0.0" + +"@nrwl/devkit@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nrwl/devkit/-/devkit-16.10.0.tgz#ac8c5b4db00f12c4b817c937be2f7c4eb8f2593c" + integrity sha512-fRloARtsDQoQgQ7HKEy0RJiusg/HSygnmg4gX/0n/Z+SUS+4KoZzvHjXc6T5ZdEiSjvLypJ+HBM8dQzIcVACPQ== + dependencies: + "@nx/devkit" "16.10.0" + +"@nrwl/tao@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-16.10.0.tgz#94642a0380709b8e387e1e33705a5a9624933375" + integrity sha512-QNAanpINbr+Pod6e1xNgFbzK1x5wmZl+jMocgiEFXZ67KHvmbD6MAQQr0MMz+GPhIu7EE4QCTLTyCEMlAG+K5Q== + dependencies: + nx "16.10.0" + tslib "^2.3.0" + +"@nx/devkit@16.10.0", "@nx/devkit@>=16.5.1 < 17": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/devkit/-/devkit-16.10.0.tgz#7e466be2dee2dcb1ccaf286786ca2a0a639aa007" + integrity sha512-IvKQqRJFDDiaj33SPfGd3ckNHhHi6ceEoqCbAP4UuMXOPPVOX6H0KVk+9tknkPb48B7jWIw6/AgOeWkBxPRO5w== + dependencies: + "@nrwl/devkit" "16.10.0" + ejs "^3.1.7" + enquirer "~2.3.6" + ignore "^5.0.4" + semver "7.5.3" + tmp "~0.2.1" + tslib "^2.3.0" + +"@nx/nx-darwin-arm64@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/nx-darwin-arm64/-/nx-darwin-arm64-16.10.0.tgz#0c73010cac7a502549483b12bad347da9014e6f1" + integrity sha512-YF+MIpeuwFkyvM5OwgY/rTNRpgVAI/YiR0yTYCZR+X3AAvP775IVlusNgQ3oedTBRUzyRnI4Tknj1WniENFsvQ== + +"@nx/nx-darwin-x64@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/nx-darwin-x64/-/nx-darwin-x64-16.10.0.tgz#2ccf270418d552fd0a8e0d6089aee4944315adaa" + integrity sha512-ypi6YxwXgb0kg2ixKXE3pwf5myVNUgWf1CsV5OzVccCM8NzheMO51KDXTDmEpXdzUsfT0AkO1sk5GZeCjhVONg== + +"@nx/nx-freebsd-x64@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/nx-freebsd-x64/-/nx-freebsd-x64-16.10.0.tgz#c3ee6914256e69493fed9355b0d6661d0e86da44" + integrity sha512-UeEYFDmdbbDkTQamqvtU8ibgu5jQLgFF1ruNb/U4Ywvwutw2d4ruOMl2e0u9hiNja9NFFAnDbvzrDcMo7jYqYw== + +"@nx/nx-linux-arm-gnueabihf@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-16.10.0.tgz#a961eccbb38acb2da7fc125b29d1fead0b39152f" + integrity sha512-WV3XUC2DB6/+bz1sx+d1Ai9q2Cdr+kTZRN50SOkfmZUQyEBaF6DRYpx/a4ahhxH3ktpNfyY8Maa9OEYxGCBkQA== + +"@nx/nx-linux-arm64-gnu@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-16.10.0.tgz#795f20072549d03822b5c4639ef438e473dbb541" + integrity sha512-aWIkOUw995V3ItfpAi5FuxQ+1e9EWLS1cjWM1jmeuo+5WtaKToJn5itgQOkvSlPz+HSLgM3VfXMvOFALNk125g== + +"@nx/nx-linux-arm64-musl@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-16.10.0.tgz#f2428ee6dbe2b2c326e8973f76c97666def33607" + integrity sha512-uO6Gg+irqpVcCKMcEPIQcTFZ+tDI02AZkqkP7koQAjniLEappd8DnUBSQdcn53T086pHpdc264X/ZEpXFfrKWQ== + +"@nx/nx-linux-x64-gnu@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-16.10.0.tgz#d36c2bcf94d49eaa24e3880ddaf6f1f617de539b" + integrity sha512-134PW/u/arNFAQKpqMJniC7irbChMPz+W+qtyKPAUXE0XFKPa7c1GtlI/wK2dvP9qJDZ6bKf0KtA0U/m2HMUOA== + +"@nx/nx-linux-x64-musl@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-16.10.0.tgz#78bd2ab97a583b3d4ea3387b67fd7b136907493c" + integrity sha512-q8sINYLdIJxK/iUx9vRk5jWAWb/2O0PAbOJFwv4qkxBv4rLoN7y+otgCZ5v0xfx/zztFgk/oNY4lg5xYjIso2Q== + +"@nx/nx-win32-arm64-msvc@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-16.10.0.tgz#ef20ec8d0c83d66e73e20df12d2c788b8f866396" + integrity sha512-moJkL9kcqxUdJSRpG7dET3UeLIciwrfP08mzBQ12ewo8K8FzxU8ZUsTIVVdNrwt01CXOdXoweGfdQLjJ4qTURA== + +"@nx/nx-win32-x64-msvc@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-16.10.0.tgz#7410a51d0f8be631eec9552f01b2e5946285927c" + integrity sha512-5iV2NKZnzxJwZZ4DM5JVbRG/nkhAbzEskKaLBB82PmYGKzaDHuMHP1lcPoD/rtYMlowZgNA/RQndfKvPBPwmXA== + +"@octokit/auth-token@^2.4.4": version "2.5.0" resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-2.5.0.tgz#27c37ea26c205f28443402477ffd261311f21e36" integrity sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g== dependencies: "@octokit/types" "^6.0.3" +"@octokit/auth-token@^3.0.0": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-3.0.4.tgz#70e941ba742bdd2b49bdb7393e821dea8520a3db" + integrity sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ== + "@octokit/core@^3.5.1": version "3.6.0" resolved "https://registry.yarnpkg.com/@octokit/core/-/core-3.6.0.tgz#3376cb9f3008d9b3d110370d90e0a1fcd5fe6085" @@ -1971,6 +1480,19 @@ before-after-hook "^2.2.0" universal-user-agent "^6.0.0" +"@octokit/core@^4.2.1": + version "4.2.4" + resolved "https://registry.yarnpkg.com/@octokit/core/-/core-4.2.4.tgz#d8769ec2b43ff37cc3ea89ec4681a20ba58ef907" + integrity sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ== + dependencies: + "@octokit/auth-token" "^3.0.0" + "@octokit/graphql" "^5.0.0" + "@octokit/request" "^6.0.0" + "@octokit/request-error" "^3.0.0" + "@octokit/types" "^9.0.0" + before-after-hook "^2.2.0" + universal-user-agent "^6.0.0" + "@octokit/endpoint@^6.0.1": version "6.0.12" resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-6.0.12.tgz#3b4d47a4b0e79b1027fb8d75d4221928b2d05658" @@ -1980,6 +1502,15 @@ is-plain-object "^5.0.0" universal-user-agent "^6.0.0" +"@octokit/endpoint@^7.0.0": + version "7.0.6" + resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-7.0.6.tgz#791f65d3937555141fb6c08f91d618a7d645f1e2" + integrity sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg== + dependencies: + "@octokit/types" "^9.0.0" + is-plain-object "^5.0.0" + universal-user-agent "^6.0.0" + "@octokit/graphql@^4.5.8": version "4.8.0" resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-4.8.0.tgz#664d9b11c0e12112cbf78e10f49a05959aa22cc3" @@ -1989,59 +1520,64 @@ "@octokit/types" "^6.0.3" universal-user-agent "^6.0.0" -"@octokit/openapi-types@^11.2.0": - version "11.2.0" - resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-11.2.0.tgz#b38d7fc3736d52a1e96b230c1ccd4a58a2f400a6" - integrity sha512-PBsVO+15KSlGmiI8QAzaqvsNlZlrDlyAJYcrXBCvVUxCp7VnXjkwPoFHgjEJXx3WF9BAwkA6nfCUA7i9sODzKA== +"@octokit/graphql@^5.0.0": + version "5.0.6" + resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-5.0.6.tgz#9eac411ac4353ccc5d3fca7d76736e6888c5d248" + integrity sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw== + dependencies: + "@octokit/request" "^6.0.0" + "@octokit/types" "^9.0.0" + universal-user-agent "^6.0.0" + +"@octokit/openapi-types@^12.11.0": + version "12.11.0" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-12.11.0.tgz#da5638d64f2b919bca89ce6602d059f1b52d3ef0" + integrity sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ== + +"@octokit/openapi-types@^18.0.0": + version "18.1.1" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-18.1.1.tgz#09bdfdabfd8e16d16324326da5148010d765f009" + integrity sha512-VRaeH8nCDtF5aXWnjPuEMIYf1itK/s3JYyJcWFJT8X9pSNnBtriDf7wlEWsGuhPLl4QIH4xM8fqTXDwJ3Mu6sw== -"@octokit/plugin-enterprise-rest@^6.0.1": +"@octokit/plugin-enterprise-rest@6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/@octokit/plugin-enterprise-rest/-/plugin-enterprise-rest-6.0.1.tgz#e07896739618dab8da7d4077c658003775f95437" integrity sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw== -"@octokit/plugin-paginate-rest@^1.1.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-1.1.2.tgz#004170acf8c2be535aba26727867d692f7b488fc" - integrity sha512-jbsSoi5Q1pj63sC16XIUboklNw+8tL9VOnJsWycWYR78TKss5PVpIPb1TUUcMQ+bBh7cY579cVAWmf5qG+dw+Q== +"@octokit/plugin-paginate-rest@^2.16.8": + version "2.21.3" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.21.3.tgz#7f12532797775640dbb8224da577da7dc210c87e" + integrity sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw== dependencies: - "@octokit/types" "^2.0.1" + "@octokit/types" "^6.40.0" -"@octokit/plugin-paginate-rest@^2.16.8": - version "2.17.0" - resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.17.0.tgz#32e9c7cab2a374421d3d0de239102287d791bce7" - integrity sha512-tzMbrbnam2Mt4AhuyCHvpRkS0oZ5MvwwcQPYGtMv4tUa5kkzG58SVB0fcsLulOZQeRnOgdkZWkRUiyBlh0Bkyw== +"@octokit/plugin-paginate-rest@^6.1.2": + version "6.1.2" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.1.2.tgz#f86456a7a1fe9e58fec6385a85cf1b34072341f8" + integrity sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ== dependencies: - "@octokit/types" "^6.34.0" + "@octokit/tsconfig" "^1.0.2" + "@octokit/types" "^9.2.3" -"@octokit/plugin-request-log@^1.0.0", "@octokit/plugin-request-log@^1.0.4": +"@octokit/plugin-request-log@^1.0.4": version "1.0.4" resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz#5e50ed7083a613816b1e4a28aeec5fb7f1462e85" integrity sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA== -"@octokit/plugin-rest-endpoint-methods@2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-2.4.0.tgz#3288ecf5481f68c494dd0602fc15407a59faf61e" - integrity sha512-EZi/AWhtkdfAYi01obpX0DF7U6b1VRr30QNQ5xSFPITMdLSfhcBqjamE3F+sKcxPbD7eZuMHu3Qkk2V+JGxBDQ== - dependencies: - "@octokit/types" "^2.0.1" - deprecation "^2.3.1" - "@octokit/plugin-rest-endpoint-methods@^5.12.0": - version "5.13.0" - resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.13.0.tgz#8c46109021a3412233f6f50d28786f8e552427ba" - integrity sha512-uJjMTkN1KaOIgNtUPMtIXDOjx6dGYysdIFhgA52x4xSadQCz3b/zJexvITDVpANnfKPW/+E0xkOvLntqMYpviA== + version "5.16.2" + resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.16.2.tgz#7ee8bf586df97dd6868cf68f641354e908c25342" + integrity sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw== dependencies: - "@octokit/types" "^6.34.0" + "@octokit/types" "^6.39.0" deprecation "^2.3.1" -"@octokit/request-error@^1.0.2": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-1.2.1.tgz#ede0714c773f32347576c25649dc013ae6b31801" - integrity sha512-+6yDyk1EES6WK+l3viRDElw96MvwfJxCt45GvmjDUKWjYIb3PJZQkq3i46TwGwoPD4h8NmTrENmtyA1FwbmhRA== +"@octokit/plugin-rest-endpoint-methods@^7.1.2": + version "7.2.3" + resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-7.2.3.tgz#37a84b171a6cb6658816c82c4082ac3512021797" + integrity sha512-I5Gml6kTAkzVlN7KCtjOM+Ruwe/rQppp0QU372K1GP7kNOYEKe8Xn5BW4sE62JAHdwpq95OQK/qGNyKQMUzVgA== dependencies: - "@octokit/types" "^2.0.0" - deprecation "^2.0.0" - once "^1.4.0" + "@octokit/types" "^10.0.0" "@octokit/request-error@^2.0.5", "@octokit/request-error@^2.1.0": version "2.1.0" @@ -2052,7 +1588,16 @@ deprecation "^2.0.0" once "^1.4.0" -"@octokit/request@^5.2.0", "@octokit/request@^5.6.0", "@octokit/request@^5.6.3": +"@octokit/request-error@^3.0.0": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-3.0.3.tgz#ef3dd08b8e964e53e55d471acfe00baa892b9c69" + integrity sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ== + dependencies: + "@octokit/types" "^9.0.0" + deprecation "^2.0.0" + once "^1.4.0" + +"@octokit/request@^5.6.0", "@octokit/request@^5.6.3": version "5.6.3" resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.6.3.tgz#19a022515a5bba965ac06c9d1334514eb50c48b0" integrity sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A== @@ -2064,27 +1609,27 @@ node-fetch "^2.6.7" universal-user-agent "^6.0.0" -"@octokit/rest@^16.28.4": - version "16.43.2" - resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-16.43.2.tgz#c53426f1e1d1044dee967023e3279c50993dd91b" - integrity sha512-ngDBevLbBTFfrHZeiS7SAMAZ6ssuVmXuya+F/7RaVvlysgGa1JKJkKWY+jV6TCJYcW0OALfJ7nTIGXcBXzycfQ== - dependencies: - "@octokit/auth-token" "^2.4.0" - "@octokit/plugin-paginate-rest" "^1.1.1" - "@octokit/plugin-request-log" "^1.0.0" - "@octokit/plugin-rest-endpoint-methods" "2.4.0" - "@octokit/request" "^5.2.0" - "@octokit/request-error" "^1.0.2" - atob-lite "^2.0.0" - before-after-hook "^2.0.0" - btoa-lite "^1.0.0" - deprecation "^2.0.0" - lodash.get "^4.4.2" - lodash.set "^4.3.2" - lodash.uniq "^4.5.0" - octokit-pagination-methods "^1.1.0" - once "^1.4.0" - universal-user-agent "^4.0.0" +"@octokit/request@^6.0.0": + version "6.2.8" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-6.2.8.tgz#aaf480b32ab2b210e9dadd8271d187c93171d8eb" + integrity sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw== + dependencies: + "@octokit/endpoint" "^7.0.0" + "@octokit/request-error" "^3.0.0" + "@octokit/types" "^9.0.0" + is-plain-object "^5.0.0" + node-fetch "^2.6.7" + universal-user-agent "^6.0.0" + +"@octokit/rest@19.0.11": + version "19.0.11" + resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-19.0.11.tgz#2ae01634fed4bd1fca5b642767205ed3fd36177c" + integrity sha512-m2a9VhaP5/tUw8FwfnW2ICXlXpLPIqxtg3XcAiGMLj/Xhw3RSBfZ8le/466ktO1Gcjr8oXudGnHhxV1TXJgFxw== + dependencies: + "@octokit/core" "^4.2.1" + "@octokit/plugin-paginate-rest" "^6.1.2" + "@octokit/plugin-request-log" "^1.0.4" + "@octokit/plugin-rest-endpoint-methods" "^7.1.2" "@octokit/rest@^18.12.0": version "18.12.0" @@ -2096,19 +1641,128 @@ "@octokit/plugin-request-log" "^1.0.4" "@octokit/plugin-rest-endpoint-methods" "^5.12.0" -"@octokit/types@^2.0.0", "@octokit/types@^2.0.1": - version "2.16.2" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-2.16.2.tgz#4c5f8da3c6fecf3da1811aef678fda03edac35d2" - integrity sha512-O75k56TYvJ8WpAakWwYRN8Bgu60KrmX0z1KqFp1kNiFNkgW+JW+9EBKZ+S33PU6SLvbihqd+3drvPxKK68Ee8Q== +"@octokit/tsconfig@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@octokit/tsconfig/-/tsconfig-1.0.2.tgz#59b024d6f3c0ed82f00d08ead5b3750469125af7" + integrity sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA== + +"@octokit/types@^10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-10.0.0.tgz#7ee19c464ea4ada306c43f1a45d444000f419a4a" + integrity sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg== + dependencies: + "@octokit/openapi-types" "^18.0.0" + +"@octokit/types@^6.0.3", "@octokit/types@^6.16.1", "@octokit/types@^6.39.0", "@octokit/types@^6.40.0": + version "6.41.0" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-6.41.0.tgz#e58ef78d78596d2fb7df9c6259802464b5f84a04" + integrity sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg== + dependencies: + "@octokit/openapi-types" "^12.11.0" + +"@octokit/types@^9.0.0", "@octokit/types@^9.2.3": + version "9.3.2" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-9.3.2.tgz#3f5f89903b69f6a2d196d78ec35f888c0013cac5" + integrity sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA== + dependencies: + "@octokit/openapi-types" "^18.0.0" + +"@parcel/watcher-android-arm64@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz#507f836d7e2042f798c7d07ad19c3546f9848ac1" + integrity sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA== + +"@parcel/watcher-darwin-arm64@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz#3d26dce38de6590ef79c47ec2c55793c06ad4f67" + integrity sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw== + +"@parcel/watcher-darwin-x64@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz#99f3af3869069ccf774e4ddfccf7e64fd2311ef8" + integrity sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg== + +"@parcel/watcher-freebsd-x64@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz#14d6857741a9f51dfe51d5b08b7c8afdbc73ad9b" + integrity sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ== + +"@parcel/watcher-linux-arm-glibc@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz#43c3246d6892381db473bb4f663229ad20b609a1" + integrity sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA== + +"@parcel/watcher-linux-arm-musl@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz#663750f7090bb6278d2210de643eb8a3f780d08e" + integrity sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q== + +"@parcel/watcher-linux-arm64-glibc@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz#ba60e1f56977f7e47cd7e31ad65d15fdcbd07e30" + integrity sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w== + +"@parcel/watcher-linux-arm64-musl@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz#f7fbcdff2f04c526f96eac01f97419a6a99855d2" + integrity sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg== + +"@parcel/watcher-linux-x64-glibc@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz#4d2ea0f633eb1917d83d483392ce6181b6a92e4e" + integrity sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A== + +"@parcel/watcher-linux-x64-musl@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz#277b346b05db54f55657301dd77bdf99d63606ee" + integrity sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg== + +"@parcel/watcher-win32-arm64@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz#7e9e02a26784d47503de1d10e8eab6cceb524243" + integrity sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw== + +"@parcel/watcher-win32-ia32@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz#2d0f94fa59a873cdc584bf7f6b1dc628ddf976e6" + integrity sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ== + +"@parcel/watcher-win32-x64@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz#ae52693259664ba6f2228fa61d7ee44b64ea0947" + integrity sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA== + +"@parcel/watcher@2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-2.0.4.tgz#f300fef4cc38008ff4b8c29d92588eced3ce014b" + integrity sha512-cTDi+FUDBIUOBKEtj+nhiJ71AZVlkAsQFuGQTun5tV9mwQBQgZvhCzG+URPQc8myeN32yRVZEfVAPCs1RW+Jvg== dependencies: - "@types/node" ">= 8" + node-addon-api "^3.2.1" + node-gyp-build "^4.3.0" -"@octokit/types@^6.0.3", "@octokit/types@^6.16.1", "@octokit/types@^6.34.0": - version "6.34.0" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-6.34.0.tgz#c6021333334d1ecfb5d370a8798162ddf1ae8218" - integrity sha512-s1zLBjWhdEI2zwaoSgyOFoKSl109CUcVBCc7biPJ3aAf6LGLU6szDvi31JPU7bxfla2lqfhjbbg/5DdFNxOwHw== +"@parcel/watcher@^2.5.0": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-2.5.1.tgz#342507a9cfaaf172479a882309def1e991fb1200" + integrity sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg== dependencies: - "@octokit/openapi-types" "^11.2.0" + detect-libc "^1.0.3" + is-glob "^4.0.3" + micromatch "^4.0.5" + node-addon-api "^7.0.0" + optionalDependencies: + "@parcel/watcher-android-arm64" "2.5.1" + "@parcel/watcher-darwin-arm64" "2.5.1" + "@parcel/watcher-darwin-x64" "2.5.1" + "@parcel/watcher-freebsd-x64" "2.5.1" + "@parcel/watcher-linux-arm-glibc" "2.5.1" + "@parcel/watcher-linux-arm-musl" "2.5.1" + "@parcel/watcher-linux-arm64-glibc" "2.5.1" + "@parcel/watcher-linux-arm64-musl" "2.5.1" + "@parcel/watcher-linux-x64-glibc" "2.5.1" + "@parcel/watcher-linux-x64-musl" "2.5.1" + "@parcel/watcher-win32-arm64" "2.5.1" + "@parcel/watcher-win32-ia32" "2.5.1" + "@parcel/watcher-win32-x64" "2.5.1" "@phosphor/algorithm@1", "@phosphor/algorithm@^1.2.0": version "1.2.0" @@ -2209,17 +1863,28 @@ "@phosphor/signaling" "^1.3.1" "@phosphor/virtualdom" "^1.2.0" -"@popperjs/core@^2.9.0": - version "2.11.5" - resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.5.tgz#db5a11bf66bdab39569719555b0f76e138d7bd64" - integrity sha512-9X2obfABZuDVLCgPK9aX0a/x4jaOEweTTWE2+9sr0Qqqevj2Uv5XorvusThmc9XGYpS9yI+fhh8RTafBtGposw== - -"@primer/octicons-react@^9.0.0": - version "9.6.0" - resolved "https://registry.yarnpkg.com/@primer/octicons-react/-/octicons-react-9.6.0.tgz#996f621cb063757a4985cd6b45e59ed00e3444bf" - integrity sha512-FR0fiU1UY1ds5ZMCUY+iVkkm1Eh4yDHf2ui+cxB3VvYX23DAdUAohPGit+qaMFy2caDd7uWYGRZduKS7dW1FZQ== +"@pingghost/protoc@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@pingghost/protoc/-/protoc-1.0.2.tgz#68436fe6df7b700149dfb2b9a6a9db3b66fe758a" + integrity sha512-7ndq6JmrfcRfr6wIxdrjBqAipsrWwldFL5TQRmJXgpGrRi1yU6vKWID6Z4cs96iK+3yLIoUON11fE5CThNBrXA== dependencies: - prop-types "^15.6.1" + glob "^7.2.3" + mkdirp "^0.5.6" + node-fetch "^3.2.10" + rimraf "^3.0.2" + unzipper "^0.10.11" + uuid "^9.0.0" + vinyl "^2.2.1" + +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + +"@popperjs/core@^2.9.0": + version "2.11.8" + resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f" + integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== "@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": version "1.1.2" @@ -2274,85 +1939,86 @@ resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== +"@puppeteer/browsers@2.3.1": + version "2.3.1" + resolved "https://registry.yarnpkg.com/@puppeteer/browsers/-/browsers-2.3.1.tgz#238200dbdce5c00ae28c8f2a55ac053c3be71668" + integrity sha512-uK7o3hHkK+naEobMSJ+2ySYyXtQkBxIH8Gn4MK9ciePjNV+Pf+PgY/W7iPzn2MTjl3stcYB5AlcTmPYw7AXDwA== + dependencies: + debug "^4.3.6" + extract-zip "^2.0.1" + progress "^2.0.3" + proxy-agent "^6.4.0" + semver "^7.6.3" + tar-fs "^3.0.6" + unbzip2-stream "^1.4.3" + yargs "^17.7.2" + +"@sigstore/bundle@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@sigstore/bundle/-/bundle-1.1.0.tgz#17f8d813b09348b16eeed66a8cf1c3d6bd3d04f1" + integrity sha512-PFutXEy0SmQxYI4texPw3dd2KewuNqv7OuK1ZFtY2fM754yhvG2KdgwIhRnoEE2uHdtdGNQ8s0lb94dW9sELog== + dependencies: + "@sigstore/protobuf-specs" "^0.2.0" + +"@sigstore/protobuf-specs@^0.2.0": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@sigstore/protobuf-specs/-/protobuf-specs-0.2.1.tgz#be9ef4f3c38052c43bd399d3f792c97ff9e2277b" + integrity sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A== + +"@sigstore/sign@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@sigstore/sign/-/sign-1.0.0.tgz#6b08ebc2f6c92aa5acb07a49784cb6738796f7b4" + integrity sha512-INxFVNQteLtcfGmcoldzV6Je0sbbfh9I16DM4yJPw3j5+TFP8X6uIiA18mvpEa9yyeycAKgPmOA3X9hVdVTPUA== + dependencies: + "@sigstore/bundle" "^1.1.0" + "@sigstore/protobuf-specs" "^0.2.0" + make-fetch-happen "^11.0.1" + +"@sigstore/tuf@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@sigstore/tuf/-/tuf-1.0.3.tgz#2a65986772ede996485728f027b0514c0b70b160" + integrity sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg== + dependencies: + "@sigstore/protobuf-specs" "^0.2.0" + tuf-js "^1.1.7" + +"@sinclair/typebox@^0.27.8": + version "0.27.8" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" + integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== + "@sindresorhus/df@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@sindresorhus/df/-/df-1.0.1.tgz#c69b66f52f6fcdd287c807df210305dbaf78500d" integrity sha512-1Hyp7NQnD/u4DSxR2DGW78TF9k7R0wZ8ev0BpMAIzA6yTQSHqNb5wTuvtcPYf4FWbVse2rW7RgDsyL8ua2vXHw== -"@sindresorhus/df@^2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/df/-/df-2.1.0.tgz#d208cf27e06f0bb476d14d7deccd7d726e9aa389" - integrity sha512-yozEsK3X8sEjh9fiolh3JntMUuGKe2n2t8gtE3yZ1PqAFFeaSxTrSiEVORy/YkPzUsxQ85RzLcGqmqSOgiFhtg== +"@sindresorhus/df@^3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@sindresorhus/df/-/df-3.1.1.tgz#94200f9277e4a7fdd35ce8ab8b6bc5b52b164d31" + integrity sha512-SME/vtXaJcnQ/HpeV6P82Egy+jThn11IKfwW8+/XVoRD0rmPHVTeKMtww1oWdVnMykzVPjmrDN9S8NBndPEHCQ== dependencies: - execa "^0.2.2" - -"@sindresorhus/is@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" - integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== - -"@sindresorhus/is@^0.7.0": - version "0.7.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.7.0.tgz#9a06f4f137ee84d7df0460c1fdb1135ffa6c50fd" - integrity sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow== + execa "^2.0.1" "@sindresorhus/is@^4.0.0": version "4.6.0" resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f" integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw== -"@sinonjs/commons@^1.6.0", "@sinonjs/commons@^1.7.0", "@sinonjs/commons@^1.8.3": - version "1.8.3" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" - integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== - dependencies: - type-detect "4.0.8" - -"@sinonjs/fake-timers@>=5": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz#4eaab737fab77332ab132d396a3c0d364bd0ea8c" - integrity sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw== - dependencies: - "@sinonjs/commons" "^1.7.0" - -"@sinonjs/fake-timers@^8.1.0": - version "8.1.0" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz#3fdc2b6cb58935b21bfb8d1625eb1300484316e7" - integrity sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg== - dependencies: - "@sinonjs/commons" "^1.7.0" - -"@sinonjs/samsam@^6.0.2": - version "6.1.1" - resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-6.1.1.tgz#627f7f4cbdb56e6419fa2c1a3e4751ce4f6a00b1" - integrity sha512-cZ7rKJTLiE7u7Wi/v9Hc2fs3Ucc3jrWeMgPHbbTCeVAB2S0wOBbYlkJVeNSL04i7fdhT8wIbDq1zhC/PXTD2SA== - dependencies: - "@sinonjs/commons" "^1.6.0" - lodash.get "^4.4.2" - type-detect "^4.0.8" - -"@sinonjs/text-encoding@^0.7.1": - version "0.7.1" - resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" - integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== +"@sindresorhus/is@^5.2.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-5.6.0.tgz#41dd6093d34652cddb5d5bdeee04eafc33826668" + integrity sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g== -"@socket.io/component-emitter@~3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.0.0.tgz#8863915676f837d9dad7b76f50cb500c1e9422e9" - integrity sha512-2pTGuibAXJswAPJjaKisthqS/NOK5ypG4LYT6tEAV0S/mxW0zOIvYvGK0V8w8+SHxAm6vRMSjqSalFXeBAqs+Q== +"@socket.io/component-emitter@~3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz#821f8442f4175d8f0467b9daf26e3a18e2d02af2" + integrity sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA== -"@stroncium/procfs@^1.0.0": +"@stroncium/procfs@^1.2.1": version "1.2.1" resolved "https://registry.yarnpkg.com/@stroncium/procfs/-/procfs-1.2.1.tgz#6b9be6fd20fb0a4c20e99a8695e083c699bb2b45" integrity sha512-X1Iui3FUNZP18EUvysTHxt+Avu2nlVzyf90YM8OYgP6SGzTzzX/0JgObfO1AQQDzuZtNNz29bVh8h5R97JrjxA== -"@szmarczak/http-timer@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" - integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== - dependencies: - defer-to-connect "^1.0.1" - "@szmarczak/http-timer@^4.0.5": version "4.0.6" resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz#b4a914bb62e7c272d4e5989fe4440f812ab1d807" @@ -2360,123 +2026,144 @@ dependencies: defer-to-connect "^2.0.0" -"@theia/application-manager@1.25.0": - version "1.25.0" - resolved "https://registry.yarnpkg.com/@theia/application-manager/-/application-manager-1.25.0.tgz#8d6fb5db8184b36027c8145df74e4297b6261267" - integrity sha512-2O9QcoaXICDFHIzviWbfuPMHVOdV7fh6RUKo6/tIdPeoc8Q6gqmDzvLpTpVVTnNTy2o72s5F62HhSSFpZxjNvg== +"@szmarczak/http-timer@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-5.0.1.tgz#c7c1bf1141cdd4751b0399c8fc7b8b664cd5be3a" + integrity sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw== + dependencies: + defer-to-connect "^2.0.1" + +"@theia/application-manager@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/application-manager/-/application-manager-1.57.0.tgz#8830301d392081eb5731b845585783aa0f2b223a" + integrity sha512-L5X0+pM8Py2F0+pf4KhqFYh0awsUnJAXjs/dTJvD6eXJsAnKxpwgMTVlI144XigDEDZo+y7Zhiry84uXcrxCXQ== dependencies: "@babel/core" "^7.10.0" "@babel/plugin-transform-classes" "^7.10.0" "@babel/plugin-transform-runtime" "^7.10.0" "@babel/preset-env" "^7.10.0" - "@theia/application-package" "1.25.0" - "@theia/ffmpeg" "1.25.0" + "@theia/application-package" "1.57.0" + "@theia/ffmpeg" "1.57.0" + "@theia/native-webpack-plugin" "1.57.0" "@types/fs-extra" "^4.0.2" - "@types/semver" "^7.3.8" + "@types/semver" "^7.5.0" babel-loader "^8.2.2" buffer "^6.0.3" - circular-dependency-plugin "^5.2.2" compression-webpack-plugin "^9.0.0" copy-webpack-plugin "^8.1.1" css-loader "^6.2.0" electron-rebuild "^3.2.7" fs-extra "^4.0.2" + http-server "^14.1.1" ignore-loader "^0.1.2" less "^3.0.3" + mini-css-extract-plugin "^2.6.1" node-abi "*" + node-loader "^2.0.0" path-browserify "^1.0.1" - semver "^7.3.5" + semver "^7.5.4" setimmediate "^1.0.5" source-map "^0.6.1" source-map-loader "^2.0.1" source-map-support "^0.5.19" style-loader "^2.0.0" + tslib "^2.6.2" umd-compat-loader "^2.1.2" - webpack "^5.48.0" + webpack "^5.76.0" webpack-cli "4.7.0" worker-loader "^3.0.8" yargs "^15.3.1" -"@theia/application-package@1.25.0": - version "1.25.0" - resolved "https://registry.yarnpkg.com/@theia/application-package/-/application-package-1.25.0.tgz#b04c91f58cd9e3ab059a0356c76f2cd67f8a4b9f" - integrity sha512-O640J9R81B7RHzeZRitb3qYvW8wlb1o+w743PMPnwca5Kin/AE3JKVMn1DXdGuK1e7U1vWL8JhUKMPXbps/pmQ== +"@theia/application-package@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/application-package/-/application-package-1.57.0.tgz#4464aef8fba52bcdb584b7fb93805ee120494406" + integrity sha512-5bq1K6Bw2CSsNBR8B+Ry4MJo1M8/Wq6W3qPtgoASg/aRPPMbAyDyBt9Mk7BG0zpnXa1sSU+bUx+AUkKPONeRqQ== dependencies: + "@theia/request" "1.57.0" "@types/fs-extra" "^4.0.2" - "@types/request" "^2.0.3" - "@types/semver" "^5.4.0" + "@types/semver" "^7.5.0" "@types/write-json-file" "^2.2.1" deepmerge "^4.2.2" fs-extra "^4.0.2" is-electron "^2.1.0" - nano "^9.0.5" - request "^2.82.0" - semver "^5.4.1" + nano "^10.1.3" + resolve-package-path "^4.0.3" + semver "^7.5.4" + tslib "^2.6.2" write-json-file "^2.2.0" -"@theia/bulk-edit@1.25.0": - version "1.25.0" - resolved "https://registry.yarnpkg.com/@theia/bulk-edit/-/bulk-edit-1.25.0.tgz#3b00f8675580613daff708d02516b8a3bb5ab1b8" - integrity sha512-yY1AT5e8ujdTRnauZ3CWYdSj9g6oygR753Sm+lxAR/Fnx6RMvLw2yfWOZoGdID2eGqWWvjkWWe+N4xRpCRdMbQ== - dependencies: - "@theia/core" "1.25.0" - "@theia/editor" "1.25.0" - "@theia/filesystem" "1.25.0" - "@theia/monaco" "1.25.0" - "@theia/monaco-editor-core" "1.65.2" - "@theia/workspace" "1.25.0" - -"@theia/callhierarchy@1.25.0": - version "1.25.0" - resolved "https://registry.yarnpkg.com/@theia/callhierarchy/-/callhierarchy-1.25.0.tgz#b3633a1415967273152f8f07be56adf74ada030c" - integrity sha512-ttMt4TA65XX4+xKmeKlVfnbfrI6IOOiZQJ7I6yWfzFQAsjNUcPPmVj8bIAUPY3EB0XbAoyR6mXwyky6/CVka8w== - dependencies: - "@theia/core" "1.25.0" - "@theia/editor" "1.25.0" +"@theia/bulk-edit@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/bulk-edit/-/bulk-edit-1.57.0.tgz#aae0965acea735351353f234e3d36f77d5fbca1e" + integrity sha512-aArK91eyowUuVQvtiEXArq5ot6rVGW0PRGNKBOxCmxFwjep2vfDboGzLzSHKuVtx4oXjBwGSMBWQBvovALatfw== + dependencies: + "@theia/core" "1.57.0" + "@theia/editor" "1.57.0" + "@theia/filesystem" "1.57.0" + "@theia/monaco" "1.57.0" + "@theia/monaco-editor-core" "1.83.101" + "@theia/workspace" "1.57.0" + tslib "^2.6.2" + +"@theia/callhierarchy@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/callhierarchy/-/callhierarchy-1.57.0.tgz#d8046b181837d2a43d9d3a83cbdd694811ad10c6" + integrity sha512-73WraULaDH7te+zHXBGpCOOpzm3j9V6nDpHJXrg1ab8+m/EGiIfdlerWkzo6LyKWcebyGxrviL49jDeqjOYoAw== + dependencies: + "@theia/core" "1.57.0" + "@theia/editor" "1.57.0" ts-md5 "^1.2.2" - -"@theia/cli@1.25.0": - version "1.25.0" - resolved "https://registry.yarnpkg.com/@theia/cli/-/cli-1.25.0.tgz#2feb993ce387133235bda5176752fd73862f9c34" - integrity sha512-zpOMiFBFSWXBi9wJ+r0pJ6lmyB5EjHxHORBbojm7WNa6lqlNeETvlISp6/+VO5Y9oDhWAFms4O8Uq4DHZQzGOw== - dependencies: - "@theia/application-manager" "1.25.0" - "@theia/application-package" "1.25.0" - "@theia/ffmpeg" "1.25.0" - "@theia/localization-manager" "1.25.0" - "@theia/ovsx-client" "1.25.0" + tslib "^2.6.2" + +"@theia/cli@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/cli/-/cli-1.57.0.tgz#8fb894ca7a547a8d90b862359e671b049f6d21b2" + integrity sha512-wz0rcMGkpAbjSJySJC6HbtJHAURaTBsY2FPL4FkVmEA6DhC/+mTxqzejFMWCfZbyUCPr520vYTryfVrs9iQGsQ== + dependencies: + "@theia/application-manager" "1.57.0" + "@theia/application-package" "1.57.0" + "@theia/ffmpeg" "1.57.0" + "@theia/localization-manager" "1.57.0" + "@theia/ovsx-client" "1.57.0" + "@theia/request" "1.57.0" "@types/chai" "^4.2.7" - "@types/mocha" "^5.2.7" + "@types/mocha" "^10.0.0" "@types/node-fetch" "^2.5.7" - "@types/puppeteer" "^2.0.0" - chai "^4.2.0" + chai "^4.3.10" chalk "4.0.0" decompress "^4.2.1" - https-proxy-agent "^5.0.0" - mocha "^7.0.0" - node-fetch "^2.6.7" - proxy-from-env "^1.1.0" - puppeteer "^2.0.0" - puppeteer-to-istanbul "^1.2.2" + escape-string-regexp "4.0.0" + glob "^8.0.3" + http-server "^14.1.1" + limiter "^2.1.0" + log-update "^4.0.0" + mocha "^10.1.0" + patch-package "^8.0.0" + puppeteer "23.1.0" + puppeteer-core "23.1.0" + puppeteer-to-istanbul "1.4.0" temp "^0.9.1" + tslib "^2.6.2" yargs "^15.3.1" -"@theia/console@1.25.0": - version "1.25.0" - resolved "https://registry.yarnpkg.com/@theia/console/-/console-1.25.0.tgz#071c257924e32072ce6dc4655d2bdadedc12689f" - integrity sha512-sePfkDrltFaIACd8wB4AbwBFz0gkYqwhF2nX87YOpqci0s/FHZKDhFhub92mtJl6RSOUQKkznzyNXlOWRQ3wDQ== +"@theia/console@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/console/-/console-1.57.0.tgz#b1e90f0c6c2a89ef34b677562b4d8c8e06197305" + integrity sha512-SL81TiLdP5dm51ejjDk/rU3Dd/28VcnrWCzJCv1f7IBi/BphzQGqFsqJhcCkbWwmnwxsxzMvLceIc82ANnMx2w== dependencies: - "@theia/core" "1.25.0" - "@theia/monaco" "1.25.0" - "@theia/monaco-editor-core" "1.65.2" + "@theia/core" "1.57.0" + "@theia/monaco" "1.57.0" + "@theia/monaco-editor-core" "1.83.101" anser "^2.0.1" + tslib "^2.6.2" -"@theia/core@1.25.0": - version "1.25.0" - resolved "https://registry.yarnpkg.com/@theia/core/-/core-1.25.0.tgz#3360ae56ba919f9b3a46d3feffd1925ca4a8fab4" - integrity sha512-u7g6QuVDsSIqIeWYKS5wgT+Zcl0970Q42Jvmc9kyLgYB8NhpcTHbh437uUfKwAN5jUChLiT2ew7dMcb0vGYhIQ== +"@theia/core@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/core/-/core-1.57.0.tgz#d473d8b9246403c5bcaf402d885bb4e2627d54b4" + integrity sha512-TT06PG3i+j7ViSTEaiAys9GrThhzH+9hkFCgyLJMr49Qc6XnUPtWcy2ncoi7nKyX1dxg+d4lAvj5oqpWRXlmUQ== dependencies: "@babel/runtime" "^7.10.0" + "@parcel/watcher" "^2.5.0" "@phosphor/algorithm" "1" "@phosphor/commands" "1" "@phosphor/coreutils" "1" @@ -2487,164 +2174,178 @@ "@phosphor/signaling" "1" "@phosphor/virtualdom" "1" "@phosphor/widgets" "1" - "@primer/octicons-react" "^9.0.0" - "@theia/application-package" "1.25.0" + "@theia/application-package" "1.57.0" + "@theia/request" "1.57.0" "@types/body-parser" "^1.16.4" "@types/cookie" "^0.3.3" "@types/dompurify" "^2.2.2" - "@types/express" "^4.16.0" + "@types/express" "^4.17.21" "@types/fs-extra" "^4.0.2" "@types/lodash.debounce" "4.0.3" "@types/lodash.throttle" "^4.1.3" "@types/markdown-it" "^12.2.3" - "@types/react" "^16.8.0" - "@types/react-dom" "^16.8.0" - "@types/react-virtualized" "^9.18.3" + "@types/react" "^18.0.15" + "@types/react-dom" "^18.0.6" "@types/route-parser" "^0.1.1" "@types/safer-buffer" "^2.1.0" - "@types/ws" "^5.1.2" + "@types/uuid" "^9.0.8" + "@types/ws" "^8.5.5" "@types/yargs" "^15" "@vscode/codicons" "*" ajv "^6.5.3" + async-mutex "^0.4.0" body-parser "^1.17.2" cookie "^0.4.0" dompurify "^2.2.9" drivelist "^9.0.2" es6-promise "^4.2.4" - express "^4.16.3" + express "^4.21.0" + fast-json-stable-stringify "^2.1.0" file-icons-js "~1.0.3" font-awesome "^4.7.0" fs-extra "^4.0.2" fuzzy "^0.1.3" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.0" iconv-lite "^0.6.0" - inversify "^5.1.1" + inversify "^6.1.3" jschardet "^2.1.1" keytar "7.2.0" lodash.debounce "^4.0.8" lodash.throttle "^4.1.1" markdown-it "^12.3.2" - nsfw "^2.1.2" + msgpackr "^1.10.2" p-debounce "^2.1.0" - perfect-scrollbar "^1.3.0" - react "^16.8.0" - react-dom "^16.8.0" + perfect-scrollbar "^1.5.5" + react "^18.2.0" + react-dom "^18.2.0" react-tooltip "^4.2.21" - react-virtualized "^9.20.0" - reconnecting-websocket "^4.2.0" + react-virtuoso "^2.17.0" reflect-metadata "^0.1.10" route-parser "^0.0.5" safer-buffer "^2.1.2" - socket.io "4.4.1" - socket.io-client "4.4.1" - uuid "^8.3.2" - vscode-languageserver-protocol "~3.15.3" + socket.io "^4.5.3" + socket.io-client "^4.5.3" + tslib "^2.6.2" + uuid "^9.0.1" + vscode-languageserver-protocol "^3.17.2" vscode-uri "^2.1.1" - vscode-ws-jsonrpc "^0.2.0" - ws "^7.1.2" + ws "^8.17.1" yargs "^15.3.1" -"@theia/debug@1.25.0": - version "1.25.0" - resolved "https://registry.yarnpkg.com/@theia/debug/-/debug-1.25.0.tgz#00a7c5419698b1aecc84ab4db651c204abe87516" - integrity sha512-PBHaeYQz5cE3azQ+I/EfQ1f+uPblOQmvOCIOp2tu4Kw9Re0fRZxA0DeYOliq74TyWb/ot9eg7g0/V/THcUFPlQ== - dependencies: - "@theia/console" "1.25.0" - "@theia/core" "1.25.0" - "@theia/editor" "1.25.0" - "@theia/filesystem" "1.25.0" - "@theia/markers" "1.25.0" - "@theia/monaco" "1.25.0" - "@theia/monaco-editor-core" "1.65.2" - "@theia/output" "1.25.0" - "@theia/process" "1.25.0" - "@theia/task" "1.25.0" - "@theia/terminal" "1.25.0" - "@theia/variable-resolver" "1.25.0" - "@theia/workspace" "1.25.0" +"@theia/debug@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/debug/-/debug-1.57.0.tgz#9f2b0752f626dea19a6549ea9bcf259e9d1199c2" + integrity sha512-qmiq7KT8uB7IGhd3yqg07NtgF/aA8r6me1uHHiEYQsNv392F3kgx03aTjIAWmMuqjnk/esEM09vl6NGIoj3XAg== + dependencies: + "@theia/console" "1.57.0" + "@theia/core" "1.57.0" + "@theia/editor" "1.57.0" + "@theia/filesystem" "1.57.0" + "@theia/markers" "1.57.0" + "@theia/monaco" "1.57.0" + "@theia/monaco-editor-core" "1.83.101" + "@theia/output" "1.57.0" + "@theia/process" "1.57.0" + "@theia/task" "1.57.0" + "@theia/terminal" "1.57.0" + "@theia/test" "1.57.0" + "@theia/variable-resolver" "1.57.0" + "@theia/workspace" "1.57.0" + "@vscode/debugprotocol" "^1.51.0" + fast-deep-equal "^3.1.3" jsonc-parser "^2.2.0" - mkdirp "^0.5.0" p-debounce "^2.1.0" - requestretry "^7.0.0" - tar "^4.0.0" - unzip-stream "^0.3.0" - vscode-debugprotocol "^1.32.0" + tslib "^2.6.2" + +"@theia/editor-preview@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/editor-preview/-/editor-preview-1.57.0.tgz#1ce7faea7e150a35d8785a21bd865bed4f9f0059" + integrity sha512-Tj0QARXKkf8EaQpgUgBW/JSfOsazAbl5DeKr+XPlZ8qb41iN+DXwD5bSO7XfhG45KrvVkM7wLEntBVMGMGPXSg== + dependencies: + "@theia/core" "1.57.0" + "@theia/editor" "1.57.0" + "@theia/navigator" "1.57.0" + tslib "^2.6.2" -"@theia/editor@1.25.0": - version "1.25.0" - resolved "https://registry.yarnpkg.com/@theia/editor/-/editor-1.25.0.tgz#7faeda4fdf30be28873d9710edf39c146b847b1b" - integrity sha512-SWvnHwi7CMuanlwkr2LwChGrjOJjdLgmW0Qz1Lk1oiS/nR9vusJZfwyRgnYLbI3jI/LbXECPmwZYtTVDa/ci+g== +"@theia/editor@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/editor/-/editor-1.57.0.tgz#3fc4e8cfab89be566046b446f225fa1933c46c95" + integrity sha512-8Q3j5RJEnyHjOvnoL8k8HzfuRyU1n0JaGksT0Nl8fdt4XKHcjfda0AApDTEKVurXf20gfAtfjnIfR/f2Xv/ckw== dependencies: - "@theia/core" "1.25.0" - "@theia/variable-resolver" "1.25.0" + "@theia/core" "1.57.0" + "@theia/variable-resolver" "1.57.0" + tslib "^2.6.2" -"@theia/electron@1.25.0": - version "1.25.0" - resolved "https://registry.yarnpkg.com/@theia/electron/-/electron-1.25.0.tgz#bdd2fd7aa85f93eb3b86f07fbb78f4f5d9e6b176" - integrity sha512-mfYh+ODlp0jf8D8M0WbNsNYFu2aEu9E4p8lq0EcwzU4tsKO7QcRKy3MbmZTvnt/GVGUeQOtNastp+MaFXSd7Xg== +"@theia/electron@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/electron/-/electron-1.57.0.tgz#13388ca1716de97915fd89cf18bc9d8c5b0225e8" + integrity sha512-QNzpmQapDCXJKwmATXe2F1T5DNDvLQyzAqrBLDNXegRxeuOZ+wAaPiKi7eq0zBh2481fzXu0hCNSvsx5gM1vjQ== dependencies: - "@electron/remote" "^2.0.1 <2.0.4 || >2.0.4" electron-store "^8.0.0" fix-path "^3.0.0" native-keymap "^2.2.1" -"@theia/ffmpeg@1.25.0": - version "1.25.0" - resolved "https://registry.yarnpkg.com/@theia/ffmpeg/-/ffmpeg-1.25.0.tgz#0b1b229184d445ef3af8a6fe5d3d20f643217df4" - integrity sha512-UkY9eEoVC3oPZOXDi8UKkOnGqGDD16u+vhdzRonNcUmsTFGkVmFkf2goBZIfOHtRJgCidfK3rx9/yISeHQp4AQ== +"@theia/ffmpeg@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/ffmpeg/-/ffmpeg-1.57.0.tgz#109f16bc542831bf9e2eb7b8dea056b51c63dce4" + integrity sha512-/NEUrNH6vJFpkUwI9bokfRLg81715nvhdvgJjYOgh2UBVHZ1XCeubjcrVWql/Zz5Ta8x7pbPqkY89WPyLWJmlg== dependencies: - "@electron/get" "^1.12.4" + "@electron/get" "^2.0.0" + tslib "^2.6.2" unzipper "^0.9.11" -"@theia/file-search@1.25.0": - version "1.25.0" - resolved "https://registry.yarnpkg.com/@theia/file-search/-/file-search-1.25.0.tgz#7d51dc1413f97b3f21ab9d94ac8b16c502658a35" - integrity sha512-uUGn1HFaeH73YY782B7+FdJj8VqOV46oWYydK5RE4Ayy6NFePXU2BO4Ttmxq1wy0IvKfDHiZYjYXIAd0itwjjA== - dependencies: - "@theia/core" "1.25.0" - "@theia/editor" "1.25.0" - "@theia/filesystem" "1.25.0" - "@theia/process" "1.25.0" - "@theia/workspace" "1.25.0" - vscode-ripgrep "^1.2.4" - -"@theia/filesystem@1.25.0": - version "1.25.0" - resolved "https://registry.yarnpkg.com/@theia/filesystem/-/filesystem-1.25.0.tgz#0685f696016a9521afe25ec693f93dcc12049d2d" - integrity sha512-zDCTXLm+PZVQUHUmtzpBqEIcQGtUwEdyHgWK322RIThdV2XJXV/A8Ya5hia6ZtBI2W5+i5K7+4q9EqVHbdDXog== - dependencies: - "@theia/core" "1.25.0" +"@theia/file-search@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/file-search/-/file-search-1.57.0.tgz#3e94a65d371308ab40e86bb85f6af01182730317" + integrity sha512-oB35LTRgQVlEEgKaS4oTS6f576kFP3d2FqelfkSsQNFVnaQFwp6R2Jabj3uNyYgBfCN/FcZaxMj/EGet9jN+jA== + dependencies: + "@theia/core" "1.57.0" + "@theia/editor" "1.57.0" + "@theia/filesystem" "1.57.0" + "@theia/process" "1.57.0" + "@theia/workspace" "1.57.0" + "@vscode/ripgrep" "^1.14.2" + tslib "^2.6.2" + +"@theia/filesystem@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/filesystem/-/filesystem-1.57.0.tgz#1c212c951b5d495a9848bfe6bf4e26ca72713154" + integrity sha512-88bMYtksDZOiTgzyaOuKbmQmAk6SOjIrnGIsGe5oJXxXcSr8vbMIGwTimFL5KKXo02D0rfXTQ6HxxX6xD32PWA== + dependencies: + "@theia/core" "1.57.0" "@types/body-parser" "^1.17.0" "@types/multer" "^1.4.7" - "@types/rimraf" "^2.0.2" "@types/tar-fs" "^1.16.1" - "@types/uuid" "^7.0.3" async-mutex "^0.3.1" body-parser "^1.18.3" http-status-codes "^1.3.0" - minimatch "^3.0.4" - multer "^1.4.2" - rimraf "^2.6.2" + minimatch "^5.1.0" + multer "1.4.4-lts.1" + rimraf "^5.0.0" + stat-mode "^1.0.0" tar-fs "^1.16.2" - trash "^6.1.1" - uuid "^8.0.0" + trash "^7.2.0" + tslib "^2.6.2" vscode-languageserver-textdocument "^1.0.1" -"@theia/keymaps@1.25.0": - version "1.25.0" - resolved "https://registry.yarnpkg.com/@theia/keymaps/-/keymaps-1.25.0.tgz#0adfb6f088a532aa3c2f05448ac5697e6a16f5ad" - integrity sha512-gt+4cc/lWfB+qDG9/DjLnkRyYIVkQJeF6woOAl86P00BQbdEKNWZPm+uEwLfEVPl3/YcIYm2E6jUWDgX+A09Mw== +"@theia/keymaps@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/keymaps/-/keymaps-1.57.0.tgz#f267101be3af848facc4d872f9bbe282c1537ee6" + integrity sha512-DcSdfRT2/X0eJoT8pumbyXTREnFGKbhcLOCXzO66QcjGevk+QEcYlNbQhGIL8rNOXNMV0o096MZSK4LaNJsbtQ== dependencies: - "@theia/core" "1.25.0" - "@theia/monaco" "1.25.0" - "@theia/monaco-editor-core" "1.65.2" - "@theia/preferences" "1.25.0" - "@theia/userstorage" "1.25.0" + "@theia/core" "1.57.0" + "@theia/monaco" "1.57.0" + "@theia/monaco-editor-core" "1.83.101" + "@theia/preferences" "1.57.0" + "@theia/userstorage" "1.57.0" jsonc-parser "^2.2.0" + tslib "^2.6.2" -"@theia/localization-manager@1.25.0": - version "1.25.0" - resolved "https://registry.yarnpkg.com/@theia/localization-manager/-/localization-manager-1.25.0.tgz#faa90dccb6dd865292caca866be51606a4fe68ab" - integrity sha512-BYR6tsvv2aH5tVMkiA2iWmH9uGYRb2/LaXQuzgVG26kGUAjtcHdaHU0RwFBklAoeWFU7tguw8NbSoEvvKBhlaA== +"@theia/localization-manager@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/localization-manager/-/localization-manager-1.57.0.tgz#40d274e7dbea4fac422193d721406c58f0ef6b43" + integrity sha512-f5HH1s83thnYl3+/83hMk4p+cfgmqAeBncU9atljdWMnp0vLe9gJRjpFGdwoL5SbtU/qEq9UpcRlNZoT6ZCV/Q== dependencies: "@types/bent" "^7.0.1" "@types/fs-extra" "^4.0.2" @@ -2653,274 +2354,363 @@ deepmerge "^4.2.2" fs-extra "^4.0.2" glob "^7.2.0" - typescript "~4.5.5" + tslib "^2.6.2" + typescript "~5.4.5" -"@theia/markers@1.25.0": - version "1.25.0" - resolved "https://registry.yarnpkg.com/@theia/markers/-/markers-1.25.0.tgz#3b27605511aa9772d07465c66c57331aea0ed76b" - integrity sha512-Hw7LejXkOOxhtAiNnVG/yTMcCLT9K/z9hq0uMCRRjF7Dsa7jQe3bV1kwDR5VSuIM7XCrwx7KrSj2NQR3WmiuGg== +"@theia/markers@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/markers/-/markers-1.57.0.tgz#71969b2fee96b9044e682b74ad5081863e4b0f17" + integrity sha512-XYoIWMx6dy5PlKIyJrX+jOduznKRSxPKvxghU5LbDIBSYUsZUab3zN3/SCuO28cVUikktqMtwBkKIbL++5BBMw== dependencies: - "@theia/core" "1.25.0" - "@theia/filesystem" "1.25.0" - "@theia/workspace" "1.25.0" + "@theia/core" "1.57.0" + "@theia/filesystem" "1.57.0" + "@theia/workspace" "1.57.0" + tslib "^2.6.2" -"@theia/messages@1.25.0": - version "1.25.0" - resolved "https://registry.yarnpkg.com/@theia/messages/-/messages-1.25.0.tgz#3437481d27633c2a2acf4ffcad3b2d413c5c7905" - integrity sha512-02lnN0eummZ6KH5UJjQpyoswqQw5U7F1+kbFQYo240IPifKqeIJfWVNWfTsDdbK2syp+6qFmKaoHBuq4LnY5Ig== +"@theia/messages@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/messages/-/messages-1.57.0.tgz#24d412eff171e91eded5c2baab0907ce80a33d1f" + integrity sha512-Lg3wAyrhX4zmgDsM/1IA2lNsFO8a05mFiMlneAvBa/XN5HO4stpJTOH56rkvUkrVr9bGPpHupSAkqCySz3pQnw== dependencies: - "@theia/core" "1.25.0" + "@theia/core" "1.57.0" react-perfect-scrollbar "^1.5.3" ts-md5 "^1.2.2" - -"@theia/monaco-editor-core@1.65.2": - version "1.65.2" - resolved "https://registry.yarnpkg.com/@theia/monaco-editor-core/-/monaco-editor-core-1.65.2.tgz#91bc9ce2afe1b6011789ce83a5bee898f0153430" - integrity sha512-2UmGjcEW/YpZ2DsFuVevKR3CBMe44Rd6DgwP/5s4pyOe6K/s6TKY7Sh24lO0BXetQKofAEx3zh+ldEvjwhNwDw== - -"@theia/monaco@1.25.0": - version "1.25.0" - resolved "https://registry.yarnpkg.com/@theia/monaco/-/monaco-1.25.0.tgz#912ad508626ad555c2ef3dc5ba05863c71382765" - integrity sha512-169Z8nnJAbr05aPXGKwcu7ifpTxX9mfVZUVLZK/eD2qoYVnXSNObhqKb28NW6vnam3ixCNJLO3sDL5O2ZAUx/A== - dependencies: - "@theia/core" "1.25.0" - "@theia/editor" "1.25.0" - "@theia/filesystem" "1.25.0" - "@theia/markers" "1.25.0" - "@theia/monaco-editor-core" "1.65.2" - "@theia/outline-view" "1.25.0" + tslib "^2.6.2" + +"@theia/monaco-editor-core@1.83.101": + version "1.83.101" + resolved "https://registry.yarnpkg.com/@theia/monaco-editor-core/-/monaco-editor-core-1.83.101.tgz#a0577396fb4c69540536df2d7fed2de4399c4fde" + integrity sha512-UaAi6CEvain/qbGD3o6Ufe8plLyzAVQ53p9Ke+MoBYDhb391+r+MuK++JtITqIrXqoa8OCjbt8wQxEFSNNO0Mw== + +"@theia/monaco@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/monaco/-/monaco-1.57.0.tgz#229d514e8b3edc4a228ac52e83e1e1a2a140f7c2" + integrity sha512-nzv58i058BnWeIVr256KNs1Q/iLaDmljZrw4OHERBhsIrNJhJqYQnTpRv8rEoP9NxM7OTDpfbzSnnjV3vOV/Gg== + dependencies: + "@theia/core" "1.57.0" + "@theia/editor" "1.57.0" + "@theia/filesystem" "1.57.0" + "@theia/markers" "1.57.0" + "@theia/monaco-editor-core" "1.83.101" + "@theia/outline-view" "1.57.0" + "@theia/workspace" "1.57.0" fast-plist "^0.1.2" idb "^4.0.5" jsonc-parser "^2.2.0" - onigasm "^2.2.0" - vscode-textmate "^4.4.0" - -"@theia/navigator@1.25.0": - version "1.25.0" - resolved "https://registry.yarnpkg.com/@theia/navigator/-/navigator-1.25.0.tgz#ca3d357b5b4d1c46e90fa913eb9d115b68e013df" - integrity sha512-ODIvnDA9Rqi9J/CgEcvMeQZcFw8PoON7aAoueJER9R/EHQo8/6bvWU36wmwos1GUvmehRyPxzJ+MMPszTq9D6Q== - dependencies: - "@theia/core" "1.25.0" - "@theia/filesystem" "1.25.0" - "@theia/workspace" "1.25.0" - minimatch "^3.0.4" - -"@theia/outline-view@1.25.0": - version "1.25.0" - resolved "https://registry.yarnpkg.com/@theia/outline-view/-/outline-view-1.25.0.tgz#c7b82c61124bc384216a89d46965da1e82ad958f" - integrity sha512-P7hYD5LgbMjqxs0rEXD5Dp6mSRX+DhIXkuB25GztJSVyfv1ZTI6d67Ay1oKc7/eF7lx+t5GgqyGvRD/adCqmnA== - dependencies: - "@theia/core" "1.25.0" - -"@theia/output@1.25.0": - version "1.25.0" - resolved "https://registry.yarnpkg.com/@theia/output/-/output-1.25.0.tgz#8296c099ad2c13a335074ee4a6a1ceac3f522971" - integrity sha512-b5jBfQyN/faG3RXwi8jxGuYg1G6IIWSAM7nBqIG5RZyCq0uKVoVulqASLHazn3dwzw/k9Kge+Xuo8C54Cx9pkw== - dependencies: - "@theia/core" "1.25.0" - "@theia/editor" "1.25.0" - "@theia/monaco" "1.25.0" - "@theia/monaco-editor-core" "1.65.2" + tslib "^2.6.2" + vscode-oniguruma "1.6.1" + vscode-textmate "^9.0.0" + +"@theia/native-webpack-plugin@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/native-webpack-plugin/-/native-webpack-plugin-1.57.0.tgz#8276888bcb4be1b6e8f83609455a9cdbb5ea5960" + integrity sha512-sX29faaRIhPkp4e2OD7JGkOrYNGUMzYmEhldvACo6PWCFn0J4tkhGLAEB9oMnedAmpGAeBYTMMN7u4UfyWwa1Q== + dependencies: + detect-libc "^2.0.2" + tslib "^2.6.2" + webpack "^5.76.0" + +"@theia/navigator@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/navigator/-/navigator-1.57.0.tgz#73c50b1bf9c1b74f448d2d315149c432219f2af8" + integrity sha512-7/87eyeeLOXwIC5UeBk7bXdg/t484rToZZi+Jk8AbubCWnGoicECo0r3fkjDYFDWWX/xiEewZrMUoyxoy/jK2Q== + dependencies: + "@theia/core" "1.57.0" + "@theia/filesystem" "1.57.0" + "@theia/workspace" "1.57.0" + minimatch "^5.1.0" + tslib "^2.6.2" + +"@theia/notebook@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/notebook/-/notebook-1.57.0.tgz#1b4ad78005d520bf5d9a9a75f30cf85010b0a79f" + integrity sha512-1sJSSKaM0FEXQJgaO4DOwwoj/NFKyEhseu5SpxHcJ8v/1e7PTB3GN+nEv4Ax+ZDVoj5H4xZZ8qf/GxmSHhuseQ== + dependencies: + "@theia/core" "1.57.0" + "@theia/editor" "1.57.0" + "@theia/filesystem" "1.57.0" + "@theia/monaco" "1.57.0" + "@theia/monaco-editor-core" "1.83.101" + "@theia/outline-view" "1.57.0" + advanced-mark.js "^2.6.0" + react-perfect-scrollbar "^1.5.8" + tslib "^2.6.2" + +"@theia/outline-view@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/outline-view/-/outline-view-1.57.0.tgz#5b91222df1faaa05b0b8fcbb1458c4aaf8bd860e" + integrity sha512-VUZdOAIrzMHhEsqVdwIQN8QCWY3O6kBeDDtcRQRn7TnoKt77aJuNHmGoQXPPi0uweNRyNXXSU45+YnTEDM6O4w== + dependencies: + "@theia/core" "1.57.0" + tslib "^2.6.2" + +"@theia/output@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/output/-/output-1.57.0.tgz#80a987a5b32564c752f70fd48097152709b6c7f7" + integrity sha512-Xp6gOhE4KYnszraOWw03gDGRZuUlS7V3GX6VDqwb20NdGi1Ezgr6H1lQMQ8F/nJFEuRzmw2BR6HWgMWGXEB1aA== + dependencies: + "@theia/core" "1.57.0" + "@theia/editor" "1.57.0" + "@theia/monaco" "1.57.0" + "@theia/monaco-editor-core" "1.83.101" "@types/p-queue" "^2.3.1" p-queue "^2.4.2" - -"@theia/ovsx-client@1.25.0": - version "1.25.0" - resolved "https://registry.yarnpkg.com/@theia/ovsx-client/-/ovsx-client-1.25.0.tgz#41aa49d2954152750fe6c37e9652f6c8b0407fa0" - integrity sha512-GciPBkJafEghoXK9ehoDMcnI/f8+D1z0DPGUkKB648tSvV5lAzH+jp1fFBoOo/Jl35doGjcwiM3qKARucEJSMA== - dependencies: - "@types/bent" "^7.0.1" - bent "^7.1.0" - semver "^5.4.1" - -"@theia/plugin-ext-vscode@1.25.0": - version "1.25.0" - resolved "https://registry.yarnpkg.com/@theia/plugin-ext-vscode/-/plugin-ext-vscode-1.25.0.tgz#ddd1550da60b287a91a9541214da56cbc07d3902" - integrity sha512-UqzuWKwQY0H++ute1+pWhajlJVKwQ5KD40otDJYPTWKaFFfLz51XU7YKgtZ0SFBFlSw9750mUKZncAlNVVVDrg== - dependencies: - "@theia/callhierarchy" "1.25.0" - "@theia/core" "1.25.0" - "@theia/editor" "1.25.0" - "@theia/filesystem" "1.25.0" - "@theia/monaco" "1.25.0" - "@theia/monaco-editor-core" "1.65.2" - "@theia/navigator" "1.25.0" - "@theia/plugin" "1.25.0" - "@theia/plugin-ext" "1.25.0" - "@theia/terminal" "1.25.0" - "@theia/userstorage" "1.25.0" - "@theia/workspace" "1.25.0" - "@types/request" "^2.0.3" + tslib "^2.6.2" + +"@theia/ovsx-client@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/ovsx-client/-/ovsx-client-1.57.0.tgz#60a8f2824bfde860b09476372d5c74f8de34cf18" + integrity sha512-SQ0V2VG7xzOrOWtyqSLsAIhXwDenHw7/3VAb1mMKCx/eaVNf1ZTL9HYMEYkBgtF9iMa2BAOAY/m47Vv8ken+BA== + dependencies: + "@theia/request" "1.57.0" + limiter "^2.1.0" + semver "^7.5.4" + tslib "^2.6.2" + +"@theia/plugin-ext-vscode@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/plugin-ext-vscode/-/plugin-ext-vscode-1.57.0.tgz#0a305596f2907bb6abb77d1282c6642599a00d5b" + integrity sha512-hFqQ4VjJBzRTs/uPwHoCtyL7IC2vGXEvIRIwMNTnDuPj12xp/cbVBephT0otnLNsjEtVwzsgbhqeKyzIr/ZuBQ== + dependencies: + "@theia/callhierarchy" "1.57.0" + "@theia/core" "1.57.0" + "@theia/editor" "1.57.0" + "@theia/filesystem" "1.57.0" + "@theia/monaco" "1.57.0" + "@theia/monaco-editor-core" "1.83.101" + "@theia/navigator" "1.57.0" + "@theia/outline-view" "1.57.0" + "@theia/plugin" "1.57.0" + "@theia/plugin-ext" "1.57.0" + "@theia/terminal" "1.57.0" + "@theia/typehierarchy" "1.57.0" + "@theia/userstorage" "1.57.0" + "@theia/workspace" "1.57.0" + decompress "^4.2.1" filenamify "^4.1.0" - request "^2.82.0" - -"@theia/plugin-ext@1.25.0": - version "1.25.0" - resolved "https://registry.yarnpkg.com/@theia/plugin-ext/-/plugin-ext-1.25.0.tgz#e8ac89abe0ed45ab46449530bc652af10abeadbd" - integrity sha512-yu8cH6UKYCU6a8PLDwXH16Gy1I8PRNWXVyaIJK9A8jFGGJJqeZd1lOBUDEXUMEwbFvgNz8jjLXELHSGUxdjBUQ== - dependencies: - "@theia/bulk-edit" "1.25.0" - "@theia/callhierarchy" "1.25.0" - "@theia/console" "1.25.0" - "@theia/core" "1.25.0" - "@theia/debug" "1.25.0" - "@theia/editor" "1.25.0" - "@theia/file-search" "1.25.0" - "@theia/filesystem" "1.25.0" - "@theia/markers" "1.25.0" - "@theia/messages" "1.25.0" - "@theia/monaco" "1.25.0" - "@theia/monaco-editor-core" "1.65.2" - "@theia/navigator" "1.25.0" - "@theia/output" "1.25.0" - "@theia/plugin" "1.25.0" - "@theia/preferences" "1.25.0" - "@theia/scm" "1.25.0" - "@theia/search-in-workspace" "1.25.0" - "@theia/task" "1.25.0" - "@theia/terminal" "1.25.0" - "@theia/timeline" "1.25.0" - "@theia/workspace" "1.25.0" + tslib "^2.6.2" + +"@theia/plugin-ext@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/plugin-ext/-/plugin-ext-1.57.0.tgz#308bebeec7710961dc289a4ebe4c6faa4e404147" + integrity sha512-0seEcyaYOg1AsjrJL1WrL3baYbadlW1unCKlfb/MEHjGXO2Dkkya5Wmm4bZ3JfZa0BFye9uZGmzVtIzH8SXOFg== + dependencies: + "@theia/bulk-edit" "1.57.0" + "@theia/callhierarchy" "1.57.0" + "@theia/console" "1.57.0" + "@theia/core" "1.57.0" + "@theia/debug" "1.57.0" + "@theia/editor" "1.57.0" + "@theia/editor-preview" "1.57.0" + "@theia/file-search" "1.57.0" + "@theia/filesystem" "1.57.0" + "@theia/markers" "1.57.0" + "@theia/messages" "1.57.0" + "@theia/monaco" "1.57.0" + "@theia/monaco-editor-core" "1.83.101" + "@theia/navigator" "1.57.0" + "@theia/notebook" "1.57.0" + "@theia/output" "1.57.0" + "@theia/plugin" "1.57.0" + "@theia/preferences" "1.57.0" + "@theia/scm" "1.57.0" + "@theia/search-in-workspace" "1.57.0" + "@theia/task" "1.57.0" + "@theia/terminal" "1.57.0" + "@theia/test" "1.57.0" + "@theia/timeline" "1.57.0" + "@theia/typehierarchy" "1.57.0" + "@theia/variable-resolver" "1.57.0" + "@theia/workspace" "1.57.0" "@types/mime" "^2.0.1" + "@vscode/debugprotocol" "^1.51.0" + "@vscode/proxy-agent" "^0.13.2" + async-mutex "^0.4.0" decompress "^4.2.1" escape-html "^1.0.3" filenamify "^4.1.0" is-electron "^2.2.0" jsonc-parser "^2.2.0" lodash.clonedeep "^4.5.0" - macaddress "^0.2.9" + macaddress "^0.5.3" mime "^2.4.4" ps-tree "^1.2.0" - request "^2.82.0" - uuid "^8.0.0" + semver "^7.5.4" + tslib "^2.6.2" vhost "^3.0.2" - vscode-debugprotocol "^1.32.0" - vscode-textmate "^4.0.1" - -"@theia/plugin@1.25.0": - version "1.25.0" - resolved "https://registry.yarnpkg.com/@theia/plugin/-/plugin-1.25.0.tgz#73ab183cbe28fc5577548975d687f108f6da6731" - integrity sha512-OSiw58/3KNgYd9JJaZZGXsWhKVHTZbhU6t/uGVhEAQ0Dv/jQqd6NbrCwYSUJCcgGxjbRlr1sreku8wQ87EPNng== - -"@theia/preferences@1.25.0": - version "1.25.0" - resolved "https://registry.yarnpkg.com/@theia/preferences/-/preferences-1.25.0.tgz#1444497cedea1e4ab63128e52b0b83f52a4aa326" - integrity sha512-56Ew+xIEyudzKGkkscrthTch+u9pCVJa9i0Ul56DwWdynPOnYoodICjZIB28E8UR1s8WPVf+H4JQOV+Iv5oMTw== - dependencies: - "@theia/core" "1.25.0" - "@theia/editor" "1.25.0" - "@theia/filesystem" "1.25.0" - "@theia/monaco" "1.25.0" - "@theia/monaco-editor-core" "1.65.2" - "@theia/userstorage" "1.25.0" - "@theia/workspace" "1.25.0" + vscode-textmate "^9.0.0" + +"@theia/plugin@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/plugin/-/plugin-1.57.0.tgz#587a1f2caa358ab0065ef43e6b7abc97512954cc" + integrity sha512-WvKxS2hFDu7CYQ2PhzDRBLlH3nKf/dmqgWyXnzqft6HewnSzlfZz9RYpbMnHGLxc3NMCtmnNYEpDRGO2Q/BeMA== + +"@theia/preferences@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/preferences/-/preferences-1.57.0.tgz#044297884da7b47b2835354ab3fb85157ff179cc" + integrity sha512-+huHT1D6ycjqeFMY4Mo5gOp+lZeTjWz1UGI7P7U/Fqw/SnGtj4QuAsoR5imdp5TgWahCjtCYFMPGB7HqTbeS+Q== + dependencies: + "@theia/core" "1.57.0" + "@theia/editor" "1.57.0" + "@theia/filesystem" "1.57.0" + "@theia/monaco" "1.57.0" + "@theia/monaco-editor-core" "1.83.101" + "@theia/userstorage" "1.57.0" + "@theia/workspace" "1.57.0" async-mutex "^0.3.1" + fast-deep-equal "^3.1.3" jsonc-parser "^2.2.0" p-debounce "^2.1.0" + tslib "^2.6.2" -"@theia/process@1.25.0": - version "1.25.0" - resolved "https://registry.yarnpkg.com/@theia/process/-/process-1.25.0.tgz#31f666213169c319d59d79a02893b176a0995108" - integrity sha512-I5En6Y6ZV9ifVc3JpyLiTGkmNU2aCXK6dbk/hvEXdygrfoqyfNctbDfW7BuJ3p3uOJcPkM3uItdmNyv/VhBxPg== +"@theia/process@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/process/-/process-1.57.0.tgz#5186b407ccbb4b7ab5d0115003e02adb9f8e9f27" + integrity sha512-CD5oFDKoDYGq+Udbz8aL/NIubdCwxb/XcklnOmpYhKOIA1CGrRs2+9/pJOUkIMKO9XbbWv8DqSdFWi/tWU2I8g== dependencies: - "@theia/core" "1.25.0" - node-pty "0.11.0-beta17" + "@theia/core" "1.57.0" + node-pty "0.11.0-beta24" string-argv "^0.1.1" + tslib "^2.6.2" -"@theia/scm@1.25.0": - version "1.25.0" - resolved "https://registry.yarnpkg.com/@theia/scm/-/scm-1.25.0.tgz#e9765fc09979508b77bcfecd28dda8d8c4e6c8b0" - integrity sha512-ckFjUdU+ltF74vzPGo5SmgmRPIhXNe0LafHQlCnCvhb7yFfS+HHknZDCHfNFZIVhOPKunltUYZlFQ2ad/z8yVg== +"@theia/request@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/request/-/request-1.57.0.tgz#777d6e9c7e0429410d037e3087bce8e1efc6ff32" + integrity sha512-udL2PR5Aa66fEDB/IGJuXXzPoDtZRDYGvQluZHPKfJlUn5pZbdT58m4yA1YJqQjSrJvHxipZVSluCXJdXAxOVg== dependencies: - "@theia/core" "1.25.0" - "@theia/editor" "1.25.0" - "@theia/filesystem" "1.25.0" - "@types/diff" "^3.2.2" - diff "^3.4.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.0" + tslib "^2.6.2" + +"@theia/scm@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/scm/-/scm-1.57.0.tgz#5cdb3600f57b41b714afb5c1c04d0b337e1df05e" + integrity sha512-U0oX4SnGxfWPHIlzEVhpytgl52OKhQ0UokIjwnO9+AbjG6TjoFoJK2c2WExrZ0ku9C5DPgGPxifF0W3nj4teqQ== + dependencies: + "@theia/core" "1.57.0" + "@theia/editor" "1.57.0" + "@theia/filesystem" "1.57.0" + "@theia/monaco" "1.57.0" + "@theia/monaco-editor-core" "1.83.101" + "@types/diff" "^5.2.1" + diff "^5.2.0" p-debounce "^2.1.0" react-autosize-textarea "^7.0.0" ts-md5 "^1.2.2" - -"@theia/search-in-workspace@1.25.0": - version "1.25.0" - resolved "https://registry.yarnpkg.com/@theia/search-in-workspace/-/search-in-workspace-1.25.0.tgz#92d669012d2cc740a51c44a4f42168ca43d77970" - integrity sha512-6Y3RYhyoOnNA4QZ2krRwh0KN3rGBmviYDpYzVoyME10G/RIZdY6su2/YO6aIzKSBNQ/daj7003z5UHjcwnna9Q== - dependencies: - "@theia/core" "1.25.0" - "@theia/editor" "1.25.0" - "@theia/filesystem" "1.25.0" - "@theia/navigator" "1.25.0" - "@theia/process" "1.25.0" - "@theia/workspace" "1.25.0" - minimatch "^3.0.4" - vscode-ripgrep "^1.2.4" - -"@theia/task@1.25.0": - version "1.25.0" - resolved "https://registry.yarnpkg.com/@theia/task/-/task-1.25.0.tgz#768c8c92f1811325dfd0ec55536e2d0f92a61f86" - integrity sha512-49ArYtTdQjxgF39J0CLq4tL0+rQs2U+gyUjzuAOGayfsI2VHpJ6dLnz0Ue2tY7CL67wV6fJD6Px9RaDXzMJDpA== - dependencies: - "@theia/core" "1.25.0" - "@theia/editor" "1.25.0" - "@theia/filesystem" "1.25.0" - "@theia/markers" "1.25.0" - "@theia/monaco" "1.25.0" - "@theia/monaco-editor-core" "1.65.2" - "@theia/process" "1.25.0" - "@theia/terminal" "1.25.0" - "@theia/userstorage" "1.25.0" - "@theia/variable-resolver" "1.25.0" - "@theia/workspace" "1.25.0" + tslib "^2.6.2" + +"@theia/search-in-workspace@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/search-in-workspace/-/search-in-workspace-1.57.0.tgz#4647785278f8c59ba9dd8f1b61fb962ef61615bc" + integrity sha512-hmHF1YshxLs9eKk9JUpKuEQeiv2XY0I0IbfPJ1wqHMf7mGESM9YxHEQnrZ85bBWZ4y8rPNeQnrJ80GIBxy7dYg== + dependencies: + "@theia/core" "1.57.0" + "@theia/editor" "1.57.0" + "@theia/filesystem" "1.57.0" + "@theia/navigator" "1.57.0" + "@theia/process" "1.57.0" + "@theia/workspace" "1.57.0" + "@vscode/ripgrep" "^1.14.2" + minimatch "^5.1.0" + react-autosize-textarea "^7.0.0" + tslib "^2.6.2" + +"@theia/task@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/task/-/task-1.57.0.tgz#8d8bb1d1453a9b752b12e24e8cf878e982bc6053" + integrity sha512-4ipLeVukxu1SR7EDFsbbkH94ULuvocNj7SScvx3UjJ7btKPCMd+vVmdm+HzbLPhLfYD9T8H75tOi09asNYW7mQ== + dependencies: + "@theia/core" "1.57.0" + "@theia/editor" "1.57.0" + "@theia/filesystem" "1.57.0" + "@theia/markers" "1.57.0" + "@theia/monaco" "1.57.0" + "@theia/monaco-editor-core" "1.83.101" + "@theia/process" "1.57.0" + "@theia/terminal" "1.57.0" + "@theia/userstorage" "1.57.0" + "@theia/variable-resolver" "1.57.0" + "@theia/workspace" "1.57.0" async-mutex "^0.3.1" jsonc-parser "^2.2.0" p-debounce "^2.1.0" - -"@theia/terminal@1.25.0": - version "1.25.0" - resolved "https://registry.yarnpkg.com/@theia/terminal/-/terminal-1.25.0.tgz#3459fa777d8b661d19c12be78174de2d27fac5cb" - integrity sha512-d6mYQyOus0EWIkTv3aE4EvSC06o0hu5WCfsqrhUm4NtBkDjTFWEcmaxDIO6+n9mixNalDe25owCVCOJYUWfvuA== - dependencies: - "@theia/core" "1.25.0" - "@theia/editor" "1.25.0" - "@theia/filesystem" "1.25.0" - "@theia/process" "1.25.0" - "@theia/workspace" "1.25.0" + tslib "^2.6.2" + +"@theia/terminal@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/terminal/-/terminal-1.57.0.tgz#d3409e51df80a184aff764cf8379f7df976a45ce" + integrity sha512-cTRi9XqAp7LANDy0a1o/0O+/oVFGdiNdGtpAQ43SHsYvBFmpaY3wH+pcvDGSezUS1D24IKEqHRikmJ1ZE46zTw== + dependencies: + "@theia/core" "1.57.0" + "@theia/editor" "1.57.0" + "@theia/file-search" "1.57.0" + "@theia/filesystem" "1.57.0" + "@theia/process" "1.57.0" + "@theia/variable-resolver" "1.57.0" + "@theia/workspace" "1.57.0" + tslib "^2.6.2" + xterm "^5.3.0" + xterm-addon-fit "^0.8.0" + xterm-addon-search "^0.13.0" + +"@theia/test@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/test/-/test-1.57.0.tgz#0eaf442d67e17907497892411b6e9b7e9333f006" + integrity sha512-x1TUAojhMD5pd3JC+pbGB2lLHpFvANJP04hxCJNPPU2MnFXQo6d9VtYaWZcuzZBLHp2S7eiXGw/kEkc/h98IaQ== + dependencies: + "@theia/core" "1.57.0" + "@theia/editor" "1.57.0" + "@theia/filesystem" "1.57.0" + "@theia/navigator" "1.57.0" + "@theia/terminal" "1.57.0" xterm "^4.16.0" xterm-addon-fit "^0.5.0" - xterm-addon-search "^0.8.2" - -"@theia/timeline@1.25.0": - version "1.25.0" - resolved "https://registry.yarnpkg.com/@theia/timeline/-/timeline-1.25.0.tgz#1f663bfa35007ab8fe5d1305eaf70135087e1716" - integrity sha512-5VjJHHgOFGloxYfkKaKv5LZAAUtCJUv264deGPeEVn7hwYySw7VZ5Qdxm1csknqEZXZEVGqySA80SO8FR7tzUQ== - dependencies: - "@theia/core" "1.25.0" - "@theia/navigator" "1.25.0" - -"@theia/userstorage@1.25.0": - version "1.25.0" - resolved "https://registry.yarnpkg.com/@theia/userstorage/-/userstorage-1.25.0.tgz#ee09b430a49b70af43bf472e654783add3eefa34" - integrity sha512-EJ6Ox0enFYO6Gpj+mP3hwLKF4tn7Z1m4/NO+PgJUJeVlGt51o7qJoVz2rcMVXcENU9HSjpt49Sp6QOhUIS5d+A== - dependencies: - "@theia/core" "1.25.0" - "@theia/filesystem" "1.25.0" - -"@theia/variable-resolver@1.25.0": - version "1.25.0" - resolved "https://registry.yarnpkg.com/@theia/variable-resolver/-/variable-resolver-1.25.0.tgz#2e04b3256dac71b8a0b86984783f544ea3ebc8d4" - integrity sha512-NmZ/NAGDNHj5OjJgROzx+rILUXZIcNJn89AylRr+8s+fHdEg1oRkhsr+/Qqr5PsTQ9QVw3jj1GqikeZWaHYeNQ== - dependencies: - "@theia/core" "1.25.0" -"@theia/workspace@1.25.0": - version "1.25.0" - resolved "https://registry.yarnpkg.com/@theia/workspace/-/workspace-1.25.0.tgz#870cd4391d1b58775b276cc209f69dd840803d36" - integrity sha512-2snKXNF1U/D2zOTthLCRSzQKwactZPXW6ewjb9DCOEdIVUljBz6/kp2neI/Hxc6RC32arpdNHtnY8OBrDbe8gg== - dependencies: - "@theia/core" "1.25.0" - "@theia/filesystem" "1.25.0" - "@theia/variable-resolver" "1.25.0" +"@theia/timeline@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/timeline/-/timeline-1.57.0.tgz#629d2bd9a62ca44bc14dc8751ca4879a2f047e25" + integrity sha512-iUij2P5RKRy0scP+HYyxNXlM2Pvsq8dI1RE5s4KjgZGtyn9JNayKOfsd9uPFYisGuV4tTlP1oH7bi3UPcRYFgA== + dependencies: + "@theia/core" "1.57.0" + "@theia/navigator" "1.57.0" + tslib "^2.6.2" + +"@theia/typehierarchy@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/typehierarchy/-/typehierarchy-1.57.0.tgz#6cae26e812471d582360d11d98bf57757046e8a3" + integrity sha512-XJi6GsxGPDKNuJmzqS+woXzQfrOEynhzXV3tr1VbYNBk0wdlqghf52ehonhPfmVrwkqYRnpH11wlGPPNfg/htw== + dependencies: + "@theia/core" "1.57.0" + "@theia/editor" "1.57.0" + tslib "^2.6.2" + +"@theia/userstorage@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/userstorage/-/userstorage-1.57.0.tgz#4d30e5059163ce97d491b752ad755ff84bb99299" + integrity sha512-msI0U0b6X3RWq12QrOuB33GEw7+PXUo63UfIOypdcZeoYZWRECZrogE69AVTrFYh368kYPSpBb9G2zqvgC9ESQ== + dependencies: + "@theia/core" "1.57.0" + "@theia/filesystem" "1.57.0" + tslib "^2.6.2" + +"@theia/variable-resolver@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/variable-resolver/-/variable-resolver-1.57.0.tgz#aa6e833924f4cba5d5080dcc7319ee5dbf3048aa" + integrity sha512-o8CL8NYAdiaf5fYsNjmSwhQouhWOJEshqFiggte4gS2nFGW6LL+zeQ3xRGOK7IhNcSgzACPEpDTGMjQQblJrpg== + dependencies: + "@theia/core" "1.57.0" + tslib "^2.6.2" + +"@theia/workspace@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/workspace/-/workspace-1.57.0.tgz#4b7bfe78a0f1e25e6445175da283f3b7c2d2e573" + integrity sha512-L68Bu07+IJQTpQur+aRq3G0fmJqUQQ3FSQQIlCrUaobPQ7/wtDoWg4yMybTXwZ0f0Nbm9IxmsB59/O6Jnzb/ug== + dependencies: + "@theia/core" "1.57.0" + "@theia/filesystem" "1.57.0" + "@theia/variable-resolver" "1.57.0" jsonc-parser "^2.2.0" + tslib "^2.6.2" valid-filename "^2.0.1" "@tippyjs/react@^4.2.5": @@ -2930,7 +2720,12 @@ dependencies: tippy.js "^6.3.1" -"@tootallnate/once@1": +"@tokenizer/token@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@tokenizer/token/-/token-0.3.0.tgz#fe98a93fe789247e998c75e74e9c7c63217aa276" + integrity sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A== + +"@tootallnate/once@1", "@tootallnate/once@^1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== @@ -2940,74 +2735,70 @@ resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== -"@types/atob@^2.1.2": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@types/atob/-/atob-2.1.2.tgz#157eb0cc46264a8c55f2273a836c7a1a644fb820" - integrity sha512-8GAYQ1jDRUQkSpHzJUqXwAkYFOxuWAOGLhIR4aPd/Y/yL12Q/9m7LsKpHKlfKdNE/362Hc9wPI1Yh6opDfxVJg== +"@tootallnate/quickjs-emscripten@^0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz#db4ecfd499a9765ab24002c3b696d02e6d32a12c" + integrity sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA== + +"@tufjs/canonical-json@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz#eade9fd1f537993bc1f0949f3aea276ecc4fab31" + integrity sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ== + +"@tufjs/models@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@tufjs/models/-/models-1.0.4.tgz#5a689630f6b9dbda338d4b208019336562f176ef" + integrity sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A== + dependencies: + "@tufjs/canonical-json" "1.0.0" + minimatch "^9.0.0" -"@types/auth0-js@^9.14.0": - version "9.14.6" - resolved "https://registry.yarnpkg.com/@types/auth0-js/-/auth0-js-9.14.6.tgz#a1b0cdaf1c5a7062480455d9b255326bdc748117" - integrity sha512-dQrWP1G5PO5onJcDdto803OKvw1mplNBoRTdMJzRemfLyKSMAShiVBVD12jZ8VbB1RRDlg6R2eheEH/sxv1ZtQ== +"@types/auth0-js@^9.21.3": + version "9.21.6" + resolved "https://registry.yarnpkg.com/@types/auth0-js/-/auth0-js-9.21.6.tgz#31535a9cca2b3154c4836aab7854c38c2016a26c" + integrity sha512-wsvfk03WzQDXCbMdX8lQZH2Thh5AQk9SKQcxrBN1EdRkIOgkw9aIixxBpzsTHu/gj0I514BGQv7t5EyZSgVRmQ== "@types/bent@^7.0.1": - version "7.3.2" - resolved "https://registry.yarnpkg.com/@types/bent/-/bent-7.3.2.tgz#07b4f7bcec577be27cdb9e9034eb0de0242481a7" - integrity sha512-wtE/+NIk55jVUHJFt//kxmq8cQ7ef4J2U9HO7lZqKW4lvvPYTd7KfAEKZLsFmDgmzzMvfd4cPSdv3blqVWmqSQ== + version "7.3.8" + resolved "https://registry.yarnpkg.com/@types/bent/-/bent-7.3.8.tgz#69c3ee49bf6593d831006794e7bd2f84bb573e58" + integrity sha512-yZ09JA1KsA5Fl6Oh/ahK00+H5bV0qCy2bYnyfiFY42wnaMK4n7IDC6HaFe3WW45Zhnak7iqJBKlWD0nVxzrGWg== dependencies: "@types/node" "*" "@types/body-parser@*", "@types/body-parser@^1.16.4", "@types/body-parser@^1.17.0": - version "1.19.2" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" - integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== + version "1.19.5" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.5.tgz#04ce9a3b677dc8bd681a17da1ab9835dc9d3ede4" + integrity sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg== dependencies: "@types/connect" "*" "@types/node" "*" "@types/btoa@^1.2.3": - version "1.2.3" - resolved "https://registry.yarnpkg.com/@types/btoa/-/btoa-1.2.3.tgz#2c8e7093f902bf8f0e10992a731a4996aa1a5732" - integrity sha512-ANNCZICS/ofxhzUl8V1DniBJs+sFQ+Yg5am1ZwVEf/sxoKY/J2+h5Fuw3xUErlZ7eJLdgzukBjZwnsV6+/2Rmg== + version "1.2.5" + resolved "https://registry.yarnpkg.com/@types/btoa/-/btoa-1.2.5.tgz#9b2690b224e2bd2a629d0fc5812d19ccd5e781bc" + integrity sha512-BItINdjZRlcGdI2efwK4bwxY5vEAT0SnIVfMOZVT18wp4900F1Lurqk/9PNdF9hMP1zgFmWbjVEtAsQKVcbqxA== dependencies: "@types/node" "*" "@types/cacheable-request@^6.0.1": - version "6.0.2" - resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.2.tgz#c324da0197de0a98a2312156536ae262429ff6b9" - integrity sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA== + version "6.0.3" + resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.3.tgz#a430b3260466ca7b5ca5bfd735693b36e7a9d183" + integrity sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw== dependencies: "@types/http-cache-semantics" "*" - "@types/keyv" "*" + "@types/keyv" "^3.1.4" "@types/node" "*" - "@types/responselike" "*" - -"@types/caseless@*": - version "0.12.2" - resolved "https://registry.yarnpkg.com/@types/caseless/-/caseless-0.12.2.tgz#f65d3d6389e01eeb458bd54dc8f52b95a9463bc8" - integrity sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w== - -"@types/chai-string@^1.4.2": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@types/chai-string/-/chai-string-1.4.2.tgz#0f116504a666b6c6a3c42becf86634316c9a19ac" - integrity sha512-ld/1hV5qcPRGuwlPdvRfvM3Ka/iofOk2pH4VkasK4b1JJP1LjNmWWn0LsISf6RRzyhVOvs93rb9tM09e+UuF8Q== - dependencies: - "@types/chai" "*" - -"@types/chai@*", "@types/chai@^4.2.7": - version "4.3.1" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.1.tgz#e2c6e73e0bdeb2521d00756d099218e9f5d90a04" - integrity sha512-/zPMqDkzSZ8t3VtxOa4KPq7uzzW978M9Tvh+j7GHKuo6k6GTLxPJ4J5gE5cjfJ26pnXst0N5Hax8Sr0T2Mi9zQ== + "@types/responselike" "^1.0.0" -"@types/component-emitter@^1.2.10": - version "1.2.11" - resolved "https://registry.yarnpkg.com/@types/component-emitter/-/component-emitter-1.2.11.tgz#50d47d42b347253817a39709fef03ce66a108506" - integrity sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ== +"@types/chai@^4.2.7": + version "4.3.20" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.20.tgz#cb291577ed342ca92600430841a00329ba05cecc" + integrity sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ== "@types/connect@*": - version "3.4.35" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" - integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== + version "3.4.38" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" + integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== dependencies: "@types/node" "*" @@ -3016,162 +2807,154 @@ resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.3.3.tgz#85bc74ba782fb7aa3a514d11767832b0e3bc6803" integrity sha512-LKVP3cgXBT9RYj+t+9FDKwS5tdI+rPBXaNSkma7hvqy35lc7mAokC2zsqWJH0LaqIt3B962nuYI77hsJoT1gow== -"@types/cookie@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d" - integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== - "@types/cors@^2.8.12": - version "2.8.12" - resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.12.tgz#6b2c510a7ad7039e98e7b8d3d6598f4359e5c080" - integrity sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw== + version "2.8.17" + resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.17.tgz#5d718a5e494a8166f569d986794e49c48b216b2b" + integrity sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA== + dependencies: + "@types/node" "*" "@types/dateformat@^3.0.1": version "3.0.1" resolved "https://registry.yarnpkg.com/@types/dateformat/-/dateformat-3.0.1.tgz#98d747a2e5e9a56070c6bf14e27bff56204e34cc" integrity sha512-KlPPdikagvL6ELjWsljbyDIPzNCeliYkqRpI+zea99vBBbCIA5JNshZAwQKTON139c87y9qvTFVgkFd14rtS4g== -"@types/debug@^4.0.0": - version "4.1.7" - resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.7.tgz#7cc0ea761509124709b8b2d1090d8f6c17aadb82" - integrity sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg== +"@types/debug@^4.0.0", "@types/debug@^4.1.6": + version "4.1.12" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" + integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== dependencies: "@types/ms" "*" -"@types/deep-equal@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@types/deep-equal/-/deep-equal-1.0.1.tgz#71cfabb247c22bcc16d536111f50c0ed12476b03" - integrity sha512-mMUu4nWHLBlHtxXY17Fg6+ucS/MnndyOWyOe7MmwkoMYxvfQU2ajtRaEvqSUv+aVkMqH/C0NCI8UoVfRNQ10yg== - -"@types/deepmerge@^2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@types/deepmerge/-/deepmerge-2.2.0.tgz#6f63896c217f3164782f52d858d9f3a927139f64" - integrity sha512-FEQYDHh6+Q+QXKSrIY46m+/lAmAj/bk4KpLaam+hArmzaVpMBHLcfwOH2Q2UOkWM7XsdY9PmZpGyPAjh/JRGhQ== - dependencies: - deepmerge "*" - -"@types/diff@^3.2.2": - version "3.5.5" - resolved "https://registry.yarnpkg.com/@types/diff/-/diff-3.5.5.tgz#d1ddc082c03a26f0490856da47d57c29093d1e76" - integrity sha512-aqcrAbqT/0+ULJJ73bwKWsiFkBh3ZnAelj9u+iI5/cr4Nz3yXGf3w4glx5am6uvvgBbKinK1PAqSJs7fSKD6ig== +"@types/diff@^5.2.1": + version "5.2.3" + resolved "https://registry.yarnpkg.com/@types/diff/-/diff-5.2.3.tgz#dcdcfa40df9f011f9465180e0196dfbd921971d9" + integrity sha512-K0Oqlrq3kQMaO2RhfrNQX5trmt+XLyom88zS0u84nnIcLvFnRUMRRHmrGny5GSM+kNO9IZLARsdQHDzkhAgmrQ== "@types/dompurify@^2.2.2": - version "2.3.3" - resolved "https://registry.yarnpkg.com/@types/dompurify/-/dompurify-2.3.3.tgz#c24c92f698f77ed9cc9d9fa7888f90cf2bfaa23f" - integrity sha512-nnVQSgRVuZ/843oAfhA25eRSNzUFcBPk/LOiw5gm8mD9/X7CNcbRkQu/OsjCewO8+VIYfPxUnXvPEVGenw14+w== + version "2.4.0" + resolved "https://registry.yarnpkg.com/@types/dompurify/-/dompurify-2.4.0.tgz#fd9706392a88e0e0e6d367f3588482d817df0ab9" + integrity sha512-IDBwO5IZhrKvHFUl+clZxgf3hn2b/lU6H1KaBShPkQyGJUQ0xwebezIPSuiyGwfz1UzJWQl4M7BDxtHtCCPlTg== dependencies: "@types/trusted-types" "*" -"@types/eslint-scope@^3.7.3": - version "3.7.3" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.3.tgz#125b88504b61e3c8bc6f870882003253005c3224" - integrity sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g== +"@types/eslint-scope@^3.7.7": + version "3.7.7" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.7.tgz#3108bd5f18b0cdb277c867b3dd449c9ed7079ac5" + integrity sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg== dependencies: "@types/eslint" "*" "@types/estree" "*" "@types/eslint@*": - version "8.4.2" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.2.tgz#48f2ac58ab9c631cb68845c3d956b28f79fad575" - integrity sha512-Z1nseZON+GEnFjJc04sv4NSALGjhFwy6K0HXt7qsn5ArfAKtb63dXNJHf+1YW6IpOIYRBGUbu3GwJdj8DGnCjA== + version "9.6.1" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-9.6.1.tgz#d5795ad732ce81715f27f75da913004a56751584" + integrity sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag== dependencies: "@types/estree" "*" "@types/json-schema" "*" -"@types/estree@*", "@types/estree@^0.0.51": - version "0.0.51" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" - integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== +"@types/estree@*", "@types/estree@^1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" + integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== -"@types/events@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" - integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== +"@types/express-serve-static-core@^4.17.33": + version "4.19.6" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz#e01324c2a024ff367d92c66f48553ced0ab50267" + integrity sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + "@types/send" "*" -"@types/express-serve-static-core@^4.17.18": - version "4.17.28" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz#c47def9f34ec81dc6328d0b1b5303d1ec98d86b8" - integrity sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig== +"@types/express-serve-static-core@^5.0.0": + version "5.0.6" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz#41fec4ea20e9c7b22f024ab88a95c6bb288f51b8" + integrity sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA== dependencies: "@types/node" "*" "@types/qs" "*" "@types/range-parser" "*" + "@types/send" "*" -"@types/express@*", "@types/express@^4.16.0": - version "4.17.13" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.13.tgz#a76e2995728999bab51a33fabce1d705a3709034" - integrity sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA== +"@types/express@*": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@types/express/-/express-5.0.0.tgz#13a7d1f75295e90d19ed6e74cab3678488eaa96c" + integrity sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ== dependencies: "@types/body-parser" "*" - "@types/express-serve-static-core" "^4.17.18" + "@types/express-serve-static-core" "^5.0.0" "@types/qs" "*" "@types/serve-static" "*" -"@types/fs-extra@^4.0.2": - version "4.0.12" - resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-4.0.12.tgz#357f68e835d381a12f63967a8bb5d3d81145443a" - integrity sha512-alTHKMXq1kGPB9sddbbjJ4OJ9UJ/xiXaaoDzbLhontmlnZLwlJpvIUE8lI7YtcO45gcI9Cwt8hPfmU1rgmVHSQ== +"@types/express@^4.17.21": + version "4.17.21" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.21.tgz#c26d4a151e60efe0084b23dc3369ebc631ed192d" + integrity sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.33" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/fs-extra@9.0.13", "@types/fs-extra@^9.0.11": + version "9.0.13" + resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-9.0.13.tgz#7594fbae04fe7f1918ce8b3d213f74ff44ac1f45" + integrity sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA== dependencies: "@types/node" "*" -"@types/glob@*", "@types/glob@^7.1.1", "@types/glob@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" - integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== +"@types/fs-extra@^4.0.2": + version "4.0.15" + resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-4.0.15.tgz#82d70b4a2e5e3dd17474ce9e8fe951a03aeddd31" + integrity sha512-zU/EU2kZ1tv+p4pswQLntA7dFQq84wXrSCfmLjZvMbLjf4N46cPOWHg+WKfc27YnEOQ0chVFlBui55HRsvzHPA== dependencies: - "@types/minimatch" "*" "@types/node" "*" "@types/google-protobuf@^3.7.2": - version "3.15.6" - resolved "https://registry.yarnpkg.com/@types/google-protobuf/-/google-protobuf-3.15.6.tgz#674a69493ef2c849b95eafe69167ea59079eb504" - integrity sha512-pYVNNJ+winC4aek+lZp93sIKxnXt5qMkuKmaqS3WGuTq0Bw1ZDYNBgzG5kkdtwcv+GmYJGo3yEg6z2cKKAiEdw== + version "3.15.12" + resolved "https://registry.yarnpkg.com/@types/google-protobuf/-/google-protobuf-3.15.12.tgz#eb2ba0eddd65712211a2b455dc6071d665ccf49b" + integrity sha512-40um9QqwHjRS92qnOaDpL7RmDK15NuZYo9HihiJRbYkMQZlWnuH8AdvbMy8/o6lgLmKbDUKa+OALCltHdbOTpQ== "@types/hast@^2.0.0": - version "2.3.4" - resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.4.tgz#8aa5ef92c117d20d974a82bdfb6a648b08c0bafc" - integrity sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g== + version "2.3.10" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.10.tgz#5c9d9e0b304bbb8879b857225c5ebab2d81d7643" + integrity sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw== dependencies: - "@types/unist" "*" + "@types/unist" "^2" -"@types/http-cache-semantics@*": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz#0ea7b61496902b95890dc4c3a116b60cb8dae812" - integrity sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ== +"@types/http-cache-semantics@*", "@types/http-cache-semantics@^4.0.2": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz#b979ebad3919799c979b17c72621c0bc0a31c6c4" + integrity sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA== + +"@types/http-errors@*": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f" + integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== "@types/js-yaml@^3.12.2": - version "3.12.7" - resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-3.12.7.tgz#330c5d97a3500e9c903210d6e49f02964af04a0e" - integrity sha512-S6+8JAYTE1qdsc9HMVsfY7+SgSuUU/Tp6TYTmITW0PZxiyIMvol3Gy//y69Wkhs0ti4py5qgR3uZH6uz/DNzJQ== + version "3.12.10" + resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-3.12.10.tgz#4d80d0c7dfc570eb4f0be280cb2d67789f977ba5" + integrity sha512-/Mtaq/wf+HxXpvhzFYzrzCqNRcA958sW++7JOFC8nPrZcvfi/TrzOaaGbvt27ltJB2NQbHVAg5a1wUCsyMH7NA== -"@types/jsdom@^11.0.4": - version "11.12.0" - resolved "https://registry.yarnpkg.com/@types/jsdom/-/jsdom-11.12.0.tgz#00ddc6f0a1b04c2f5ff6fb23eb59360ca65f12ae" - integrity sha512-XHMNZFQ0Ih3A4/NTWAO15+OsQafPKnQCanN0FYGbsTM/EoI5EoEAvvkF51/DQC2BT5low4tomp7k2RLMlriA5Q== +"@types/jsdom@^21.1.1": + version "21.1.7" + resolved "https://registry.yarnpkg.com/@types/jsdom/-/jsdom-21.1.7.tgz#9edcb09e0b07ce876e7833922d3274149c898cfa" + integrity sha512-yOriVnggzrnQ3a9OKOCxaVuSug3w3/SbOj5i7VwXWZEyUNl3bLF9V3MfxGbZKuwqJOQyRfqXyROBB1CoZLFWzA== dependencies: - "@types/events" "*" "@types/node" "*" "@types/tough-cookie" "*" - parse5 "^4.0.0" + parse5 "^7.0.0" -"@types/json-buffer@~3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/json-buffer/-/json-buffer-3.0.0.tgz#85c1ff0f0948fc159810d4b5be35bf8c20875f64" - integrity sha512-3YP80IxxFJB4b5tYC2SUPwkg0XQLiu0nWvhRgEatgjf+29IcWO9X1k8xRv5DGssJ/lCrjYTjQPcobJr2yWIVuQ== - -"@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.7", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": - version "7.0.11" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" - integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== - -"@types/keytar@^4.4.0": - version "4.4.2" - resolved "https://registry.yarnpkg.com/@types/keytar/-/keytar-4.4.2.tgz#49ef917d6cbb4f19241c0ab50cd35097b5729b32" - integrity sha512-xtQcDj9ruGnMwvSu1E2BH4SFa5Dv2PvSPd0CKEBLN5hEj/v5YpXJY+B6hAfuKIbvEomD7vJTc/P1s1xPNh2kRw== - dependencies: - keytar "*" +"@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== -"@types/keyv@*": +"@types/keyv@^3.1.4": version "3.1.4" resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.4.tgz#3ccdb1c6751b0c7e52300bcdacd5bcbf8faa75b6" integrity sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg== @@ -3179,9 +2962,9 @@ "@types/node" "*" "@types/linkify-it@*": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@types/linkify-it/-/linkify-it-3.0.2.tgz#fd2cd2edbaa7eaac7e7f3c1748b52a19143846c9" - integrity sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA== + version "5.0.0" + resolved "https://registry.yarnpkg.com/@types/linkify-it/-/linkify-it-5.0.0.tgz#21413001973106cda1c3a9b91eedd4ccd5469d76" + integrity sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q== "@types/lodash.debounce@4.0.3": version "4.0.3" @@ -3191,28 +2974,23 @@ "@types/lodash" "*" "@types/lodash.debounce@^4.0.6": - version "4.0.7" - resolved "https://registry.yarnpkg.com/@types/lodash.debounce/-/lodash.debounce-4.0.7.tgz#0285879defb7cdb156ae633cecd62d5680eded9f" - integrity sha512-X1T4wMZ+gT000M2/91SYj0d/7JfeNZ9PeeOldSNoE/lunLeQXKvkmIumI29IaKMotU/ln/McOIvgzZcQ/3TrSA== + version "4.0.9" + resolved "https://registry.yarnpkg.com/@types/lodash.debounce/-/lodash.debounce-4.0.9.tgz#0f5f21c507bce7521b5e30e7a24440975ac860a5" + integrity sha512-Ma5JcgTREwpLRwMM+XwBR7DaWe96nC38uCBDFKZWbNKD+osjVzdpnUSwBcqCptrp16sSOLBAUb50Car5I0TCsQ== dependencies: "@types/lodash" "*" "@types/lodash.throttle@^4.1.3": - version "4.1.7" - resolved "https://registry.yarnpkg.com/@types/lodash.throttle/-/lodash.throttle-4.1.7.tgz#4ef379eb4f778068022310ef166625f420b6ba58" - integrity sha512-znwGDpjCHQ4FpLLx19w4OXDqq8+OvREa05H89obtSyXyOFKL3dDjCslsmfBz0T2FU8dmf5Wx1QvogbINiGIu9g== + version "4.1.9" + resolved "https://registry.yarnpkg.com/@types/lodash.throttle/-/lodash.throttle-4.1.9.tgz#f17a6ae084f7c0117bd7df145b379537bc9615c5" + integrity sha512-PCPVfpfueguWZQB7pJQK890F2scYKoDUL3iM522AptHWn7d5NQmeS/LTEHIcLr5PaTzl3dK2Z0xSUHHTHwaL5g== dependencies: "@types/lodash" "*" "@types/lodash@*": - version "4.14.182" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.182.tgz#05301a4d5e62963227eaafe0ce04dd77c54ea5c2" - integrity sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q== - -"@types/long@^4.0.1": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.2.tgz#b74129719fc8d11c01868010082d483b7545591a" - integrity sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA== + version "4.17.16" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.16.tgz#94ae78fab4a38d73086e962d0b65c30d816bfb0a" + integrity sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g== "@types/markdown-it@^12.2.3": version "12.2.3" @@ -3223,88 +3001,80 @@ "@types/mdurl" "*" "@types/mdast@^3.0.0": - version "3.0.10" - resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.10.tgz#4724244a82a4598884cbbe9bcfd73dff927ee8af" - integrity sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA== + version "3.0.15" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.15.tgz#49c524a263f30ffa28b71ae282f813ed000ab9f5" + integrity sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ== dependencies: - "@types/unist" "*" - -"@types/mdurl@*", "@types/mdurl@^1.0.0": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@types/mdurl/-/mdurl-1.0.2.tgz#e2ce9d83a613bacf284c7be7d491945e39e1f8e9" - integrity sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA== + "@types/unist" "^2" -"@types/mime-types@^2.1.0": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@types/mime-types/-/mime-types-2.1.1.tgz#d9ba43490fa3a3df958759adf69396c3532cf2c1" - integrity sha512-vXOTGVSLR2jMw440moWTC7H19iUyLtP3Z1YTj7cSsubOICinjMxFeb/V57v9QdyyPGbbWolUFSSmSiRSn94tFw== +"@types/mdurl@*": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@types/mdurl/-/mdurl-2.0.0.tgz#d43878b5b20222682163ae6f897b20447233bdfd" + integrity sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg== "@types/mime@^1": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" - integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" + integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== "@types/mime@^2.0.1": version "2.0.3" resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.3.tgz#c893b73721db73699943bfc3653b1deb7faa4a3a" integrity sha512-Jus9s4CDbqwocc5pOAnh8ShfrnMcPHuJYzVcSUU7lrh8Ni5HuIqX3oilL86p3dlTrk0LzHRCgA/GQ7uNCw6l2Q== -"@types/minimatch@*": +"@types/minimatch@^3.0.3": version "3.0.5" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== "@types/minimist@^1.2.0": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" - integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== + version "1.2.5" + resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.5.tgz#ec10755e871497bcd83efe927e43ec46e8c0747e" + integrity sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag== -"@types/mocha@^5.2.7": - version "5.2.7" - resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.2.7.tgz#315d570ccb56c53452ff8638738df60726d5b6ea" - integrity sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ== +"@types/mocha@^10.0.0": + version "10.0.10" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.10.tgz#91f62905e8d23cbd66225312f239454a23bebfa0" + integrity sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q== "@types/ms@*": - version "0.7.31" - resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" - integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== + version "2.1.0" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-2.1.0.tgz#052aa67a48eccc4309d7f0191b7e41434b90bb78" + integrity sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA== "@types/multer@^1.4.7": - version "1.4.7" - resolved "https://registry.yarnpkg.com/@types/multer/-/multer-1.4.7.tgz#89cf03547c28c7bbcc726f029e2a76a7232cc79e" - integrity sha512-/SNsDidUFCvqqcWDwxv2feww/yqhNeTRL5CVoL3jU4Goc4kKEL10T7Eye65ZqPNi4HRx8sAEX59pV1aEH7drNA== + version "1.4.12" + resolved "https://registry.yarnpkg.com/@types/multer/-/multer-1.4.12.tgz#da67bd0c809f3a63fe097c458c0d4af1fea50ab7" + integrity sha512-pQ2hoqvXiJt2FP9WQVLPRO+AmiIm/ZYkavPlIQnx282u4ZrVdztx0pkh3jjpQt0Kz+YI0YhSG264y08UJKoUQg== dependencies: "@types/express" "*" -"@types/ncp@^2.0.4": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@types/ncp/-/ncp-2.0.5.tgz#5c53b229a321946102a188b603306162137f4fb9" - integrity sha512-ocK0p8JuFmX7UkMabFPjY0F7apPvQyLWt5qtdvuvQEBz9i4m2dbzV+6L1zNaUp042RfnL6pHnxDE53OH6XQ9VQ== - dependencies: - "@types/node" "*" - "@types/node-fetch@^2.5.7": - version "2.6.1" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.1.tgz#8f127c50481db65886800ef496f20bbf15518975" - integrity sha512-oMqjURCaxoSIsHSr1E47QHzbmzNR5rK8McHuNb11BOM9cHcIK3Avy0s/b2JlXHoQGTYS3NsvWzV1M0iK7l0wbA== + version "2.6.12" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.12.tgz#8ab5c3ef8330f13100a7479e2cd56d3386830a03" + integrity sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA== dependencies: "@types/node" "*" - form-data "^3.0.0" + form-data "^4.0.0" -"@types/node@*", "@types/node@>= 8", "@types/node@>=10.0.0", "@types/node@>=12.12.47", "@types/node@>=13.7.0": - version "17.0.34" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.34.tgz#3b0b6a50ff797280b8d000c6281d229f9c538cef" - integrity sha512-XImEz7XwTvDBtzlTnm8YvMqGW/ErMWBsKZ+hMTvnDIjGCKxwK5Xpc+c/oQjOauwq8M4OS11hEkpjX8rrI/eEgA== +"@types/node@*", "@types/node@>=10.0.0", "@types/node@>=13.7.0": + version "22.13.10" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.13.10.tgz#df9ea358c5ed991266becc3109dc2dc9125d77e4" + integrity sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw== + dependencies: + undici-types "~6.20.0" -"@types/node@^14.6.2": - version "14.18.18" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.18.tgz#5c9503030df484ccffcbb935ea9a9e1d6fad1a20" - integrity sha512-B9EoJFjhqcQ9OmQrNorItO+OwEOORNn3S31WuiHvZY/dm9ajkB7AKD/8toessEtHHNL+58jofbq7hMMY9v4yig== +"@types/node@^20.9.0": + version "20.17.24" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.17.24.tgz#2325476954e6fc8c2f11b9c61e26ba6eb7d3f5b6" + integrity sha512-d7fGCyB96w9BnWQrOsJtpyiSaBcAYYr75bnK6ZRjDbql2cGLj/3GsL5OYmLPNq76l7Gf2q4Rv9J2o6h5CrD9sA== + dependencies: + undici-types "~6.19.2" "@types/normalize-package-data@^2.4.0": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" - integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== + version "2.4.4" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901" + integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA== "@types/p-queue@^2.3.1": version "2.3.2" @@ -3312,182 +3082,105 @@ integrity sha512-eKAv5Ql6k78dh3ULCsSBxX6bFNuGjTmof5Q/T6PiECDq0Yf8IIn46jCyp3RJvCi8owaEmm3DZH1PEImjBMd/vQ== "@types/parse-json@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" - integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.2.tgz#5950e50960793055845e956c427fc2b0d70c5239" + integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw== + +"@types/plist@^3.0.1": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@types/plist/-/plist-3.0.5.tgz#9a0c49c0f9886c8c8696a7904dd703f6284036e0" + integrity sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA== + dependencies: + "@types/node" "*" + xmlbuilder ">=11.0.1" "@types/prop-types@*", "@types/prop-types@^15.0.0": - version "15.7.5" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" - integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== + version "15.7.14" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.14.tgz#1433419d73b2a7ebfc6918dcefd2ec0d5cd698f2" + integrity sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ== "@types/ps-tree@^1.1.0": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@types/ps-tree/-/ps-tree-1.1.2.tgz#5c60773a38ffb1402e049902a7b7a8d3c67cd59a" - integrity sha512-ZREFYlpUmPQJ0esjxoG1fMvB2HNaD3z+mjqdSosZvd3RalncI9NEur73P8ZJz4YQdL64CmV1w0RuqoRUlhQRBw== - -"@types/puppeteer@^2.0.0": - version "2.1.8" - resolved "https://registry.yarnpkg.com/@types/puppeteer/-/puppeteer-2.1.8.tgz#c880b35b7d34ef85806deca7032d959ec5af8498" - integrity sha512-sFyFD1yIlBwg8jpCbmi4ngecMI6Uw6iEKyUUglFXOiaZQHTvE8oftAWKK7E5sac1Uce+7uR5iVKWDLKDxmjcSA== - dependencies: - "@types/node" "*" + version "1.1.6" + resolved "https://registry.yarnpkg.com/@types/ps-tree/-/ps-tree-1.1.6.tgz#fbb22dabe3d64b79295f37ce0afb7320a26ac9a6" + integrity sha512-PtrlVaOaI44/3pl3cvnlK+GxOM3re2526TJvPvh7W+keHIXdV4TE0ylpPBAcvFQCbGitaTXwL9u+RF7qtVeazQ== "@types/qs@*": - version "6.9.7" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" - integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== + version "6.9.18" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.18.tgz#877292caa91f7c1b213032b34626505b746624c2" + integrity sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA== "@types/range-parser@*": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" - integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== - -"@types/react-dom@*": - version "18.0.4" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.4.tgz#dcbcadb277bcf6c411ceff70069424c57797d375" - integrity sha512-FgTtbqPOCI3dzZPZoC2T/sx3L34qxy99ITWn4eoSA95qPyXDMH0ALoAqUp49ITniiJFsXUVBtalh/KffMpg21Q== - dependencies: - "@types/react" "*" - -"@types/react-dom@^16.8.0": - version "16.9.16" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.9.16.tgz#c591f2ed1c6f32e9759dfa6eb4abfd8041f29e39" - integrity sha512-Oqc0RY4fggGA3ltEgyPLc3IV9T73IGoWjkONbsyJ3ZBn+UPPCYpU2ec0i3cEbJuEdZtkqcCF2l1zf2pBdgUGSg== - dependencies: - "@types/react" "^16" - -"@types/react-select@^3.0.0": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@types/react-select/-/react-select-3.1.2.tgz#38627df4b49be9b28f800ed72b35d830369a624b" - integrity sha512-ygvR/2FL87R2OLObEWFootYzkvm67LRA+URYEAcBuvKk7IXmdsnIwSGm60cVXGaqkJQHozb2Cy1t94tCYb6rJA== - dependencies: - "@types/react" "*" - "@types/react-dom" "*" - "@types/react-transition-group" "*" - -"@types/react-tabs@^2.3.2": - version "2.3.4" - resolved "https://registry.yarnpkg.com/@types/react-tabs/-/react-tabs-2.3.4.tgz#b63662ee52e59a86ec33b78b9721d8163a46394c" - integrity sha512-HQzhKW+RF/7h14APw/2cu4Nnt+GmsTvfBKbFdn/NbYpb8Q+iB65wIkPHz4VRKDxWtOpNFpOUtzt5r0LRmQMfOA== - dependencies: - "@types/react" "*" + version "1.2.7" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" + integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== -"@types/react-transition-group@*": - version "4.4.4" - resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.4.tgz#acd4cceaa2be6b757db61ed7b432e103242d163e" - integrity sha512-7gAPz7anVK5xzbeQW9wFBDg7G++aPLAFY0QaSMOou9rJZpbuI58WAuJrgu+qR92l61grlnCUe7AFX8KGahAgug== +"@types/react-dom@18.3.1", "@types/react-dom@^18.0.6": + version "18.3.1" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.3.1.tgz#1e4654c08a9cdcfb6594c780ac59b55aad42fe07" + integrity sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ== dependencies: "@types/react" "*" -"@types/react-virtualized@^9.18.3": - version "9.21.21" - resolved "https://registry.yarnpkg.com/@types/react-virtualized/-/react-virtualized-9.21.21.tgz#65c96f25314f0fb3d40536929dc78112753b49e1" - integrity sha512-Exx6I7p4Qn+BBA1SRyj/UwQlZ0I0Pq7g7uhAp0QQ4JWzZunqEqNBGTmCmMmS/3N9wFgAGWuBD16ap7k8Y14VPA== - dependencies: - "@types/prop-types" "*" - "@types/react" "^17" +"@types/react-transition-group@^4.4.0": + version "4.4.12" + resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.12.tgz#b5d76568485b02a307238270bfe96cb51ee2a044" + integrity sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w== "@types/react-window@^1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@types/react-window/-/react-window-1.8.5.tgz#285fcc5cea703eef78d90f499e1457e9b5c02fc1" - integrity sha512-V9q3CvhC9Jk9bWBOysPGaWy/Z0lxYcTXLtLipkt2cnRj1JOSFNF7wqGpkScSXMgBwC+fnVRg/7shwgddBG5ICw== + version "1.8.8" + resolved "https://registry.yarnpkg.com/@types/react-window/-/react-window-1.8.8.tgz#c20645414d142364fbe735818e1c1e0a145696e3" + integrity sha512-8Ls660bHR1AUA2kuRvVG9D/4XpRC6wjAaPT9dil7Ckc76eP9TKWZwwmgfq8Q1LANX3QNDnoU4Zp48A3w+zK69Q== dependencies: "@types/react" "*" -"@types/react@*", "@types/react@16.14.25", "@types/react@^16", "@types/react@^16.8.0", "@types/react@^17": - version "16.14.25" - resolved "https://registry.yarnpkg.com/@types/react/-/react-16.14.25.tgz#d003f712c7563fdef5a87327f1892825af375608" - integrity sha512-cXRVHd7vBT5v1is72mmvmsg9stZrbJO04DJqFeh3Yj2tVKO6vmxg5BI+ybI6Ls7ROXRG3aFbZj9x0WA3ZAoDQw== +"@types/react@*", "@types/react@18.3.1", "@types/react@^18.0.15": + version "18.3.1" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.1.tgz#fed43985caa834a2084d002e4771e15dfcbdbe8e" + integrity sha512-V0kuGBX3+prX+DQ/7r2qsv1NsdfnCLnTgnRJ1pYnxykBhGMz+qj+box5lq7XsO5mtZsBqpjwwTu/7wszPfMBcw== dependencies: "@types/prop-types" "*" - "@types/scheduler" "*" csstype "^3.0.2" -"@types/request@^2.0.3": - version "2.48.8" - resolved "https://registry.yarnpkg.com/@types/request/-/request-2.48.8.tgz#0b90fde3b655ab50976cb8c5ac00faca22f5a82c" - integrity sha512-whjk1EDJPcAR2kYHRbFl/lKeeKYTi05A15K9bnLInCVroNDCtXce57xKdI0/rQaA3K+6q0eFyUBPmqfSndUZdQ== - dependencies: - "@types/caseless" "*" - "@types/node" "*" - "@types/tough-cookie" "*" - form-data "^2.5.0" - -"@types/responselike@*", "@types/responselike@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.0.tgz#251f4fe7d154d2bad125abe1b429b23afd262e29" - integrity sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA== - dependencies: - "@types/node" "*" - -"@types/rimraf@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@types/rimraf/-/rimraf-2.0.5.tgz#368fb04d59630b727fc05a74d2ca557f64a8ef98" - integrity sha512-YyP+VfeaqAyFmXoTh3HChxOQMyjByRMsHU7kc5KOJkSlXudhMhQIALbYV7rHh/l8d2lX3VUQzprrcAgWdRuU8g== +"@types/responselike@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.3.tgz#cc29706f0a397cfe6df89debfe4bf5cea159db50" + integrity sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw== dependencies: - "@types/glob" "*" "@types/node" "*" "@types/route-parser@^0.1.1": - version "0.1.4" - resolved "https://registry.yarnpkg.com/@types/route-parser/-/route-parser-0.1.4.tgz#155686e569d19ff97779bf6bcb513360587748dd" - integrity sha512-lwH3SeyKwCAwP7oUoJNryPDdbW3Bx5lrB6mhV5iebqzOJHIut6wlaSxpQR4Lsk6j7wC08pGenr/xE8I/A4J3Fg== + version "0.1.7" + resolved "https://registry.yarnpkg.com/@types/route-parser/-/route-parser-0.1.7.tgz#76d324537c9f0aaf65c96588c6ab5f3b84ae1505" + integrity sha512-haO+3HVio/4w+yuMJTjqfSo0ivOV8WnXaOReVD6QN729UGBEyizWNGc2Jd0OLsJDucIod4aJSsPLBeLj2uzMCQ== "@types/safer-buffer@^2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@types/safer-buffer/-/safer-buffer-2.1.0.tgz#8c498815fe00af8f8b23d63eb3fd6fae6ae2ab7a" - integrity sha512-04WlrCdOLy1Ejpwc3A7qyZzsH6uqeWoH+XO80V8S8NRubGg+E4FMMM3VAS6jZZ8w+dXki1/5FI5upmMDQlaQsQ== + version "2.1.3" + resolved "https://registry.yarnpkg.com/@types/safer-buffer/-/safer-buffer-2.1.3.tgz#901b21c2da54344cf73a205fb5d400592a43b5fd" + integrity sha512-5o3RcpBa7mUFnnnoMa9UIGOf9naD4DCKKMYzqkm9OSY7NNTd26k7adNC+fphcVRI9BUJglBs2yJQiRZYqBF/8w== dependencies: "@types/node" "*" -"@types/scheduler@*": - version "0.16.2" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" - integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== +"@types/semver@^7.3.12", "@types/semver@^7.3.6", "@types/semver@^7.5.0": + version "7.5.8" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" + integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== -"@types/semver@^5.4.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-5.5.0.tgz#146c2a29ee7d3bae4bf2fcb274636e264c813c45" - integrity sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ== - -"@types/semver@^7.3.6", "@types/semver@^7.3.8": - version "7.3.9" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.9.tgz#152c6c20a7688c30b967ec1841d31ace569863fc" - integrity sha512-L/TMpyURfBkf+o/526Zb6kd/tchUP3iBDEPjqjb+U2MAJhVRxxrmr2fwpe08E7QsV7YLcpq0tUaQ9O9x97ZIxQ== - -"@types/serve-static@*": - version "1.13.10" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.10.tgz#f5e0ce8797d2d7cc5ebeda48a52c96c4fa47a8d9" - integrity sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ== +"@types/send@*": + version "0.17.4" + resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.4.tgz#6619cd24e7270793702e4e6a4b958a9010cfc57a" + integrity sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA== dependencies: "@types/mime" "^1" "@types/node" "*" -"@types/sinon-chai@^3.2.6": - version "3.2.8" - resolved "https://registry.yarnpkg.com/@types/sinon-chai/-/sinon-chai-3.2.8.tgz#5871d09ab50d671d8e6dd72e9073f8e738ac61dc" - integrity sha512-d4ImIQbT/rKMG8+AXpmcan5T2/PNeSjrYhvkwet6z0p8kzYtfgA32xzOBlbU0yqJfq+/0Ml805iFoODO0LP5/g== - dependencies: - "@types/chai" "*" - "@types/sinon" "*" - -"@types/sinon@*", "@types/sinon@^10.0.6": - version "10.0.11" - resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-10.0.11.tgz#8245827b05d3fc57a6601bd35aee1f7ad330fc42" - integrity sha512-dmZsHlBsKUtBpHriNjlK0ndlvEh8dcb9uV9Afsbt89QIyydpC7NcR+nWlAhASfy3GHnxTl4FX/aKE7XZUt/B4g== +"@types/serve-static@*": + version "1.15.7" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.7.tgz#22174bbd74fb97fe303109738e9b5c2f3064f714" + integrity sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw== dependencies: - "@types/sinonjs__fake-timers" "*" - -"@types/sinon@^2.3.5": - version "2.3.7" - resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-2.3.7.tgz#e92c2fed3297eae078d78d1da032b26788b4af86" - integrity sha512-w+LjztaZbgZWgt/y/VMP5BUAWLtSyoIJhXyW279hehLPyubDoBNwvhcj3WaSptcekuKYeTCVxrq60rdLc6ImJA== - -"@types/sinonjs__fake-timers@*": - version "8.1.2" - resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.2.tgz#bf2e02a3dbd4aecaf95942ecd99b7402e03fad5e" - integrity sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA== + "@types/http-errors" "*" + "@types/node" "*" + "@types/send" "*" "@types/tar-fs@^1.16.1": version "1.16.3" @@ -3498,9 +3191,9 @@ "@types/tar-stream" "*" "@types/tar-stream@*": - version "2.2.2" - resolved "https://registry.yarnpkg.com/@types/tar-stream/-/tar-stream-2.2.2.tgz#be9d0be9404166e4b114151f93e8442e6ab6fb1d" - integrity sha512-1AX+Yt3icFuU6kxwmPakaiGrJUwG44MpuiqPg4dSolRFk6jmvs4b3IbUol9wKDLIgU76gevn3EwE8y/DkSJCZQ== + version "3.1.3" + resolved "https://registry.yarnpkg.com/@types/tar-stream/-/tar-stream-3.1.3.tgz#f61427229691eda1b7d5719f34acdc4fc8a558ce" + integrity sha512-Zbnx4wpkWBMBSu5CytMbrT5ZpMiF55qgM+EpHzR4yIDu7mv52cej8hTkOc6K+LzpkOAbxwn/m7j3iO+/l42YkQ== dependencies: "@types/node" "*" @@ -3511,268 +3204,424 @@ dependencies: "@types/node" "*" -"@types/tough-cookie@*", "@types/tough-cookie@^4.0.0": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.2.tgz#6286b4c7228d58ab7866d19716f3696e03a09397" - integrity sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw== +"@types/tough-cookie@*": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.5.tgz#cb6e2a691b70cb177c6e3ae9c1d2e8b2ea8cd304" + integrity sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA== "@types/trusted-types@*": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.2.tgz#fc25ad9943bcac11cceb8168db4f275e0e72e756" - integrity sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg== + version "2.0.7" + resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.7.tgz#baccb07a970b91707df3a3e8ba6896c57ead2d11" + integrity sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw== -"@types/unist@*", "@types/unist@^2.0.0": - version "2.0.6" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d" - integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== +"@types/unist@^2", "@types/unist@^2.0.0": + version "2.0.11" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.11.tgz#11af57b127e32487774841f7a4e54eab166d03c4" + integrity sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA== -"@types/uuid@^7.0.3": - version "7.0.5" - resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-7.0.5.tgz#b1d2f772142a301538fae9bdf9cf15b9f2573a29" - integrity sha512-hKB88y3YHL8oPOs/CNlaXtjWn93+Bs48sDQR37ZUqG2tLeCS7EA1cmnkKsuQsub9OKEB/y/Rw9zqJqqNSbqVlQ== +"@types/uuid@^9.0.8": + version "9.0.8" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.8.tgz#7545ba4fc3c003d6c756f651f3bf163d8f0f29ba" + integrity sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA== -"@types/which@^1.3.1": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@types/which/-/which-1.3.2.tgz#9c246fc0c93ded311c8512df2891fb41f6227fdf" - integrity sha512-8oDqyLC7eD4HM307boe2QWKyuzdzWBj56xI/imSl2cpL+U3tCMaTAkMJ4ee5JBZ/FsOJlvRGeIShiZDAl1qERA== +"@types/verror@^1.10.3": + version "1.10.11" + resolved "https://registry.yarnpkg.com/@types/verror/-/verror-1.10.11.tgz#d3d6b418978c8aa202d41e5bb3483227b6ecc1bb" + integrity sha512-RlDm9K7+o5stv0Co8i8ZRGxDbrTxhJtgjqjFyVh/tXQyl/rYtTKlnTvZ88oSTeYREWurwx20Js4kTuKCsFkUtg== + +"@types/vscode@^1.78.0": + version "1.98.0" + resolved "https://registry.yarnpkg.com/@types/vscode/-/vscode-1.98.0.tgz#5b6fa5bd99ba15313567d3847fb1177832fee08c" + integrity sha512-+KuiWhpbKBaG2egF+51KjbGWatTH5BbmWQjSLMDCssb4xF8FJnW4nGH4nuAdOOfMbpD0QlHtI+C3tPq+DoKElg== "@types/write-json-file@^2.2.1": version "2.2.1" resolved "https://registry.yarnpkg.com/@types/write-json-file/-/write-json-file-2.2.1.tgz#74155aaccbb0d532be21f9d66bebc4ea875a5a62" integrity sha512-JdO/UpPm9RrtQBNVcZdt3M7j3mHO/kXaea9LBGx3UgWJd1f9BkIWP7jObLBG6ZtRyqp7KzLFEsaPhWcidVittA== -"@types/ws@^5.1.2": - version "5.1.2" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-5.1.2.tgz#f02d3b1cd46db7686734f3ce83bdf46c49decd64" - integrity sha512-NkTXUKTYdXdnPE2aUUbGOXE1XfMK527SCvU/9bj86kyFF6kZ9ZnOQ3mK5jADn98Y2vEUD/7wKDgZa7Qst2wYOg== +"@types/ws@^8.5.5": + version "8.18.0" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.18.0.tgz#8a2ec491d6f0685ceaab9a9b7ff44146236993b5" + integrity sha512-8svvI3hMyvN0kKCJMvTJP/x6Y/EoQbepff882wL+Sn5QsXb3etnamgrJq4isrBxSJj5L2AuXcI0+bgkoAXGUJw== dependencies: - "@types/events" "*" "@types/node" "*" "@types/yargs-parser@*": - version "21.0.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" - integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== + version "21.0.3" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" + integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== "@types/yargs@^15": - version "15.0.14" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.14.tgz#26d821ddb89e70492160b66d10a0eb6df8f6fb06" - integrity sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ== + version "15.0.19" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.19.tgz#328fb89e46109ecbdb70c295d96ff2f46dfd01b9" + integrity sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA== dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@^4.27.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz#c24dc7c8069c7706bc40d99f6fa87edcb2005276" - integrity sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg== +"@types/yauzl@^2.9.1": + version "2.10.3" + resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.3.tgz#e9b2808b4f109504a03cda958259876f61017999" + integrity sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q== dependencies: - "@typescript-eslint/experimental-utils" "4.33.0" - "@typescript-eslint/scope-manager" "4.33.0" - debug "^4.3.1" - functional-red-black-tree "^1.0.1" - ignore "^5.1.8" - regexpp "^3.1.0" - semver "^7.3.5" + "@types/node" "*" + +"@typescript-eslint/eslint-plugin@^5.59.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz#aeef0328d172b9e37d9bab6dbc13b87ed88977db" + integrity sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag== + dependencies: + "@eslint-community/regexpp" "^4.4.0" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/type-utils" "5.62.0" + "@typescript-eslint/utils" "5.62.0" + debug "^4.3.4" + graphemer "^1.4.0" + ignore "^5.2.0" + natural-compare-lite "^1.4.0" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/parser@^5.59.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.62.0.tgz#1b63d082d849a2fcae8a569248fbe2ee1b8a56c7" + integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA== + dependencies: + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" + integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== + dependencies: + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" + +"@typescript-eslint/type-utils@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz#286f0389c41681376cdad96b309cedd17d70346a" + integrity sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew== + dependencies: + "@typescript-eslint/typescript-estree" "5.62.0" + "@typescript-eslint/utils" "5.62.0" + debug "^4.3.4" + tsutils "^3.21.0" + +"@typescript-eslint/types@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" + integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== + +"@typescript-eslint/typescript-estree@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" + integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== + dependencies: + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/experimental-utils@4.33.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz#6f2a786a4209fa2222989e9380b5331b2810f7fd" - integrity sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q== +"@typescript-eslint/utils@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" + integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== dependencies: - "@types/json-schema" "^7.0.7" - "@typescript-eslint/scope-manager" "4.33.0" - "@typescript-eslint/types" "4.33.0" - "@typescript-eslint/typescript-estree" "4.33.0" + "@eslint-community/eslint-utils" "^4.2.0" + "@types/json-schema" "^7.0.9" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" eslint-scope "^5.1.1" - eslint-utils "^3.0.0" + semver "^7.3.7" -"@typescript-eslint/parser@^4.27.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.33.0.tgz#dfe797570d9694e560528d18eecad86c8c744899" - integrity sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA== +"@typescript-eslint/visitor-keys@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" + integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== dependencies: - "@typescript-eslint/scope-manager" "4.33.0" - "@typescript-eslint/types" "4.33.0" - "@typescript-eslint/typescript-estree" "4.33.0" - debug "^4.3.1" + "@typescript-eslint/types" "5.62.0" + eslint-visitor-keys "^3.3.0" + +"@ungap/structured-clone@^1.2.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.3.0.tgz#d06bbb384ebcf6c505fde1c3d0ed4ddffe0aaff8" + integrity sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g== -"@typescript-eslint/scope-manager@4.33.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz#d38e49280d983e8772e29121cf8c6e9221f280a3" - integrity sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ== +"@virtuoso.dev/react-urx@^0.2.12": + version "0.2.13" + resolved "https://registry.yarnpkg.com/@virtuoso.dev/react-urx/-/react-urx-0.2.13.tgz#e2cfc42d259d2a002695e7517d34cb97b64ee9c4" + integrity sha512-MY0ugBDjFb5Xt8v2HY7MKcRGqw/3gTpMlLXId2EwQvYJoC8sP7nnXjAxcBtTB50KTZhO0SbzsFimaZ7pSdApwA== dependencies: - "@typescript-eslint/types" "4.33.0" - "@typescript-eslint/visitor-keys" "4.33.0" + "@virtuoso.dev/urx" "^0.2.13" + +"@virtuoso.dev/urx@^0.2.12", "@virtuoso.dev/urx@^0.2.13": + version "0.2.13" + resolved "https://registry.yarnpkg.com/@virtuoso.dev/urx/-/urx-0.2.13.tgz#a65e7e8d923cb03397ac876bfdd45c7f71c8edf1" + integrity sha512-iirJNv92A1ZWxoOHHDYW/1KPoi83939o83iUBQHIim0i3tMeSKEh+bxhJdTHQ86Mr4uXx9xGUTq69cp52ZP8Xw== + +"@vscode/codicons@*": + version "0.0.36" + resolved "https://registry.yarnpkg.com/@vscode/codicons/-/codicons-0.0.36.tgz#ccdabfaef5db596b266644ab85fc25aa701058f0" + integrity sha512-wsNOvNMMJ2BY8rC2N2MNBG7yOowV3ov8KlvUE/AiVUlHKTfWsw3OgAOQduX7h0Un6GssKD3aoTVH+TF3DSQwKQ== -"@typescript-eslint/types@4.33.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.33.0.tgz#a1e59036a3b53ae8430ceebf2a919dc7f9af6d72" - integrity sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ== +"@vscode/debugprotocol@^1.51.0": + version "1.68.0" + resolved "https://registry.yarnpkg.com/@vscode/debugprotocol/-/debugprotocol-1.68.0.tgz#e558ba6affe1be7aff4ec824599f316b61d9a69d" + integrity sha512-2J27dysaXmvnfuhFGhfeuxfHRXunqNPxtBoR3koiTOA9rdxWNDTa1zIFLCFMSHJ9MPTPKFcBeblsyaCJCIlQxg== -"@typescript-eslint/typescript-estree@4.33.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz#0dfb51c2908f68c5c08d82aefeaf166a17c24609" - integrity sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA== +"@vscode/proxy-agent@^0.13.2": + version "0.13.2" + resolved "https://registry.yarnpkg.com/@vscode/proxy-agent/-/proxy-agent-0.13.2.tgz#0d289826c07faecc4ca07de80a8e5a9459d06119" + integrity sha512-BSUd0NTj44WvG4O9A6N+4R1XhxtPqCYltWeHyNkquX9T//a1US+cd8fxzcZCPd3z7dygdYIPkZAKM+CrefWWOA== dependencies: - "@typescript-eslint/types" "4.33.0" - "@typescript-eslint/visitor-keys" "4.33.0" + "@tootallnate/once" "^1.1.2" + agent-base "^6.0.2" debug "^4.3.1" - globby "^11.0.3" - is-glob "^4.0.1" - semver "^7.3.5" - tsutils "^3.21.0" + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + socks-proxy-agent "^5.0.0" + optionalDependencies: + "@vscode/windows-ca-certs" "^0.3.1" -"@typescript-eslint/visitor-keys@4.33.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz#2a22f77a41604289b7a186586e9ec48ca92ef1dd" - integrity sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg== +"@vscode/ripgrep@^1.14.2": + version "1.15.11" + resolved "https://registry.yarnpkg.com/@vscode/ripgrep/-/ripgrep-1.15.11.tgz#31d49e8edae86cd6bab3017f1b2088bdb48dfc4e" + integrity sha512-G/VqtA6kR50mJkIH4WA+I2Q78V5blovgPPq0VPYM0QIRp57lYMkdV+U9VrY80b3AvaC72A1z8STmyxc8ZKiTsw== dependencies: - "@typescript-eslint/types" "4.33.0" - eslint-visitor-keys "^2.0.0" + https-proxy-agent "^7.0.2" + proxy-from-env "^1.1.0" + yauzl "^2.9.2" -"@vscode/codicons@*": - version "0.0.30" - resolved "https://registry.yarnpkg.com/@vscode/codicons/-/codicons-0.0.30.tgz#67c265c1f3ff7214da475333efa6d381710b0335" - integrity sha512-/quu8pLXEyrShoDjTImQwJ2H28y1XhANigyw7E7JvN9NNWc3XCkoIWpcb/tUhdf7XQpopLVVYbkMjXpdPPuMXg== +"@vscode/windows-ca-certs@^0.3.1": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@vscode/windows-ca-certs/-/windows-ca-certs-0.3.3.tgz#7943d78db7d1d99bcd82eb8a0765a870b111d003" + integrity sha512-C0Iq5RcH+H31GUZ8bsMORsX3LySVkGAqe4kQfUSVcCqJ0QOhXkhgwUMU7oCiqYLXaQWyXFp6Fj6eMdt05uK7VA== + dependencies: + node-addon-api "^8.2.0" -"@webassemblyjs/ast@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" - integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== +"@webassemblyjs/ast@1.14.1", "@webassemblyjs/ast@^1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.14.1.tgz#a9f6a07f2b03c95c8d38c4536a1fdfb521ff55b6" + integrity sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ== dependencies: - "@webassemblyjs/helper-numbers" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/helper-numbers" "1.13.2" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" -"@webassemblyjs/floating-point-hex-parser@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" - integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== +"@webassemblyjs/floating-point-hex-parser@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz#fcca1eeddb1cc4e7b6eed4fc7956d6813b21b9fb" + integrity sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA== -"@webassemblyjs/helper-api-error@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" - integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== +"@webassemblyjs/helper-api-error@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz#e0a16152248bc38daee76dd7e21f15c5ef3ab1e7" + integrity sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ== -"@webassemblyjs/helper-buffer@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" - integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== +"@webassemblyjs/helper-buffer@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz#822a9bc603166531f7d5df84e67b5bf99b72b96b" + integrity sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA== -"@webassemblyjs/helper-numbers@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae" - integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== +"@webassemblyjs/helper-numbers@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz#dbd932548e7119f4b8a7877fd5a8d20e63490b2d" + integrity sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA== dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.11.1" - "@webassemblyjs/helper-api-error" "1.11.1" + "@webassemblyjs/floating-point-hex-parser" "1.13.2" + "@webassemblyjs/helper-api-error" "1.13.2" "@xtuc/long" "4.2.2" -"@webassemblyjs/helper-wasm-bytecode@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" - integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== +"@webassemblyjs/helper-wasm-bytecode@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz#e556108758f448aae84c850e593ce18a0eb31e0b" + integrity sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA== -"@webassemblyjs/helper-wasm-section@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a" - integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== +"@webassemblyjs/helper-wasm-section@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz#9629dda9c4430eab54b591053d6dc6f3ba050348" + integrity sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw== dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-buffer" "1.14.1" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/wasm-gen" "1.14.1" -"@webassemblyjs/ieee754@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614" - integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== +"@webassemblyjs/ieee754@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz#1c5eaace1d606ada2c7fd7045ea9356c59ee0dba" + integrity sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw== dependencies: "@xtuc/ieee754" "^1.2.0" -"@webassemblyjs/leb128@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5" - integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== +"@webassemblyjs/leb128@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.13.2.tgz#57c5c3deb0105d02ce25fa3fd74f4ebc9fd0bbb0" + integrity sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw== dependencies: "@xtuc/long" "4.2.2" -"@webassemblyjs/utf8@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" - integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== +"@webassemblyjs/utf8@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.13.2.tgz#917a20e93f71ad5602966c2d685ae0c6c21f60f1" + integrity sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ== -"@webassemblyjs/wasm-edit@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6" - integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/helper-wasm-section" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - "@webassemblyjs/wasm-opt" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - "@webassemblyjs/wast-printer" "1.11.1" - -"@webassemblyjs/wasm-gen@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76" - integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== +"@webassemblyjs/wasm-edit@^1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz#ac6689f502219b59198ddec42dcd496b1004d597" + integrity sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-buffer" "1.14.1" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/helper-wasm-section" "1.14.1" + "@webassemblyjs/wasm-gen" "1.14.1" + "@webassemblyjs/wasm-opt" "1.14.1" + "@webassemblyjs/wasm-parser" "1.14.1" + "@webassemblyjs/wast-printer" "1.14.1" + +"@webassemblyjs/wasm-gen@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz#991e7f0c090cb0bb62bbac882076e3d219da9570" + integrity sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg== dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/ieee754" "1.11.1" - "@webassemblyjs/leb128" "1.11.1" - "@webassemblyjs/utf8" "1.11.1" + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/ieee754" "1.13.2" + "@webassemblyjs/leb128" "1.13.2" + "@webassemblyjs/utf8" "1.13.2" -"@webassemblyjs/wasm-opt@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2" - integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== +"@webassemblyjs/wasm-opt@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz#e6f71ed7ccae46781c206017d3c14c50efa8106b" + integrity sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw== dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-buffer" "1.14.1" + "@webassemblyjs/wasm-gen" "1.14.1" + "@webassemblyjs/wasm-parser" "1.14.1" -"@webassemblyjs/wasm-parser@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199" - integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== +"@webassemblyjs/wasm-parser@1.14.1", "@webassemblyjs/wasm-parser@^1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz#b3e13f1893605ca78b52c68e54cf6a865f90b9fb" + integrity sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ== dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-api-error" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/ieee754" "1.11.1" - "@webassemblyjs/leb128" "1.11.1" - "@webassemblyjs/utf8" "1.11.1" + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-api-error" "1.13.2" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/ieee754" "1.13.2" + "@webassemblyjs/leb128" "1.13.2" + "@webassemblyjs/utf8" "1.13.2" -"@webassemblyjs/wast-printer@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0" - integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== +"@webassemblyjs/wast-printer@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz#3bb3e9638a8ae5fdaf9610e7a06b4d9f9aa6fe07" + integrity sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw== dependencies: - "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/ast" "1.14.1" "@xtuc/long" "4.2.2" "@webpack-cli/configtest@^1.0.3": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.1.1.tgz#9f53b1b7946a6efc2a749095a4f450e2932e8356" - integrity sha512-1FBc1f9G4P/AxMqIgfZgeOTuRnwZMten8E7zap5zgpPInnCrP8D4Q81+4CWIch8i/Nf7nXjP0v6CjjbHOrXhKg== + version "1.2.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.2.0.tgz#7b20ce1c12533912c3b217ea68262365fa29a6f5" + integrity sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg== "@webpack-cli/info@^1.2.4": - version "1.4.1" - resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.4.1.tgz#2360ea1710cbbb97ff156a3f0f24556e0fc1ebea" - integrity sha512-PKVGmazEq3oAo46Q63tpMr4HipI3OPfP7LiNOEJg963RMgT0rqheag28NCML0o3GIzA3DmxP1ZIAv9oTX1CUIA== + version "1.5.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.5.0.tgz#6c78c13c5874852d6e2dd17f08a41f3fe4c261b1" + integrity sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ== dependencies: envinfo "^7.7.3" "@webpack-cli/serve@^1.4.0": - version "1.6.1" - resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.6.1.tgz#0de2875ac31b46b6c5bb1ae0a7d7f0ba5678dffe" - integrity sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw== + version "1.7.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.7.0.tgz#e1993689ac42d2b16e9194376cfb6753f6254db1" + integrity sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q== + +"@xhmikosr/archive-type@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@xhmikosr/archive-type/-/archive-type-6.0.1.tgz#684e9e5369bfa93223d7aeb2c84fe0780d6d5e24" + integrity sha512-PB3NeJL8xARZt52yDBupK0dNPn8uIVQDe15qNehUpoeeLWCZyAOam4vGXnoZGz2N9D1VXtjievJuCsXam2TmbQ== + dependencies: + file-type "^18.5.0" + +"@xhmikosr/decompress-tar@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@xhmikosr/decompress-tar/-/decompress-tar-7.0.0.tgz#ae1ecc723bde8547ff65540018765875712d400b" + integrity sha512-kyWf2hybtQVbWtB+FdRyOT+jyR5jxCNZPLqvQGB7djZj75lrpLUPEmRbyo86AtJ5OEtivpYaNWjCkqSJ8xtRWw== + dependencies: + file-type "^18.5.0" + is-stream "^3.0.0" + tar-stream "^3.1.4" + +"@xhmikosr/decompress-tarbz2@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@xhmikosr/decompress-tarbz2/-/decompress-tarbz2-7.0.0.tgz#eea242c59e7d52f9bccc91e1a51d4b34ed048792" + integrity sha512-3QnjipYkRgh3Dee1MWDgKmANWxOQBVN4e1IwiGNe2fHYfMYTeSkVvWREt87UIoSucKUh3E95v8uGFttgTknZcA== + dependencies: + "@xhmikosr/decompress-tar" "^7.0.0" + file-type "^18.5.0" + is-stream "^3.0.0" + seek-bzip "^1.0.6" + unbzip2-stream "^1.4.3" + +"@xhmikosr/decompress-targz@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@xhmikosr/decompress-targz/-/decompress-targz-7.0.0.tgz#b80c913056903b162088b85619f632914f514f74" + integrity sha512-7BNHJl92g9OLhw89zqcFS67V1LAtm4Ex02j6OiQzuE8P7Yy9lQcyBuEL3x6v436grLdL+BcFjgbmhWxnem4GHw== + dependencies: + "@xhmikosr/decompress-tar" "^7.0.0" + file-type "^18.5.0" + is-stream "^3.0.0" + +"@xhmikosr/decompress-unzip@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@xhmikosr/decompress-unzip/-/decompress-unzip-6.0.0.tgz#d617956a1e762c5396cef8340973dd60ba24c9dd" + integrity sha512-R1HAkjXLS7RAL74YFLxYY9zYflCcYGssld9KKFDu87PnJ4h4btdhzXfSC8J5i5A2njH3oYIoCzx03RIGTH07Sg== + dependencies: + file-type "^18.5.0" + get-stream "^6.0.1" + yauzl "^2.10.0" + +"@xhmikosr/decompress@^9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@xhmikosr/decompress/-/decompress-9.0.1.tgz#e35977739da39bc664e0b49015b402a7cf9b1d91" + integrity sha512-9Lvlt6Qdpo9SaRQyRIXCo3lgU++eMZ68lzgjcTwtuKDrlwT635+5zsHZ1yrSx/Blc5IDuVLlPkBPj5CZkx+2+Q== + dependencies: + "@xhmikosr/decompress-tar" "^7.0.0" + "@xhmikosr/decompress-tarbz2" "^7.0.0" + "@xhmikosr/decompress-targz" "^7.0.0" + "@xhmikosr/decompress-unzip" "^6.0.0" + graceful-fs "^4.2.11" + make-dir "^4.0.0" + strip-dirs "^3.0.0" + +"@xhmikosr/downloader@^13.0.1": + version "13.0.1" + resolved "https://registry.yarnpkg.com/@xhmikosr/downloader/-/downloader-13.0.1.tgz#8478b36606d2108eb86bff419e1df36d84cc262d" + integrity sha512-mBvWew1kZJHfNQVVfVllMjUDwCGN9apPa0t4/z1zaUJ9MzpXjRL3w8fsfJKB8gHN/h4rik9HneKfDbh2fErN+w== + dependencies: + "@xhmikosr/archive-type" "^6.0.1" + "@xhmikosr/decompress" "^9.0.1" + content-disposition "^0.5.4" + ext-name "^5.0.0" + file-type "^18.5.0" + filenamify "^5.1.1" + get-stream "^6.0.1" + got "^12.6.1" + merge-options "^3.0.4" + p-event "^5.0.1" + +"@xmldom/xmldom@^0.8.8": + version "0.8.10" + resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz#a1337ca426aa61cef9fe15b5b28e340a72f6fa99" + integrity sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw== "@xtuc/ieee754@^1.2.0": version "1.2.0" @@ -3784,16 +3633,27 @@ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== -"@zkochan/cmd-shim@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@zkochan/cmd-shim/-/cmd-shim-3.1.0.tgz#2ab8ed81f5bb5452a85f25758eb9b8681982fd2e" - integrity sha512-o8l0+x7C7sMZU3v9GuJIAU10qQLtwR1dtRQIOmlNMtyaqhmpXOzx1HWiYoWfmmf9HHZoAkXpc9TM9PQYF9d4Jg== +"@yarnpkg/lockfile@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" + integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== + +"@yarnpkg/parsers@3.0.0-rc.46": + version "3.0.0-rc.46" + resolved "https://registry.yarnpkg.com/@yarnpkg/parsers/-/parsers-3.0.0-rc.46.tgz#03f8363111efc0ea670e53b0282cd3ef62de4e01" + integrity sha512-aiATs7pSutzda/rq8fnuPwTglyVwjM22bNnK2ZgjrpAjQHSSl3lztd2f9evst1W/qnC58DRz7T7QndUDumAR4Q== + dependencies: + js-yaml "^3.10.0" + tslib "^2.4.0" + +"@zkochan/js-yaml@0.0.6": + version "0.0.6" + resolved "https://registry.yarnpkg.com/@zkochan/js-yaml/-/js-yaml-0.0.6.tgz#975f0b306e705e28b8068a07737fa46d3fc04826" + integrity sha512-nzvgl3VfhcELQ8LyVrYOru+UtAy1nrygk2+AGbTm8a5YcO6o8lSjAT+pfg3vJWxIoZKOUhrK6UU7xW/+00kQrg== dependencies: - is-windows "^1.0.0" - mkdirp-promise "^5.0.1" - mz "^2.5.0" + argparse "^2.0.1" -JSONStream@^1.0.4, JSONStream@^1.3.4: +JSONStream@^1.3.5: version "1.3.5" resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== @@ -3801,16 +3661,23 @@ JSONStream@^1.0.4, JSONStream@^1.3.4: jsonparse "^1.2.0" through ">=2.2.7 <3" -abab@^2.0.0, abab@^2.0.5: +abab@^2.0.5, abab@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== -abbrev@1: +abbrev@1, abbrev@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== +abort-controller@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== + dependencies: + event-target-shim "^5.0.0" + accepts@~1.3.4, accepts@~1.3.8: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" @@ -3819,60 +3686,40 @@ accepts@~1.3.4, accepts@~1.3.8: mime-types "~2.1.34" negotiator "0.6.3" -acorn-globals@^4.1.0: - version "4.3.4" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7" - integrity sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A== +acorn-globals@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-7.0.1.tgz#0dbf05c44fa7c94332914c02066d5beff62c40c3" + integrity sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q== dependencies: - acorn "^6.0.1" - acorn-walk "^6.0.1" - -acorn-import-assertions@^1.7.6: - version "1.8.0" - resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" - integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== + acorn "^8.1.0" + acorn-walk "^8.0.2" -acorn-jsx@^5.3.1: +acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn-walk@^6.0.1: - version "6.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" - integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA== - -acorn@^5.5.3: - version "5.7.4" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e" - integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg== - -acorn@^6.0.1: - version "6.4.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" - integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== - -acorn@^7.4.0: - version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== - -acorn@^8.4.1, acorn@^8.5.0: - version "8.7.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" - integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== - -agent-base@4, agent-base@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee" - integrity sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg== +acorn-walk@^8.0.2: + version "8.3.4" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.4.tgz#794dd169c3977edf4ba4ea47583587c5866236b7" + integrity sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g== dependencies: - es6-promisify "^5.0.0" + acorn "^8.11.0" -agent-base@5: - version "5.1.1" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-5.1.1.tgz#e8fb3f242959db44d63be665db7a8e739537a32c" - integrity sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g== +acorn@^8.1.0, acorn@^8.11.0, acorn@^8.14.0, acorn@^8.8.2, acorn@^8.9.0: + version "8.14.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.1.tgz#721d5dc10f7d5b5609a891773d47731796935dfb" + integrity sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg== + +add-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/add-stream/-/add-stream-1.0.0.tgz#6a7990437ca736d5e1288db92bd3266d5f5cb2aa" + integrity sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ== + +advanced-mark.js@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/advanced-mark.js/-/advanced-mark.js-2.6.0.tgz#86ea8b81152b543db91b1602df4e69282c3b0083" + integrity sha512-b6Q7iNkXk1BTUvmbvtig+/p3Z54qDQqOoOKPJUZXYtCdgeZPz/qj9xZs6GKKQA2/OIOrlNwSt/OvyIq06eYPVw== agent-base@6, agent-base@^6.0.2: version "6.0.2" @@ -3881,27 +3728,16 @@ agent-base@6, agent-base@^6.0.2: dependencies: debug "4" -agent-base@~4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9" - integrity sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg== - dependencies: - es6-promisify "^5.0.0" - -agentkeepalive@^3.4.1: - version "3.5.2" - resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-3.5.2.tgz#a113924dd3fa24a0bc3b78108c450c2abee00f67" - integrity sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ== - dependencies: - humanize-ms "^1.2.1" +agent-base@^7.1.0, agent-base@^7.1.2: + version "7.1.3" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.3.tgz#29435eb821bc4194633a5b89e5bc4703bafc25a1" + integrity sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw== -agentkeepalive@^4.1.3, agentkeepalive@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.2.1.tgz#a7975cbb9f83b367f06c90cc51ff28fe7d499717" - integrity sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA== +agentkeepalive@^4.2.1: + version "4.6.0" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.6.0.tgz#35f73e94b3f40bf65f105219c623ad19c136ea6a" + integrity sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ== dependencies: - debug "^4.1.0" - depd "^1.1.2" humanize-ms "^1.2.1" aggregate-error@^3.0.0: @@ -3912,6 +3748,14 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" +aggregate-error@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-4.0.1.tgz#25091fe1573b9e0be892aeda15c7c66a545f758e" + integrity sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w== + dependencies: + clean-stack "^4.0.0" + indent-string "^5.0.0" + ajv-formats@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" @@ -3919,19 +3763,19 @@ ajv-formats@^2.1.1: dependencies: ajv "^8.0.0" -ajv-keywords@^3.5.2: +ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: version "3.5.2" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== -ajv-keywords@^5.0.0: +ajv-keywords@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== dependencies: fast-deep-equal "^3.1.3" -ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.5.3: +ajv@^6.10.0, ajv@^6.12.0, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.5.3: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -3941,263 +3785,47 @@ ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.5.3: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.0, ajv@^8.0.1, ajv@^8.6.3, ajv@^8.8.0: - version "8.11.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" - integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== +ajv@^8.0.0, ajv@^8.6.3, ajv@^8.9.0: + version "8.17.1" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" + integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== dependencies: - fast-deep-equal "^3.1.1" + fast-deep-equal "^3.1.3" + fast-uri "^3.0.1" json-schema-traverse "^1.0.0" require-from-string "^2.0.2" - uri-js "^4.2.2" anser@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/anser/-/anser-2.1.1.tgz#8afae28d345424c82de89cc0e4d1348eb0c5af7c" - integrity sha512-nqLm4HxOTpeLOxcmB3QWmV5TcDFhW9y/fyQ+hivtDFcK4OQ+pQ5fzPnXHM1Mfcm0VkLtvVi1TCPr++Qy0Q/3EQ== - -ansi-bgblack@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-bgblack/-/ansi-bgblack-0.1.1.tgz#a68ba5007887701b6aafbe3fa0dadfdfa8ee3ca2" - integrity sha512-tp8M/NCmSr6/skdteeo9UgJ2G1rG88X3ZVNZWXUxFw4Wh0PAGaAAWQS61sfBt/1QNcwMTY3EBKOMPujwioJLaw== - dependencies: - ansi-wrap "0.1.0" - -ansi-bgblue@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-bgblue/-/ansi-bgblue-0.1.1.tgz#67bdc04edc9b9b5278969da196dea3d75c8c3613" - integrity sha512-R8JmX2Xv3+ichUQE99oL+LvjsyK+CDWo/BtVb4QUz3hOfmf2bdEmiDot3fQcpn2WAHW3toSRdjSLm6bgtWRDlA== - dependencies: - ansi-wrap "0.1.0" - -ansi-bgcyan@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-bgcyan/-/ansi-bgcyan-0.1.1.tgz#58489425600bde9f5507068dd969ebfdb50fe768" - integrity sha512-6SByK9q2H978bmqzuzA5NPT1lRDXl3ODLz/DjC4URO5f/HqK7dnRKfoO/xQLx/makOz7zWIbRf6+Uf7bmaPSkQ== - dependencies: - ansi-wrap "0.1.0" - -ansi-bggreen@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-bggreen/-/ansi-bggreen-0.1.1.tgz#4e3191248529943f4321e96bf131d1c13816af49" - integrity sha512-8TRtOKmIPOuxjpklrkhUbqD2NnVb4WZQuIjXrT+TGKFKzl7NrL7wuNvEap3leMt2kQaCngIN1ZzazSbJNzF+Aw== - dependencies: - ansi-wrap "0.1.0" - -ansi-bgmagenta@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-bgmagenta/-/ansi-bgmagenta-0.1.1.tgz#9b28432c076eaa999418672a3efbe19391c2c7a1" - integrity sha512-UZYhobiGAlV4NiwOlKAKbkCyxOl1PPZNvdIdl/Ce5by45vwiyNdBetwHk/AjIpo1Ji9z+eE29PUBAjjfVmz5SA== - dependencies: - ansi-wrap "0.1.0" - -ansi-bgred@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-bgred/-/ansi-bgred-0.1.1.tgz#a76f92838382ba43290a6c1778424f984d6f1041" - integrity sha512-BpPHMnYmRBhcjY5knRWKjQmPDPvYU7wrgBSW34xj7JCH9+a/SEIV7+oSYVOgMFopRIadOz9Qm4zIy+mEBvUOPA== - dependencies: - ansi-wrap "0.1.0" - -ansi-bgwhite@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-bgwhite/-/ansi-bgwhite-0.1.1.tgz#6504651377a58a6ececd0331994e480258e11ba8" - integrity sha512-KIF19t+HOYOorUnHTOhZpeZ3bJsjzStBG2hSGM0WZ8YQQe4c7lj9CtwnucscJDPrNwfdz6GBF+pFkVfvHBq6uw== - dependencies: - ansi-wrap "0.1.0" - -ansi-bgyellow@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-bgyellow/-/ansi-bgyellow-0.1.1.tgz#c3fe2eb08cd476648029e6874d15a0b38f61d44f" - integrity sha512-WyRoOFSIvOeM7e7YdlSjfAV82Z6K1+VUVbygIQ7C/VGzWYuO/d30F0PG7oXeo4uSvSywR0ozixDQvtXJEorq4Q== - dependencies: - ansi-wrap "0.1.0" - -ansi-black@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-black/-/ansi-black-0.1.1.tgz#f6185e889360b2545a1ec50c0bf063fc43032453" - integrity sha512-hl7re02lWus7lFOUG6zexhoF5gssAfG5whyr/fOWK9hxNjUFLTjhbU/b4UHWOh2dbJu9/STSUv+80uWYzYkbTQ== - dependencies: - ansi-wrap "0.1.0" - -ansi-blue@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-blue/-/ansi-blue-0.1.1.tgz#15b804990e92fc9ca8c5476ce8f699777c21edbf" - integrity sha512-8Um59dYNDdQyoczlf49RgWLzYgC2H/28W3JAIyOAU/+WkMcfZmaznm+0i1ikrE0jME6Ypk9CJ9CY2+vxbPs7Fg== - dependencies: - ansi-wrap "0.1.0" - -ansi-bold@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-bold/-/ansi-bold-0.1.1.tgz#3e63950af5acc2ae2e670e6f67deb115d1a5f505" - integrity sha512-wWKwcViX1E28U6FohtWOP4sHFyArELHJ2p7+3BzbibqJiuISeskq6t7JnrLisUngMF5zMhgmXVw8Equjzz9OlA== - dependencies: - ansi-wrap "0.1.0" - -ansi-colors@3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" - integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== + version "2.3.2" + resolved "https://registry.yarnpkg.com/anser/-/anser-2.3.2.tgz#e2da9d10759a4243a5819595f4f46ec369970c5b" + integrity sha512-PMqBCBvrOVDRqLGooQb+z+t1Q0PiPyurUQeZRR5uHBOVZcW8B04KMmnT12USnhpNX2wCPagWzLVppQMUG3u0Dw== -ansi-colors@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-0.2.0.tgz#72c31de2a0d9a2ccd0cac30cc9823eeb2f6434b5" - integrity sha512-ScRNUT0TovnYw6+Xo3iKh6G+VXDw2Ds7ZRnMIuKBgHY02DgvT2T2K22/tc/916Fi0W/5Z1RzDaHQwnp75hqdbA== - dependencies: - ansi-bgblack "^0.1.1" - ansi-bgblue "^0.1.1" - ansi-bgcyan "^0.1.1" - ansi-bggreen "^0.1.1" - ansi-bgmagenta "^0.1.1" - ansi-bgred "^0.1.1" - ansi-bgwhite "^0.1.1" - ansi-bgyellow "^0.1.1" - ansi-black "^0.1.1" - ansi-blue "^0.1.1" - ansi-bold "^0.1.1" - ansi-cyan "^0.1.1" - ansi-dim "^0.1.1" - ansi-gray "^0.1.1" - ansi-green "^0.1.1" - ansi-grey "^0.1.1" - ansi-hidden "^0.1.1" - ansi-inverse "^0.1.1" - ansi-italic "^0.1.1" - ansi-magenta "^0.1.1" - ansi-red "^0.1.1" - ansi-reset "^0.1.1" - ansi-strikethrough "^0.1.1" - ansi-underline "^0.1.1" - ansi-white "^0.1.1" - ansi-yellow "^0.1.1" - lazy-cache "^2.0.1" - -ansi-colors@^4.1.1: +ansi-colors@^4.1.1, ansi-colors@^4.1.3: version "4.1.3" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== -ansi-cyan@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-cyan/-/ansi-cyan-0.1.1.tgz#538ae528af8982f28ae30d86f2f17456d2609873" - integrity sha512-eCjan3AVo/SxZ0/MyIYRtkpxIu/H3xZN7URr1vXVrISxeyz8fUFz0FJziamK4sS8I+t35y4rHg1b2PklyBe/7A== - dependencies: - ansi-wrap "0.1.0" - -ansi-dim@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-dim/-/ansi-dim-0.1.1.tgz#40de4c603aa8086d8e7a86b8ff998d5c36eefd6c" - integrity sha512-zAfb1fokXsq4BoZBkL0eK+6MfFctbzX3R4UMcoWrL1n2WHewFKentTvOZv2P11u6P4NtW/V47hVjaN7fJiefOg== - dependencies: - ansi-wrap "0.1.0" - -ansi-escapes@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" - integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== - -ansi-escapes@^4.3.0: +ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: version "4.3.2" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== dependencies: type-fest "^0.21.3" -ansi-gray@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-gray/-/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251" - integrity sha512-HrgGIZUl8h2EHuZaU9hTR/cU5nhKxpVE1V6kdGsQ8e4zirElJ5fvtfc8N7Q1oq1aatO275i8pUFUCpNWCAnVWw== - dependencies: - ansi-wrap "0.1.0" - -ansi-green@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-green/-/ansi-green-0.1.1.tgz#8a5d9a979e458d57c40e33580b37390b8e10d0f7" - integrity sha512-WJ70OI4jCaMy52vGa/ypFSKFb/TrYNPaQ2xco5nUwE0C5H8piume/uAZNNdXXiMQ6DbRmiE7l8oNBHu05ZKkrw== - dependencies: - ansi-wrap "0.1.0" - -ansi-grey@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-grey/-/ansi-grey-0.1.1.tgz#59d98b6ac2ba19f8a51798e9853fba78339a33c1" - integrity sha512-+J1nM4lC+whSvf3T4jsp1KR+C63lypb+VkkwtLQMc1Dlt+nOvdZpFT0wwFTYoSlSwCcLUAaOpHF6kPkYpSa24A== - dependencies: - ansi-wrap "0.1.0" - -ansi-hidden@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-hidden/-/ansi-hidden-0.1.1.tgz#ed6a4c498d2bb7cbb289dbf2a8d1dcc8567fae0f" - integrity sha512-8gB1bo9ym9qZ/Obvrse1flRsfp2RE+40B23DhQcKxY+GSeaOJblLnzBOxzvmLTWbi5jNON3as7wd9rC0fNK73Q== - dependencies: - ansi-wrap "0.1.0" - -ansi-inverse@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-inverse/-/ansi-inverse-0.1.1.tgz#b6af45826fe826bfb528a6c79885794355ccd269" - integrity sha512-Kq8Z0dBRhQhDMN/Rso1Nu9niwiTsRkJncfJZXiyj7ApbfJrGrrubHXqXI37feJZkYcIx6SlTBdNCeK0OQ6X6ag== - dependencies: - ansi-wrap "0.1.0" - -ansi-italic@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-italic/-/ansi-italic-0.1.1.tgz#104743463f625c142a036739cf85eda688986f23" - integrity sha512-jreCxifSAqbaBvcibeQxcwhQDbEj7gF69XnpA6x83qbECEBaRBD1epqskrmov1z4B+zzQuEdwbWxgzvhKa+PkA== - dependencies: - ansi-wrap "0.1.0" - -ansi-magenta@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-magenta/-/ansi-magenta-0.1.1.tgz#063b5ba16fb3f23e1cfda2b07c0a89de11e430ae" - integrity sha512-A1Giu+HRwyWuiXKyXPw2AhG1yWZjNHWO+5mpt+P+VWYkmGRpLPry0O5gmlJQEvpjNpl4RjFV7DJQ4iozWOmkbQ== - dependencies: - ansi-wrap "0.1.0" - -ansi-red@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-red/-/ansi-red-0.1.1.tgz#8c638f9d1080800a353c9c28c8a81ca4705d946c" - integrity sha512-ewaIr5y+9CUTGFwZfpECUbFlGcC0GCw1oqR9RI6h1gQCd9Aj2GxSckCnPsVJnmfMZbwFYE+leZGASgkWl06Jow== - dependencies: - ansi-wrap "0.1.0" - ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== - -ansi-regex@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1" - integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== - -ansi-regex@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" - integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== + integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== -ansi-reset@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-reset/-/ansi-reset-0.1.1.tgz#e7e71292c3c7ddcd4d62ef4a6c7c05980911c3b7" - integrity sha512-n+D0qD3B+h/lP0dSwXX1SZMoXufdUVotLMwUuvXa50LtBAh3f+WV8b5nFMfLL/hgoPBUt+rG/pqqzF8krlZKcw== - dependencies: - ansi-wrap "0.1.0" - -ansi-strikethrough@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-strikethrough/-/ansi-strikethrough-0.1.1.tgz#d84877140b2cff07d1c93ebce69904f68885e568" - integrity sha512-gWkLPDvHH2pC9YEKqp8dIl0mg3sRglMPvioqGDIOXiwxjxUwIJ1gF86E2o4R5yLNh8IAkwHbaMtASkJfkQ2hIA== - dependencies: - ansi-wrap "0.1.0" - -ansi-styles@^3.2.0, ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" +ansi-regex@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654" + integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" @@ -4206,71 +3834,89 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" -ansi-underline@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-underline/-/ansi-underline-0.1.1.tgz#dfc920f4c97b5977ea162df8ffb988308aaa71a4" - integrity sha512-D+Bzwio/0/a0Fu5vJzrIT6bFk43TW46vXfSvzysOTEHcXOAUJTVMHWDbELIzGU4AVxVw2rCTb7YyWS4my2cSKQ== - dependencies: - ansi-wrap "0.1.0" - -ansi-white@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-white/-/ansi-white-0.1.1.tgz#9c77b7c193c5ee992e6011d36ec4c921b4578944" - integrity sha512-DJHaF2SRzBb9wZBgqIJNjjTa7JUJTO98sHeTS1sDopyKKRopL1KpaJ20R6W2f/ZGras8bYyIZDtNwYOVXNgNFg== - dependencies: - ansi-wrap "0.1.0" - -ansi-wrap@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" - integrity sha512-ZyznvL8k/FZeQHr2T6LzcJ/+vBApDnMNZvfVFy3At0knswWd6rJ3/0Hhmpu8oqa6C92npmozs890sX9Dl6q+Qw== - -ansi-yellow@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-yellow/-/ansi-yellow-0.1.1.tgz#cb9356f2f46c732f0e3199e6102955a77da83c1d" - integrity sha512-6E3D4BQLXHLl3c/NwirWVZ+BCkMq2qsYxdeAGGOijKrx09FaqU+HktFL6QwAwNvgJiMLnv6AQ2C1gFZx0h1CBg== - dependencies: - ansi-wrap "0.1.0" +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== -any-promise@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" - integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== +ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== -anymatch@~3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" picomatch "^2.0.4" +app-builder-bin@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/app-builder-bin/-/app-builder-bin-4.0.0.tgz#1df8e654bd1395e4a319d82545c98667d7eed2f0" + integrity sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA== + +app-builder-lib@24.13.3: + version "24.13.3" + resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-24.13.3.tgz#36e47b65fecb8780bb73bff0fee4e0480c28274b" + integrity sha512-FAzX6IBit2POXYGnTCT8YHFO/lr5AapAII6zzhQO3Rw4cEDOgK+t1xhLc5tNcKlicTHlo9zxIwnYCX9X2DLkig== + dependencies: + "@develar/schema-utils" "~2.6.5" + "@electron/notarize" "2.2.1" + "@electron/osx-sign" "1.0.5" + "@electron/universal" "1.5.1" + "@malept/flatpak-bundler" "^0.4.0" + "@types/fs-extra" "9.0.13" + async-exit-hook "^2.0.1" + bluebird-lst "^1.0.9" + builder-util "24.13.1" + builder-util-runtime "9.2.4" + chromium-pickle-js "^0.2.0" + debug "^4.3.4" + ejs "^3.1.8" + electron-publish "24.13.1" + form-data "^4.0.0" + fs-extra "^10.1.0" + hosted-git-info "^4.1.0" + is-ci "^3.0.0" + isbinaryfile "^5.0.0" + js-yaml "^4.1.0" + lazy-val "^1.0.5" + minimatch "^5.1.1" + read-config-file "6.3.2" + sanitize-filename "^1.6.3" + semver "^7.3.8" + tar "^6.1.12" + temp-file "^3.4.0" + append-field@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/append-field/-/append-field-1.0.0.tgz#1e3440e915f0b1203d23748e78edd7b9b5b43e56" integrity sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw== -aproba@^1.0.3, aproba@^1.1.1: +aproba@^1.0.3: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== -"aproba@^1.0.3 || ^2.0.0", aproba@^2.0.0: +"aproba@^1.0.3 || ^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== -archive-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/archive-type/-/archive-type-4.0.0.tgz#f92e72233056dfc6969472749c267bdb046b1d70" - integrity sha512-zV4Ky0v1F8dBrdYElwTvQhweQ0P7Kwc1aluqJsYtOBP01jXcWCyW2IEfI1YiqsG+Iy7ZR+o5LF1N+PGECBxHWA== - dependencies: - file-type "^4.2.0" +arduino-serial-plotter-webapp@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/arduino-serial-plotter-webapp/-/arduino-serial-plotter-webapp-0.2.0.tgz#90d61ad7ed1452f70fd226ff25eccb36c1ab1a4f" + integrity sha512-AxQIsKr6Mf8K1c3kj+ojjFvE9Vz8cUqJqRink6/myp/ranEGwsQQ83hziktkPKZvBQshqrMH8nzoGIY2Z3A2OA== -arduino-serial-plotter-webapp@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/arduino-serial-plotter-webapp/-/arduino-serial-plotter-webapp-0.1.0.tgz#fa631483a93a12acd89d7bbe0487a3c0e57fac9f" - integrity sha512-0gHDGDz6guIC7Y8JXHaUad0RoueG2A+ykKNY1yo59+hWGbkM37hdRy4GKLsOkn0NMqU1TjnWmQHaSmYJjD1cAQ== +ardunno-cli@^0.1.2: + version "0.1.11" + resolved "https://registry.yarnpkg.com/ardunno-cli/-/ardunno-cli-0.1.11.tgz#776b3f4d4c21088b4c69eaf1c05da0f941e1041f" + integrity sha512-B8MtDWXwynLYx4d+GvXZ8Vzo7//mN6PgwP0RSAGgIyv0b3Gn4DQZWSnyhYMZE4Y/oagL05SZrUvHVtZPqBX14w== + dependencies: + nice-grpc-common "^2.0.2" + protobufjs "^7.2.3" are-we-there-yet@^2.0.0: version "2.0.0" @@ -4281,9 +3927,9 @@ are-we-there-yet@^2.0.0: readable-stream "^3.6.0" are-we-there-yet@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-3.0.0.tgz#ba20bd6b553e31d62fc8c31bd23d22b95734390d" - integrity sha512-0GWpv50YSOcLXaN6/FAKY3vfRbllXWV2xvfA/oKJF8pzFhWXPV+yjhJXDBbjscDYowv7Yw1A3uigpzn5iEGTyw== + version "3.0.1" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz#679df222b278c64f2cdba1175cdc00b0d96164bd" + integrity sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg== dependencies: delegates "^1.0.0" readable-stream "^3.6.0" @@ -4296,7 +3942,7 @@ are-we-there-yet@~1.1.2: delegates "^1.0.0" readable-stream "^2.0.6" -argparse@^1.0.10, argparse@^1.0.7: +argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== @@ -4308,35 +3954,18 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA== - -arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== - -array-differ@^2.0.3: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-2.1.0.tgz#4b9c1c3f14b906757082925769e8ab904f4801b1" - integrity sha512-KbUpJgx909ZscOc/7CLATBFam7P1Z1QRQInvgT0UztM9Q72aGKCunKASAl7WNW0tnPmPyEMeMhdsfWhfmW037w== - -array-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" - integrity sha512-H3LU5RLiSsGXPhN+Nipar0iR0IofH+8r89G2y1tBKxQ/agagKyAjhkAFDRBfodP2caPrNKHpAWNIM/c9yeL7uA== - -array-find-index@^1.0.1: +array-buffer-byte-length@^1.0.0, array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" - integrity sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw== + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz#384d12a37295aec3769ab022ad323a18a51ccf8b" + integrity sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw== + dependencies: + call-bound "^1.0.3" + is-array-buffer "^3.0.5" + +array-differ@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-3.0.0.tgz#3cbb3d0f316810eafcc47624734237d6aee4ae6b" + integrity sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg== array-flatten@1.1.1: version "1.1.1" @@ -4348,27 +3977,19 @@ array-ify@^1.0.0: resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" integrity sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng== -array-includes@^3.1.4, array-includes@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.5.tgz#2c320010db8d31031fd2a5f6b3bbd4b1aad31bdb" - integrity sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ== +array-includes@^3.1.6, array-includes@^3.1.8: + version "3.1.8" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" + integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.19.5" - get-intrinsic "^1.1.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.4" is-string "^1.0.7" -array-sort@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/array-sort/-/array-sort-0.1.4.tgz#662855eaeb671b4188df4451b2f24a0753992b23" - integrity sha512-BNcM+RXxndPxiZ2rd76k6nyQLRZr2/B/sdi8pQ+Joafr5AH279L40dfokSUTp8O+AaqYjXWhblBWa2st2nc4fQ== - dependencies: - default-compare "^1.0.0" - get-value "^2.0.6" - kind-of "^5.0.2" - -array-union@^1.0.1, array-union@^1.0.2: +array-union@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" integrity sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng== @@ -4385,39 +4006,78 @@ array-uniq@^1.0.1: resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" integrity sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q== -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== +array.prototype.findlast@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz#3e4fbcb30a15a7f5bf64cf2faae22d139c2e4904" + integrity sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-shim-unscopables "^1.0.2" -array.prototype.flatmap@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz#a7e8ed4225f4788a70cd910abcf0791e76a5534f" - integrity sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg== +array.prototype.flat@^1.3.1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz#534aaf9e6e8dd79fb6b9a9917f839ef1ec63afe5" + integrity sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.2" - es-shim-unscopables "^1.0.0" + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-shim-unscopables "^1.0.2" + +array.prototype.flatmap@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz#712cc792ae70370ae40586264629e33aab5dd38b" + integrity sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg== + dependencies: + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-shim-unscopables "^1.0.2" + +array.prototype.tosorted@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz#fe954678ff53034e717ea3352a03f0b0b86f7ffc" + integrity sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.3" + es-errors "^1.3.0" + es-shim-unscopables "^1.0.2" + +arraybuffer.prototype.slice@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz#9d760d84dbdd06d0cbf92c8849615a1a7ab3183c" + integrity sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ== + dependencies: + array-buffer-byte-length "^1.0.1" + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + is-array-buffer "^3.0.4" arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== +arrify@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" + integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== + asap@^2.0.0: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== -asn1@~0.2.3: - version "0.2.6" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" - integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== - dependencies: - safer-buffer "~2.1.0" - -assert-plus@1.0.0, assert-plus@^1.0.0: +assert-plus@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== @@ -4427,16 +4087,18 @@ assertion-error@^1.1.0: resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== - ast-types@0.9.6: version "0.9.6" resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.6.tgz#102c9e9e9005d3e7e3829bf0c4fa24ee862ee9b9" integrity sha512-qEdtR2UH78yyHX/AUNfXmJTlM48XoFZKBdwi1nzkI1mJL21cmbu0cvjxjpkXJ5NENMq42H+hNs8VLJcqXLerBQ== +ast-types@^0.13.4: + version "0.13.4" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.4.tgz#ee0d77b343263965ecc3fb62da16e7222b2b6782" + integrity sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w== + dependencies: + tslib "^2.0.1" + ast-types@^0.9.2: version "0.9.14" resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.14.tgz#d34ba5dffb9d15a44351fd2a9d82e4ab2838b5ba" @@ -4447,10 +4109,15 @@ astral-regex@^2.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== -async-limiter@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" - integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== +async-exit-hook@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/async-exit-hook/-/async-exit-hook-2.0.1.tgz#8bd8b024b0ec9b1c01cccb9af9db29bd717dfaf3" + integrity sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw== + +async-function@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async-function/-/async-function-1.0.0.tgz#509c9fca60eaf85034c6829838188e4e4c8ffb2b" + integrity sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA== async-mutex@^0.3.0, async-mutex@^0.3.1: version "0.3.2" @@ -4459,156 +4126,115 @@ async-mutex@^0.3.0, async-mutex@^0.3.1: dependencies: tslib "^2.3.1" +async-mutex@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/async-mutex/-/async-mutex-0.4.1.tgz#bccf55b96f2baf8df90ed798cb5544a1f6ee4c2c" + integrity sha512-WfoBo4E/TbCX1G95XTjbWTE3X2XLG0m1Xbv2cwOtuPdyH9CZvnaA5nCt1ucjaKEgW2A5IF71hxrRhr83Je5xjA== + dependencies: + tslib "^2.4.0" + +async@^3.2.3, async@^3.2.6: + version "3.2.6" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" + integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== -atob-lite@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/atob-lite/-/atob-lite-2.0.0.tgz#0fef5ad46f1bd7a8502c65727f0367d5ee43d696" - integrity sha512-LEeSAWeh2Gfa2FtlQE1shxQ8zi5F9GHarrGKz08TMdODD5T4eH6BMsvtnhbWZ+XQn+Gb6om/917ucvRu7l7ukw== - -atob@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== atomically@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/atomically/-/atomically-1.7.0.tgz#c07a0458432ea6dbc9a3506fffa424b48bccaafe" integrity sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w== -auth0-js@^9.14.0: - version "9.19.0" - resolved "https://registry.yarnpkg.com/auth0-js/-/auth0-js-9.19.0.tgz#09fcf97465c5a9a93b23c63056f9e45d8d4b3be2" - integrity sha512-PbzzGqtcfUZj3jnPqEcJYoWH+YNMmHI9woRYBY1VZn+GaU5NIWR1H/2ZAx5ZERZXvte6qQsu2FDNB8V+1N9Ahg== +auth0-js@^9.23.2: + version "9.28.0" + resolved "https://registry.yarnpkg.com/auth0-js/-/auth0-js-9.28.0.tgz#f9d3f0ddf865d4e34f1befb0eacfaa6785ca2f9e" + integrity sha512-2xIfQIGM0vX3IdPR91ztLO2+Ar2I5+3iFKcjuZO+LV9vRh4Wje+Ka1hnHjMU9dH892Lm3ZxBAHxRo68YToUhfg== dependencies: base64-js "^1.5.1" - idtoken-verifier "^2.2.2" + idtoken-verifier "^2.2.4" js-cookie "^2.2.0" + minimist "^1.2.5" qs "^6.10.1" - superagent "^5.3.1" + superagent "^7.1.5" url-join "^4.0.1" winchan "^0.2.2" -autolinker@~0.28.0: - version "0.28.1" - resolved "https://registry.yarnpkg.com/autolinker/-/autolinker-0.28.1.tgz#0652b491881879f0775dace0cdca3233942a4e47" - integrity sha512-zQAFO1Dlsn69eXaO6+7YZc+v84aquQKbwpzCE3L0stj56ERn9hutFxPopViLjo9G+rWwjozRhgS5KJ25Xy19cQ== - dependencies: - gulp-header "^1.7.1" - autosize@^4.0.2: version "4.0.4" resolved "https://registry.yarnpkg.com/autosize/-/autosize-4.0.4.tgz#924f13853a466b633b9309330833936d8bccce03" integrity sha512-5yxLQ22O0fCRGoxGfeLSNt3J8LB1v+umtpMnPW6XjkTWXKoN0AmXAIhelJcDtFT/Y/wYWmfE+oqU10Q0b8FhaQ== -available-typed-arrays@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" - integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== - -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== - -aws4@^1.8.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" - integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== - -axios-cookiejar-support@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/axios-cookiejar-support/-/axios-cookiejar-support-1.0.1.tgz#7b32af7d932508546c68b1fc5ba8f562884162e1" - integrity sha512-IZJxnAJ99XxiLqNeMOqrPbfR7fRyIfaoSLdPUf4AMQEGkH8URs0ghJK/xtqBsD+KsSr3pKl4DEQjCn834pHMig== +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== dependencies: - is-redirect "^1.0.0" - pify "^5.0.0" + possible-typed-array-names "^1.0.0" -axios@^0.21.1: - version "0.21.4" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" - integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== +axios@^1.0.0, axios@^1.6.7, axios@^1.7.4: + version "1.8.3" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.8.3.tgz#9ebccd71c98651d547162a018a1a95a4b4ed4de8" + integrity sha512-iP4DebzoNlP/YN2dpwCgb8zoCmhtkajzS48JvwmkSkXvPI3DHc7m+XYL5tGnSlJtR6nImXZmdCuN5aP8dh1d8A== dependencies: - follow-redirects "^1.14.0" + follow-redirects "^1.15.6" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + +b4a@^1.6.4: + version "1.6.7" + resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.6.7.tgz#a99587d4ebbfbd5a6e3b21bdb5d5fa385767abe4" + integrity sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg== babel-loader@^8.2.2: - version "8.2.5" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.5.tgz#d45f585e654d5a5d90f5350a779d7647c5ed512e" - integrity sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ== + version "8.4.1" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.4.1.tgz#6ccb75c66e62c3b144e1c5f2eaec5b8f6c08c675" + integrity sha512-nXzRChX+Z1GoE6yWavBQg6jDslyFF3SDjl2paADuoQtQW10JqShJt62R6eJQ5m/pjJFDT8xgKIWSP85OY8eXeA== dependencies: find-cache-dir "^3.3.1" - loader-utils "^2.0.0" + loader-utils "^2.0.4" make-dir "^3.1.0" schema-utils "^2.6.5" -babel-plugin-dynamic-import-node@^2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" - integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== - dependencies: - object.assign "^4.1.0" - -babel-plugin-emotion@^10.0.27: - version "10.2.2" - resolved "https://registry.yarnpkg.com/babel-plugin-emotion/-/babel-plugin-emotion-10.2.2.tgz#a1fe3503cff80abfd0bdda14abd2e8e57a79d17d" - integrity sha512-SMSkGoqTbTyUTDeuVuPIWifPdUGkTk1Kf9BWRiXIOIcuyMfsdp2EjeiiFvOzX8NOBvEh/ypKYvUh2rkgAJMCLA== - dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@emotion/hash" "0.8.0" - "@emotion/memoize" "0.7.4" - "@emotion/serialize" "^0.11.16" - babel-plugin-macros "^2.0.0" - babel-plugin-syntax-jsx "^6.18.0" - convert-source-map "^1.5.0" - escape-string-regexp "^1.0.5" - find-root "^1.1.0" - source-map "^0.5.7" - -babel-plugin-macros@^2.0.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz#0f958a7cc6556b1e65344465d99111a1e5e10138" - integrity sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg== +babel-plugin-macros@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1" + integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg== dependencies: - "@babel/runtime" "^7.7.2" - cosmiconfig "^6.0.0" - resolve "^1.12.0" + "@babel/runtime" "^7.12.5" + cosmiconfig "^7.0.0" + resolve "^1.19.0" -babel-plugin-polyfill-corejs2@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz#440f1b70ccfaabc6b676d196239b138f8a2cfba5" - integrity sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w== +babel-plugin-polyfill-corejs2@^0.4.10: + version "0.4.12" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.12.tgz#ca55bbec8ab0edeeef3d7b8ffd75322e210879a9" + integrity sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og== dependencies: - "@babel/compat-data" "^7.13.11" - "@babel/helper-define-polyfill-provider" "^0.3.1" - semver "^6.1.1" + "@babel/compat-data" "^7.22.6" + "@babel/helper-define-polyfill-provider" "^0.6.3" + semver "^6.3.1" -babel-plugin-polyfill-corejs3@^0.5.0: - version "0.5.2" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz#aabe4b2fa04a6e038b688c5e55d44e78cd3a5f72" - integrity sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ== +babel-plugin-polyfill-corejs3@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz#4e4e182f1bb37c7ba62e2af81d8dd09df31344f6" + integrity sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ== dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.1" - core-js-compat "^3.21.0" + "@babel/helper-define-polyfill-provider" "^0.6.3" + core-js-compat "^3.40.0" -babel-plugin-polyfill-regenerator@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz#2c0678ea47c75c8cc2fbb1852278d8fb68233990" - integrity sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A== +babel-plugin-polyfill-regenerator@^0.6.1: + version "0.6.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.3.tgz#abeb1f3f1c762eace37587f42548b08b57789bc8" + integrity sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q== dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.1" - -babel-plugin-syntax-jsx@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" - integrity sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw== - -backo2@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" - integrity sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA== + "@babel/helper-define-polyfill-provider" "^0.6.3" bail@^2.0.0: version "2.0.2" @@ -4620,6 +4246,39 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +bare-events@^2.0.0, bare-events@^2.2.0: + version "2.5.4" + resolved "https://registry.yarnpkg.com/bare-events/-/bare-events-2.5.4.tgz#16143d435e1ed9eafd1ab85f12b89b3357a41745" + integrity sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA== + +bare-fs@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/bare-fs/-/bare-fs-4.0.1.tgz#85844f34da819c76754d545323a8b23ed3617c76" + integrity sha512-ilQs4fm/l9eMfWY2dY0WCIUplSUp7U0CT1vrqMg1MUdeZl4fypu5UP0XcDBK5WBQPJAKP1b7XEodISmekH/CEg== + dependencies: + bare-events "^2.0.0" + bare-path "^3.0.0" + bare-stream "^2.0.0" + +bare-os@^3.0.1: + version "3.6.0" + resolved "https://registry.yarnpkg.com/bare-os/-/bare-os-3.6.0.tgz#1465dd7e1bebe0dec230097a23ad00f7db51f957" + integrity sha512-BUrFS5TqSBdA0LwHop4OjPJwisqxGy6JsWVqV6qaFoe965qqtaKfDzHY5T2YA1gUL0ZeeQeA+4BBc1FJTcHiPw== + +bare-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bare-path/-/bare-path-3.0.0.tgz#b59d18130ba52a6af9276db3e96a2e3d3ea52178" + integrity sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw== + dependencies: + bare-os "^3.0.1" + +bare-stream@^2.0.0: + version "2.6.5" + resolved "https://registry.yarnpkg.com/bare-stream/-/bare-stream-2.6.5.tgz#bba8e879674c4c27f7e27805df005c15d7a2ca07" + integrity sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA== + dependencies: + streamx "^2.21.0" + base64-js@^1.3.1, base64-js@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" @@ -4630,30 +4289,22 @@ base64id@2.0.0, base64id@~2.0.0: resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== +basic-auth@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" + integrity sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg== dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" + safe-buffer "5.1.2" -bcrypt-pbkdf@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== - dependencies: - tweetnacl "^0.14.3" +basic-ftp@^5.0.2: + version "5.0.5" + resolved "https://registry.yarnpkg.com/basic-ftp/-/basic-ftp-5.0.5.tgz#14a474f5fffecca1f4f406f1c26b18f800225ac0" + integrity sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg== -before-after-hook@^2.0.0, before-after-hook@^2.2.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.2.tgz#a6e8ca41028d90ee2c24222f201c90956091613e" - integrity sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ== +before-after-hook@^2.2.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.3.tgz#c51e809c81a4e354084422b9b26bad88249c517c" + integrity sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ== bent@^7.1.0: version "7.3.12" @@ -4665,9 +4316,9 @@ bent@^7.1.0: is-stream "^2.0.0" big-integer@^1.6.17: - version "1.6.51" - resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.51.tgz#0df92a5d9880560d3ff2d5fd20245c889d130686" - integrity sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg== + version "1.6.52" + resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.52.tgz#60a887f3047614a8e1bffe5d7173490a97dc8c85" + integrity sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg== big.js@^5.2.2: version "5.2.2" @@ -4675,11 +4326,11 @@ big.js@^5.2.2: integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + version "2.3.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== -binary@^0.3.0, binary@~0.3.0: +binary@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/binary/-/binary-0.3.0.tgz#9f60553bc5ce8c3386f3b553cff47462adecaa79" integrity sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg== @@ -4711,7 +4362,14 @@ bl@^4.0.3, bl@^4.1.0: inherits "^2.0.4" readable-stream "^3.4.0" -bluebird@^3.5.1, bluebird@^3.5.3, bluebird@^3.5.5: +bluebird-lst@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/bluebird-lst/-/bluebird-lst-1.0.9.tgz#a64a0e4365658b9ab5fe875eb9dfb694189bb41c" + integrity sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw== + dependencies: + bluebird "^3.5.5" + +bluebird@^3.5.5: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== @@ -4721,21 +4379,21 @@ bluebird@~3.4.1: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.7.tgz#f72d760be09b7f76d08ed8fae98b289a8d05fab3" integrity sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA== -body-parser@1.20.0, body-parser@^1.17.2, body-parser@^1.18.3: - version "1.20.0" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.0.tgz#3de69bd89011c11573d7bfee6a64f11b6bd27cc5" - integrity sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg== +body-parser@1.20.3, body-parser@^1.17.2, body-parser@^1.18.3: + version "1.20.3" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.3.tgz#1953431221c6fb5cd63c4b36d53fab0928e548c6" + integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g== dependencies: bytes "3.1.2" - content-type "~1.0.4" + content-type "~1.0.5" debug "2.6.9" depd "2.0.0" destroy "1.2.0" http-errors "2.0.0" iconv-lite "0.4.24" on-finished "2.4.1" - qs "6.10.3" - raw-body "2.5.1" + qs "6.13.0" + raw-body "2.5.2" type-is "~1.6.18" unpipe "1.0.0" @@ -4759,54 +4417,27 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" -braces@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - -braces@^3.0.2, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== +braces@^3.0.3, braces@~3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: - fill-range "^7.0.1" + fill-range "^7.1.1" -browser-process-hrtime@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" - integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== - -browser-stdout@1.3.1: +browser-stdout@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== -browserslist@^4.14.5, browserslist@^4.20.2, browserslist@^4.20.3: - version "4.20.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.20.3.tgz#eb7572f49ec430e054f56d52ff0ebe9be915f8bf" - integrity sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg== +browserslist@^4.24.0, browserslist@^4.24.4: + version "4.24.4" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.4.tgz#c6b2865a3f08bcb860a0e827389003b9fe686e4b" + integrity sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A== dependencies: - caniuse-lite "^1.0.30001332" - electron-to-chromium "^1.4.118" - escalade "^3.1.1" - node-releases "^2.0.3" - picocolors "^1.0.0" - -btoa-lite@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/btoa-lite/-/btoa-lite-1.0.0.tgz#337766da15801210fdd956c22e9c6891ab9d0337" - integrity sha512-gvW7InbIyF8AicrqWoptdW08pUxuhq8BEgowNajy9RhiE86fmGAGl+bLKo6oB8QP0CkqHLowfN0oJdKC/J6LbA== + caniuse-lite "^1.0.30001688" + electron-to-chromium "^1.5.73" + node-releases "^2.0.19" + update-browserslist-db "^1.1.1" btoa@^1.2.1: version "1.2.1" @@ -4831,6 +4462,11 @@ buffer-crc32@~0.2.3: resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== +buffer-equal@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.1.tgz#2f7651be5b1b3f057fcd6e7ee16cf34767077d90" + integrity sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg== + buffer-fill@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" @@ -4846,7 +4482,7 @@ buffer-indexof-polyfill@~1.0.0: resolved "https://registry.yarnpkg.com/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz#d2732135c5999c64b277fcf9b1abe3498254729c" integrity sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A== -buffer@^5.2.1, buffer@^5.5.0: +buffer@^5.1.0, buffer@^5.2.1, buffer@^5.5.0: version "5.7.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== @@ -4875,28 +4511,59 @@ builder-util-runtime@8.9.2: debug "^4.3.2" sax "^1.2.4" +builder-util-runtime@9.2.4: + version "9.2.4" + resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-9.2.4.tgz#13cd1763da621e53458739a1e63f7fcba673c42a" + integrity sha512-upp+biKpN/XZMLim7aguUyW8s0FUpDvOtK6sbanMFDAMBzpHDqdhgVYm6zc9HJ6nWo7u2Lxk60i2M6Jd3aiNrA== + dependencies: + debug "^4.3.4" + sax "^1.2.4" + +builder-util@24.13.1: + version "24.13.1" + resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-24.13.1.tgz#4a4c4f9466b016b85c6990a0ea15aa14edec6816" + integrity sha512-NhbCSIntruNDTOVI9fdXz0dihaqX2YuE1D6zZMrwiErzH4ELZHE6mdiB40wEgZNprDia+FghRFgKoAqMZRRjSA== + dependencies: + "7zip-bin" "~5.2.0" + "@types/debug" "^4.1.6" + app-builder-bin "4.0.0" + bluebird-lst "^1.0.9" + builder-util-runtime "9.2.4" + chalk "^4.1.2" + cross-spawn "^7.0.3" + debug "^4.3.4" + fs-extra "^10.1.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.1" + is-ci "^3.0.0" + js-yaml "^4.1.0" + source-map-support "^0.5.19" + stat-mode "^1.0.0" + temp-file "^3.4.0" + builtins@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" integrity sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ== -busboy@^0.2.11: - version "0.2.14" - resolved "https://registry.yarnpkg.com/busboy/-/busboy-0.2.14.tgz#6c2a622efcf47c57bbbe1e2a9c37ad36c7925453" - integrity sha512-InWFDomvlkEj+xWLBfU3AvnbVYqeTWmQopiW0tWWEy5yehYm2YkGEc59sUmw/4ty5Zj/b0WHGs1LgecuBSBGrg== +builtins@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/builtins/-/builtins-5.1.0.tgz#6d85eeb360c4ebc166c3fdef922a15aa7316a5e8" + integrity sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg== dependencies: - dicer "0.2.5" - readable-stream "1.1.x" + semver "^7.0.0" -byline@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/byline/-/byline-5.0.0.tgz#741c5216468eadc457b03410118ad77de8c1ddb1" - integrity sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q== +busboy@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" + integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== + dependencies: + streamsearch "^1.1.0" -byte-size@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/byte-size/-/byte-size-5.0.1.tgz#4b651039a5ecd96767e71a3d7ed380e48bed4191" - integrity sha512-/XuKeqWocKsYa/cBY1YbSJSWWqTi4cFgr9S6OyM7PBaPbr9zvNGwWP33vt0uqGhwDdN+y3yhbXVILEUpnwEWGw== +byte-size@8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/byte-size/-/byte-size-8.1.1.tgz#3424608c62d59de5bfda05d31e0313c6174842ae" + integrity sha512-tUkzZWK0M/qdoLEqikxBWe4kumyuwjl3HO6zHTr4yEI23EojPtLYXdG1+AQY7MN0cGyNDvEaJ8wiYQm6P2bPxg== bytes@3.1.2: version "3.1.2" @@ -4908,55 +4575,10 @@ bytesish@^0.4.1: resolved "https://registry.yarnpkg.com/bytesish/-/bytesish-0.4.4.tgz#f3b535a0f1153747427aee27256748cff92347e6" integrity sha512-i4uu6M4zuMUiyfZN4RU2+i9+peJh//pXhd9x1oSe1LBkZ3LEbCoygu8W0bXTukU1Jme2txKuotpCZRaC3FLxcQ== -cacache@^12.0.0, cacache@^12.0.3: - version "12.0.4" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" - integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ== - dependencies: - bluebird "^3.5.5" - chownr "^1.1.1" - figgy-pudding "^3.5.1" - glob "^7.1.4" - graceful-fs "^4.1.15" - infer-owner "^1.0.3" - lru-cache "^5.1.1" - mississippi "^3.0.0" - mkdirp "^0.5.1" - move-concurrently "^1.0.1" - promise-inflight "^1.0.1" - rimraf "^2.6.3" - ssri "^6.0.1" - unique-filename "^1.1.1" - y18n "^4.0.0" - -cacache@^15.2.0: - version "15.3.0" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.3.0.tgz#dc85380fb2f556fe3dda4c719bfa0ec875a7f1eb" - integrity sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ== - dependencies: - "@npmcli/fs" "^1.0.0" - "@npmcli/move-file" "^1.0.1" - chownr "^2.0.0" - fs-minipass "^2.0.0" - glob "^7.1.4" - infer-owner "^1.0.4" - lru-cache "^6.0.0" - minipass "^3.1.1" - minipass-collect "^1.0.2" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.2" - mkdirp "^1.0.3" - p-map "^4.0.0" - promise-inflight "^1.0.1" - rimraf "^3.0.2" - ssri "^8.0.1" - tar "^6.0.2" - unique-filename "^1.1.1" - cacache@^16.1.0: - version "16.1.0" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-16.1.0.tgz#87a6bae558a511c9cb2a13768073e240ca76153a" - integrity sha512-Pk4aQkwCW82A4jGKFvcGkQFqZcMspfP9YWq9Pr87/ldDvlWf718zeI6KWCdKt/jeihu6BytHRUicJPB1K2k8EQ== + version "16.1.3" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-16.1.3.tgz#a02b9f34ecfaf9a78c9f4bc16fceb94d5d67a38e" + integrity sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ== dependencies: "@npmcli/fs" "^2.1.0" "@npmcli/move-file" "^2.0.0" @@ -4975,58 +4597,53 @@ cacache@^16.1.0: rimraf "^3.0.2" ssri "^9.0.0" tar "^6.1.11" - unique-filename "^1.1.1" + unique-filename "^2.0.0" -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== +cacache@^17.0.0: + version "17.1.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-17.1.4.tgz#b3ff381580b47e85c6e64f801101508e26604b35" + integrity sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A== dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" + "@npmcli/fs" "^3.1.0" + fs-minipass "^3.0.0" + glob "^10.2.2" + lru-cache "^7.7.1" + minipass "^7.0.3" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + p-map "^4.0.0" + ssri "^10.0.0" + tar "^6.1.11" + unique-filename "^3.0.0" cacheable-lookup@^5.0.3: version "5.0.4" resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005" integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA== -cacheable-request@^2.1.1: - version "2.1.4" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-2.1.4.tgz#0d808801b6342ad33c91df9d0b44dc09b91e5c3d" - integrity sha512-vag0O2LKZ/najSoUwDbVlnlCFvhBE/7mGTY2B5FgCBDcRD+oVV1HYTOwM6JZfMg/hIcM6IwnTZ1uQQL5/X3xIQ== - dependencies: - clone-response "1.0.2" - get-stream "3.0.0" - http-cache-semantics "3.8.1" - keyv "3.0.0" - lowercase-keys "1.0.0" - normalize-url "2.0.1" - responselike "1.0.2" - -cacheable-request@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" - integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== - dependencies: - clone-response "^1.0.2" - get-stream "^5.1.0" - http-cache-semantics "^4.0.0" - keyv "^3.0.0" - lowercase-keys "^2.0.0" - normalize-url "^4.1.0" - responselike "^1.0.2" +cacheable-lookup@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz#3476a8215d046e5a3202a9209dd13fec1f933a27" + integrity sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w== + +cacheable-request@^10.2.8: + version "10.2.14" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-10.2.14.tgz#eb915b665fda41b79652782df3f553449c406b9d" + integrity sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ== + dependencies: + "@types/http-cache-semantics" "^4.0.2" + get-stream "^6.0.1" + http-cache-semantics "^4.1.1" + keyv "^4.5.3" + mimic-response "^4.0.0" + normalize-url "^8.0.0" + responselike "^3.0.0" cacheable-request@^7.0.2: - version "7.0.2" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.2.tgz#ea0d0b889364a25854757301ca12b2da77f91d27" - integrity sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew== + version "7.0.4" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.4.tgz#7a33ebf08613178b403635be7b899d3e69bbe817" + integrity sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg== dependencies: clone-response "^1.0.2" get-stream "^5.1.0" @@ -5036,37 +4653,31 @@ cacheable-request@^7.0.2: normalize-url "^6.0.1" responselike "^2.0.0" -call-bind@^1.0.0, call-bind@^1.0.2: +call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" + integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -call-me-maybe@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" - integrity sha512-wCyFsDQkKPwwF8BDwOiWNx/9K45L/hvggQiDbve+viMNMQnWhrlYIuBk09offfwCRtCO9P6XwUttufzU11WCVw== + es-errors "^1.3.0" + function-bind "^1.1.2" -caller-callsite@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" - integrity sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ== +call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.7, call-bind@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz#0736a9660f537e3388826f440d5ec45f744eaa4c" + integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== dependencies: - callsites "^2.0.0" + call-bind-apply-helpers "^1.0.0" + es-define-property "^1.0.0" + get-intrinsic "^1.2.4" + set-function-length "^1.2.2" -caller-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" - integrity sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A== +call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" + integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== dependencies: - caller-callsite "^2.0.0" - -callsites@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" - integrity sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ== + call-bind-apply-helpers "^1.0.2" + get-intrinsic "^1.3.0" callsites@^3.0.0: version "3.1.0" @@ -5081,23 +4692,6 @@ camel-case@^4.1.2: pascal-case "^3.1.2" tslib "^2.0.3" -camelcase-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" - integrity sha512-bA/Z/DERHKqoEOrp+qeGKw1QlvEQkGZSc0XaY6VnTxZr+Kv1G5zFwttpjv8qxZ/sBPT4nthwZaAcsAZTJlSKXQ== - dependencies: - camelcase "^2.0.0" - map-obj "^1.0.0" - -camelcase-keys@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-4.2.0.tgz#a2aa5fb1af688758259c32c141426d78923b9b77" - integrity sha512-Ej37YKYbFUI8QiYlvj9YHb6/Z60dZyPJW0Cs8sFilMbd2lP0bw3ylAq9yJkK4lcTA2dID5fG8LjmJYbO7kWb7Q== - dependencies: - camelcase "^4.1.0" - map-obj "^2.0.0" - quick-lru "^1.0.0" - camelcase-keys@^6.2.2: version "6.2.2" resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" @@ -5107,25 +4701,20 @@ camelcase-keys@^6.2.2: map-obj "^4.0.0" quick-lru "^4.0.1" -camelcase@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" - integrity sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw== - -camelcase@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" - integrity sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw== - camelcase@^5.0.0, camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -caniuse-lite@^1.0.30001332: - version "1.0.30001341" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001341.tgz#59590c8ffa8b5939cf4161f00827b8873ad72498" - integrity sha512-2SodVrFFtvGENGCv0ChVJIDQ0KPaS1cg7/qtfMaICgeMolDdo/Z2OD32F0Aq9yl6F4YFwGPBS5AaPqNYiW4PoA== +camelcase@^6.0.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +caniuse-lite@^1.0.30001688: + version "1.0.30001704" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001704.tgz#6644fe909d924ac3a7125e8a0ab6af95b1f32990" + integrity sha512-+L2IgBbV6gXB4ETf0keSvLr7JUrRVbIaB/lrQ1+z8mRcQiisG5k+lG6O4n6Y5q6f5EuNfaYXKgymucphlEXQew== capital-case@^1.0.4: version "1.0.4" @@ -5141,33 +4730,18 @@ caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== -caw@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/caw/-/caw-2.0.1.tgz#6c3ca071fc194720883c2dc5da9b074bfc7e9e95" - integrity sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA== - dependencies: - get-proxy "^2.0.0" - isurl "^1.0.0-alpha5" - tunnel-agent "^0.6.0" - url-to-options "^1.0.1" - -chai-string@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/chai-string/-/chai-string-1.5.0.tgz#0bdb2d8a5f1dbe90bc78ec493c1c1c180dd4d3d2" - integrity sha512-sydDC3S3pNAQMYwJrs6dQX0oBQ6KfIPuOZ78n7rocW0eJJlsHPh2t3kwW7xfwYA/1Bf6/arGtSUo16rxR2JFlw== - -chai@^4.2.0: - version "4.3.6" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.6.tgz#ffe4ba2d9fa9d6680cc0b370adae709ec9011e9c" - integrity sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q== +chai@^4.2.0, chai@^4.3.10: + version "4.5.0" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.5.0.tgz#707e49923afdd9b13a8b0b47d33d732d13812fd8" + integrity sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw== dependencies: assertion-error "^1.1.0" - check-error "^1.0.2" - deep-eql "^3.0.1" - get-func-name "^2.0.0" - loupe "^2.3.1" + check-error "^1.0.3" + deep-eql "^4.1.3" + get-func-name "^2.0.2" + loupe "^2.3.6" pathval "^1.1.1" - type-detect "^4.0.5" + type-detect "^4.1.0" chainsaw@~0.1.0: version "0.1.0" @@ -5184,16 +4758,15 @@ chalk@4.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^2.0.0, chalk@^2.3.1, chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== +chalk@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" + integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" + ansi-styles "^4.1.0" + supports-color "^7.1.0" -chalk@^4.0.0: +chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -5201,14 +4774,6 @@ chalk@^4.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" - integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - change-case@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/change-case/-/change-case-4.1.2.tgz#fedfc5f136045e2398c0410ee441f95704641e12" @@ -5228,36 +4793,43 @@ change-case@^4.1.2: tslib "^2.0.3" character-entities@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-2.0.1.tgz#98724833e1e27990dee0bd0f2b8a859c3476aac7" - integrity sha512-OzmutCf2Kmc+6DrFrrPS8/tDh2+DpnrfzdICHWhcVC9eOd0N1PXmQEE1a8iM4IziIAG+8tmTq3K+oo0ubH6RRQ== + version "2.0.2" + resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-2.0.2.tgz#2d09c2e72cd9523076ccb21157dff66ad43fcc22" + integrity sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ== chardet@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== -check-error@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" - integrity sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA== +check-error@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.3.tgz#a6502e4312a7ee969f646e83bb3ddd56281bd694" + integrity sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg== + dependencies: + get-func-name "^2.0.2" -chokidar@3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.0.tgz#12c0714668c55800f659e262d4962a97faf554a6" - integrity sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A== +chmodr@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/chmodr/-/chmodr-1.2.0.tgz#720e96caa09b7f1cdbb01529b7d0ab6bc5e118b9" + integrity sha512-Y5uI7Iq/Az6HgJEL6pdw7THVd7jbVOTPwsmcPOBjQL8e3N+pz872kzK5QxYGEy21iRys+iHWV0UZQXDFJo1hyA== + +chokidar@^3.5.3: + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== dependencies: - anymatch "~3.1.1" + anymatch "~3.1.2" braces "~3.0.2" - glob-parent "~5.1.0" + glob-parent "~5.1.2" is-binary-path "~2.1.0" is-glob "~4.0.1" normalize-path "~3.0.0" - readdirp "~3.2.0" + readdirp "~3.6.0" optionalDependencies: - fsevents "~2.1.1" + fsevents "~2.3.2" -chownr@^1.0.1, chownr@^1.1.1, chownr@^1.1.2, chownr@^1.1.4: +chownr@^1.0.1, chownr@^1.1.1: version "1.1.4" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== @@ -5268,64 +4840,68 @@ chownr@^2.0.0: integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== chrome-trace-event@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" - integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== + version "1.0.4" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz#05bffd7ff928465093314708c93bdfa9bd1f0f5b" + integrity sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ== + +chromium-bidi@0.6.4: + version "0.6.4" + resolved "https://registry.yarnpkg.com/chromium-bidi/-/chromium-bidi-0.6.4.tgz#627d76bae2819d59b61a413babe9664e0a16b71d" + integrity sha512-8zoq6ogmhQQkAKZVKO2ObFTl4uOkqoX1PlKQX3hZQ5E9cbUotcAb7h4pTNVAGGv8Z36PF3CtdOriEp/Rz82JqQ== + dependencies: + mitt "3.0.1" + urlpattern-polyfill "10.0.0" + zod "3.23.8" + +chromium-pickle-js@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz#04a106672c18b085ab774d983dfa3ea138f22205" + integrity sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw== ci-info@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== -circular-dependency-plugin@^5.2.2: - version "5.2.2" - resolved "https://registry.yarnpkg.com/circular-dependency-plugin/-/circular-dependency-plugin-5.2.2.tgz#39e836079db1d3cf2f988dc48c5188a44058b600" - integrity sha512-g38K9Cm5WRwlaH6g03B9OEz/0qRizI+2I7n+Gz+L5DxXJAPAiWQvwlYNm1V1jkdpUv95bOe/ASm2vfi/G560jQ== - -circular-json@^0.3.1: - version "0.3.3" - resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" - integrity sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A== - -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" +ci-info@^3.2.0, ci-info@^3.6.1, ci-info@^3.7.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== classnames@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.1.tgz#dfcfa3891e306ec1dad105d0e88f4417b8535e8e" - integrity sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA== + version "2.5.1" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.5.1.tgz#ba774c614be0f016da105c858e7159eae8e7687b" + integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow== clean-stack@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== -cli-cursor@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" - integrity sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw== +clean-stack@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-4.2.0.tgz#c464e4cde4ac789f4e0735c5d75beb49d7b30b31" + integrity sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg== dependencies: - restore-cursor "^2.0.0" + escape-string-regexp "5.0.0" -cli-cursor@^3.1.0: +cli-cursor@3.1.0, cli-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== dependencies: restore-cursor "^3.1.0" -cli-spinners@^2.5.0: +cli-spinners@2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d" integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g== +cli-spinners@^2.5.0: + version "2.9.2" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" + integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== + cli-truncate@2.1.0, cli-truncate@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" @@ -5334,28 +4910,10 @@ cli-truncate@2.1.0, cli-truncate@^2.1.0: slice-ansi "^3.0.0" string-width "^4.2.0" -cli-width@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" - integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== - -cliui@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" - integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== - dependencies: - string-width "^2.1.1" - strip-ansi "^4.0.0" - wrap-ansi "^2.0.0" - -cliui@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" - integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== - dependencies: - string-width "^3.1.0" - strip-ansi "^5.2.0" - wrap-ansi "^5.1.0" +cli-width@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" + integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== cliui@^6.0.0: version "6.0.0" @@ -5375,12 +4933,21 @@ cliui@^7.0.2: strip-ansi "^6.0.0" wrap-ansi "^7.0.0" +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + clone-buffer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" - integrity sha1-4+JbIHrE5wGvch4staFnksrD3Fg= + integrity sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g== -clone-deep@^4.0.1: +clone-deep@4.0.1, clone-deep@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== @@ -5389,27 +4956,27 @@ clone-deep@^4.0.1: kind-of "^6.0.2" shallow-clone "^3.0.0" -clone-response@1.0.2, clone-response@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" - integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= +clone-response@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.3.tgz#af2032aa47816399cf5f0a1d0db902f517abb8c3" + integrity sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA== dependencies: mimic-response "^1.0.0" clone-stats@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680" - integrity sha1-s3gt/4u1R04Yuba/D9/ngvh3doA= + integrity sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag== clone@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" - integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= + integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== clone@^2.1.1, clone@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" - integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= + integrity sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w== cloneable-readable@^1.0.0: version "1.1.3" @@ -5420,30 +4987,20 @@ cloneable-readable@^1.0.0: process-nextick-args "^2.0.0" readable-stream "^2.3.5" -clsx@^1.0.4, clsx@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.1.1.tgz#98b3134f9abbdf23b2663491ace13c5c03a73188" - integrity sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA== +clsx@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.1.tgz#eed397c9fd8bd882bfb18deab7102049a2f32999" + integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== + +cmd-shim@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-6.0.1.tgz#a65878080548e1dca760b3aea1e21ed05194da9d" + integrity sha512-S9iI9y0nKR4hwEQsVWpyxld/6kRfGepGfzff83FcaiEBpmvlbA2nnGe7Cylgrx2f/p1P5S5wpRm9oL8z1PbS3Q== code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= - -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" + integrity sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA== color-convert@^2.0.1: version "2.0.1" @@ -5452,11 +5009,6 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" @@ -5473,11 +5025,11 @@ colorette@^1.2.1, colorette@^1.4.0: integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g== colorette@^2.0.16: - version "2.0.16" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da" - integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g== + version "2.0.20" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== -columnify@^1.5.4: +columnify@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/columnify/-/columnify-1.6.0.tgz#6989531713c9008bb29735e61e37acf5bd553cf3" integrity sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q== @@ -5485,7 +5037,7 @@ columnify@^1.5.4: strip-ansi "^6.0.1" wcwidth "^1.0.0" -combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: +combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== @@ -5493,15 +5045,25 @@ combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: delayed-stream "~1.0.0" comma-separated-tokens@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.2.tgz#d4c25abb679b7751c880be623c1179780fe1dd98" - integrity sha512-G5yTt3KQN4Yn7Yk4ed73hlZ1evrFKXeUW3086p3PRFNp7m2vIjI6Pg+Kgb+oyzhd9F2qdcoj67+y3SdxL5XWsg== + version "2.0.3" + resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" + integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== commander@^2.20.0, commander@^2.8.1: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== +commander@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" + integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== + +commander@^6.2.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" + integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== + commander@^7.0.0: version "7.2.0" resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" @@ -5515,7 +5077,7 @@ commander@^8.2.0, commander@^8.3.0: commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== compare-func@^2.0.0: version "2.0.0" @@ -5525,18 +5087,15 @@ compare-func@^2.0.0: array-ify "^1.0.0" dot-prop "^5.1.0" -component-emitter@^1.2.1, component-emitter@^1.3.0, component-emitter@~1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== +compare-version@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/compare-version/-/compare-version-0.1.2.tgz#0162ec2d9351f5ddd59a9202cba935366a725080" + integrity sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A== -compress-brotli@^1.3.8: - version "1.3.8" - resolved "https://registry.yarnpkg.com/compress-brotli/-/compress-brotli-1.3.8.tgz#0c0a60c97a989145314ec381e84e26682e7b38db" - integrity sha512-lVcQsjhxhIXsuupfy9fmZUFtAIdBmXA7EGY6GBdgZ++qkM9zG4YFT8iU7FoBxzryNDMOpD1HIFHUSX4D87oqhQ== - dependencies: - "@types/json-buffer" "~3.0.0" - json-buffer "~3.0.1" +component-emitter@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.1.tgz#ef1d5796f7d93f135ee6fb684340b26403c97d17" + integrity sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ== compression-webpack-plugin@^9.0.0: version "9.2.0" @@ -5549,14 +5108,14 @@ compression-webpack-plugin@^9.0.0: computed-style@~0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/computed-style/-/computed-style-0.1.4.tgz#7f344fd8584b2e425bedca4a1afc0e300bb05d74" - integrity sha1-fzRP2FhLLkJb7cpKGvwOMAuwXXQ= + integrity sha512-WpAmaKbMNmS3OProfHIdJiNleNJdgUrJfbKArXua28QF7+0CoZjlLn0lp6vlc+dl5r2/X9GQiQRQQU4BzSa69w== concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== -concat-stream@^1.5.0, concat-stream@^1.5.2, concat-stream@^1.6.2: +concat-stream@^1.5.2: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== @@ -5576,17 +5135,10 @@ concat-stream@^2.0.0: readable-stream "^3.0.2" typedarray "^0.0.6" -concat-with-sourcemaps@*: - version "1.1.0" - resolved "https://registry.yarnpkg.com/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz#d4ea93f05ae25790951b99e7b3b09e3908a4082e" - integrity sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg== - dependencies: - source-map "^0.6.1" - -conf@^10.0.3: - version "10.1.2" - resolved "https://registry.yarnpkg.com/conf/-/conf-10.1.2.tgz#50132158f388756fa9dea3048f6b47935315c14e" - integrity sha512-o9Fv1Mv+6A0JpoayQ8JleNp3hhkbOJP/Re/Q+QqxMPHPkABVsRjQGWZn9A5GcqLiTNC6d89p2PB5ZhHVDSMwyg== +conf@^10.2.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/conf/-/conf-10.2.0.tgz#838e757be963f1a2386dfe048a98f8f69f7b55d6" + integrity sha512-8fLl9F04EJqjSqH+QjITQfJF8BrOVaYr1jewVgSRAEWePfxT0sku4w2hrGQ60BC/TNLGQ2pgxNlTbWQmMPFvXg== dependencies: ajv "^8.6.3" ajv-formats "^2.1.1" @@ -5599,18 +5151,18 @@ conf@^10.0.3: pkg-up "^3.1.0" semver "^7.3.5" -config-chain@^1.1.11: - version "1.1.13" - resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4" - integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ== +config-file-ts@^0.2.4: + version "0.2.6" + resolved "https://registry.yarnpkg.com/config-file-ts/-/config-file-ts-0.2.6.tgz#b424ff74612fb37f626d6528f08f92ddf5d22027" + integrity sha512-6boGVaglwblBgJqGyxm4+xCmEGcWgnWHSWHY5jad58awQhB6gftq0G8HbzU39YqCIYHMLAiL1yjwiZ36m/CL8w== dependencies: - ini "^1.3.4" - proto-list "~1.2.1" + glob "^10.3.10" + typescript "^5.3.3" console-control-strings@^1.0.0, console-control-strings@^1.1.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= + integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== constant-case@^3.0.4: version "3.0.4" @@ -5621,126 +5173,125 @@ constant-case@^3.0.4: tslib "^2.0.3" upper-case "^2.0.2" -content-disposition@0.5.4, content-disposition@^0.5.2: +content-disposition@0.5.4, content-disposition@^0.5.4: version "0.5.4" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== dependencies: safe-buffer "5.2.1" -content-type@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== +content-type@~1.0.4, content-type@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== -conventional-changelog-angular@^5.0.3: - version "5.0.13" - resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz#896885d63b914a70d4934b59d2fe7bde1832b28c" - integrity sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA== +conventional-changelog-angular@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz#5eec8edbff15aa9b1680a8dcfbd53e2d7eb2ba7a" + integrity sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ== dependencies: compare-func "^2.0.0" - q "^1.5.1" -conventional-changelog-core@^3.1.6: - version "3.2.3" - resolved "https://registry.yarnpkg.com/conventional-changelog-core/-/conventional-changelog-core-3.2.3.tgz#b31410856f431c847086a7dcb4d2ca184a7d88fb" - integrity sha512-LMMX1JlxPIq/Ez5aYAYS5CpuwbOk6QFp8O4HLAcZxe3vxoCtABkhfjetk8IYdRB9CDQGwJFLR3Dr55Za6XKgUQ== - dependencies: - conventional-changelog-writer "^4.0.6" - conventional-commits-parser "^3.0.3" - dateformat "^3.0.0" - get-pkg-repo "^1.0.0" - git-raw-commits "2.0.0" +conventional-changelog-core@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/conventional-changelog-core/-/conventional-changelog-core-5.0.1.tgz#3c331b155d5b9850f47b4760aeddfc983a92ad49" + integrity sha512-Rvi5pH+LvgsqGwZPZ3Cq/tz4ty7mjijhr3qR4m9IBXNbxGGYgTVVO+duXzz9aArmHxFtwZ+LRkrNIMDQzgoY4A== + dependencies: + add-stream "^1.0.0" + conventional-changelog-writer "^6.0.0" + conventional-commits-parser "^4.0.0" + dateformat "^3.0.3" + get-pkg-repo "^4.2.1" + git-raw-commits "^3.0.0" git-remote-origin-url "^2.0.0" - git-semver-tags "^2.0.3" - lodash "^4.2.1" - normalize-package-data "^2.3.5" - q "^1.5.1" + git-semver-tags "^5.0.0" + normalize-package-data "^3.0.3" read-pkg "^3.0.0" read-pkg-up "^3.0.0" - through2 "^3.0.0" -conventional-changelog-preset-loader@^2.1.1: - version "2.3.4" - resolved "https://registry.yarnpkg.com/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz#14a855abbffd59027fd602581f1f34d9862ea44c" - integrity sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g== +conventional-changelog-preset-loader@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-3.0.0.tgz#14975ef759d22515d6eabae6396c2ae721d4c105" + integrity sha512-qy9XbdSLmVnwnvzEisjxdDiLA4OmV3o8db+Zdg4WiFw14fP3B6XNz98X0swPPpkTd/pc1K7+adKgEDM1JCUMiA== -conventional-changelog-writer@^4.0.6: - version "4.1.0" - resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-4.1.0.tgz#1ca7880b75aa28695ad33312a1f2366f4b12659f" - integrity sha512-WwKcUp7WyXYGQmkLsX4QmU42AZ1lqlvRW9mqoyiQzdD+rJWbTepdWoKJuwXTS+yq79XKnQNa93/roViPQrAQgw== +conventional-changelog-writer@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-6.0.1.tgz#d8d3bb5e1f6230caed969dcc762b1c368a8f7b01" + integrity sha512-359t9aHorPw+U+nHzUXHS5ZnPBOizRxfQsWT5ZDHBfvfxQOAik+yfuhKXG66CN5LEWPpMNnIMHUTCKeYNprvHQ== dependencies: - compare-func "^2.0.0" - conventional-commits-filter "^2.0.7" - dateformat "^3.0.0" - handlebars "^4.7.6" + conventional-commits-filter "^3.0.0" + dateformat "^3.0.3" + handlebars "^4.7.7" json-stringify-safe "^5.0.1" - lodash "^4.17.15" - meow "^8.0.0" - semver "^6.0.0" - split "^1.0.0" - through2 "^4.0.0" + meow "^8.1.2" + semver "^7.0.0" + split "^1.0.1" -conventional-commits-filter@^2.0.2, conventional-commits-filter@^2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz#f8d9b4f182fce00c9af7139da49365b136c8a0b3" - integrity sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA== +conventional-commits-filter@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/conventional-commits-filter/-/conventional-commits-filter-3.0.0.tgz#bf1113266151dd64c49cd269e3eb7d71d7015ee2" + integrity sha512-1ymej8b5LouPx9Ox0Dw/qAO2dVdfpRFq28e5Y0jJEU8ZrLdy0vOSkkIInwmxErFGhg6SALro60ZrwYFVTUDo4Q== dependencies: lodash.ismatch "^4.4.0" - modify-values "^1.0.0" + modify-values "^1.0.1" -conventional-commits-parser@^3.0.3: - version "3.2.4" - resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz#a7d3b77758a202a9b2293d2112a8d8052c740972" - integrity sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q== +conventional-commits-parser@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-4.0.0.tgz#02ae1178a381304839bce7cea9da5f1b549ae505" + integrity sha512-WRv5j1FsVM5FISJkoYMR6tPk07fkKT0UodruX4je86V4owk451yjXAKzKAPOs9l7y59E2viHUS9eQ+dfUA9NSg== dependencies: - JSONStream "^1.0.4" + JSONStream "^1.3.5" is-text-path "^1.0.1" - lodash "^4.17.15" - meow "^8.0.0" - split2 "^3.0.0" - through2 "^4.0.0" + meow "^8.1.2" + split2 "^3.2.2" -conventional-recommended-bump@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/conventional-recommended-bump/-/conventional-recommended-bump-5.0.1.tgz#5af63903947b6e089e77767601cb592cabb106ba" - integrity sha512-RVdt0elRcCxL90IrNP0fYCpq1uGt2MALko0eyeQ+zQuDVWtMGAy9ng6yYn3kax42lCj9+XBxQ8ZN6S9bdKxDhQ== +conventional-recommended-bump@7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/conventional-recommended-bump/-/conventional-recommended-bump-7.0.1.tgz#ec01f6c7f5d0e2491c2d89488b0d757393392424" + integrity sha512-Ft79FF4SlOFvX4PkwFDRnaNiIVX7YbmqGU0RwccUaiGvgp3S0a8ipR2/Qxk31vclDNM+GSdJOVs2KrsUCjblVA== dependencies: concat-stream "^2.0.0" - conventional-changelog-preset-loader "^2.1.1" - conventional-commits-filter "^2.0.2" - conventional-commits-parser "^3.0.3" - git-raw-commits "2.0.0" - git-semver-tags "^2.0.3" - meow "^4.0.0" - q "^1.5.1" - -convert-source-map@^1.5.0, convert-source-map@^1.7.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" - integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== - dependencies: - safe-buffer "~5.1.1" + conventional-changelog-preset-loader "^3.0.0" + conventional-commits-filter "^3.0.0" + conventional-commits-parser "^4.0.0" + git-raw-commits "^3.0.0" + git-semver-tags "^5.0.0" + meow "^8.1.2" + +convert-source-map@^1.5.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== -cookie@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" - integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== +cookie@0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.1.tgz#2f73c42142d5d5cf71310a74fc4ae61670e5dbc9" + integrity sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w== -cookie@^0.4.0, cookie@~0.4.1: +cookie@^0.4.0: version "0.4.2" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== -cookiejar@^2.1.2: - version "2.1.3" - resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.3.tgz#fc7a6216e408e74414b90230050842dacda75acc" - integrity sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ== +cookie@~0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7" + integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== + +cookiejar@^2.1.3: + version "2.1.4" + resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.4.tgz#ee669c1fea2cf42dc31585469d193fef0d65771b" + integrity sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw== copy-anything@^2.0.1: version "2.0.6" @@ -5749,23 +5300,6 @@ copy-anything@^2.0.1: dependencies: is-what "^3.14.1" -copy-concurrently@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" - integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== - dependencies: - aproba "^1.1.1" - fs-write-stream-atomic "^1.0.8" - iferr "^0.1.5" - mkdirp "^0.5.1" - rimraf "^2.5.4" - run-queue "^1.0.0" - -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= - copy-webpack-plugin@^8.1.1: version "8.1.1" resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-8.1.1.tgz#3f697e162764925c2f0d235f380676125508fd26" @@ -5779,18 +5313,17 @@ copy-webpack-plugin@^8.1.1: schema-utils "^3.0.0" serialize-javascript "^5.0.1" -core-js-compat@^3.21.0, core-js-compat@^3.22.1: - version "3.22.5" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.22.5.tgz#7fffa1d20cb18405bd22756ca1353c6f1a0e8614" - integrity sha512-rEF75n3QtInrYICvJjrAgV03HwKiYvtKHdPtaba1KucG+cNZ4NJnH9isqt979e67KZlhpbCOTwnsvnIr+CVeOg== +core-js-compat@^3.40.0: + version "3.41.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.41.0.tgz#4cdfce95f39a8f27759b667cf693d96e5dda3d17" + integrity sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A== dependencies: - browserslist "^4.20.3" - semver "7.0.0" + browserslist "^4.24.4" core-util-is@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== core-util-is@~1.0.0: version "1.0.3" @@ -5805,195 +5338,177 @@ cors@~2.8.5: object-assign "^4" vary "^1" -cosmiconfig@^5.1.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" - integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== - dependencies: - import-fresh "^2.0.0" - is-directory "^0.3.1" - js-yaml "^3.13.1" - parse-json "^4.0.0" +corser@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/corser/-/corser-2.0.1.tgz#8eda252ecaab5840dcd975ceb90d9370c819ff87" + integrity sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ== -cosmiconfig@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" - integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== +cosmiconfig@^7.0.0, cosmiconfig@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" + integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== dependencies: "@types/parse-json" "^4.0.0" - import-fresh "^3.1.0" + import-fresh "^3.2.1" parse-json "^5.0.0" path-type "^4.0.0" - yaml "^1.7.2" + yaml "^1.10.0" -cosmiconfig@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" - integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== +cosmiconfig@^8.2.0: + version "8.3.6" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" + integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.2.1" - parse-json "^5.0.0" + import-fresh "^3.3.0" + js-yaml "^4.1.0" + parse-json "^5.2.0" path-type "^4.0.0" - yaml "^1.10.0" -cp-file@^6.1.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/cp-file/-/cp-file-6.2.0.tgz#40d5ea4a1def2a9acdd07ba5c0b0246ef73dc10d" - integrity sha512-fmvV4caBnofhPe8kOcitBwSn2f39QLjnAnGq3gO9dfd75mUytzKNZB1hde6QHunW2Rt+OwuBOMc3i1tNElbszA== +cosmiconfig@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-9.0.0.tgz#34c3fc58287b915f3ae905ab6dc3de258b55ad9d" + integrity sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg== dependencies: - graceful-fs "^4.1.2" - make-dir "^2.0.0" - nested-error-stacks "^2.0.0" - pify "^4.0.1" - safe-buffer "^5.0.1" + env-paths "^2.2.1" + import-fresh "^3.3.0" + js-yaml "^4.1.0" + parse-json "^5.2.0" -create-frame@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/create-frame/-/create-frame-1.0.0.tgz#8b95f2691e3249b6080443e33d0bad9f8f6975aa" - integrity sha1-i5XyaR4ySbYIBEPjPQutn49pdao= +crc@^3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/crc/-/crc-3.8.0.tgz#ad60269c2c856f8c299e2c4cc0de4556914056c6" + integrity sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ== dependencies: - define-property "^0.2.5" - extend-shallow "^2.0.1" - isobject "^3.0.0" - lazy-cache "^2.0.2" + buffer "^5.1.0" -cross-env@^7.0.2: +cross-env@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf" integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw== dependencies: cross-spawn "^7.0.1" -cross-spawn-async@^2.1.1: - version "2.2.5" - resolved "https://registry.yarnpkg.com/cross-spawn-async/-/cross-spawn-async-2.2.5.tgz#845ff0c0834a3ded9d160daca6d390906bb288cc" - integrity sha1-hF/wwINKPe2dFg2sptOQkGuyiMw= +cross-fetch@^3.1.5: + version "3.2.0" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.2.0.tgz#34e9192f53bc757d6614304d9e5e6fb4edb782e3" + integrity sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q== dependencies: - lru-cache "^4.0.0" - which "^1.2.8" + node-fetch "^2.7.0" cross-spawn@^4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41" - integrity sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE= + integrity sha512-yAXz/pA1tD8Gtg2S98Ekf/sewp3Lcp3YoFKJ4Hkp5h5yLWnKVTDU0kwjKJ8NDCYcfTLfyGkzTikst+jWypT1iA== dependencies: lru-cache "^4.0.1" which "^1.2.9" -cross-spawn@^6.0.0: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - -cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== +cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3, cross-spawn@^7.0.6: + version "7.0.6" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== dependencies: path-key "^3.1.0" shebang-command "^2.0.0" which "^2.0.1" -crypto-js@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-4.1.1.tgz#9e485bcf03521041bd85844786b83fb7619736cf" - integrity sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw== +crypto-js@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-4.2.0.tgz#4d931639ecdfd12ff80e8186dba6af2c2e856631" + integrity sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q== css-loader@^6.2.0: - version "6.7.1" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.7.1.tgz#e98106f154f6e1baf3fc3bc455cb9981c1d5fd2e" - integrity sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw== + version "6.11.0" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.11.0.tgz#33bae3bf6363d0a7c2cf9031c96c744ff54d85ba" + integrity sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g== dependencies: icss-utils "^5.1.0" - postcss "^8.4.7" - postcss-modules-extract-imports "^3.0.0" - postcss-modules-local-by-default "^4.0.0" - postcss-modules-scope "^3.0.0" + postcss "^8.4.33" + postcss-modules-extract-imports "^3.1.0" + postcss-modules-local-by-default "^4.0.5" + postcss-modules-scope "^3.2.0" postcss-modules-values "^4.0.0" postcss-value-parser "^4.2.0" - semver "^7.3.5" + semver "^7.5.4" cssesc@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": - version "0.3.8" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" - integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== - -cssstyle@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.4.0.tgz#9d31328229d3c565c61e586b02041a28fccdccf1" - integrity sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA== +cssstyle@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-3.0.0.tgz#17ca9c87d26eac764bb8cfd00583cff21ce0277a" + integrity sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg== dependencies: - cssom "0.3.x" - -csstype@^2.5.7: - version "2.6.20" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.20.tgz#9229c65ea0b260cf4d3d997cb06288e36a8d6dda" - integrity sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA== + rrweb-cssom "^0.6.0" csstype@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.0.tgz#4ddcac3718d787cf9df0d1b7d15033925c8f29f2" - integrity sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA== + version "3.1.3" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" + integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== -currently-unhandled@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" - integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= - dependencies: - array-find-index "^1.0.1" +dargs@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/dargs/-/dargs-7.0.0.tgz#04015c41de0bcb69ec84050f3d9be0caf8d6d5cc" + integrity sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg== -cyclist@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" - integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= +data-uri-to-buffer@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz#d8feb2b2881e6a4f58c2e08acfd0e2834e26222e" + integrity sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A== -dargs@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/dargs/-/dargs-4.1.0.tgz#03a9dbb4b5c2f139bf14ae53f0b8a2a6a86f4e17" - integrity sha1-A6nbtLXC8Tm/FK5T8LiipqhvThc= +data-uri-to-buffer@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz#8a58bb67384b261a38ef18bea1810cb01badd28b" + integrity sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw== + +data-urls@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-4.0.0.tgz#333a454eca6f9a5b7b0f1013ff89074c3f522dd4" + integrity sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g== dependencies: - number-is-nan "^1.0.0" + abab "^2.0.6" + whatwg-mimetype "^3.0.0" + whatwg-url "^12.0.0" -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= +data-view-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.2.tgz#211a03ba95ecaf7798a8c7198d79536211f88570" + integrity sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ== dependencies: - assert-plus "^1.0.0" + call-bound "^1.0.3" + es-errors "^1.3.0" + is-data-view "^1.0.2" -data-urls@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" - integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ== +data-view-byte-length@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz#9e80f7ca52453ce3e93d25a35318767ea7704735" + integrity sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ== dependencies: - abab "^2.0.0" - whatwg-mimetype "^2.2.0" - whatwg-url "^7.0.0" + call-bound "^1.0.3" + es-errors "^1.3.0" + is-data-view "^1.0.2" -date.js@^0.3.1: - version "0.3.3" - resolved "https://registry.yarnpkg.com/date.js/-/date.js-0.3.3.tgz#ef1e92332f507a638795dbb985e951882e50bbda" - integrity sha512-HgigOS3h3k6HnW011nAb43c5xx5rBXk8P2v/WIT9Zv4koIaVXiH2BURguI78VVp+5Qc076T7OR378JViCnZtBw== +data-view-byte-offset@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz#068307f9b71ab76dbbe10291389e020856606191" + integrity sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ== dependencies: - debug "~3.1.0" + call-bound "^1.0.2" + es-errors "^1.3.0" + is-data-view "^1.0.1" -dateformat@^3.0.0, dateformat@^3.0.3: +dateformat@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== +dateformat@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-5.0.3.tgz#fe2223eff3cc70ce716931cb3038b59a9280696e" + integrity sha512-Kvr6HmPXUMerlLcLF+Pwq3K7apHpYmGDVqrxcDasBg86UcKeTSNWbEzU8bwdXnxnR44FtMhJAxI4Bov6Y/KUfA== + debounce-fn@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/debounce-fn/-/debounce-fn-4.0.0.tgz#ed76d206d8a50e60de0dd66d494d82835ffe61c7" @@ -6001,33 +5516,19 @@ debounce-fn@^4.0.0: dependencies: mimic-fn "^3.0.0" -debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: +debug@2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" -debug@3.1.0, debug@~3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== - dependencies: - ms "2.0.0" - -debug@3.2.6: - version "3.2.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" - integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== - dependencies: - ms "^2.1.1" - -debug@4, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@~4.3.1, debug@~4.3.2: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== +debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@^4.3.5, debug@^4.3.6: + version "4.4.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" + integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== dependencies: - ms "2.1.2" + ms "^2.1.3" debug@^3.1.0: version "3.2.7" @@ -6036,42 +5537,47 @@ debug@^3.1.0: dependencies: ms "^2.1.1" -debuglog@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" - integrity sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI= +debug@~4.3.1, debug@~4.3.2, debug@~4.3.4: + version "4.3.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" + integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== + dependencies: + ms "^2.1.3" -decamelize-keys@^1.0.0, decamelize-keys@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" - integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk= +decamelize-keys@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.1.tgz#04a2d523b2f18d80d0158a43b895d56dff8d19d8" + integrity sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg== dependencies: decamelize "^1.1.0" map-obj "^1.0.0" -decamelize@^1.1.0, decamelize@^1.1.1, decamelize@^1.1.2, decamelize@^1.2.0: +decamelize@^1.1.0, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== + +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== + +decimal.js@^10.4.3: + version "10.5.0" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.5.0.tgz#0f371c7cf6c4898ce0afb09836db73cd82010f22" + integrity sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw== decode-named-character-reference@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/decode-named-character-reference/-/decode-named-character-reference-1.0.1.tgz#57b2bd9112659cacbc449d3577d7dadb8e1f3d1b" - integrity sha512-YV/0HQHreRwKb7uBopyIkLG17jG6Sv2qUchk9qSoVJ2f+flwRsPNBO0hAnjt6mTNYUT+vw9Gy2ihXg4sUWPi2w== + version "1.1.0" + resolved "https://registry.yarnpkg.com/decode-named-character-reference/-/decode-named-character-reference-1.1.0.tgz#5d6ce68792808901210dac42a8e9853511e2b8bf" + integrity sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w== dependencies: character-entities "^2.0.0" -decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= - -decompress-response@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" - integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= - dependencies: - mimic-response "^1.0.0" +decode-uri-component@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" + integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== decompress-response@^4.2.0: version "4.2.1" @@ -6096,7 +5602,7 @@ decompress-tar@^4.0.0, decompress-tar@^4.1.0, decompress-tar@^4.1.1: is-stream "^1.1.0" tar-stream "^1.5.2" -decompress-tarbz2@^4.0.0: +decompress-tarbz2@^4.0.0, decompress-tarbz2@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz#3082a5b880ea4043816349f378b56c516be1a39b" integrity sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A== @@ -6119,7 +5625,7 @@ decompress-targz@^4.0.0, decompress-targz@^4.1.1: decompress-unzip@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/decompress-unzip/-/decompress-unzip-4.0.1.tgz#deaaccdfd14aeaf85578f733ae8210f9b4848f69" - integrity sha1-3qrM39FK6vhVePczroIQ+bSEj2k= + integrity sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw== dependencies: file-type "^3.8.0" get-stream "^2.2.0" @@ -6140,152 +5646,130 @@ decompress@^4.2.0, decompress@^4.2.1: pify "^2.3.0" strip-dirs "^2.0.0" -dedent@^0.7.0: +dedent@0.7.0, dedent@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" - integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= + integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== -deep-eql@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" - integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== +deep-eql@^4.1.3: + version "4.1.4" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.4.tgz#d0d3912865911bb8fac5afb4e3acfa6a28dc72b7" + integrity sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg== dependencies: type-detect "^4.0.0" -deep-equal@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.0.5.tgz#55cd2fe326d83f9cbf7261ef0e060b3f724c5cb9" - integrity sha512-nPiRgmbAtm1a3JsnLCf6/SLfXcjyN5v8L1TXzdCmHrXJ4hx+gW/w1YCcn7z8gJtSiDArZCgYtbao3QqLm/N1Sw== - dependencies: - call-bind "^1.0.0" - es-get-iterator "^1.1.1" - get-intrinsic "^1.0.1" - is-arguments "^1.0.4" - is-date-object "^1.0.2" - is-regex "^1.1.1" +deep-equal@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.3.tgz#af89dafb23a396c7da3e862abc0be27cf51d56e1" + integrity sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.5" + es-get-iterator "^1.1.3" + get-intrinsic "^1.2.2" + is-arguments "^1.1.1" + is-array-buffer "^3.0.2" + is-date-object "^1.0.5" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" isarray "^2.0.5" - object-is "^1.1.4" + object-is "^1.1.5" object-keys "^1.1.1" - object.assign "^4.1.2" - regexp.prototype.flags "^1.3.0" - side-channel "^1.0.3" - which-boxed-primitive "^1.0.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.5.1" + side-channel "^1.0.4" + which-boxed-primitive "^1.0.2" which-collection "^1.0.1" - which-typed-array "^1.1.2" + which-typed-array "^1.1.13" deep-extend@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== -deep-is@^0.1.3, deep-is@~0.1.3: +deep-is@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== -deepmerge@*, deepmerge@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" - integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== - -deepmerge@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-2.0.1.tgz#25c1c24f110fb914f80001b925264dd77f3f4312" - integrity sha512-VIPwiMJqJ13ZQfaCsIFnp5Me9tnjURiaIFxfz7EH0Ci0dTSQpZtSLrqOicXqEd/z2r+z+Klk9GzmnRsgpgbOsQ== - -default-compare@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/default-compare/-/default-compare-1.0.0.tgz#cb61131844ad84d84788fb68fd01681ca7781a2f" - integrity sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ== - dependencies: - kind-of "^5.0.2" +deepmerge@^4.2.2: + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== default-shell@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/default-shell/-/default-shell-1.0.1.tgz#752304bddc6174f49eb29cb988feea0b8813c8bc" - integrity sha1-dSMEvdxhdPSespy5iP7qC4gTyLw= + integrity sha512-/Os8tTMPSriNHCsVj3VLjMZblIl1sIg8EXz3qg7C5K+y9calfTA/qzlfPvCQ+LEgLWmtZ9wCnzE1w+S6TPPFyQ== defaults@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" - integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= + version "1.0.4" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" + integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== dependencies: clone "^1.0.2" -defer-to-connect@^1.0.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" - integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== - -defer-to-connect@^2.0.0: +defer-to-connect@^2.0.0, defer-to-connect@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== +define-data-property@^1.0.1, define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + define-lazy-prop@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== -define-properties@^1.1.2, define-properties@^1.1.3, define-properties@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" - integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== +define-properties@^1.1.3, define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== dependencies: + define-data-property "^1.0.1" has-property-descriptors "^1.0.0" object-keys "^1.1.1" -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== +degenerator@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/degenerator/-/degenerator-5.0.1.tgz#9403bf297c6dad9a1ece409b37db27954f91f2f5" + integrity sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ== dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" + ast-types "^0.13.4" + escodegen "^2.1.0" + esprima "^4.0.1" delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== depd@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== -depd@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= - deprecation@^2.0.0, deprecation@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== dequal@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.2.tgz#85ca22025e3a87e65ef75a7a437b35284a7e319d" - integrity sha512-q9K8BlJVxK7hQYqa6XISGmBZbtQQWVXSrRrWreHC94rMt1QL/Impruc+7p2CYSYuVIUr+YCt6hjrs1kkdJRTug== + version "2.0.3" + resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" + integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== destroy@1.2.0: version "1.2.0" @@ -6295,24 +5779,29 @@ destroy@1.2.0: detect-indent@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" - integrity sha1-OHHMCmoALow+Wzz38zYmRnXwa50= + integrity sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g== detect-libc@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= + integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg== -detect-libc@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.1.tgz#e1897aa88fa6ad197862937fbc0441ef352ee0cd" - integrity sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w== +detect-libc@^2.0.0, detect-libc@^2.0.1, detect-libc@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" + integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== detect-node@^2.0.4: version "2.1.0" resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== -dezalgo@^1.0.0: +devtools-protocol@0.0.1312386: + version "0.0.1312386" + resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.1312386.tgz#5ab824d6f1669ec6c6eb0fba047e73601d969052" + integrity sha512-DPnhUXvmvKT2dFA/j7B+riVLUt9Q6RKJlcppojL5CoRywJJKLDYnRlw0gTFKfgDPHP5E04UoB71SxoJlVZy8FA== + +dezalgo@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.4.tgz#751235260469084c132157dfa857f386d4c33d81" integrity sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig== @@ -6320,25 +5809,25 @@ dezalgo@^1.0.0: asap "^2.0.0" wrappy "1" -dicer@0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/dicer/-/dicer-0.2.5.tgz#5996c086bb33218c812c090bddc09cd12facb70f" - integrity sha1-WZbAhrszIYyBLAkL3cCc0S+stw8= - dependencies: - readable-stream "1.1.x" - streamsearch "0.1.2" +diff-sequences@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" + integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== -diff@3.5.0, diff@^3.4.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" - integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== +diff@^5.0.0, diff@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.2.0.tgz#26ded047cd1179b78b9537d5ef725503ce1ae531" + integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== -diff@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" - integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== +dir-compare@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/dir-compare/-/dir-compare-3.3.0.tgz#2c749f973b5c4b5d087f11edaae730db31788416" + integrity sha512-J7/et3WlGUCxjdnD3HAAzQ6nsnc0WL6DD7WcwJb7c39iH1+AWfg+9OqzJNaI6PkBwBvm1mhZNL9iY/nRiZXlPg== + dependencies: + buffer-equal "^1.0.0" + minimatch "^3.0.4" -dir-glob@^2.0.0, dir-glob@^2.2.2: +dir-glob@^2.0.0: version "2.2.2" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw== @@ -6352,6 +5841,48 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" +dmg-builder@24.13.3: + version "24.13.3" + resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-24.13.3.tgz#95d5b99c587c592f90d168a616d7ec55907c7e55" + integrity sha512-rcJUkMfnJpfCboZoOOPf4L29TRtEieHNOeAbYPWPxlaBw/Z1RKrRA86dOI9rwaI4tQSc/RD82zTNHprfUHXsoQ== + dependencies: + app-builder-lib "24.13.3" + builder-util "24.13.1" + builder-util-runtime "9.2.4" + fs-extra "^10.1.0" + iconv-lite "^0.6.2" + js-yaml "^4.1.0" + optionalDependencies: + dmg-license "^1.0.11" + +dmg-license@^1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/dmg-license/-/dmg-license-1.0.11.tgz#7b3bc3745d1b52be7506b4ee80cb61df6e4cd79a" + integrity sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q== + dependencies: + "@types/plist" "^3.0.1" + "@types/verror" "^1.10.3" + ajv "^6.10.0" + crc "^3.8.0" + iconv-corefoundation "^1.1.7" + plist "^3.0.4" + smart-buffer "^4.0.2" + verror "^1.10.0" + +dns-packet@^5.2.4: + version "5.6.1" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.6.1.tgz#ae888ad425a9d1478a0674256ab866de1012cf2f" + integrity sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw== + dependencies: + "@leichtgewicht/ip-codec" "^2.0.1" + +dns-socket@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/dns-socket/-/dns-socket-4.2.2.tgz#58b0186ec053ea0731feb06783c7eeac4b95b616" + integrity sha512-BDeBd8najI4/lS00HSKpdFia+OvUMytaVjfzR9n5Lq8MlZRSvtbI+uLtx1+XmQFls5wFU9dssccTmQQ6nfpjdg== + dependencies: + dns-packet "^5.2.4" + doctrine@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" @@ -6366,7 +5897,7 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -dom-helpers@^5.0.1, dom-helpers@^5.1.3: +dom-helpers@^5.0.1: version "5.2.1" resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== @@ -6374,17 +5905,17 @@ dom-helpers@^5.0.1, dom-helpers@^5.1.3: "@babel/runtime" "^7.8.7" csstype "^3.0.2" -domexception@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" - integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug== +domexception@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-4.0.0.tgz#4ad1be56ccadc86fc76d033353999a8037d03673" + integrity sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw== dependencies: - webidl-conversions "^4.0.2" + webidl-conversions "^7.0.0" -dompurify@^2.2.9: - version "2.3.8" - resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.3.8.tgz#224fe9ae57d7ebd9a1ae1ac18c1c1ca3f532226f" - integrity sha512-eVhaWoVibIzqdGYjwsBWodIQIaXFSB+cKDf4cfxLMsK0xiud6SE+/WCVx/Xw/UwQsa4cS3T2eITcdtmTg2UKcw== +dompurify@^2.2.9, dompurify@^2.4.7: + version "2.5.8" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.5.8.tgz#2809d89d7e528dc7a071dea440d7376df676f824" + integrity sha512-o1vSNgrmYMQObbSSvF/1brBYEQPHhV1+gsmrusO7/GXtp1T9rCS8cXFqVxK/9crT1jA6Ccv+5MTSjBNqr7Sovw== dot-case@^3.0.4: version "3.0.4" @@ -6394,13 +5925,6 @@ dot-case@^3.0.4: no-case "^3.0.4" tslib "^2.0.3" -dot-prop@^4.2.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.1.tgz#45884194a71fc2cda71cbb4bceb3a4dd2f433ba4" - integrity sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ== - dependencies: - is-obj "^1.0.0" - dot-prop@^5.1.0: version "5.3.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" @@ -6415,25 +5939,27 @@ dot-prop@^6.0.1: dependencies: is-obj "^2.0.0" -download@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/download/-/download-7.1.0.tgz#9059aa9d70b503ee76a132897be6dec8e5587233" - integrity sha512-xqnBTVd/E+GxJVrX5/eUJiLYjCGPwMpdL+jGhGU57BvtcA7wwhtHVbXBeUk51kOpW3S7Jn3BQbN9Q1R1Km2qDQ== - dependencies: - archive-type "^4.0.0" - caw "^2.0.1" - content-disposition "^0.5.2" - decompress "^4.2.0" - ext-name "^5.0.0" - file-type "^8.1.0" - filenamify "^2.0.0" - get-stream "^3.0.0" - got "^8.3.1" - make-dir "^1.2.0" - p-event "^2.1.0" - pify "^3.0.0" +dotenv-expand@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0" + integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== + +dotenv-expand@~10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-10.0.0.tgz#12605d00fb0af6d0a592e6558585784032e4ef37" + integrity sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A== + +dotenv@^9.0.2: + version "9.0.2" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-9.0.2.tgz#dacc20160935a37dea6364aa1bef819fb9b6ab05" + integrity sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg== + +dotenv@~16.3.1: + version "16.3.2" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.3.2.tgz#3cb611ce5a63002dbabf7c281bc331f69d28f03f" + integrity sha512-HTlk5nmhkm8F6JcdXvHIzaorzCoziNQT9mGxLPVXW8wJF1TiGSL60ZGB4gHWabHOaMmWmhvk2/lPHfnBiT78AQ== -drivelist@^9.0.2: +drivelist@^9.0.2, drivelist@^9.2.4: version "9.2.4" resolved "https://registry.yarnpkg.com/drivelist/-/drivelist-9.2.4.tgz#f89d2233d86c9fcdbc0daacae257d7b27a658d20" integrity sha512-F36yn+qXwiOGZM16FYPKcIRjC7qXDIA0SBZ0vvTEe01ai788Se8z78acYdgXC8NAsghiO+9c/GYXgU7E9hhUpg== @@ -6443,78 +5969,114 @@ drivelist@^9.0.2: nan "^2.14.0" prebuild-install "^5.2.4" +dunder-proto@^1.0.0, dunder-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" + integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== + dependencies: + call-bind-apply-helpers "^1.0.1" + es-errors "^1.3.0" + gopd "^1.2.0" + duplexer2@~0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" - integrity sha1-ixLauHjA1p4+eJEFFmKjL8a93ME= + integrity sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA== dependencies: readable-stream "^2.0.2" -duplexer3@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" - integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= - duplexer@^0.1.1, duplexer@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== -duplexify@^3.4.2, duplexify@^3.6.0: - version "3.7.1" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" - integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== - dependencies: - end-of-stream "^1.0.0" - inherits "^2.0.1" - readable-stream "^2.0.0" - stream-shift "^1.0.0" - -ecc-jsbn@~0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= - dependencies: - jsbn "~0.1.0" - safer-buffer "^2.1.0" +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +ejs@^3.1.7, ejs@^3.1.8: + version "3.1.10" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.10.tgz#69ab8358b14e896f80cc39e62087b88500c3ac3b" + integrity sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA== + dependencies: + jake "^10.8.5" + +electron-builder@^24.6.4: + version "24.13.3" + resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-24.13.3.tgz#c506dfebd36d9a50a83ee8aa32d803d83dbe4616" + integrity sha512-yZSgVHft5dNVlo31qmJAe4BVKQfFdwpRw7sFp1iQglDRCDD6r22zfRJuZlhtB5gp9FHUxCMEoWGq10SkCnMAIg== + dependencies: + app-builder-lib "24.13.3" + builder-util "24.13.1" + builder-util-runtime "9.2.4" + chalk "^4.1.2" + dmg-builder "24.13.3" + fs-extra "^10.1.0" + is-ci "^3.0.0" + lazy-val "^1.0.5" + read-config-file "6.3.2" + simple-update-notifier "2.0.0" + yargs "^17.6.2" + +electron-notarize@^1.1.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/electron-notarize/-/electron-notarize-1.2.2.tgz#ebf2b258e8e08c1c9f8ff61dc53d5b16b439daf4" + integrity sha512-ZStVWYcWI7g87/PgjPJSIIhwQXOaw4/XeXU+pWqMMktSLHaGMLHdyPPN7Cmao7+Cr7fYufA16npdtMndYciHNw== + dependencies: + debug "^4.1.1" + fs-extra "^9.0.1" + +electron-publish@24.13.1: + version "24.13.1" + resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-24.13.1.tgz#57289b2f7af18737dc2ad134668cdd4a1b574a0c" + integrity sha512-2ZgdEqJ8e9D17Hwp5LEq5mLQPjqU3lv/IALvgp+4W8VeNhryfGhYEQC/PgDPMrnWUp+l60Ou5SJLsu+k4mhQ8A== + dependencies: + "@types/fs-extra" "^9.0.11" + builder-util "24.13.1" + builder-util-runtime "9.2.4" + chalk "^4.1.2" + fs-extra "^10.1.0" + lazy-val "^1.0.5" + mime "^2.5.2" electron-rebuild@^3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/electron-rebuild/-/electron-rebuild-3.2.7.tgz#0f56c1cc99a6fec0a5b990532283c2a8c838c19b" - integrity sha512-WvaW1EgRinDQ61khHFZfx30rkPQG5ItaOT0wrI7iJv9A3SbghriQGfZQfHZs25fWLBe6/vkv05LOqg6aDw6Wzw== + version "3.2.9" + resolved "https://registry.yarnpkg.com/electron-rebuild/-/electron-rebuild-3.2.9.tgz#ea372be15f591f8d6d978ee9bca6526dadbcf20f" + integrity sha512-FkEZNFViUem3P0RLYbZkUjC8LUFIK+wKq09GHoOITSJjfDAVQv964hwaNseTTWt58sITQX3/5fHNYcTefqaCWw== dependencies: "@malept/cross-spawn-promise" "^2.0.0" chalk "^4.0.0" debug "^4.1.1" - detect-libc "^1.0.3" + detect-libc "^2.0.1" fs-extra "^10.0.0" got "^11.7.0" lzma-native "^8.0.5" node-abi "^3.0.0" node-api-version "^0.1.4" - node-gyp "^8.4.0" + node-gyp "^9.0.0" ora "^5.1.0" semver "^7.3.5" tar "^6.0.5" yargs "^17.0.1" electron-store@^8.0.0: - version "8.0.1" - resolved "https://registry.yarnpkg.com/electron-store/-/electron-store-8.0.1.tgz#9b598c1d2edeffebee9d8c1cd957ad368c528925" - integrity sha512-ZyLvNywiqSpbwC/pp89O/AycVWY/UJIkmtyzF2Bd0Nm/rLmcFc0NTGuLdg6+LE8mS8qsiK5JMoe4PnrecLHH5w== + version "8.2.0" + resolved "https://registry.yarnpkg.com/electron-store/-/electron-store-8.2.0.tgz#114e6e453e8bb746ab4ccb542424d8c881ad2ca1" + integrity sha512-ukLL5Bevdil6oieAOXz3CMy+OgaItMiVBg701MNlG6W5RaC0AHN7rvlqTCmeb6O7jP0Qa1KKYTE0xV0xbhF4Hw== dependencies: - conf "^10.0.3" - type-fest "^1.0.2" + conf "^10.2.0" + type-fest "^2.17.0" -electron-to-chromium@^1.4.118: - version "1.4.137" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.137.tgz#186180a45617283f1c012284458510cd99d6787f" - integrity sha512-0Rcpald12O11BUogJagX3HsCN3FE83DSqWjgXoHo5a72KUKMSfI39XBgJpgNNxS9fuGzytaFjE06kZkiVFy2qA== +electron-to-chromium@^1.5.73: + version "1.5.118" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.118.tgz#064bda9bfea1611074288adb1fdd1f787a131e21" + integrity sha512-yNDUus0iultYyVoEFLnQeei7LOQkL8wg8GQpkPCRrOlJXlcCwa6eGKZkxQ9ciHsqZyYbj8Jd94X1CTPzGm+uIA== electron-updater@^4.6.5: version "4.6.5" @@ -6530,36 +6092,41 @@ electron-updater@^4.6.5: lodash.isequal "^4.5.0" semver "^7.3.5" -electron@^15.3.5: - version "15.5.5" - resolved "https://registry.yarnpkg.com/electron/-/electron-15.5.5.tgz#796b7822bfb2b045b504e40657674f2869361681" - integrity sha512-cGS1ueek14WLvLJlJbId3fmqJLvkr7VuBI0hHt6gpKaj8m2iv/NMteRg0deLgwlxjEF6ZGGNerUJW6a96rNq/Q== +electron@30.1.2: + version "30.1.2" + resolved "https://registry.yarnpkg.com/electron/-/electron-30.1.2.tgz#9c8b9b0d0e3f07783d8c5dbd9519b3ffd11f1551" + integrity sha512-A5CFGwbA+HSXnzwjc8fP2GIezBcAb0uN/VbNGLOW8DHOYn07rvJ/1bAJECHUUzt5zbfohveG3hpMQiYpbktuDw== dependencies: - "@electron/get" "^1.13.0" - "@types/node" "^14.6.2" - extract-zip "^1.0.3" - -emoji-regex@^7.0.1: - version "7.0.3" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + "@electron/get" "^2.0.0" + "@types/node" "^20.9.0" + extract-zip "^2.0.1" emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + emojis-list@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== -encodeurl@^1.0.2, encodeurl@~1.0.2: +encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +encodeurl@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" + integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== -encoding@^0.1.11, encoding@^0.1.12, encoding@^0.1.13: +encoding@^0.1.13: version "0.1.13" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== @@ -6573,61 +6140,64 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1: dependencies: once "^1.4.0" -engine.io-client@~6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-6.1.1.tgz#800d4b9db5487d169686729e5bd887afa78d36b0" - integrity sha512-V05mmDo4gjimYW+FGujoGmmmxRaDsrVr7AXA3ZIfa04MWM1jOfZfUwou0oNqhNwy/votUDvGDt4JA4QF4e0b4g== +engine.io-client@~6.6.1: + version "6.6.3" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-6.6.3.tgz#815393fa24f30b8e6afa8f77ccca2f28146be6de" + integrity sha512-T0iLjnyNWahNyv/lcjS2y4oE358tVS/SYQNxYXGAJ9/GLgH4VCvOQ/mhTjqU88mLZCQgiG8RIegFHYCdVC+j5w== dependencies: - "@socket.io/component-emitter" "~3.0.0" + "@socket.io/component-emitter" "~3.1.0" debug "~4.3.1" - engine.io-parser "~5.0.0" - has-cors "1.1.0" - parseqs "0.0.6" - parseuri "0.0.6" - ws "~8.2.3" - xmlhttprequest-ssl "~2.0.0" - yeast "0.1.2" - -engine.io-parser@~5.0.0, engine.io-parser@~5.0.3: - version "5.0.4" - resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.0.4.tgz#0b13f704fa9271b3ec4f33112410d8f3f41d0fc0" - integrity sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg== + engine.io-parser "~5.2.1" + ws "~8.17.1" + xmlhttprequest-ssl "~2.1.1" -engine.io@~6.1.0: - version "6.1.3" - resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.1.3.tgz#f156293d011d99a3df5691ac29d63737c3302e6f" - integrity sha512-rqs60YwkvWTLLnfazqgZqLa/aKo+9cueVfEi/dZ8PyGyaf8TLOxj++4QMIgeG3Gn0AhrWiFXvghsoY9L9h25GA== +engine.io-parser@~5.2.1: + version "5.2.3" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.2.3.tgz#00dc5b97b1f233a23c9398d0209504cf5f94d92f" + integrity sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q== + +engine.io@~6.6.0: + version "6.6.4" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.6.4.tgz#0a89a3e6b6c1d4b0c2a2a637495e7c149ec8d8ee" + integrity sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g== dependencies: - "@types/cookie" "^0.4.1" "@types/cors" "^2.8.12" "@types/node" ">=10.0.0" accepts "~1.3.4" base64id "2.0.0" - cookie "~0.4.1" + cookie "~0.7.2" cors "~2.8.5" debug "~4.3.1" - engine.io-parser "~5.0.3" - ws "~8.2.3" + engine.io-parser "~5.2.1" + ws "~8.17.1" -enhanced-resolve@^5.9.3: - version "5.9.3" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz#44a342c012cbc473254af5cc6ae20ebd0aae5d88" - integrity sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow== +enhanced-resolve@^5.17.1: + version "5.18.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz#728ab082f8b7b6836de51f1637aab5d3b9568faf" + integrity sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" -enquirer@^2.3.5, enquirer@^2.3.6: +enquirer@^2.3.6: + version "2.4.1" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" + integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== + dependencies: + ansi-colors "^4.1.1" + strip-ansi "^6.0.1" + +enquirer@~2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== dependencies: ansi-colors "^4.1.1" -ent@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" - integrity sha1-6WQhkyWiHQX0RGai9obtbOX13R0= +entities@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== entities@~2.1.0: version "2.1.0" @@ -6639,15 +6209,15 @@ env-paths@^2.2.0, env-paths@^2.2.1: resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== -envinfo@^7.3.1, envinfo@^7.7.3: +envinfo@7.8.1: version "7.8.1" resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== -err-code@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/err-code/-/err-code-1.1.2.tgz#06e0116d3028f6aef4806849eb0ea6a748ae6960" - integrity sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA= +envinfo@^7.7.3: + version "7.14.0" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.14.0.tgz#26dac5db54418f2a4c1159153a0b2ae980838aae" + integrity sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg== err-code@^2.0.2: version "2.0.3" @@ -6661,172 +6231,246 @@ errno@^0.1.1: dependencies: prr "~1.0.1" -error-ex@^1.2.0, error-ex@^1.3.1: +error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" -error-symbol@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/error-symbol/-/error-symbol-0.1.0.tgz#0a4dae37d600d15a29ba453d8ef920f1844333f6" - integrity sha1-Ck2uN9YA0VopukU9jvkg8YRDM/Y= - -es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.2, es-abstract@^1.19.5, es-abstract@^1.20.0: - version "1.20.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.1.tgz#027292cd6ef44bd12b1913b828116f54787d1814" - integrity sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA== - dependencies: - call-bind "^1.0.2" - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - function.prototype.name "^1.1.5" - get-intrinsic "^1.1.1" - get-symbol-description "^1.0.0" - has "^1.0.3" - has-property-descriptors "^1.0.0" - has-symbols "^1.0.3" - internal-slot "^1.0.3" - is-callable "^1.2.4" - is-negative-zero "^2.0.2" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" - is-string "^1.0.7" - is-weakref "^1.0.2" - object-inspect "^1.12.0" +es-abstract@^1.17.5, es-abstract@^1.23.2, es-abstract@^1.23.3, es-abstract@^1.23.5, es-abstract@^1.23.6, es-abstract@^1.23.9: + version "1.23.9" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.9.tgz#5b45994b7de78dada5c1bebf1379646b32b9d606" + integrity sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA== + dependencies: + array-buffer-byte-length "^1.0.2" + arraybuffer.prototype.slice "^1.0.4" + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" + call-bound "^1.0.3" + data-view-buffer "^1.0.2" + data-view-byte-length "^1.0.2" + data-view-byte-offset "^1.0.1" + es-define-property "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-set-tostringtag "^2.1.0" + es-to-primitive "^1.3.0" + function.prototype.name "^1.1.8" + get-intrinsic "^1.2.7" + get-proto "^1.0.0" + get-symbol-description "^1.1.0" + globalthis "^1.0.4" + gopd "^1.2.0" + has-property-descriptors "^1.0.2" + has-proto "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + internal-slot "^1.1.0" + is-array-buffer "^3.0.5" + is-callable "^1.2.7" + is-data-view "^1.0.2" + is-regex "^1.2.1" + is-shared-array-buffer "^1.0.4" + is-string "^1.1.1" + is-typed-array "^1.1.15" + is-weakref "^1.1.0" + math-intrinsics "^1.1.0" + object-inspect "^1.13.3" object-keys "^1.1.1" - object.assign "^4.1.2" - regexp.prototype.flags "^1.4.3" - string.prototype.trimend "^1.0.5" - string.prototype.trimstart "^1.0.5" - unbox-primitive "^1.0.2" + object.assign "^4.1.7" + own-keys "^1.0.1" + regexp.prototype.flags "^1.5.3" + safe-array-concat "^1.1.3" + safe-push-apply "^1.0.0" + safe-regex-test "^1.1.0" + set-proto "^1.0.0" + string.prototype.trim "^1.2.10" + string.prototype.trimend "^1.0.9" + string.prototype.trimstart "^1.0.8" + typed-array-buffer "^1.0.3" + typed-array-byte-length "^1.0.3" + typed-array-byte-offset "^1.0.4" + typed-array-length "^1.0.7" + unbox-primitive "^1.1.0" + which-typed-array "^1.1.18" + +es-define-property@^1.0.0, es-define-property@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== -es-get-iterator@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.2.tgz#9234c54aba713486d7ebde0220864af5e2b283f7" - integrity sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ== +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-get-iterator@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6" + integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== dependencies: call-bind "^1.0.2" - get-intrinsic "^1.1.0" - has-symbols "^1.0.1" - is-arguments "^1.1.0" + get-intrinsic "^1.1.3" + has-symbols "^1.0.3" + is-arguments "^1.1.1" is-map "^2.0.2" is-set "^2.0.2" - is-string "^1.0.5" + is-string "^1.0.7" isarray "^2.0.5" + stop-iteration-iterator "^1.0.0" -es-module-lexer@^0.9.0: - version "0.9.3" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" - integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== +es-iterator-helpers@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz#d1dd0f58129054c0ad922e6a9a1e65eef435fe75" + integrity sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + es-abstract "^1.23.6" + es-errors "^1.3.0" + es-set-tostringtag "^2.0.3" + function-bind "^1.1.2" + get-intrinsic "^1.2.6" + globalthis "^1.0.4" + gopd "^1.2.0" + has-property-descriptors "^1.0.2" + has-proto "^1.2.0" + has-symbols "^1.1.0" + internal-slot "^1.1.0" + iterator.prototype "^1.1.4" + safe-array-concat "^1.1.3" + +es-module-lexer@^1.2.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.6.0.tgz#da49f587fd9e68ee2404fe4e256c0c7d3a81be21" + integrity sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ== -es-shim-unscopables@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" - integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== +es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" + integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== dependencies: - has "^1.0.3" + es-errors "^1.3.0" -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== +es-set-tostringtag@^2.0.3, es-set-tostringtag@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" + integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== + dependencies: + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + has-tostringtag "^1.0.2" + hasown "^2.0.2" + +es-shim-unscopables@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz#438df35520dac5d105f3943d927549ea3b00f4b5" + integrity sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw== + dependencies: + hasown "^2.0.2" + +es-to-primitive@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.3.0.tgz#96c89c82cc49fd8794a24835ba3e1ff87f214e18" + integrity sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g== dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" + is-callable "^1.2.7" + is-date-object "^1.0.5" + is-symbol "^1.0.4" es6-error@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== -es6-promise@^4.0.3, es6-promise@^4.2.4, es6-promise@^4.2.8: +es6-promise@^4.2.4, es6-promise@^4.2.8: version "4.2.8" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== -es6-promisify@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" - integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM= - dependencies: - es6-promise "^4.0.3" - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== +escalade@^3.1.1, escalade@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== escape-html@^1.0.3, escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= - -escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== -escape-string-regexp@^4.0.0: +escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -escodegen@^1.9.1: - version "1.14.3" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" - integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== +escape-string-regexp@5.0.0, escape-string-regexp@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" + integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== + +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escodegen@^2.0.0, escodegen@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" + integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== dependencies: esprima "^4.0.1" - estraverse "^4.2.0" + estraverse "^5.2.0" esutils "^2.0.2" - optionator "^0.8.1" optionalDependencies: source-map "~0.6.1" -eslint-config-prettier@^8.3.0: - version "8.5.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz#5a81680ec934beca02c7b1a61cf8ca34b66feab1" - integrity sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q== +eslint-config-prettier@^8.8.0: + version "8.10.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz#3a06a662130807e2502fc3ff8b4143d8a0658e11" + integrity sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg== -eslint-plugin-prettier@^3.4.0: - version "3.4.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz#e9ddb200efb6f3d05ffe83b1665a716af4a387e5" - integrity sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g== +eslint-plugin-prettier@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz#651cbb88b1dab98bfd42f017a12fa6b2d993f94b" + integrity sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ== dependencies: prettier-linter-helpers "^1.0.0" -eslint-plugin-react-hooks@^4.2.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.5.0.tgz#5f762dfedf8b2cf431c689f533c9d3fa5dcf25ad" - integrity sha512-8k1gRt7D7h03kd+SAAlzXkQwWK22BnK6GKZG+FJA6BAGy22CFvl8kCIXKpVux0cCxMWDQUPqSok0LKaZ0aOcCw== - -eslint-plugin-react@^7.24.0: - version "7.30.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.30.0.tgz#8e7b1b2934b8426ac067a0febade1b13bd7064e3" - integrity sha512-RgwH7hjW48BleKsYyHK5vUAvxtE9SMPDKmcPRQgtRCYaZA0XQPt5FSkrU3nhz5ifzMZcA8opwmRJ2cmOO8tr5A== - dependencies: - array-includes "^3.1.5" - array.prototype.flatmap "^1.3.0" +eslint-plugin-react-hooks@^4.6.0: + version "4.6.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz#c829eb06c0e6f484b3fbb85a97e57784f328c596" + integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ== + +eslint-plugin-react@^7.32.2: + version "7.37.4" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.37.4.tgz#1b6c80b6175b6ae4b26055ae4d55d04c414c7181" + integrity sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ== + dependencies: + array-includes "^3.1.8" + array.prototype.findlast "^1.2.5" + array.prototype.flatmap "^1.3.3" + array.prototype.tosorted "^1.1.4" doctrine "^2.1.0" + es-iterator-helpers "^1.2.1" estraverse "^5.3.0" + hasown "^2.0.2" jsx-ast-utils "^2.4.1 || ^3.0.0" minimatch "^3.1.2" - object.entries "^1.1.5" - object.fromentries "^2.0.5" - object.hasown "^1.1.1" - object.values "^1.1.5" + object.entries "^1.1.8" + object.fromentries "^2.0.8" + object.values "^1.2.1" prop-types "^15.8.1" - resolve "^2.0.0-next.3" - semver "^6.3.0" - string.prototype.matchall "^4.0.7" + resolve "^2.0.0-next.5" + semver "^6.3.1" + string.prototype.matchall "^4.0.12" + string.prototype.repeat "^1.0.0" -eslint-plugin-unused-imports@^1.1.1: - version "1.1.5" - resolved "https://registry.yarnpkg.com/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-1.1.5.tgz#a2b992ef0faf6c6c75c3815cc47bde76739513c2" - integrity sha512-TeV8l8zkLQrq9LBeYFCQmYVIXMjfHgdRQLw7dEZp4ZB3PeR10Y5Uif11heCsHRmhdRIYMoewr1d9ouUHLbLHew== +eslint-plugin-unused-imports@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-2.0.0.tgz#d8db8c4d0cfa0637a8b51ce3fd7d1b6bc3f08520" + integrity sha512-3APeS/tQlTrFa167ThtP0Zm0vctjr4M44HMpeg1P4bK6wItarumq0Ma82xorMKdFsWpphQBlRPzw/pxiVELX1A== dependencies: eslint-rule-composer "^0.3.0" @@ -6843,84 +6487,71 @@ eslint-scope@5.1.1, eslint-scope@^5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-utils@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" - integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== - dependencies: - eslint-visitor-keys "^1.1.0" - -eslint-utils@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" - integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== dependencies: - eslint-visitor-keys "^2.0.0" - -eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" - integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== - -eslint-visitor-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" - integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + esrecurse "^4.3.0" + estraverse "^5.2.0" -eslint@^7.28.0: - version "7.32.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" - integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== - dependencies: - "@babel/code-frame" "7.12.11" - "@eslint/eslintrc" "^0.4.3" - "@humanwhocodes/config-array" "^0.5.0" - ajv "^6.10.0" +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint@^8.39.0: + version "8.57.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.1.tgz#7df109654aba7e3bbe5c8eae533c5e461d3c6ca9" + integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.4" + "@eslint/js" "8.57.1" + "@humanwhocodes/config-array" "^0.13.0" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + "@ungap/structured-clone" "^1.2.0" + ajv "^6.12.4" chalk "^4.0.0" cross-spawn "^7.0.2" - debug "^4.0.1" + debug "^4.3.2" doctrine "^3.0.0" - enquirer "^2.3.5" escape-string-regexp "^4.0.0" - eslint-scope "^5.1.1" - eslint-utils "^2.1.0" - eslint-visitor-keys "^2.0.0" - espree "^7.3.1" - esquery "^1.4.0" + eslint-scope "^7.2.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" + esquery "^1.4.2" esutils "^2.0.2" fast-deep-equal "^3.1.3" file-entry-cache "^6.0.1" - functional-red-black-tree "^1.0.1" - glob-parent "^5.1.2" - globals "^13.6.0" - ignore "^4.0.6" - import-fresh "^3.0.0" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + graphemer "^1.4.0" + ignore "^5.2.0" imurmurhash "^0.1.4" is-glob "^4.0.0" - js-yaml "^3.13.1" + is-path-inside "^3.0.3" + js-yaml "^4.1.0" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" lodash.merge "^4.6.2" - minimatch "^3.0.4" + minimatch "^3.1.2" natural-compare "^1.4.0" - optionator "^0.9.1" - progress "^2.0.0" - regexpp "^3.1.0" - semver "^7.2.1" - strip-ansi "^6.0.0" - strip-json-comments "^3.1.0" - table "^6.0.9" + optionator "^0.9.3" + strip-ansi "^6.0.1" text-table "^0.2.0" - v8-compile-cache "^2.0.3" -espree@^7.3.0, espree@^7.3.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" - integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== +espree@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== dependencies: - acorn "^7.4.0" - acorn-jsx "^5.3.1" - eslint-visitor-keys "^1.3.0" + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" @@ -6930,12 +6561,12 @@ esprima@^4.0.0, esprima@^4.0.1: esprima@~3.1.0: version "3.1.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" - integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= + integrity sha512-AWwVMNxwhN8+NIPQzAQZCm7RkLC4RbM3B1OobMuyp3i+w73X57KCKaVIxaRZb+DYCojq7rspo+fmuQfAboyhFg== -esquery@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" - integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== +esquery@^1.4.2: + version "1.6.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" + integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== dependencies: estraverse "^5.1.0" @@ -6946,7 +6577,7 @@ esrecurse@^4.3.0: dependencies: estraverse "^5.2.0" -estraverse@^4.1.1, estraverse@^4.2.0: +estraverse@^4.1.1: version "4.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== @@ -6964,12 +6595,12 @@ esutils@^2.0.2: etag@~1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== event-stream@=3.3.4: version "3.3.4" resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" - integrity sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE= + integrity sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g== dependencies: duplexer "~0.1.1" from "~0" @@ -6979,31 +6610,40 @@ event-stream@=3.3.4: stream-combiner "~0.0.4" through "~2.3.1" -eventemitter3@^3.1.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7" - integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q== +event-target-shim@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== + +eventemitter3@^4.0.0, eventemitter3@^4.0.4: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== -events@^3.2.0: +events@^3.2.0, events@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== -execa@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.2.2.tgz#e2ead472c2c31aad6f73f1ac956eef45e12320cb" - integrity sha1-4urUcsLDGq1vc/GslW7vReEjIMs= +execa@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.0.0.tgz#4029b0007998a841fbd1032e5f4de86a3c1e3376" + integrity sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ== dependencies: - cross-spawn-async "^2.1.1" - npm-run-path "^1.0.0" - object-assign "^4.0.1" - path-key "^1.0.0" - strip-eof "^1.0.0" + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" execa@^0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/execa/-/execa-0.5.1.tgz#de3fb85cb8d6e91c85bcbceb164581785cb57b36" - integrity sha1-3j+4XLjW6RyFvLzrFkWBeFy1ezY= + integrity sha512-R66dW/hW3I8yV77Wg4xn6zMguRPUgt59VLm5e85NrOF05ZdPn7YOfPBSw0E9epJDvuzwVWEG+HmEaQ4muYuWKQ== dependencies: cross-spawn "^4.0.0" get-stream "^2.2.0" @@ -7013,18 +6653,35 @@ execa@^0.5.0: signal-exit "^3.0.0" strip-eof "^1.0.0" -execa@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" - integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== +execa@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-2.1.0.tgz#e5d3ecd837d2a60ec50f3da78fd39767747bbe99" + integrity sha512-Y/URAVapfbYy2Xp/gb6A0E7iR8xeqOCXsuuaoMn7A5PzrXUK84E1gyiEfq0wQd/GHA6GsoHWwhNq8anb0mleIw== dependencies: - cross-spawn "^6.0.0" - get-stream "^4.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" + cross-spawn "^7.0.0" + get-stream "^5.0.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^3.0.0" + onetime "^5.1.0" + p-finally "^2.0.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + +execa@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" + integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" execa@^5.0.0, execa@^5.1.1: version "5.1.1" @@ -7041,55 +6698,62 @@ execa@^5.0.0, execa@^5.1.1: signal-exit "^3.0.3" strip-final-newline "^2.0.0" -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= +execa@^7.1.1: + version "7.2.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-7.2.0.tgz#657e75ba984f42a70f38928cedc87d6f2d4fe4e9" + integrity sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA== dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" + cross-spawn "^7.0.3" + get-stream "^6.0.1" + human-signals "^4.3.0" + is-stream "^3.0.0" + merge-stream "^2.0.0" + npm-run-path "^5.1.0" + onetime "^6.0.0" + signal-exit "^3.0.7" + strip-final-newline "^3.0.0" expand-template@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== -express@^4.16.3: - version "4.18.1" - resolved "https://registry.yarnpkg.com/express/-/express-4.18.1.tgz#7797de8b9c72c857b9cd0e14a5eea80666267caf" - integrity sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q== +exponential-backoff@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.2.tgz#a8f26adb96bf78e8cd8ad1037928d5e5c0679d91" + integrity sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA== + +express@^4.21.0: + version "4.21.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.21.2.tgz#cf250e48362174ead6cea4a566abef0162c1ec32" + integrity sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA== dependencies: accepts "~1.3.8" array-flatten "1.1.1" - body-parser "1.20.0" + body-parser "1.20.3" content-disposition "0.5.4" content-type "~1.0.4" - cookie "0.5.0" + cookie "0.7.1" cookie-signature "1.0.6" debug "2.6.9" depd "2.0.0" - encodeurl "~1.0.2" + encodeurl "~2.0.0" escape-html "~1.0.3" etag "~1.8.1" - finalhandler "1.2.0" + finalhandler "1.3.1" fresh "0.5.2" http-errors "2.0.0" - merge-descriptors "1.0.1" + merge-descriptors "1.0.3" methods "~1.1.2" on-finished "2.4.1" parseurl "~1.3.3" - path-to-regexp "0.1.7" + path-to-regexp "0.1.12" proxy-addr "~2.0.7" - qs "6.10.3" + qs "6.13.0" range-parser "~1.2.1" safe-buffer "5.2.1" - send "0.18.0" - serve-static "1.15.0" + send "0.19.0" + serve-static "1.16.2" setprototypeof "1.2.0" statuses "2.0.1" type-is "~1.6.18" @@ -7111,22 +6775,7 @@ ext-name@^5.0.0: ext-list "^2.0.0" sort-keys-length "^1.0.0" -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - -extend@^3.0.0, extend@^3.0.2, extend@~3.0.2: +extend@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== @@ -7140,128 +6789,104 @@ external-editor@^3.0.3: iconv-lite "^0.4.24" tmp "^0.0.33" -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -extract-zip@^1.0.3, extract-zip@^1.6.6: - version "1.7.0" - resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.7.0.tgz#556cc3ae9df7f452c493a0cfb51cc30277940927" - integrity sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA== +extract-zip@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" + integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== dependencies: - concat-stream "^1.6.2" - debug "^2.6.9" - mkdirp "^0.5.4" + debug "^4.1.1" + get-stream "^5.1.0" yauzl "^2.10.0" - -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + optionalDependencies: + "@types/yauzl" "^2.9.1" extsprintf@^1.2.0: version "1.4.1" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== -"falsey@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/falsey/-/falsey-0.3.2.tgz#b21c90c5c34660fc192bf909575db95b6880d597" - integrity sha512-lxEuefF5MBIVDmE6XeqCdM4BWk1+vYmGZtkbKZ/VFcg6uBBw6fXNEbWmxCjDdQlFc9hy450nkiWwM3VAW6G1qg== - dependencies: - kind-of "^5.0.2" - fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-diff@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" - integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== + version "1.3.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" + integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== -fast-glob@^2.2.6: - version "2.2.7" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" - integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw== - dependencies: - "@mrmlnc/readdir-enhanced" "^2.2.1" - "@nodelib/fs.stat" "^1.1.2" - glob-parent "^3.1.0" - is-glob "^4.0.0" - merge2 "^1.2.3" - micromatch "^3.1.10" +fast-fifo@^1.2.0, fast-fifo@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c" + integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ== fast-glob@^3.2.5, fast-glob@^3.2.9: - version "3.2.11" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" - integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== + version "3.3.3" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" + integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" glob-parent "^5.1.2" merge2 "^1.3.0" - micromatch "^4.0.4" + micromatch "^4.0.8" -fast-json-stable-stringify@^2.0.0: +fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: +fast-levenshtein@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fast-plist@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/fast-plist/-/fast-plist-0.1.2.tgz#a45aff345196006d406ca6cdcd05f69051ef35b8" - integrity sha1-pFr/NFGWAG1AbKbNzQX2kFHvNbg= + version "0.1.3" + resolved "https://registry.yarnpkg.com/fast-plist/-/fast-plist-0.1.3.tgz#328cd9335e93a2479ac90814a1302437574ea925" + integrity sha512-d9cEfo/WcOezgPLAC/8t8wGb6YOD6JTCPMw2QcG2nAdFmyY+9rTUizCTaGjIZAloWENTEUMAPpkUAIJJJ0i96A== -fast-safe-stringify@^2.0.7, fast-safe-stringify@^2.1.1: +fast-safe-stringify@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== +fast-uri@^3.0.1: + version "3.0.6" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.6.tgz#88f130b77cfaea2378d56bf970dea21257a68748" + integrity sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw== + fastest-levenshtein@^1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2" - integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow== + version "1.0.16" + resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" + integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== fastq@^1.6.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" - integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + version "1.19.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.19.1.tgz#d50eaba803c8846a883c16492821ebcd2cda55f5" + integrity sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ== dependencies: reusify "^1.0.4" fd-slicer@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" - integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4= + integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== dependencies: pend "~1.2.0" -figgy-pudding@^3.4.1, figgy-pudding@^3.5.1: - version "3.5.2" - resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" - integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== +fetch-blob@^3.1.2, fetch-blob@^3.1.4: + version "3.2.0" + resolved "https://registry.yarnpkg.com/fetch-blob/-/fetch-blob-3.2.0.tgz#f09b8d4bbd45adc6f0c20b7e787e793e309dcce9" + integrity sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ== + dependencies: + node-domexception "^1.0.0" + web-streams-polyfill "^3.0.3" -figures@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= +figures@3.2.0, figures@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== dependencies: escape-string-regexp "^1.0.5" @@ -7277,49 +6902,51 @@ file-icons-js@~1.0.3: resolved "https://registry.yarnpkg.com/file-icons-js/-/file-icons-js-1.0.3.tgz#d0765dc1d86aba4b2d7664a39e4ef7af9f12c5af" integrity sha512-n4zoKEpMaAxBTUB7wtgrFBa4dM3b7mBLLA1VI/Q5Cdk/k2UA8S8oaxvnECp3QOzg0Dn+KKRzfIHF7qSdRkA65Q== +file-type@^18.5.0: + version "18.7.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-18.7.0.tgz#cddb16f184d6b94106cfc4bb56978726b25cb2a2" + integrity sha512-ihHtXRzXEziMrQ56VSgU7wkxh55iNchFkosu7Y9/S+tXHdKyrGjVK0ujbqNnsxzea+78MaLhN6PGmfYSAv1ACw== + dependencies: + readable-web-to-node-stream "^3.0.2" + strtok3 "^7.0.0" + token-types "^5.0.1" + file-type@^3.8.0: version "3.9.0" resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9" - integrity sha1-JXoHg4TR24CHvESdEH1SpSZyuek= - -file-type@^4.2.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-4.4.0.tgz#1b600e5fca1fbdc6e80c0a70c71c8dba5f7906c5" - integrity sha1-G2AOX8ofvcboDApwxxyNul95BsU= + integrity sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA== file-type@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/file-type/-/file-type-5.2.0.tgz#2ddbea7c73ffe36368dfae49dc338c058c2b8ad6" - integrity sha1-LdvqfHP/42No365J3DOMBYwritY= + integrity sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ== file-type@^6.1.0: version "6.2.0" resolved "https://registry.yarnpkg.com/file-type/-/file-type-6.2.0.tgz#e50cd75d356ffed4e306dc4f5bcf52a79903a919" integrity sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg== -file-type@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-8.1.0.tgz#244f3b7ef641bbe0cca196c7276e4b332399f68c" - integrity sha512-qyQ0pzAy78gVoJsmYeNgl8uH8yKhr1lVhW7JbzJmnlRi0I4R2eEDEJZVKG8agpDnLpacwNbDhLNG/LMdxHD2YQ== - file-uri-to-path@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== +filelist@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" + integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== + dependencies: + minimatch "^5.0.1" + filename-reserved-regex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz#abf73dfab735d045440abfea2d91f389ebbfa229" - integrity sha1-q/c9+rc10EVECr/qLZHzieu/oik= + integrity sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ== -filenamify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-2.1.0.tgz#88faf495fb1b47abfd612300002a16228c677ee9" - integrity sha512-ICw7NTT6RsDp2rnYKVd8Fu4cr6ITzGy3+u4vUujPkabyaz+03F24NWEX7fs5fp+kBonlaqPH8fAO2NM+SXt/JA== - dependencies: - filename-reserved-regex "^2.0.0" - strip-outer "^1.0.0" - trim-repeated "^1.0.0" +filename-reserved-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-3.0.0.tgz#3d5dd6d4e2d73a3fed2ebc4cd0b3448869a081f7" + integrity sha512-hn4cQfU6GOT/7cFHXBqeBg2TbrMBgdD0kcjLhvSQYYwm3s4B6cjvBfb7nBALJLAXqmU5xajSa7X2NnUud/VCdw== filenamify@^4.1.0: version "4.3.0" @@ -7330,35 +6957,34 @@ filenamify@^4.1.0: strip-outer "^1.0.1" trim-repeated "^1.0.0" -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= +filenamify@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-5.1.1.tgz#a1ccc5ae678a5e34f578afcb9b72898264d166d2" + integrity sha512-M45CbrJLGACfrPOkrTp3j2EcO9OBkKUYME0eiqOCa7i2poaklU0jhlIaMlr8ijLorT0uLAzrn3qXOp5684CkfA== dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" + filename-reserved-regex "^3.0.0" + strip-outer "^2.0.0" + trim-repeated "^2.0.0" -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== dependencies: to-regex-range "^5.0.1" filter-obj@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b" - integrity sha1-mzERErxsYSehbgFsbF1/GeCAXFs= + integrity sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ== -finalhandler@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" - integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== +finalhandler@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.1.tgz#0c575f1d1d324ddd1da35ad7ece3df7d19088019" + integrity sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ== dependencies: debug "2.6.9" - encodeurl "~1.0.2" + encodeurl "~2.0.0" escape-html "~1.0.3" on-finished "2.4.1" parseurl "~1.3.3" @@ -7379,28 +7005,20 @@ find-root@^1.1.0: resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== -find-up@3.0.0, find-up@^3.0.0: +find-up@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== + dependencies: + locate-path "^2.0.0" + +find-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== dependencies: locate-path "^3.0.0" -find-up@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" - integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= - dependencies: - path-exists "^2.0.0" - pinkie-promise "^2.0.0" - -find-up@^2.0.0, find-up@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= - dependencies: - locate-path "^2.0.0" - find-up@^4.0.0, find-up@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" @@ -7409,6 +7027,21 @@ find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +find-yarn-workspace-root@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz#f47fb8d239c900eb78179aa81b66673eac88f7bd" + integrity sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ== + dependencies: + micromatch "^4.0.2" + fix-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/fix-path/-/fix-path-3.0.0.tgz#c6b82fd5f5928e520b392a63565ebfef0ddf037e" @@ -7417,140 +7050,110 @@ fix-path@^3.0.0: shell-path "^2.1.0" flat-cache@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" - integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + version "3.2.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" + integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== dependencies: - flatted "^3.1.0" + flatted "^3.2.9" + keyv "^4.5.3" rimraf "^3.0.2" -flat@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.1.tgz#a392059cc382881ff98642f5da4dde0a959f309b" - integrity sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA== - dependencies: - is-buffer "~2.0.3" - -flatted@^3.1.0: - version "3.2.5" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.5.tgz#76c8584f4fc843db64702a6bd04ab7a8bd666da3" - integrity sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg== - -flush-write-stream@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" - integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== - dependencies: - inherits "^2.0.3" - readable-stream "^2.3.6" +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== -follow-redirects@^1.14.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.0.tgz#06441868281c86d0dda4ad8bdaead2d02dca89d4" - integrity sha512-aExlJShTV4qOUOL7yF1U5tvLCB0xQuudbf6toyYA0E/acBNw71mvjFTnLaRp50aQaYocMR0a/RMMBIHeZnGyjQ== +flatted@^3.2.9: + version "3.3.3" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.3.tgz#67c8fad95454a7c7abebf74bb78ee74a44023358" + integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== + +follow-redirects@^1.0.0, follow-redirects@^1.15.6: + version "1.15.9" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" + integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== font-awesome@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/font-awesome/-/font-awesome-4.7.0.tgz#8fa8cf0411a1a31afd07b06d2902bb9fc815a133" - integrity sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM= + integrity sha512-U6kGnykA/6bFmg1M/oT9EkFeIYv7JlX3bozwQJWiiLz6L0w3F5vBVPxHlwyX/vtNq1ckcpRKOB9f2Qal/VtFpg== -for-each@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== +for-each@^0.3.3, for-each@^0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.5.tgz#d650688027826920feeb0af747ee7b9421a41d47" + integrity sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg== dependencies: - is-callable "^1.1.3" + is-callable "^1.2.7" -for-in@^1.0.1, for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= - -for-own@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" - integrity sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs= +foreground-child@^3.1.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.1.tgz#32e8e9ed1b68a3497befb9ac2b6adf92a638576f" + integrity sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw== dependencies: - for-in "^1.0.1" + cross-spawn "^7.0.6" + signal-exit "^4.0.1" -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= - -form-data@^2.5.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.1.tgz#f2cbec57b5e59e23716e128fe44d4e5dd23895f4" - integrity sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" +form-data-encoder@^2.1.2: + version "2.1.4" + resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-2.1.4.tgz#261ea35d2a70d48d30ec7a9603130fa5515e9cd5" + integrity sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw== -form-data@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" - integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== +form-data@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.2.tgz#35cabbdd30c3ce73deb2c42d3c8d3ed9ca51794c" + integrity sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w== dependencies: asynckit "^0.4.0" combined-stream "^1.0.8" + es-set-tostringtag "^2.1.0" mime-types "^2.1.12" -form-data@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" - integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== +formdata-polyfill@^4.0.10: + version "4.0.10" + resolved "https://registry.yarnpkg.com/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz#24807c31c9d402e002ab3d8c720144ceb8848423" + integrity sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g== dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" + fetch-blob "^3.1.2" -formidable@^1.2.2: - version "1.2.6" - resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.2.6.tgz#d2a51d60162bbc9b4a055d8457a7c75315d1a168" - integrity sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ== +formidable@^2.0.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/formidable/-/formidable-2.1.2.tgz#fa973a2bec150e4ce7cac15589d7a25fc30ebd89" + integrity sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g== + dependencies: + dezalgo "^1.0.4" + hexoid "^1.0.0" + once "^1.4.0" + qs "^6.11.0" forwarded@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= +fqbn@^1.0.5: + version "1.3.0" + resolved "https://registry.yarnpkg.com/fqbn/-/fqbn-1.3.0.tgz#1d1b21c721db6cd882d6dccbd7ec6332a001f3f1" + integrity sha512-h+egsORZNuWZvsgn7nPkBTuo6isy9TRrfWSmn/6ywNsgLoIuR7FrOVNMWBwCLjBI0b6FV52VkWY4CIZcQpUJZA== dependencies: - map-cache "^0.2.2" + clone "^2.1.2" + deep-equal "^2.2.3" fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= - -from2@^2.1.0, from2@^2.1.1: - version "2.3.0" - resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" - integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= - dependencies: - inherits "^2.0.1" - readable-stream "^2.0.0" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== from@~0: version "0.1.7" resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" - integrity sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4= + integrity sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g== fs-constants@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== -fs-exists-sync@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add" - integrity sha1-mC1ok6+RjnLQjeyehnP/K1qNat0= - -fs-extra@^10.0.0: +fs-extra@^10.0.0, fs-extra@^10.1.0: version "10.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== @@ -7559,6 +7162,15 @@ fs-extra@^10.0.0: jsonfile "^6.0.1" universalify "^2.0.0" +fs-extra@^11.1.0, fs-extra@^11.1.1: + version "11.3.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.3.0.tgz#0daced136bbaf65a555a326719af931adc7a314d" + integrity sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs-extra@^4.0.2: version "4.0.3" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" @@ -7577,12 +7189,15 @@ fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" -fs-minipass@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" - integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== +fs-extra@^9.0.0, fs-extra@^9.0.1: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== dependencies: - minipass "^2.6.0" + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" fs-minipass@^2.0.0, fs-minipass@^2.1.0: version "2.1.0" @@ -7591,25 +7206,22 @@ fs-minipass@^2.0.0, fs-minipass@^2.1.0: dependencies: minipass "^3.0.0" -fs-write-stream-atomic@^1.0.8: - version "1.0.10" - resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" - integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= +fs-minipass@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-3.0.3.tgz#79a85981c4dc120065e96f62086bf6f9dc26cc54" + integrity sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw== dependencies: - graceful-fs "^4.1.2" - iferr "^0.1.5" - imurmurhash "^0.1.4" - readable-stream "1 || 2" + minipass "^7.0.3" fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@~2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" - integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== fstream@^1.0.12: version "1.0.12" @@ -7621,27 +7233,24 @@ fstream@^1.0.12: mkdirp ">=0.5 0" rimraf "2" -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== -function.prototype.name@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" - integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== +function.prototype.name@^1.1.6, function.prototype.name@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.8.tgz#e68e1df7b259a5c949eeef95cdbde53edffabb78" + integrity sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.0" - functions-have-names "^1.2.2" - -functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + functions-have-names "^1.2.3" + hasown "^2.0.2" + is-callable "^1.2.7" -functions-have-names@^1.2.2: +functions-have-names@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== @@ -7649,7 +7258,7 @@ functions-have-names@^1.2.2: fuzzy@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/fuzzy/-/fuzzy-0.1.3.tgz#4c76ec2ff0ac1a36a9dccf9a00df8623078d4ed8" - integrity sha1-THbsL/CsGjap3M+aAN+GIweNTtg= + integrity sha512-/gZffu4ykarLrCiP3Ygsa86UAo1E5vEVlvTrpkKywXSbP9Xhln3oSp9QSV57gEq3JFFpGJ4GZ+5zdEp3FcUh4w== gauge@^3.0.0: version "3.0.2" @@ -7683,7 +7292,7 @@ gauge@^4.0.3: gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= + integrity sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg== dependencies: aproba "^1.0.3" console-control-strings "^1.0.0" @@ -7694,225 +7303,195 @@ gauge@~2.7.3: strip-ansi "^3.0.1" wide-align "^1.1.0" -genfun@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/genfun/-/genfun-5.0.0.tgz#9dd9710a06900a5c4a5bf57aca5da4e52fe76537" - integrity sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA== - gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== -get-caller-file@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" - integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== - get-caller-file@^2.0.1, get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-func-name@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" - integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= - -get-intrinsic@^1.0.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.2.tgz#336975123e05ad0b7ba41f152ee4aadbea6cf598" - integrity sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.3" - -get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" - integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" +get-func-name@^2.0.1, get-func-name@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" + integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== -get-object@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/get-object/-/get-object-0.2.0.tgz#d92ff7d5190c64530cda0543dac63a3d47fe8c0c" - integrity sha1-2S/31RkMZFMM2gVD2sY6PUf+jAw= - dependencies: - is-number "^2.0.2" - isobject "^0.2.0" +get-intrinsic@^1.1.3, get-intrinsic@^1.2.2, get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.2.7, get-intrinsic@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" + integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== + dependencies: + call-bind-apply-helpers "^1.0.2" + es-define-property "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.1.1" + function-bind "^1.1.2" + get-proto "^1.0.1" + gopd "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + math-intrinsics "^1.1.0" get-own-enumerable-property-symbols@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== -get-pkg-repo@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz#c73b489c06d80cc5536c2c853f9e05232056972d" - integrity sha1-xztInAbYDMVTbCyFP54FIyBWly0= +get-pkg-repo@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/get-pkg-repo/-/get-pkg-repo-4.2.1.tgz#75973e1c8050c73f48190c52047c4cee3acbf385" + integrity sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA== dependencies: - hosted-git-info "^2.1.4" - meow "^3.3.0" - normalize-package-data "^2.3.0" - parse-github-repo-url "^1.3.0" + "@hutson/parse-repository-url" "^3.0.0" + hosted-git-info "^4.0.0" through2 "^2.0.0" + yargs "^16.2.0" -get-port@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/get-port/-/get-port-4.2.0.tgz#e37368b1e863b7629c43c5a323625f95cf24b119" - integrity sha512-/b3jarXkH8KJoOMQc3uVGHASwGLPq3gSFJ7tgJm2diza+bydJPTGOibin2steecKeOylE8oY2JERlVWkAJO6yw== +get-port@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/get-port/-/get-port-5.1.1.tgz#0469ed07563479de6efb986baf053dcd7d4e3193" + integrity sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ== -get-proxy@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/get-proxy/-/get-proxy-2.1.0.tgz#349f2b4d91d44c4d4d4e9cba2ad90143fac5ef93" - integrity sha512-zmZIaQTWnNQb4R4fJUEp/FC51eZsc6EkErspy3xtIYStaq8EB/hDIWipxsal+E8rz0qD7f2sL/NA9Xee4RInJw== +get-proto@^1.0.0, get-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" + integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== dependencies: - npm-conf "^1.1.0" + dunder-proto "^1.0.1" + es-object-atoms "^1.0.0" -get-stdin@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" - integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= - -get-stream@3.0.0, get-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" - integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= +get-stream@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.0.tgz#3e0012cb6827319da2706e601a1583e8629a6718" + integrity sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg== get-stream@^2.2.0: version "2.3.1" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-2.3.1.tgz#5f38f93f346009666ee0150a054167f91bdd95de" - integrity sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4= + integrity sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA== dependencies: object-assign "^4.0.1" pinkie-promise "^2.0.0" -get-stream@^4.0.0, get-stream@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" - -get-stream@^5.1.0: +get-stream@^5.0.0, get-stream@^5.1.0: version "5.2.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== dependencies: pump "^3.0.0" -get-stream@^6.0.0: +get-stream@^6.0.0, get-stream@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== -get-symbol-description@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" - integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== +get-symbol-description@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.1.0.tgz#7bdd54e0befe8ffc9f3b4e203220d9f1e881b6ee" + integrity sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" - -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + call-bound "^1.0.3" + es-errors "^1.3.0" + get-intrinsic "^1.2.6" -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= +get-uri@^6.0.1: + version "6.0.4" + resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-6.0.4.tgz#6daaee9e12f9759e19e55ba313956883ef50e0a7" + integrity sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ== dependencies: - assert-plus "^1.0.0" + basic-ftp "^5.0.2" + data-uri-to-buffer "^6.0.2" + debug "^4.3.4" -git-raw-commits@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.0.tgz#d92addf74440c14bcc5c83ecce3fb7f8a79118b5" - integrity sha512-w4jFEJFgKXMQJ0H0ikBk2S+4KP2VEjhCvLCNqbNRQC8BgGWgLKNCO7a9K9LI+TVT7Gfoloje502sEnctibffgg== +git-raw-commits@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-3.0.0.tgz#5432f053a9744f67e8db03dbc48add81252cfdeb" + integrity sha512-b5OHmZ3vAgGrDn/X0kS+9qCfNKWe4K/jFnhwzVWWg0/k5eLa3060tZShrRg8Dja5kPc+YjS0Gc6y7cRr44Lpjw== dependencies: - dargs "^4.0.1" - lodash.template "^4.0.2" - meow "^4.0.0" - split2 "^2.0.0" - through2 "^2.0.0" + dargs "^7.0.0" + meow "^8.1.2" + split2 "^3.2.2" git-remote-origin-url@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz#5282659dae2107145a11126112ad3216ec5fa65f" - integrity sha1-UoJlna4hBxRaERJhEq0yFuxfpl8= + integrity sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw== dependencies: gitconfiglocal "^1.0.0" pify "^2.3.0" -git-semver-tags@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/git-semver-tags/-/git-semver-tags-2.0.3.tgz#48988a718acf593800f99622a952a77c405bfa34" - integrity sha512-tj4FD4ww2RX2ae//jSrXZzrocla9db5h0V7ikPl1P/WwoZar9epdUhwR7XHXSgc+ZkNq72BEEerqQuicoEQfzA== +git-semver-tags@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/git-semver-tags/-/git-semver-tags-5.0.1.tgz#db748aa0e43d313bf38dcd68624d8443234e1c15" + integrity sha512-hIvOeZwRbQ+7YEUmCkHqo8FOLQZCEn18yevLHADlFPZY02KJGsu5FZt9YW/lybfK2uhWFI7Qg/07LekJiTv7iA== dependencies: - meow "^4.0.0" - semver "^6.0.0" + meow "^8.1.2" + semver "^7.0.0" -git-up@^4.0.0: - version "4.0.5" - resolved "https://registry.yarnpkg.com/git-up/-/git-up-4.0.5.tgz#e7bb70981a37ea2fb8fe049669800a1f9a01d759" - integrity sha512-YUvVDg/vX3d0syBsk/CKUTib0srcQME0JyHkL5BaYdwLsiCslPWmDSi8PUMo9pXYjrryMcmsCoCgsTpSCJEQaA== +git-up@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/git-up/-/git-up-7.0.0.tgz#bace30786e36f56ea341b6f69adfd83286337467" + integrity sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ== dependencies: - is-ssh "^1.3.0" - parse-url "^6.0.0" + is-ssh "^1.4.0" + parse-url "^8.1.0" -git-url-parse@^11.1.2: - version "11.6.0" - resolved "https://registry.yarnpkg.com/git-url-parse/-/git-url-parse-11.6.0.tgz#c634b8de7faa66498a2b88932df31702c67df605" - integrity sha512-WWUxvJs5HsyHL6L08wOusa/IXYtMuCAhrMmnTjQPpBU0TTHyDhnOATNH3xNQz7YOQUsqIIPTGr4xiVti1Hsk5g== +git-url-parse@13.1.0: + version "13.1.0" + resolved "https://registry.yarnpkg.com/git-url-parse/-/git-url-parse-13.1.0.tgz#07e136b5baa08d59fabdf0e33170de425adf07b4" + integrity sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA== dependencies: - git-up "^4.0.0" + git-up "^7.0.0" gitconfiglocal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz#41d045f3851a5ea88f03f24ca1c6178114464b9b" - integrity sha1-QdBF84UaXqiPA/JMocYXgRRGS5s= + integrity sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ== dependencies: ini "^1.3.2" github-from-package@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" - integrity sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4= - -glob-parent@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" - integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= - dependencies: - is-glob "^3.1.0" - path-dirname "^1.0.0" + integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== -glob-parent@^5.0.0, glob-parent@^5.1.1, glob-parent@^5.1.2, glob-parent@~5.1.0: +glob-parent@5.1.2, glob-parent@^5.1.1, glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" -glob-to-regexp@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" - integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" glob-to-regexp@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== -glob@7.1.3: - version "7.1.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" - integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== +glob@10.4.4: + version "10.4.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.4.tgz#d60943feb6f8140522117e6576a923b715718380" + integrity sha512-XsOKvHsu38Xe19ZQupE6N/HENeHQBA05o3hV8labZZT2zYDg1+emxWHnc/Bm9AcCMPXfD6jt+QC7zC5JSFyumw== + dependencies: + foreground-child "^3.1.0" + jackspeak "^3.1.2" + minimatch "^9.0.4" + minipass "^7.1.2" + package-json-from-dist "^1.0.0" + path-scurry "^1.11.1" + +glob@7.1.4: + version "7.1.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" + integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -7921,7 +7500,19 @@ glob@7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.0: +glob@^10.2.2, glob@^10.3.10, glob@^10.3.3, glob@^10.3.7: + version "10.4.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" + integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== + dependencies: + foreground-child "^3.1.0" + jackspeak "^3.1.2" + minimatch "^9.0.4" + minipass "^7.1.2" + package-json-from-dist "^1.0.0" + path-scurry "^1.11.1" + +glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.0, glob@^7.2.3: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -7933,10 +7524,10 @@ glob@^7.0.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, gl once "^1.3.0" path-is-absolute "^1.0.0" -glob@^8.0.1: - version "8.0.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-8.0.3.tgz#415c6eb2deed9e502c68fa44a272e6da6eeca42e" - integrity sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ== +glob@^8.0.1, glob@^8.0.3, glob@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -7944,6 +7535,16 @@ glob@^8.0.1: minimatch "^5.0.1" once "^1.3.0" +glob@^9.2.0: + version "9.3.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-9.3.5.tgz#ca2ed8ca452781a3009685607fdf025a899dfe21" + integrity sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q== + dependencies: + fs.realpath "^1.0.0" + minimatch "^8.0.2" + minipass "^4.2.4" + path-scurry "^1.6.1" + global-agent@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/global-agent/-/global-agent-3.0.0.tgz#ae7cd31bd3583b93c5a16437a1afe27cc33a1ab6" @@ -7956,36 +7557,27 @@ global-agent@^3.0.0: semver "^7.3.2" serialize-error "^7.0.1" -global-tunnel-ng@^2.7.1: - version "2.7.1" - resolved "https://registry.yarnpkg.com/global-tunnel-ng/-/global-tunnel-ng-2.7.1.tgz#d03b5102dfde3a69914f5ee7d86761ca35d57d8f" - integrity sha512-4s+DyciWBV0eK148wqXxcmVAbFVPqtc3sEtUE/GTQfuU80rySLcMhUmHKSHI7/LDj8q0gDYI1lIhRRB7ieRAqg== - dependencies: - encodeurl "^1.0.2" - lodash "^4.17.10" - npm-conf "^1.1.3" - tunnel "^0.0.6" - globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globals@^13.6.0, globals@^13.9.0: - version "13.15.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.15.0.tgz#38113218c907d2f7e98658af246cef8b77e90bac" - integrity sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog== +globals@^13.19.0: + version "13.24.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" + integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== dependencies: type-fest "^0.20.2" -globalthis@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" - integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== +globalthis@^1.0.1, globalthis@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" + integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== dependencies: - define-properties "^1.1.3" + define-properties "^1.2.1" + gopd "^1.0.1" -globby@^11.0.3: +globby@11.1.0, globby@^11.0.3, globby@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== @@ -8000,7 +7592,7 @@ globby@^11.0.3: globby@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/globby/-/globby-7.1.1.tgz#fb2ccff9401f8600945dfada97440cca972b8680" - integrity sha1-+yzP+UAfhgCUXfral0QMypcrhoA= + integrity sha512-yANWAN2DUcBtuus5Cpd+SKROzXHs2iVXFZt/Ykrfz6SAXqacLX25NZpltE+39ceMexYF4TtEadjuSTw8+3wX4g== dependencies: array-union "^1.0.1" dir-glob "^2.0.0" @@ -8009,34 +7601,25 @@ globby@^7.1.1: pify "^3.0.0" slash "^1.0.0" -globby@^9.2.0: - version "9.2.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-9.2.0.tgz#fd029a706c703d29bdd170f4b6db3a3f7a7cb63d" - integrity sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg== - dependencies: - "@types/glob" "^7.1.1" - array-union "^1.0.2" - dir-glob "^2.2.2" - fast-glob "^2.2.6" - glob "^7.1.3" - ignore "^4.0.3" - pify "^4.0.1" - slash "^2.0.0" - -google-protobuf@3.12.4: - version "3.12.4" - resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.12.4.tgz#fd89b7e5052cdb35a80f9b455612851d542a5c9f" - integrity sha512-ItTn8YepDQMHEMHloUPH+FDaTPiHTnbsMvP50aXfbI65IK3AA5+wXlHSygJH8xz+h1g4gu7V+CK5X1/SaGITsA== +google-protobuf@3.15.8: + version "3.15.8" + resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.15.8.tgz#5f3948905e4951c867d6bc143f385a80e2a39efe" + integrity sha512-2jtfdqTaSxk0cuBJBtTTWsot4WtR9RVr2rXg7x7OoqiuOKopPrwXpM1G4dXIkLcUNRh3RKzz76C8IOkksZSeOw== google-protobuf@^3.20.1: - version "3.20.1" - resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.20.1.tgz#1b255c2b59bcda7c399df46c65206aa3c7a0ce8b" - integrity sha512-XMf1+O32FjYIV3CYu6Tuh5PNbfNEU5Xu22X+Xkdb/DUexFlCzhvv7d5Iirm4AOwn8lv4al1YvIhzGrg2j9Zfzw== + version "3.21.4" + resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.21.4.tgz#2f933e8b6e5e9f8edde66b7be0024b68f77da6c9" + integrity sha512-MnG7N936zcKTco4Jd2PX2U96Kf9PxygAPKBug+74LHzmHXmceN16MmRcdgZv+DGef/S9YvQAfRsNCn4cjf9yyQ== + +gopd@^1.0.1, gopd@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== -got@^11.7.0: - version "11.8.3" - resolved "https://registry.yarnpkg.com/got/-/got-11.8.3.tgz#f496c8fdda5d729a90b4905d2b07dbd148170770" - integrity sha512-7gtQ5KiPh1RtGS9/Jbv1ofDpBFuq42gyfEib+ejaRBJuj/3tQFeR5+gw57e4ipaU8c/rCjvX6fkQz2lyDlGAOg== +got@^11.7.0, got@^11.8.5: + version "11.8.6" + resolved "https://registry.yarnpkg.com/got/-/got-11.8.6.tgz#276e827ead8772eddbcfc97170590b841823233a" + integrity sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g== dependencies: "@sindresorhus/is" "^4.0.0" "@szmarczak/http-timer" "^4.0.5" @@ -8050,143 +7633,49 @@ got@^11.7.0: p-cancelable "^2.0.0" responselike "^2.0.0" -got@^8.3.1: - version "8.3.2" - resolved "https://registry.yarnpkg.com/got/-/got-8.3.2.tgz#1d23f64390e97f776cac52e5b936e5f514d2e937" - integrity sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw== - dependencies: - "@sindresorhus/is" "^0.7.0" - cacheable-request "^2.1.1" - decompress-response "^3.3.0" - duplexer3 "^0.1.4" - get-stream "^3.0.0" - into-stream "^3.1.0" - is-retry-allowed "^1.1.0" - isurl "^1.0.0-alpha5" - lowercase-keys "^1.0.0" - mimic-response "^1.0.0" - p-cancelable "^0.4.0" - p-timeout "^2.0.1" - pify "^3.0.0" - safe-buffer "^5.1.1" - timed-out "^4.0.1" - url-parse-lax "^3.0.0" - url-to-options "^1.0.1" - -got@^9.6.0: - version "9.6.0" - resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" - integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== - dependencies: - "@sindresorhus/is" "^0.14.0" - "@szmarczak/http-timer" "^1.1.2" - cacheable-request "^6.0.0" - decompress-response "^3.3.0" - duplexer3 "^0.1.4" - get-stream "^4.1.0" - lowercase-keys "^1.0.1" - mimic-response "^1.0.1" - p-cancelable "^1.0.0" - to-readable-stream "^1.0.0" - url-parse-lax "^3.0.0" - -graceful-fs@^4.1.10, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: - version "4.2.10" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== - -growl@1.10.5: - version "1.10.5" - resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" - integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== - -grpc-tools@^1.9.0: - version "1.11.2" - resolved "https://registry.yarnpkg.com/grpc-tools/-/grpc-tools-1.11.2.tgz#22d802d40012510ccc6591d11f9c94109ac07aab" - integrity sha512-4+EgpnnkJraamY++oyBCw5Hp9huRYfgakjNVKbiE3PgO9Tv5ydVlRo7ZyGJ0C0SEiA7HhbVc1sNNtIyK7FiEtg== - dependencies: - "@mapbox/node-pre-gyp" "^1.0.5" - -grpc_tools_node_protoc_ts@^4.1.0: - version "4.1.5" - resolved "https://registry.yarnpkg.com/grpc_tools_node_protoc_ts/-/grpc_tools_node_protoc_ts-4.1.5.tgz#ad540a51867ff407196538d2d6370b27d6d3cfc8" - integrity sha512-/TgYNCpaw9MtY5L4KFlobjdlC13G++llmaIjEAxKRzNrpS4ZHdX/ENujiJgqjBLqSEujRA/YEV/x9T/v4ltcMQ== - dependencies: - google-protobuf "3.12.4" - handlebars "4.7.4" - handlebars-helpers "0.10.0" - -gulp-header@^1.7.1: - version "1.8.12" - resolved "https://registry.yarnpkg.com/gulp-header/-/gulp-header-1.8.12.tgz#ad306be0066599127281c4f8786660e705080a84" - integrity sha512-lh9HLdb53sC7XIZOYzTXM4lFuXElv3EVkSDhsd7DoJBj7hm+Ni7D3qYbb+Rr8DuM8nRanBvkVO9d7askreXGnQ== - dependencies: - concat-with-sourcemaps "*" - lodash.template "^4.4.0" - through2 "^2.0.0" - -handlebars-helper-create-frame@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/handlebars-helper-create-frame/-/handlebars-helper-create-frame-0.1.0.tgz#8aa51d10aeb6408fcc6605d40d77356288487a03" - integrity sha1-iqUdEK62QI/MZgXUDXc1YohIegM= +got@^12.0.0, got@^12.1.0, got@^12.6.1: + version "12.6.1" + resolved "https://registry.yarnpkg.com/got/-/got-12.6.1.tgz#8869560d1383353204b5a9435f782df9c091f549" + integrity sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ== dependencies: - create-frame "^1.0.0" - isobject "^3.0.0" + "@sindresorhus/is" "^5.2.0" + "@szmarczak/http-timer" "^5.0.1" + cacheable-lookup "^7.0.0" + cacheable-request "^10.2.8" + decompress-response "^6.0.0" + form-data-encoder "^2.1.2" + get-stream "^6.0.1" + http2-wrapper "^2.1.10" + lowercase-keys "^3.0.0" + p-cancelable "^3.0.0" + responselike "^3.0.0" + +graceful-fs@4.2.11, graceful-fs@^4.1.10, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.2, graceful-fs@^4.2.4, graceful-fs@^4.2.6: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== -handlebars-helpers@0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/handlebars-helpers/-/handlebars-helpers-0.10.0.tgz#663d49e718928eafbead1473419ed7bc24bcd45a" - integrity sha512-QiyhQz58u/DbuV41VnfpE0nhy6YCH4vB514ajysV8SoKmP+DxU+pR+fahVyNECHj+jiwEN2VrvxD/34/yHaLUg== - dependencies: - arr-flatten "^1.1.0" - array-sort "^0.1.4" - create-frame "^1.0.0" - define-property "^1.0.0" - "falsey" "^0.3.2" - for-in "^1.0.2" - for-own "^1.0.0" - get-object "^0.2.0" - get-value "^2.0.6" - handlebars "^4.0.11" - handlebars-helper-create-frame "^0.1.0" - handlebars-utils "^1.0.6" - has-value "^1.0.0" - helper-date "^1.0.1" - helper-markdown "^1.0.0" - helper-md "^0.2.2" - html-tag "^2.0.0" - is-even "^1.0.0" - is-glob "^4.0.0" - is-number "^4.0.0" - kind-of "^6.0.0" - lazy-cache "^2.0.2" - logging-helpers "^1.0.0" - micromatch "^3.1.4" - relative "^3.0.2" - striptags "^3.1.0" - to-gfm-code-block "^0.1.1" - year "^0.2.1" - -handlebars-utils@^1.0.2, handlebars-utils@^1.0.4, handlebars-utils@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/handlebars-utils/-/handlebars-utils-1.0.6.tgz#cb9db43362479054782d86ffe10f47abc76357f9" - integrity sha512-d5mmoQXdeEqSKMtQQZ9WkiUcO1E3tPbWxluCK9hVgIDPzQa9WsKo3Lbe/sGflTe7TomHEeZaOgwIkyIr1kfzkw== +grpc-tools@^1.12.4: + version "1.13.0" + resolved "https://registry.yarnpkg.com/grpc-tools/-/grpc-tools-1.13.0.tgz#a4fea8eebce51fb9fec00055a3e52016dfd5af89" + integrity sha512-7CbkJ1yWPfX0nHjbYG58BQThNhbICXBZynzCUxCb3LzX5X9B3hQbRY2STiRgIEiLILlK9fgl0z0QVGwPCdXf5g== dependencies: - kind-of "^6.0.0" - typeof-article "^0.1.1" + "@mapbox/node-pre-gyp" "^1.0.5" -handlebars@4.7.4: - version "4.7.4" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.4.tgz#902c579cc97b350bb4bc12e6cabd85b57dcd9975" - integrity sha512-Is8+SzHv8K9STNadlBVpVhxXrSXxVgTyIvhdg2Qjak1SfSZ7iEozLHdwiX1jJ9lLFkcFJxqGK5s/cI7ZX+qGkQ== +grpc_tools_node_protoc_ts@^5.3.3: + version "5.3.3" + resolved "https://registry.yarnpkg.com/grpc_tools_node_protoc_ts/-/grpc_tools_node_protoc_ts-5.3.3.tgz#9a6c1c2f41563a1ab259c0177496d7dfed30dbfe" + integrity sha512-M/YrklvVXMtuuj9kb42PxeouZhs7Ul+R4e/31XwrankUcKL8cQQP50Q9q+KEHGyHQaPt6VtKKsxMgLaKbCxeww== dependencies: - neo-async "^2.6.0" - source-map "^0.6.1" - yargs "^15.3.1" - optionalDependencies: - uglify-js "^3.1.4" + google-protobuf "3.15.8" + handlebars "4.7.7" -handlebars@^4.0.11, handlebars@^4.7.6: +handlebars@4.7.7: version "4.7.7" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== @@ -8198,117 +7687,63 @@ handlebars@^4.0.11, handlebars@^4.7.6: optionalDependencies: uglify-js "^3.1.4" -har-schema@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= - -har-validator@~5.1.3: - version "5.1.5" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" - integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== +handlebars@^4.7.7: + version "4.7.8" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.8.tgz#41c42c18b1be2365439188c77c6afae71c0cd9e9" + integrity sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ== dependencies: - ajv "^6.12.3" - har-schema "^2.0.0" + minimist "^1.2.5" + neo-async "^2.6.2" + source-map "^0.6.1" + wordwrap "^1.0.0" + optionalDependencies: + uglify-js "^3.1.4" hard-rejection@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== -has-bigints@^1.0.1, has-bigints@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" - integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== - -has-cors@1.1.0: +has-bigints@^1.0.2: version "1.1.0" - resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" - integrity sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk= - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.1.0.tgz#28607e965ac967e03cd2a2c70a2636a1edad49fe" + integrity sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg== has-flag@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-property-descriptors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" - integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== dependencies: - get-intrinsic "^1.1.1" - -has-symbol-support-x@^1.4.1: - version "1.4.2" - resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455" - integrity sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw== - -has-symbols@^1.0.0, has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + es-define-property "^1.0.0" -has-to-string-tag-x@^1.2.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d" - integrity sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw== +has-proto@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.2.0.tgz#5de5a6eabd95fdffd9818b43055e8065e39fe9d5" + integrity sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ== dependencies: - has-symbol-support-x "^1.4.1" + dunder-proto "^1.0.0" -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== +has-symbols@^1.0.3, has-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== + +has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== dependencies: - has-symbols "^1.0.2" + has-symbols "^1.0.3" -has-unicode@^2.0.0, has-unicode@^2.0.1: +has-unicode@2.0.1, has-unicode@^2.0.0, has-unicode@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= - -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" + integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== hash.js@^1.1.7: version "1.1.7" @@ -8318,12 +7753,19 @@ hash.js@^1.1.7: inherits "^2.0.3" minimalistic-assert "^1.0.1" +hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + hast-util-whitespace@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-2.0.0.tgz#4fc1086467cc1ef5ba20673cb6b03cec3a970f1c" - integrity sha512-Pkw+xBHuV6xFeJprJe2BBEoDV+AvQySaz3pPDRUs5PNZEMQjpXJJueqrpcHIXxnWTcAGi/UOCgVShlkY6kLoqg== + version "2.0.1" + resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz#0ec64e257e6fc216c7d14c8a1b74d27d650b4557" + integrity sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng== -he@1.2.0: +he@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== @@ -8336,75 +7778,55 @@ header-case@^2.0.4: capital-case "^1.0.4" tslib "^2.0.3" -helper-date@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/helper-date/-/helper-date-1.0.1.tgz#12fedea3ad8e44a7ca4c4efb0ff4104a5120cffb" - integrity sha512-wU3VOwwTJvGr/w5rZr3cprPHO+hIhlblTJHD6aFBrKLuNbf4lAmkawd2iK3c6NbJEvY7HAmDpqjOFSI5/+Ey2w== - dependencies: - date.js "^0.3.1" - handlebars-utils "^1.0.4" - moment "^2.18.1" - -helper-markdown@^1.0.0: +hexoid@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/helper-markdown/-/helper-markdown-1.0.0.tgz#ee7e9fc554675007d37eb90f7853b13ce74f3e10" - integrity sha512-AnDqMS4ejkQK0MXze7pA9TM3pu01ZY+XXsES6gEE0RmCGk5/NIfvTn0NmItfyDOjRAzyo9z6X7YHbHX4PzIvOA== - dependencies: - handlebars-utils "^1.0.2" - highlight.js "^9.12.0" - remarkable "^1.7.1" + resolved "https://registry.yarnpkg.com/hexoid/-/hexoid-1.0.0.tgz#ad10c6573fb907de23d9ec63a711267d9dc9bc18" + integrity sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g== -helper-md@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/helper-md/-/helper-md-0.2.2.tgz#c1f59d7e55bbae23362fd8a0e971607aec69d41f" - integrity sha1-wfWdflW7riM2L9ig6XFgeuxp1B8= +hoist-non-react-statics@^3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== dependencies: - ent "^2.2.0" - extend-shallow "^2.0.1" - fs-exists-sync "^0.1.0" - remarkable "^1.6.2" - -highlight.js@^9.12.0: - version "9.18.5" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.18.5.tgz#d18a359867f378c138d6819edfc2a8acd5f29825" - integrity sha512-a5bFyofd/BHCX52/8i8uJkjr9DYwXIPnM/plwI6W7ezItLGqzt7X2G2nXuYSfsIJdkwwj/g9DG1LkcGJI/dDoA== + react-is "^16.7.0" -hosted-git-info@^2.1.4, hosted-git-info@^2.7.1: +hosted-git-info@^2.1.4: version "2.8.9" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== -hosted-git-info@^4.0.1: +hosted-git-info@^3.0.6: + version "3.0.8" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-3.0.8.tgz#6e35d4cc87af2c5f816e4cb9ce350ba87a3f370d" + integrity sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw== + dependencies: + lru-cache "^6.0.0" + +hosted-git-info@^4.0.0, hosted-git-info@^4.0.1, hosted-git-info@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224" integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== dependencies: lru-cache "^6.0.0" -html-encoding-sniffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" - integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw== +hosted-git-info@^6.0.0: + version "6.1.3" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-6.1.3.tgz#2ee1a14a097a1236bddf8672c35b613c46c55946" + integrity sha512-HVJyzUrLIL1c0QmviVh5E8VGyUS7xCFPS6yydaVd1UegW+ibV/CohqTH9MkOLDp5o+rb82DMo77PTuc9F/8GKw== dependencies: - whatwg-encoding "^1.0.1" + lru-cache "^7.5.1" -html-tag@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/html-tag/-/html-tag-2.0.0.tgz#36c3bc8d816fd30b570d5764a497a641640c2fed" - integrity sha512-XxzooSo6oBoxBEUazgjdXj7VwTn/iSTSZzTYKzYY6I916tkaYzypHxy+pbVU1h+0UQ9JlVf5XkNQyxOAiiQO1g== +html-encoding-sniffer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9" + integrity sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA== dependencies: - is-self-closing "^1.0.1" - kind-of "^6.0.0" + whatwg-encoding "^2.0.0" -http-cache-semantics@3.8.1, http-cache-semantics@^3.8.1: - version "3.8.1" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2" - integrity sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w== - -http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" - integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== +http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.0, http-cache-semantics@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" + integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== http-errors@2.0.0: version "2.0.0" @@ -8417,14 +7839,6 @@ http-errors@2.0.0: statuses "2.0.1" toidentifier "1.0.1" -http-proxy-agent@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405" - integrity sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg== - dependencies: - agent-base "4" - debug "3.1.0" - http-proxy-agent@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" @@ -8443,14 +7857,41 @@ http-proxy-agent@^5.0.0: agent-base "6" debug "4" -http-signature@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= - dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" +http-proxy-agent@^7.0.0, http-proxy-agent@^7.0.1: + version "7.0.2" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz#9a8b1f246866c028509486585f62b8f2c18c270e" + integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== + dependencies: + agent-base "^7.1.0" + debug "^4.3.4" + +http-proxy@^1.18.1: + version "1.18.1" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +http-server@^14.1.1: + version "14.1.1" + resolved "https://registry.yarnpkg.com/http-server/-/http-server-14.1.1.tgz#d60fbb37d7c2fdff0f0fbff0d0ee6670bd285e2e" + integrity sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A== + dependencies: + basic-auth "^2.0.1" + chalk "^4.1.2" + corser "^2.0.1" + he "^1.2.0" + html-encoding-sniffer "^3.0.0" + http-proxy "^1.18.1" + mime "^1.6.0" + minimist "^1.2.6" + opener "^1.5.1" + portfinder "^1.0.28" + secure-compare "3.0.1" + union "~0.5.0" + url-join "^4.0.1" http-status-codes@^1.3.0: version "1.4.0" @@ -8465,23 +7906,15 @@ http2-wrapper@^1.0.0-beta.5.2: quick-lru "^5.1.1" resolve-alpn "^1.0.0" -https-proxy-agent@^2.2.3: - version "2.2.4" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz#4ee7a737abd92678a293d9b34a1af4d0d08c787b" - integrity sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg== - dependencies: - agent-base "^4.3.0" - debug "^3.1.0" - -https-proxy-agent@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz#702b71fb5520a132a66de1f67541d9e62154d82b" - integrity sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg== +http2-wrapper@^2.1.10: + version "2.2.1" + resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-2.2.1.tgz#310968153dcdedb160d8b72114363ef5fce1f64a" + integrity sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ== dependencies: - agent-base "5" - debug "4" + quick-lru "^5.1.1" + resolve-alpn "^1.2.0" -https-proxy-agent@^5.0.0: +https-proxy-agent@^5.0.0, https-proxy-agent@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== @@ -8489,15 +7922,33 @@ https-proxy-agent@^5.0.0: agent-base "6" debug "4" +https-proxy-agent@^7.0.2, https-proxy-agent@^7.0.6: + version "7.0.6" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz#da8dfeac7da130b05c2ba4b59c9b6cd66611a6b9" + integrity sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw== + dependencies: + agent-base "^7.1.2" + debug "4" + +human-signals@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" + integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== + human-signals@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== +human-signals@^4.3.0: + version "4.3.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-4.3.1.tgz#ab7f811e851fca97ffbd2c1fe9a958964de321b2" + integrity sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ== + humanize-ms@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" - integrity sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0= + integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== dependencies: ms "^2.0.0" @@ -8506,6 +7957,14 @@ husky@^6.0.0: resolved "https://registry.yarnpkg.com/husky/-/husky-6.0.0.tgz#810f11869adf51604c32ea577edbc377d7f9319e" integrity sha512-SQS2gDTB7tBN486QSoKPKQItZw97BMOd+Kdb6ghfpBc0yXyzrddI0oDV5MkDAbuB4X2mO3/nj60TRMcYxwzZeQ== +iconv-corefoundation@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz#31065e6ab2c9272154c8b0821151e2c88f1b002a" + integrity sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ== + dependencies: + cli-truncate "^2.1.0" + node-addon-api "^1.6.3" + iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -8513,7 +7972,7 @@ iconv-lite@0.4.24, iconv-lite@^0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" -iconv-lite@^0.6.0, iconv-lite@^0.6.2: +iconv-lite@0.6.3, iconv-lite@^0.6.0, iconv-lite@^0.6.2: version "0.6.3" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== @@ -8530,13 +7989,13 @@ idb@^4.0.5: resolved "https://registry.yarnpkg.com/idb/-/idb-4.0.5.tgz#23b930fbb0abce391e939c35b7b31a669e74041f" integrity sha512-P+Fk9HT2h1DhXoE1YNK183SY+CRh2GHNh28de94sGwhe0bUA75JJeVJWt3SenE5p0BXK7maflIq29dl6UZHrFw== -idtoken-verifier@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/idtoken-verifier/-/idtoken-verifier-2.2.2.tgz#0d91a2f92231ebd763e5098d2ac44f038eb1068b" - integrity sha512-PFNivtWIUKFt0B53FOACLAM2PaejEwB/wh6fPqlWoLGMWP05JKGJyKyMv/uS9kduevEfRhHaSVdoLYUnQ0YmsA== +idtoken-verifier@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/idtoken-verifier/-/idtoken-verifier-2.2.4.tgz#5749bd3fc9b757db40ad764484173584fb19fb55" + integrity sha512-5t7O8cNHpJBB8FnwLD0qFZqy/+qGICObQKUl0njD6vXKHhpZPLEe8LU7qv/GBWB3Qv5e/wAIFHYVi4SoQwdOxQ== dependencies: base64-js "^1.5.1" - crypto-js "^4.1.1" + crypto-js "^4.2.0" es6-promise "^4.2.8" jsbn "^1.1.0" unfetch "^4.2.0" @@ -8547,73 +8006,54 @@ ieee754@^1.1.13, ieee754@^1.2.1: resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== -iferr@^0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" - integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= - ignore-loader@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/ignore-loader/-/ignore-loader-0.1.2.tgz#d81f240376d0ba4f0d778972c3ad25874117a463" - integrity sha1-2B8kA3bQuk8Nd4lyw60lh0EXpGM= + integrity sha512-yOJQEKrNwoYqrWLS4DcnzM7SEQhRKis5mB+LdKKh4cPmGYlLPR0ozRzHV5jmEk2IxptqJNQA5Cc0gw8Fj12bXA== ignore-styles@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ignore-styles/-/ignore-styles-5.0.1.tgz#b49ef2274bdafcd8a4880a966bfe38d1a0bf4671" - integrity sha1-tJ7yJ0va/NikiAqWa/440aC/RnE= + integrity sha512-gQQmIznCETPLEzfg1UH4Cs2oRq+HBPl8quroEUNXT8oybEG7/0lqI3dGgDSRry6B9HcCXw3PVkFFS0FF3CMddg== + +ignore-walk@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-5.0.1.tgz#5f199e23e1288f518d90358d461387788a154776" + integrity sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw== + dependencies: + minimatch "^5.0.1" -ignore-walk@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.4.tgz#c9a09f69b7c7b479a5d74ac1a3c0d4236d2a6335" - integrity sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ== +ignore-walk@^6.0.0: + version "6.0.5" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-6.0.5.tgz#ef8d61eab7da169078723d1f82833b36e200b0dd" + integrity sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A== dependencies: - minimatch "^3.0.4" + minimatch "^9.0.0" ignore@^3.3.5: version "3.3.10" resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== -ignore@^4.0.3, ignore@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" - integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== - -ignore@^5.1.8, ignore@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" - integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== +ignore@^5.0.4, ignore@^5.2.0: + version "5.3.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== image-size@~0.5.0: version "0.5.5" resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" - integrity sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w= + integrity sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ== -import-fresh@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" - integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= - dependencies: - caller-path "^2.0.0" - resolve-from "^3.0.0" - -import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== +import-fresh@^3.2.1, import-fresh@^3.3.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" + integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== dependencies: parent-module "^1.0.0" resolve-from "^4.0.0" -import-local@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" - integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== - dependencies: - pkg-dir "^3.0.0" - resolve-cwd "^2.0.0" - -import-local@^3.0.2: +import-local@3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== @@ -8621,29 +8061,30 @@ import-local@^3.0.2: pkg-dir "^4.2.0" resolve-cwd "^3.0.0" +import-local@^3.0.2: + version "3.2.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.2.0.tgz#c3d5c745798c02a6f8b897726aba5100186ee260" + integrity sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= - -indent-string@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" - integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= - dependencies: - repeating "^2.0.0" - -indent-string@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" - integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== indent-string@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== -infer-owner@^1.0.3, infer-owner@^1.0.4: +indent-string@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-5.0.0.tgz#4fd2980fccaf8622d14c64d694f4cf33c81951a5" + integrity sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg== + +infer-owner@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== @@ -8651,149 +8092,148 @@ infer-owner@^1.0.3, infer-owner@^1.0.4: inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" wrappy "1" -info-symbol@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/info-symbol/-/info-symbol-0.1.0.tgz#27841d72867ddb4242cd612d79c10633881c6a78" - integrity sha1-J4QdcoZ920JCzWEtecEGM4gcang= - -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.0, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -ini@^1.3.2, ini@^1.3.4, ini@~1.3.0: +ini@^1.3.2, ini@^1.3.8, ini@~1.3.0: version "1.3.8" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== -init-package-json@^1.10.3: - version "1.10.3" - resolved "https://registry.yarnpkg.com/init-package-json/-/init-package-json-1.10.3.tgz#45ffe2f610a8ca134f2bd1db5637b235070f6cbe" - integrity sha512-zKSiXKhQveNteyhcj1CoOP8tqp1QuxPIPBl8Bid99DGLFqA1p87M6lNgfjJHSBoWJJlidGOv5rWjyYKEB3g2Jw== - dependencies: - glob "^7.1.1" - npm-package-arg "^4.0.0 || ^5.0.0 || ^6.0.0" - promzard "^0.3.0" - read "~1.0.1" - read-package-json "1 || 2" - semver "2.x || 3.x || 4 || 5" - validate-npm-package-license "^3.0.1" - validate-npm-package-name "^3.0.0" +init-package-json@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/init-package-json/-/init-package-json-5.0.0.tgz#030cf0ea9c84cfc1b0dc2e898b45d171393e4b40" + integrity sha512-kBhlSheBfYmq3e0L1ii+VKe3zBTLL5lDCDWR+f9dLmEGSB3MqLlMlsolubSsyI88Bg6EA+BIMlomAnQ1SwgQBw== + dependencies: + npm-package-arg "^10.0.0" + promzard "^1.0.0" + read "^2.0.0" + read-package-json "^6.0.0" + semver "^7.3.5" + validate-npm-package-license "^3.0.4" + validate-npm-package-name "^5.0.0" inline-style-parser@0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== -inquirer@^6.2.0: - version "6.5.2" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" - integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ== +inquirer@^8.2.4: + version "8.2.6" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.6.tgz#733b74888195d8d400a67ac332011b5fae5ea562" + integrity sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg== dependencies: - ansi-escapes "^3.2.0" - chalk "^2.4.2" - cli-cursor "^2.1.0" - cli-width "^2.0.0" + ansi-escapes "^4.2.1" + chalk "^4.1.1" + cli-cursor "^3.1.0" + cli-width "^3.0.0" external-editor "^3.0.3" - figures "^2.0.0" - lodash "^4.17.12" - mute-stream "0.0.7" - run-async "^2.2.0" - rxjs "^6.4.0" - string-width "^2.1.0" - strip-ansi "^5.1.0" + figures "^3.0.0" + lodash "^4.17.21" + mute-stream "0.0.8" + ora "^5.4.1" + run-async "^2.4.0" + rxjs "^7.5.5" + string-width "^4.1.0" + strip-ansi "^6.0.0" through "^2.3.6" + wrap-ansi "^6.0.1" -internal-slot@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" - integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== +inspect-with-kind@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/inspect-with-kind/-/inspect-with-kind-1.0.5.tgz#fce151d4ce89722c82ca8e9860bb96f9167c316c" + integrity sha512-MAQUJuIo7Xqk8EVNP+6d3CKq9c80hi4tjIbIAT6lmGW9W6WzlHiu9PS8uSuUYU+Do+j1baiFp3H25XEVxDIG2g== dependencies: - get-intrinsic "^1.1.0" - has "^1.0.3" - side-channel "^1.0.4" + kind-of "^6.0.2" -interpret@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" - integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== +internal-slot@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.1.0.tgz#1eac91762947d2f7056bc838d93e13b2e9604961" + integrity sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw== + dependencies: + es-errors "^1.3.0" + hasown "^2.0.2" + side-channel "^1.1.0" interpret@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== -into-stream@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-3.1.0.tgz#96fb0a936c12babd6ff1752a17d05616abd094c6" - integrity sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY= - dependencies: - from2 "^2.1.1" - p-is-promise "^1.1.0" - -inversify@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/inversify/-/inversify-5.1.1.tgz#6fbd668c591337404e005a1946bfe0d802c08730" - integrity sha512-j8grHGDzv1v+8T1sAQ+3boTCntFPfvxLCkNcxB1J8qA0lUN+fAlSyYd+RXKvaPRL4AGyPxViutBEJHNXOyUdFQ== +inversify@6.0.2, inversify@^6.1.3: + version "6.0.2" + resolved "https://registry.yarnpkg.com/inversify/-/inversify-6.0.2.tgz#dc7fa0348213d789d35ffb719dea9685570989c7" + integrity sha512-i9m8j/7YIv4mDuYXUAcrpKPSaju/CIly9AHK5jvCBeoiM/2KEsuCQTTP+rzSWWpLYWRukdXFSl6ZTk2/uumbiA== -invert-kv@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" - integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== +ip-address@^9.0.5: + version "9.0.5" + resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-9.0.5.tgz#117a960819b08780c3bd1f14ef3c1cc1d3f3ea5a" + integrity sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g== + dependencies: + jsbn "1.1.0" + sprintf-js "^1.1.3" -ip@1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" - integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= +ip-regex@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5" + integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q== -ip@^1.1.5: - version "1.1.8" - resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.8.tgz#ae05948f6b075435ed3307acce04629da8cdbf48" - integrity sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg== +ip@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.1.tgz#e8f3595d33a3ea66490204234b77636965307105" + integrity sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ== ipaddr.js@1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== +is-arguments@^1.0.4, is-arguments@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.2.0.tgz#ad58c6aecf563b78ef2bf04df540da8f5d7d8e1b" + integrity sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA== dependencies: - kind-of "^6.0.0" + call-bound "^1.0.2" + has-tostringtag "^1.0.2" -is-arguments@^1.0.4, is-arguments@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" - integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== +is-array-buffer@^3.0.2, is-array-buffer@^3.0.4, is-array-buffer@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.5.tgz#65742e1e687bd2cc666253068fd8707fe4d44280" + integrity sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A== dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" + call-bind "^1.0.8" + call-bound "^1.0.3" + get-intrinsic "^1.2.6" is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== +is-async-function@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.1.1.tgz#3e69018c8e04e73b738793d020bfe884b9fd3523" + integrity sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ== dependencies: - has-bigints "^1.0.1" + async-function "^1.0.0" + call-bound "^1.0.3" + get-proto "^1.0.1" + has-tostringtag "^1.0.2" + safe-regex-test "^1.1.0" + +is-bigint@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.1.0.tgz#dda7a3445df57a42583db4228682eba7c4170672" + integrity sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ== + dependencies: + has-bigints "^1.0.2" is-binary-path@~2.1.0: version "2.1.0" @@ -8802,28 +8242,30 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== +is-boolean-object@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.2.2.tgz#7067f47709809a393c71ff5bb3e135d8a9215d9e" + integrity sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A== dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + call-bound "^1.0.3" + has-tostringtag "^1.0.2" -is-buffer@^2.0.0, is-buffer@~2.0.3: +is-buffer@^2.0.0: version "2.0.5" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" - integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== +is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-ci@3.0.1, is-ci@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867" + integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== + dependencies: + ci-info "^3.2.0" is-ci@^2.0.0: version "2.0.0" @@ -8832,56 +8274,29 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" -is-core-module@^2.2.0, is-core-module@^2.5.0, is-core-module@^2.8.1: - version "2.9.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" - integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== - dependencies: - has "^1.0.3" - -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== - dependencies: - kind-of "^6.0.0" - -is-date-object@^1.0.1, is-date-object@^1.0.2: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== - dependencies: - has-tostringtag "^1.0.0" - -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== +is-core-module@^2.13.0, is-core-module@^2.16.0, is-core-module@^2.5.0, is-core-module@^2.8.1: + version "2.16.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" + integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" + hasown "^2.0.2" -is-descriptor@^1.0.0, is-descriptor@^1.0.2: +is-data-view@^1.0.1, is-data-view@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.2.tgz#bae0a41b9688986c2188dda6657e56b8f9e63b8e" + integrity sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw== dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" + call-bound "^1.0.2" + get-intrinsic "^1.2.6" + is-typed-array "^1.1.13" -is-directory@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" - integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= +is-date-object@^1.0.5, is-date-object@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.1.0.tgz#ad85541996fc7aa8b2729701d27b7319f95d82f7" + integrity sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg== + dependencies: + call-bound "^1.0.2" + has-tostringtag "^1.0.2" is-docker@^2.0.0, is-docker@^2.1.1: version "2.2.1" @@ -8889,76 +8304,45 @@ is-docker@^2.0.0, is-docker@^2.1.1: integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== is-electron@^2.1.0, is-electron@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/is-electron/-/is-electron-2.2.1.tgz#751b1dd8a74907422faa5c35aaa0cf66d98086e9" - integrity sha512-r8EEQQsqT+Gn0aXFx7lTFygYQhILLCB+wn0WCDL5LZRINeLH/Rvw1j2oKodELLXYNImQ3CRlVsY8wW4cGOsyuw== - -is-even@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-even/-/is-even-1.0.0.tgz#76b5055fbad8d294a86b6a949015e1c97b717c06" - integrity sha1-drUFX7rY0pSoa2qUkBXhyXtxfAY= - dependencies: - is-odd "^0.1.2" - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== - dependencies: - is-plain-object "^2.0.4" - -is-extglob@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" - integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= + version "2.2.2" + resolved "https://registry.yarnpkg.com/is-electron/-/is-electron-2.2.2.tgz#3778902a2044d76de98036f5dc58089ac4d80bb9" + integrity sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg== -is-extglob@^2.1.0, is-extglob@^2.1.1: +is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== -is-finite@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" - integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== +is-finalizationregistry@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz#eefdcdc6c94ddd0674d9c85887bf93f944a97c90" + integrity sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg== + dependencies: + call-bound "^1.0.3" is-fullwidth-code-point@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + integrity sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw== dependencies: number-is-nan "^1.0.0" -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== -is-glob@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" - integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= - dependencies: - is-extglob "^1.0.0" - -is-glob@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= +is-generator-function@^1.0.10, is-generator-function@^1.0.7: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.1.0.tgz#bf3eeda931201394f57b5dba2800f91a238309ca" + integrity sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ== dependencies: - is-extglob "^2.1.0" + call-bound "^1.0.3" + get-proto "^1.0.0" + has-tostringtag "^1.0.2" + safe-regex-test "^1.1.0" -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== @@ -8970,87 +8354,62 @@ is-interactive@^1.0.0: resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== -is-invalid-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/is-invalid-path/-/is-invalid-path-0.1.0.tgz#307a855b3cf1a938b44ea70d2c61106053714f34" - integrity sha1-MHqFWzzxqTi0TqcNLGEQYFNxTzQ= +is-ip@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-ip/-/is-ip-3.1.0.tgz#2ae5ddfafaf05cb8008a62093cf29734f657c5d8" + integrity sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q== dependencies: - is-glob "^2.0.0" + ip-regex "^4.0.0" is-lambda@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" - integrity sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU= + integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== -is-map@^2.0.1, is-map@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" - integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== +is-map@^2.0.2, is-map@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" + integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== is-natural-number@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-4.0.1.tgz#ab9d76e1db4ced51e35de0c72ebecf09f734cde8" - integrity sha1-q5124dtM7VHjXeDHLr7PCfc0zeg= - -is-negative-zero@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" - integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== - -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== - dependencies: - has-tostringtag "^1.0.0" - -is-number@^2.0.2: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" - integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8= - dependencies: - kind-of "^3.0.2" + integrity sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ== -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= +is-number-object@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.1.1.tgz#144b21e95a1bc148205dcc2814a9134ec41b2541" + integrity sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw== dependencies: - kind-of "^3.0.2" - -is-number@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" - integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== + call-bound "^1.0.3" + has-tostringtag "^1.0.2" is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -is-obj@^1.0.0, is-obj@^1.0.1: +is-obj@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" - integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= + integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== is-obj@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== -is-object@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.2.tgz#a56552e1c665c9e950b4a025461da87e72f86fcf" - integrity sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA== - -is-odd@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-0.1.2.tgz#bc573b5ce371ef2aad6e6f49799b72bef13978a7" - integrity sha1-vFc7XONx7yqtbm9JeZtyvvE5eKc= +is-online@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/is-online/-/is-online-10.0.0.tgz#5e02cee9f822fd9c19b060f0ecbdc798d37295a3" + integrity sha512-WCPdKwNDjXJJmUubf2VHLMDBkUZEtuOvpXUfUnUFbEnM6In9ByiScL4f4jKACz/fsb2qDkesFerW3snf/AYz3A== dependencies: - is-number "^3.0.0" + got "^12.1.0" + p-any "^4.0.0" + p-timeout "^5.1.0" + public-ip "^5.0.0" -is-path-inside@^3.0.2: +is-path-inside@^3.0.2, is-path-inside@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== @@ -9058,14 +8417,19 @@ is-path-inside@^3.0.2: is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= + integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== + +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== is-plain-obj@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.0.0.tgz#06c0999fd7574edf5a906ba5644ad0feb3a84d22" - integrity sha512-NXRbBtUdBioI73y/HmOhogw/U5msYPC9DAtGkJXeFcFWSFZw0mCUsPxk/snTuJHzNKA8kLBK4rH97RMB1BfCXw== + version "4.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0" + integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== -is-plain-object@^2.0.3, is-plain-object@^2.0.4: +is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== @@ -9077,205 +8441,208 @@ is-plain-object@^5.0.0: resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== -is-redirect@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" - integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= +is-potential-custom-element-name@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" + integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== -is-regex@^1.1.1, is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== +is-regex@^1.1.4, is-regex@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.2.1.tgz#76d70a3ed10ef9be48eb577887d74205bf0cad22" + integrity sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g== dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" + call-bound "^1.0.2" + gopd "^1.2.0" + has-tostringtag "^1.0.2" + hasown "^2.0.2" is-regexp@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" - integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= + integrity sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA== -is-retry-allowed@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" - integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== +is-set@^2.0.2, is-set@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" + integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== -is-self-closing@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-self-closing/-/is-self-closing-1.0.1.tgz#5f406b527c7b12610176320338af0fa3896416e4" - integrity sha512-E+60FomW7Blv5GXTlYee2KDrnG6srxF7Xt1SjrhWUGUEsTFIqY/nq2y3DaftCsgUMdh89V07IVfhY9KIJhLezg== +is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz#9b67844bd9b7f246ba0708c3a93e34269c774f6f" + integrity sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A== dependencies: - self-closing-tags "^1.0.1" + call-bound "^1.0.3" -is-set@^2.0.1, is-set@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" - integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== - -is-shared-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" - integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== +is-ssh@^1.4.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/is-ssh/-/is-ssh-1.4.1.tgz#76de1cdbe8f92a8b905d1a172b6bc09704c20396" + integrity sha512-JNeu1wQsHjyHgn9NcWTaXq6zWSR6hqE0++zhfZlkFBbScNkyvxCdeV8sRkSBaeLKxmbpR21brail63ACNxJ0Tg== dependencies: - call-bind "^1.0.2" + protocols "^2.0.1" -is-ssh@^1.3.0: - version "1.3.3" - resolved "https://registry.yarnpkg.com/is-ssh/-/is-ssh-1.3.3.tgz#7f133285ccd7f2c2c7fc897b771b53d95a2b2c7e" - integrity sha512-NKzJmQzJfEEma3w5cJNcUMxoXfDjz0Zj0eyCalHn2E6VOwlzjZo0yuO2fcBSf8zhFuVCL/82/r5gRcoi6aEPVQ== - dependencies: - protocols "^1.1.0" +is-stream@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" + integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== is-stream@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== +is-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" + integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== + +is-string@^1.0.7, is-string@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.1.1.tgz#92ea3f3d5c5b6e039ca8677e5ac8d07ea773cbb9" + integrity sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA== dependencies: - has-tostringtag "^1.0.0" + call-bound "^1.0.3" + has-tostringtag "^1.0.2" -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== +is-symbol@^1.0.4, is-symbol@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.1.1.tgz#f47761279f532e2b05a7024a7506dbbedacd0634" + integrity sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w== dependencies: - has-symbols "^1.0.2" + call-bound "^1.0.2" + has-symbols "^1.1.0" + safe-regex-test "^1.1.0" is-text-path@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-1.0.1.tgz#4e1aa0fb51bfbcb3e92688001397202c1775b66e" - integrity sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4= + integrity sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w== dependencies: text-extensions "^1.0.0" -is-typed-array@^1.1.9: - version "1.1.9" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.9.tgz#246d77d2871e7d9f5aeb1d54b9f52c71329ece67" - integrity sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A== +is-typed-array@^1.1.13, is-typed-array@^1.1.14, is-typed-array@^1.1.15, is-typed-array@^1.1.3: + version "1.1.15" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.15.tgz#4bfb4a45b61cee83a5a46fba778e4e8d59c0ce0b" + integrity sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ== dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - es-abstract "^1.20.0" - for-each "^0.3.3" - has-tostringtag "^1.0.0" - -is-typedarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + which-typed-array "^1.1.16" is-unicode-supported@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== -is-utf8@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= - -is-valid-path@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-valid-path/-/is-valid-path-0.1.1.tgz#110f9ff74c37f663e1ec7915eb451f2db93ac9df" - integrity sha1-EQ+f90w39mPh7HkV60UfLbk6yd8= - dependencies: - is-invalid-path "^0.1.0" - -is-weakmap@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" - integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== +is-weakmap@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" + integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== -is-weakref@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== +is-weakref@^1.0.2, is-weakref@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.1.1.tgz#eea430182be8d64174bd96bffbc46f21bf3f9293" + integrity sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew== dependencies: - call-bind "^1.0.2" + call-bound "^1.0.3" -is-weakset@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.2.tgz#4569d67a747a1ce5a994dfd4ef6dcea76e7c0a1d" - integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== +is-weakset@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.4.tgz#c9f5deb0bc1906c6d6f1027f284ddf459249daca" + integrity sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" + call-bound "^1.0.3" + get-intrinsic "^1.2.6" is-what@^3.14.1: version "3.14.1" resolved "https://registry.yarnpkg.com/is-what/-/is-what-3.14.1.tgz#e1222f46ddda85dead0fd1c9df131760e77755c1" integrity sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA== -is-windows@^1.0.0, is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - -is-wsl@^2.2.0: +is-wsl@^2.1.1, is-wsl@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== dependencies: is-docker "^2.0.0" -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= - -isarray@1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= - isarray@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isbinaryfile@^4.0.8: + version "4.0.10" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.10.tgz#0c5b5e30c2557a2f06febd37b7322946aaee42b3" + integrity sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw== + +isbinaryfile@^5.0.0: + version "5.0.4" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-5.0.4.tgz#2a2edefa76cafa66613fe4c1ea52f7f031017bdf" + integrity sha512-YKBKVkKhty7s8rxddb40oOkuP0NbaeXrQvLin6QMHL7Ypiy2RW9LwOVrVgZRyOrhQlayMd9t+D8yDy8MKFTSDQ== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= - -isobject@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-0.2.0.tgz#a3432192f39b910b5f02cc989487836ec70aa85e" - integrity sha1-o0MhkvObkQtfAsyYlIeDbscKqF4= - -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= - dependencies: - isarray "1.0.0" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -isobject@^3.0.0, isobject@^3.0.1: +isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= +iterator.prototype@^1.1.4: + version "1.1.5" + resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.5.tgz#12c959a29de32de0aa3bbbb801f4d777066dae39" + integrity sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g== + dependencies: + define-data-property "^1.1.4" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.6" + get-proto "^1.0.0" + has-symbols "^1.1.0" + set-function-name "^2.0.2" + +jackspeak@^3.1.2: + version "3.4.3" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" + integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" -isurl@^1.0.0-alpha5: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67" - integrity sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w== +jake@^10.8.5: + version "10.9.2" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.9.2.tgz#6ae487e6a69afec3a5e167628996b59f35ae2b7f" + integrity sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA== + dependencies: + async "^3.2.3" + chalk "^4.0.2" + filelist "^1.0.4" + minimatch "^3.1.2" + +"jest-diff@>=29.4.3 < 30", jest-diff@^29.4.1: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" + integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== dependencies: - has-to-string-tag-x "^1.2.0" - is-object "^1.0.1" + chalk "^4.0.0" + diff-sequences "^29.6.3" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-get-type@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" + integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== jest-worker@^27.4.5: version "27.5.1" @@ -9296,15 +8663,14 @@ js-cookie@^2.2.0: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@3.13.1: - version "3.13.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" - integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== +js-yaml@4.1.0, js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== dependencies: - argparse "^1.0.7" - esprima "^4.0.0" + argparse "^2.0.1" -js-yaml@^3.13.1: +js-yaml@^3.10.0, js-yaml@^3.13.1: version "3.14.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== @@ -9312,81 +8678,64 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -jsbn@^1.1.0: +jsbn@1.1.0, jsbn@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040" - integrity sha1-sBMHyym2GKHtJux56RH4A8TaAEA= - -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A== jschardet@^2.1.1: version "2.3.0" resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-2.3.0.tgz#06e2636e16c8ada36feebbdc08aa34e6a9b3ff75" integrity sha512-6I6xT7XN/7sBB7q8ObzKbmv5vN+blzLcboDE1BNEsEfmRXJValMxO6OIRT69ylPBRemS3rw6US+CMCar0OBc9g== -jsdom@^11.5.1: - version "11.12.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8" - integrity sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw== - dependencies: - abab "^2.0.0" - acorn "^5.5.3" - acorn-globals "^4.1.0" - array-equal "^1.0.0" - cssom ">= 0.3.2 < 0.4.0" - cssstyle "^1.0.0" - data-urls "^1.0.0" - domexception "^1.0.1" - escodegen "^1.9.1" - html-encoding-sniffer "^1.0.2" - left-pad "^1.3.0" - nwsapi "^2.0.7" - parse5 "4.0.0" - pn "^1.1.0" - request "^2.87.0" - request-promise-native "^1.0.5" - sax "^1.2.4" - symbol-tree "^3.2.2" - tough-cookie "^2.3.4" - w3c-hr-time "^1.0.1" - webidl-conversions "^4.0.2" - whatwg-encoding "^1.0.3" - whatwg-mimetype "^2.1.0" - whatwg-url "^6.4.1" - ws "^5.2.0" - xml-name-validator "^3.0.0" - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= +jsdom@^21.1.1: + version "21.1.2" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-21.1.2.tgz#6433f751b8718248d646af1cdf6662dc8a1ca7f9" + integrity sha512-sCpFmK2jv+1sjff4u7fzft+pUh2KSUbUrEHYHyfSIbGTIcmnjyp83qg6qLwdJ/I3LpTXx33ACxeRL7Lsyc6lGQ== + dependencies: + abab "^2.0.6" + acorn "^8.8.2" + acorn-globals "^7.0.0" + cssstyle "^3.0.0" + data-urls "^4.0.0" + decimal.js "^10.4.3" + domexception "^4.0.0" + escodegen "^2.0.0" + form-data "^4.0.0" + html-encoding-sniffer "^3.0.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.1" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.4" + parse5 "^7.1.2" + rrweb-cssom "^0.6.0" + saxes "^6.0.0" + symbol-tree "^3.2.4" + tough-cookie "^4.1.2" + w3c-xmlserializer "^4.0.0" + webidl-conversions "^7.0.0" + whatwg-encoding "^2.0.0" + whatwg-mimetype "^3.0.0" + whatwg-url "^12.0.1" + ws "^8.13.0" + xml-name-validator "^4.0.0" + +jsesc@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" + integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== -json-buffer@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" - integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= +jsesc@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e" + integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g== -json-buffer@3.0.1, json-buffer@~3.0.1: +json-buffer@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== -json-parse-better-errors@^1.0.0, json-parse-better-errors@^1.0.1: +json-parse-better-errors@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== @@ -9396,6 +8745,11 @@ json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== +json-parse-even-better-errors@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz#b43d35e89c0f3be6b5fbbe9dc6c82467b30c28da" + integrity sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ== + json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" @@ -9411,32 +8765,43 @@ json-schema-typed@^7.0.3: resolved "https://registry.yarnpkg.com/json-schema-typed/-/json-schema-typed-7.0.3.tgz#23ff481b8b4eebcd2ca123b4fa0409e66469a2d9" integrity sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A== -json-schema@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" - integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== - json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json-stable-stringify@^1.0.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.2.1.tgz#addb683c2b78014d0b78d704c2fcbdf0695a60e2" + integrity sha512-Lp6HbbBgosLmJbjx0pBLbgvx68FaFU1sdkmBuckmhhJ88kL13OA51CDtR2yJB50eCNMH9wRqtQNNiAqQH4YXnA== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + isarray "^2.0.5" + jsonify "^0.0.1" + object-keys "^1.1.1" -json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: +json-stringify-safe@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== json5@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" - integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + version "1.0.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== dependencies: minimist "^1.2.0" -json5@^2.1.2, json5@^2.2.0, json5@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" - integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== +json5@^2.1.2, json5@^2.2.0, json5@^2.2.2, json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +jsonc-parser@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" + integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== jsonc-parser@^2.2.0: version "2.3.1" @@ -9444,14 +8809,14 @@ jsonc-parser@^2.2.0: integrity sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg== jsonc-parser@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.0.0.tgz#abdd785701c7e7eaca8a9ec8cf070ca51a745a22" - integrity sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA== + version "3.3.1" + resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.3.1.tgz#f2a524b4f7fd11e3d791e559977ad60b98b798b4" + integrity sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ== jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== optionalDependencies: graceful-fs "^4.1.6" @@ -9464,47 +8829,41 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" -jsonparse@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" - integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= +jsonify@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.1.tgz#2aa3111dae3d34a0f151c63f3a45d995d9420978" + integrity sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg== -jsprim@^1.2.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" - integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.4.0" - verror "1.10.0" +jsonparse@^1.2.0, jsonparse@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== "jsx-ast-utils@^2.4.1 || ^3.0.0": - version "3.3.0" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.0.tgz#e624f259143b9062c92b6413ff92a164c80d3ccb" - integrity sha512-XzO9luP6L0xkxwhIJMTJQpZo/eeN60K08jHdexfD569AGxeNug6UketeHXEhROoM8aR7EcUoOQmIhcJQjcuq8Q== + version "3.3.5" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" + integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== dependencies: - array-includes "^3.1.4" - object.assign "^4.1.2" + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + object.assign "^4.1.4" + object.values "^1.1.6" -just-extend@^4.0.2: - version "4.2.1" - resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.2.1.tgz#ef5e589afb61e5d66b24eca749409a8939a8c744" - integrity sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg== +just-diff@^5.1.1: + version "5.2.0" + resolved "https://registry.yarnpkg.com/just-diff/-/just-diff-5.2.0.tgz#60dca55891cf24cd4a094e33504660692348a241" + integrity sha512-6ufhP9SHjb7jibNFrNxyFZ6od3g+An6Ai9mhGRvcYe8UJlH0prseN64M+6ZBBUoKYHZsitDP42gAJ8+eVWr3lw== + +just-performance@4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/just-performance/-/just-performance-4.3.0.tgz#cc2bc8c9227f09e97b6b1df4cd0de2df7ae16db1" + integrity sha512-L7RjvtJsL0QO8xFs5wEoDDzzJwoiowRw6Rn/GnvldlchS2JQr9wFYPiwZcDfrbbujEKqKN0tvENdbjXdYhDp5Q== jwt-decode@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/jwt-decode/-/jwt-decode-3.1.2.tgz#3fb319f3675a2df0c2895c8f5e9fa4b67b04ed59" integrity sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A== -keytar@*: - version "7.9.0" - resolved "https://registry.yarnpkg.com/keytar/-/keytar-7.9.0.tgz#4c6225708f51b50cbf77c5aae81721964c2918cb" - integrity sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ== - dependencies: - node-addon-api "^4.3.0" - prebuild-install "^7.0.1" - keytar@7.2.0: version "7.2.0" resolved "https://registry.yarnpkg.com/keytar/-/keytar-7.2.0.tgz#4db2bec4f9700743ffd9eda22eebb658965c8440" @@ -9513,104 +8872,115 @@ keytar@7.2.0: node-addon-api "^3.0.0" prebuild-install "^6.0.0" -keyv@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.0.0.tgz#44923ba39e68b12a7cec7df6c3268c031f2ef373" - integrity sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA== - dependencies: - json-buffer "3.0.0" - -keyv@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" - integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== +keyv@^4.0.0, keyv@^4.5.3: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== dependencies: - json-buffer "3.0.0" - -keyv@^4.0.0: - version "4.2.9" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.2.9.tgz#b8f25d4968b583ed7f07fceadab646d4baadad6b" - integrity sha512-vqRBrN4xQHud7UMAGzGGFbt96MtGB9pb0OOg8Dhtq5RtiswCb1pCFq878iqC4hdeOP6eDPnCoFxA+2TXx427Ow== - dependencies: - compress-brotli "^1.3.8" json-buffer "3.0.1" -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.1.0, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0, kind-of@^5.0.2: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== - -kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: +kind-of@^6.0.2, kind-of@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== -kleur@^4.0.3: - version "4.1.4" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.4.tgz#8c202987d7e577766d039a8cd461934c01cda04d" - integrity sha512-8QADVssbrFjivHWQU7KkMgptGTl6WAcSdlbBPY4uNF+mWr6DGcKrvY2w4FQJoXch7+fKMjj0dRrL75vk3k23OA== - -lazy-cache@^2.0.1, lazy-cache@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-2.0.2.tgz#b9190a4f913354694840859f8a8f7084d8822264" - integrity sha1-uRkKT5EzVGlIQIWfio9whNiCImQ= +klaw-sync@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/klaw-sync/-/klaw-sync-6.0.0.tgz#1fd2cfd56ebb6250181114f0a581167099c2b28c" + integrity sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ== dependencies: - set-getter "^0.1.0" + graceful-fs "^4.1.11" -lazy-val@^1.0.5: +kleur@^4.0.3: + version "4.1.5" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" + integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== + +lazy-val@^1.0.4, lazy-val@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/lazy-val/-/lazy-val-1.0.5.tgz#6cf3b9f5bc31cee7ee3e369c0832b7583dcd923d" integrity sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q== -lcid@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" - integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== - dependencies: - invert-kv "^2.0.0" - -left-pad@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" - integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA== - -lerna@^3.20.2: - version "3.22.1" - resolved "https://registry.yarnpkg.com/lerna/-/lerna-3.22.1.tgz#82027ac3da9c627fd8bf02ccfeff806a98e65b62" - integrity sha512-vk1lfVRFm+UuEFA7wkLKeSF7Iz13W+N/vFd48aW2yuS7Kv0RbNm2/qcDPV863056LMfkRlsEe+QYOw3palj5Lg== - dependencies: - "@lerna/add" "3.21.0" - "@lerna/bootstrap" "3.21.0" - "@lerna/changed" "3.21.0" - "@lerna/clean" "3.21.0" - "@lerna/cli" "3.18.5" - "@lerna/create" "3.22.0" - "@lerna/diff" "3.21.0" - "@lerna/exec" "3.21.0" - "@lerna/import" "3.22.0" - "@lerna/info" "3.21.0" - "@lerna/init" "3.21.0" - "@lerna/link" "3.21.0" - "@lerna/list" "3.21.0" - "@lerna/publish" "3.22.1" - "@lerna/run" "3.21.0" - "@lerna/version" "3.22.1" - import-local "^2.0.0" - npmlog "^4.1.2" +lerna@^7.1.4: + version "7.4.2" + resolved "https://registry.yarnpkg.com/lerna/-/lerna-7.4.2.tgz#03497125d7b7c8d463eebfe17a701b16bde2ad09" + integrity sha512-gxavfzHfJ4JL30OvMunmlm4Anw7d7Tq6tdVHzUukLdS9nWnxCN/QB21qR+VJYp5tcyXogHKbdUEGh6qmeyzxSA== + dependencies: + "@lerna/child-process" "7.4.2" + "@lerna/create" "7.4.2" + "@npmcli/run-script" "6.0.2" + "@nx/devkit" ">=16.5.1 < 17" + "@octokit/plugin-enterprise-rest" "6.0.1" + "@octokit/rest" "19.0.11" + byte-size "8.1.1" + chalk "4.1.0" + clone-deep "4.0.1" + cmd-shim "6.0.1" + columnify "1.6.0" + conventional-changelog-angular "7.0.0" + conventional-changelog-core "5.0.1" + conventional-recommended-bump "7.0.1" + cosmiconfig "^8.2.0" + dedent "0.7.0" + envinfo "7.8.1" + execa "5.0.0" + fs-extra "^11.1.1" + get-port "5.1.1" + get-stream "6.0.0" + git-url-parse "13.1.0" + glob-parent "5.1.2" + globby "11.1.0" + graceful-fs "4.2.11" + has-unicode "2.0.1" + import-local "3.1.0" + ini "^1.3.8" + init-package-json "5.0.0" + inquirer "^8.2.4" + is-ci "3.0.1" + is-stream "2.0.0" + jest-diff ">=29.4.3 < 30" + js-yaml "4.1.0" + libnpmaccess "7.0.2" + libnpmpublish "7.3.0" + load-json-file "6.2.0" + lodash "^4.17.21" + make-dir "4.0.0" + minimatch "3.0.5" + multimatch "5.0.0" + node-fetch "2.6.7" + npm-package-arg "8.1.1" + npm-packlist "5.1.1" + npm-registry-fetch "^14.0.5" + npmlog "^6.0.2" + nx ">=16.5.1 < 17" + p-map "4.0.0" + p-map-series "2.1.0" + p-pipe "3.1.0" + p-queue "6.6.2" + p-reduce "2.1.0" + p-waterfall "2.1.1" + pacote "^15.2.0" + pify "5.0.0" + read-cmd-shim "4.0.0" + read-package-json "6.0.4" + resolve-from "5.0.0" + rimraf "^4.4.1" + semver "^7.3.8" + signal-exit "3.0.7" + slash "3.0.0" + ssri "^9.0.1" + strong-log-transformer "2.1.0" + tar "6.1.11" + temp-dir "1.0.0" + typescript ">=3 < 6" + upath "2.0.1" + uuid "^9.0.0" + validate-npm-package-license "3.0.4" + validate-npm-package-name "5.0.0" + write-file-atomic "5.0.1" + write-pkg "4.0.0" + yargs "16.2.0" + yargs-parser "20.2.4" less@^3.0.3: version "3.13.1" @@ -9636,18 +9006,39 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" -levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= +libnpmaccess@7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/libnpmaccess/-/libnpmaccess-7.0.2.tgz#7f056c8c933dd9c8ba771fa6493556b53c5aac52" + integrity sha512-vHBVMw1JFMTgEk15zRsJuSAg7QtGGHpUSEfnbcRL1/gTBag9iEfJbyjpDmdJmwMhvpoLoNBtdAUCdGnaP32hhw== + dependencies: + npm-package-arg "^10.1.0" + npm-registry-fetch "^14.0.3" + +libnpmpublish@7.3.0: + version "7.3.0" + resolved "https://registry.yarnpkg.com/libnpmpublish/-/libnpmpublish-7.3.0.tgz#2ceb2b36866d75a6cd7b4aa748808169f4d17e37" + integrity sha512-fHUxw5VJhZCNSls0KLNEG0mCD2PN1i14gH5elGOgiVnU3VgTcRahagYP2LKI1m0tFCJ+XrAm0zVYyF5RCbXzcg== + dependencies: + ci-info "^3.6.1" + normalize-package-data "^5.0.0" + npm-package-arg "^10.1.0" + npm-registry-fetch "^14.0.3" + proc-log "^3.0.0" + semver "^7.3.7" + sigstore "^1.4.0" + ssri "^10.0.1" + +limiter@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/limiter/-/limiter-2.1.0.tgz#d38d7c5b63729bb84fb0c4d8594b7e955a5182a2" + integrity sha512-361TYz6iay6n+9KvUUImqdLuFigK+K79qrUtBsXhJTLdH4rIt/r1y8r1iozwh8KbZNpujbFTSh74mJ7bwbAMOw== dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" + just-performance "4.3.0" line-height@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/line-height/-/line-height-0.3.1.tgz#4b1205edde182872a5efa3c8f620b3187a9c54c9" - integrity sha1-SxIF7d4YKHKl76PI9iCzGHqcVMk= + integrity sha512-YExecgqPwnp5gplD2+Y8e8A5+jKpr25+DzMbFdI1/1UAr0FJrTFv4VkHLf8/6B590i1wUPJWMKKldkd/bdQ//w== dependencies: computed-style "~0.1.3" @@ -9656,6 +9047,11 @@ lines-and-columns@^1.1.6: resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== +lines-and-columns@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-2.0.4.tgz#d00318855905d2660d8c0822e3f5a4715855fc42" + integrity sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A== + linkify-it@^3.0.1: version "3.0.3" resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-3.0.3.tgz#a98baf44ce45a550efb4d49c769d07524cc2fa2e" @@ -9663,6 +9059,27 @@ linkify-it@^3.0.1: dependencies: uc.micro "^1.0.1" +lint-staged@^10.2.2: + version "10.5.4" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-10.5.4.tgz#cd153b5f0987d2371fc1d2847a409a2fe705b665" + integrity sha512-EechC3DdFic/TdOPgj/RB3FicqE6932LTHCUm0Y2fsD9KGlLB+RwJl2q1IYBIvEsKzDOgn0D4gll+YxG5RsrKg== + dependencies: + chalk "^4.1.0" + cli-truncate "^2.1.0" + commander "^6.2.0" + cosmiconfig "^7.0.0" + debug "^4.2.0" + dedent "^0.7.0" + enquirer "^2.3.6" + execa "^4.1.0" + listr2 "^3.2.2" + log-symbols "^4.0.0" + micromatch "^4.0.2" + normalize-path "^3.0.0" + please-upgrade-node "^3.2.0" + string-argv "0.3.1" + stringify-object "^3.3.0" + lint-staged@^11.0.0: version "11.2.6" resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-11.2.6.tgz#f477b1af0294db054e5937f171679df63baa4c43" @@ -9686,9 +9103,9 @@ lint-staged@^11.0.0: listenercount@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/listenercount/-/listenercount-1.0.1.tgz#84c8a72ab59c4725321480c975e6508342e70937" - integrity sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc= + integrity sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ== -listr2@^3.12.2: +listr2@^3.12.2, listr2@^3.2.2: version "3.14.0" resolved "https://registry.yarnpkg.com/listr2/-/listr2-3.14.0.tgz#23101cc62e1375fd5836b248276d1d2b51fdbe9e" integrity sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g== @@ -9702,56 +9119,44 @@ listr2@^3.12.2: through "^2.3.8" wrap-ansi "^7.0.0" -load-json-file@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" - integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= +load-json-file@6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-6.2.0.tgz#5c7770b42cafa97074ca2848707c61662f4251a1" + integrity sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ== dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - pinkie-promise "^2.0.0" - strip-bom "^2.0.0" + graceful-fs "^4.1.15" + parse-json "^5.0.0" + strip-bom "^4.0.0" + type-fest "^0.6.0" load-json-file@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" - integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= + integrity sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw== dependencies: graceful-fs "^4.1.2" parse-json "^4.0.0" pify "^3.0.0" strip-bom "^3.0.0" -load-json-file@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-5.3.0.tgz#4d3c1e01fa1c03ea78a60ac7af932c9ce53403f3" - integrity sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw== - dependencies: - graceful-fs "^4.1.15" - parse-json "^4.0.0" - pify "^4.0.1" - strip-bom "^3.0.0" - type-fest "^0.3.0" - loader-runner@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== loader-utils@^1.0.3: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" - integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== + version "1.4.2" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.2.tgz#29a957f3a63973883eb684f10ffd3d151fec01a3" + integrity sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg== dependencies: big.js "^5.2.2" emojis-list "^3.0.0" json5 "^1.0.1" -loader-utils@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.2.tgz#d6e3b4fb81870721ae4e0868ab11dd638368c129" - integrity sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A== +loader-utils@^2.0.0, loader-utils@^2.0.3, loader-utils@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" + integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== dependencies: big.js "^5.2.2" emojis-list "^3.0.0" @@ -9760,7 +9165,7 @@ loader-utils@^2.0.0: locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA== dependencies: p-locate "^2.0.0" path-exists "^3.0.0" @@ -9780,112 +9185,59 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" -lodash._reinterpolate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" - integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" lodash.camelcase@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" - integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= + integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== lodash.clonedeep@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" - integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= + integrity sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ== lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" - integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= + integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== lodash.escaperegexp@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz#64762c48618082518ac3df4ccf5d5886dae20347" - integrity sha1-ZHYsSGGAglGKw99Mz11YhtriA0c= - -lodash.get@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" - integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= + integrity sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw== lodash.isequal@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" - integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= + integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== lodash.ismatch@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz#756cb5150ca3ba6f11085a78849645f188f85f37" - integrity sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc= + integrity sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g== lodash.merge@^4.6.2: version "4.6.2" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lodash.set@^4.3.2: - version "4.3.2" - resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23" - integrity sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM= - -lodash.sortby@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" - integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= - -lodash.template@^4.0.2, lodash.template@^4.4.0, lodash.template@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" - integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== - dependencies: - lodash._reinterpolate "^3.0.0" - lodash.templatesettings "^4.0.0" - -lodash.templatesettings@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33" - integrity sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ== - dependencies: - lodash._reinterpolate "^3.0.0" - lodash.throttle@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" - integrity sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ= - -lodash.truncate@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" - integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= + integrity sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ== -lodash.uniq@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" - integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= - -lodash@^4.17.10, lodash@^4.17.12, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.4, lodash@^4.2.1: +lodash@^4.17.15, lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -log-ok@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/log-ok/-/log-ok-0.1.1.tgz#bea3dd36acd0b8a7240d78736b5b97c65444a334" - integrity sha1-vqPdNqzQuKckDXhza1uXxlREozQ= - dependencies: - ansi-green "^0.1.1" - success-symbol "^0.1.0" - -log-symbols@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4" - integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ== - dependencies: - chalk "^2.4.2" - -log-symbols@^4.1.0: +log-symbols@^4.0.0, log-symbols@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== @@ -9903,31 +9255,10 @@ log-update@^4.0.0: slice-ansi "^4.0.0" wrap-ansi "^6.2.0" -log-utils@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/log-utils/-/log-utils-0.2.1.tgz#a4c217a0dd9a50515d9b920206091ab3d4e031cf" - integrity sha1-pMIXoN2aUFFdm5ICBgkas9TgMc8= - dependencies: - ansi-colors "^0.2.0" - error-symbol "^0.1.0" - info-symbol "^0.1.0" - log-ok "^0.1.1" - success-symbol "^0.1.0" - time-stamp "^1.0.1" - warning-symbol "^0.1.0" - -logging-helpers@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/logging-helpers/-/logging-helpers-1.0.0.tgz#b5a37b32ad53eb0137c58c7898a47b175ddb7c36" - integrity sha512-qyIh2goLt1sOgQQrrIWuwkRjUx4NUcEqEGAcYqD8VOnOC6ItwkrVE8/tA4smGpjzyp4Svhc6RodDp9IO5ghpyA== - dependencies: - isobject "^3.0.0" - log-utils "^0.2.1" - -long@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" - integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== +long@^5.0.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/long/-/long-5.3.1.tgz#9d4222d3213f38a5ec809674834e0f0ab21abe96" + integrity sha512-ka87Jz3gcx/I7Hal94xaN2tZEOPoUOEVftkQqZx2EeQRN7LGdfLlI3FvZ+7WDplm+vK2Urx9ULrvSowtdCieng== loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" @@ -9936,20 +9267,12 @@ loose-envify@^1.1.0, loose-envify@^1.4.0: dependencies: js-tokens "^3.0.0 || ^4.0.0" -loud-rejection@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" - integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= - dependencies: - currently-unhandled "^0.4.1" - signal-exit "^3.0.0" - -loupe@^2.3.1: - version "2.3.4" - resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.4.tgz#7e0b9bffc76f148f9be769cb1321d3dcf3cb25f3" - integrity sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ== +loupe@^2.3.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.7.tgz#6e69b7d4db7d3ab436328013d37d1c8c3540c697" + integrity sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA== dependencies: - get-func-name "^2.0.0" + get-func-name "^2.0.1" lower-case@^2.0.2: version "2.0.2" @@ -9958,22 +9281,22 @@ lower-case@^2.0.2: dependencies: tslib "^2.0.3" -lowercase-keys@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" - integrity sha1-TjNms55/VFfjXxMkvfb4jQv8cwY= - -lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" - integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== - lowercase-keys@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== -lru-cache@^4.0.0, lru-cache@^4.0.1: +lowercase-keys@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-3.0.0.tgz#c5e7d442e37ead247ae9db117a9d0a467c89d4f2" + integrity sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ== + +lru-cache@^10.2.0: + version "10.4.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" + integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== + +lru-cache@^4.0.1: version "4.1.5" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== @@ -9995,10 +9318,10 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -lru-cache@^7.7.1: - version "7.10.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.10.1.tgz#db577f42a94c168f676b638d15da8fb073448cab" - integrity sha512-BQuhQxPuRl79J5zSXRP+uNzPOyZw2oFI9JLRQ80XswSvg21KMKNtQza9eF42rfI/3Z40RvzBdXgziEkudzjo8A== +lru-cache@^7.14.1, lru-cache@^7.4.4, lru-cache@^7.5.1, lru-cache@^7.7.1: + version "7.18.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" + integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== lzma-native@^8.0.5: version "8.0.6" @@ -10009,24 +9332,26 @@ lzma-native@^8.0.5: node-gyp-build "^4.2.1" readable-stream "^3.6.0" -macaddress@^0.2.9: - version "0.2.9" - resolved "https://registry.yarnpkg.com/macaddress/-/macaddress-0.2.9.tgz#3579b8b9acd5b96b4553abf0f394185a86813cb3" - integrity sha512-k4F1JUof6cQXxNFzx3thLby4oJzXTXQueAOOts944Vqizn+Rjc2QNFenT9FJSLU1CH3PmrHRSyZs2E+Cqw+P2w== +macaddress@^0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/macaddress/-/macaddress-0.5.3.tgz#2b9d6832be934cb775749f30f57d6537184a2bda" + integrity sha512-vGBKTA+jwM4KgjGZ+S/8/Mkj9rWzePyGY6jManXPGhiWu63RYwW8dKPyk5koP+8qNVhPhHgFa1y/MJ4wrjsNrg== -macos-release@^2.2.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-2.5.0.tgz#067c2c88b5f3fb3c56a375b2ec93826220fa1ff2" - integrity sha512-EIgv+QZ9r+814gjJj0Bt5vSLJLzswGmSUbUpbi9AIr/fsN2IWFBl2NucV9PAiek+U1STK468tEkxmVYUtuAN3g== +make-dir@4.0.0, make-dir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" + integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== + dependencies: + semver "^7.5.3" -make-dir@^1.0.0, make-dir@^1.2.0: +make-dir@^1.0.0: version "1.3.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== dependencies: pify "^3.0.0" -make-dir@^2.0.0, make-dir@^2.1.0: +make-dir@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== @@ -10034,7 +9359,7 @@ make-dir@^2.0.0, make-dir@^2.1.0: pify "^4.0.1" semver "^5.6.0" -make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: +make-dir@^3.0.2, make-dir@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== @@ -10042,9 +9367,9 @@ make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: semver "^6.0.0" make-fetch-happen@^10.0.3: - version "10.1.4" - resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-10.1.4.tgz#b68a64367d2c402f24edc48308ff193d11fc2618" - integrity sha512-hU1w68PqfH7FdMgjbiziJoACY0edlbIZ0CyKnpcEruVdCjsUrN+qoenOCIayNqVBK7toSWwbDxvQlrhH0gjRdg== + version "10.2.1" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz#f5e3835c5e9817b617f2770870d9492d28678164" + integrity sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w== dependencies: agentkeepalive "^4.2.1" cacache "^16.1.0" @@ -10060,69 +9385,34 @@ make-fetch-happen@^10.0.3: minipass-pipeline "^1.2.4" negotiator "^0.6.3" promise-retry "^2.0.1" - socks-proxy-agent "^6.1.1" + socks-proxy-agent "^7.0.0" ssri "^9.0.0" -make-fetch-happen@^5.0.0: - version "5.0.2" - resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-5.0.2.tgz#aa8387104f2687edca01c8687ee45013d02d19bd" - integrity sha512-07JHC0r1ykIoruKO8ifMXu+xEU8qOXDFETylktdug6vJDACnP+HKevOu3PXyNPzFyTSlz8vrBYlBO1JZRe8Cag== - dependencies: - agentkeepalive "^3.4.1" - cacache "^12.0.0" - http-cache-semantics "^3.8.1" - http-proxy-agent "^2.1.0" - https-proxy-agent "^2.2.3" - lru-cache "^5.1.1" - mississippi "^3.0.0" - node-fetch-npm "^2.0.2" - promise-retry "^1.1.1" - socks-proxy-agent "^4.0.0" - ssri "^6.0.0" - -make-fetch-happen@^9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz#53085a09e7971433e6765f7971bf63f4e05cb968" - integrity sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg== +make-fetch-happen@^11.0.0, make-fetch-happen@^11.0.1, make-fetch-happen@^11.1.1: + version "11.1.1" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz#85ceb98079584a9523d4bf71d32996e7e208549f" + integrity sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w== dependencies: - agentkeepalive "^4.1.3" - cacache "^15.2.0" - http-cache-semantics "^4.1.0" - http-proxy-agent "^4.0.1" + agentkeepalive "^4.2.1" + cacache "^17.0.0" + http-cache-semantics "^4.1.1" + http-proxy-agent "^5.0.0" https-proxy-agent "^5.0.0" is-lambda "^1.0.1" - lru-cache "^6.0.0" - minipass "^3.1.3" - minipass-collect "^1.0.2" - minipass-fetch "^1.3.2" + lru-cache "^7.7.1" + minipass "^5.0.0" + minipass-fetch "^3.0.0" minipass-flush "^1.0.5" minipass-pipeline "^1.2.4" - negotiator "^0.6.2" + negotiator "^0.6.3" promise-retry "^2.0.1" - socks-proxy-agent "^6.0.0" - ssri "^8.0.0" - -map-age-cleaner@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" - integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== - dependencies: - p-defer "^1.0.0" + socks-proxy-agent "^7.0.0" + ssri "^10.0.0" -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= - -map-obj@^1.0.0, map-obj@^1.0.1: +map-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" - integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= - -map-obj@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-2.0.0.tgz#a65cd29087a92598b8791257a523e021222ac1f9" - integrity sha1-plzSkIepJZi4eRJXpSPgISIqwfk= + integrity sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg== map-obj@^4.0.0: version "4.3.0" @@ -10132,14 +9422,7 @@ map-obj@^4.0.0: map-stream@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" - integrity sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ= - -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= - dependencies: - object-visit "^1.0.0" + integrity sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g== markdown-it@^12.3.2: version "12.3.2" @@ -10159,19 +9442,24 @@ matcher@^3.0.0: dependencies: escape-string-regexp "^4.0.0" +math-intrinsics@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" + integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== + mdast-util-definitions@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-5.1.0.tgz#b6d10ef00a3c4cf191e8d9a5fa58d7f4a366f817" - integrity sha512-5hcR7FL2EuZ4q6lLMUK5w4lHT2H3vqL9quPvYZ/Ku5iifrirfMHiGdhxdXMUbUkDmz5I+TYMd7nbaxUhbQkfpQ== + version "5.1.2" + resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz#9910abb60ac5d7115d6819b57ae0bcef07a3f7a7" + integrity sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA== dependencies: "@types/mdast" "^3.0.0" "@types/unist" "^2.0.0" - unist-util-visit "^3.0.0" + unist-util-visit "^4.0.0" mdast-util-from-markdown@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-1.2.0.tgz#84df2924ccc6c995dec1e2368b2b208ad0a76268" - integrity sha512-iZJyyvKD1+K7QX1b5jXdE7Sc5dtoTry1vzV28UZZe8Z1xVnB/czKntJ7ZAkG0tANqRnBF6p3p7GpU1y19DTf2Q== + version "1.3.1" + resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz#9421a5a247f10d31d2faed2a30df5ec89ceafcf0" + integrity sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww== dependencies: "@types/mdast" "^3.0.0" "@types/unist" "^2.0.0" @@ -10187,82 +9475,47 @@ mdast-util-from-markdown@^1.0.0: uvu "^0.5.0" mdast-util-to-hast@^12.1.0: - version "12.1.1" - resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-12.1.1.tgz#89a2bb405eaf3b05eb8bf45157678f35eef5dbca" - integrity sha512-qE09zD6ylVP14jV4mjLIhDBOrpFdShHZcEsYvvKGABlr9mGbV7mTlRWdoFxL/EYSTNDiC9GZXy7y8Shgb9Dtzw== + version "12.3.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz#045d2825fb04374e59970f5b3f279b5700f6fb49" + integrity sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw== dependencies: "@types/hast" "^2.0.0" "@types/mdast" "^3.0.0" - "@types/mdurl" "^1.0.0" mdast-util-definitions "^5.0.0" - mdurl "^1.0.0" - micromark-util-sanitize-uri "^1.0.0" - unist-builder "^3.0.0" + micromark-util-sanitize-uri "^1.1.0" + trim-lines "^3.0.0" unist-util-generated "^2.0.0" unist-util-position "^4.0.0" unist-util-visit "^4.0.0" mdast-util-to-string@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz#56c506d065fbf769515235e577b5a261552d56e9" - integrity sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA== + version "3.2.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz#66f7bb6324756741c5f47a53557f0cbf16b6f789" + integrity sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg== + dependencies: + "@types/mdast" "^3.0.0" -mdurl@^1.0.0, mdurl@^1.0.1: +mdurl@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" - integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4= + integrity sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g== media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= - -mem@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" - integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== - dependencies: - map-age-cleaner "^0.1.1" - mimic-fn "^2.0.0" - p-is-promise "^2.0.0" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== -"memoize-one@>=3.1.1 <6", memoize-one@^5.0.0: +"memoize-one@>=3.1.1 <6": version "5.2.1" resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.2.1.tgz#8337aa3c4335581839ec01c3d594090cebe8f00e" integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q== -meow@^3.3.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" - integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= - dependencies: - camelcase-keys "^2.0.0" - decamelize "^1.1.2" - loud-rejection "^1.0.0" - map-obj "^1.0.1" - minimist "^1.1.3" - normalize-package-data "^2.3.4" - object-assign "^4.0.1" - read-pkg-up "^1.0.1" - redent "^1.0.0" - trim-newlines "^1.0.0" - -meow@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/meow/-/meow-4.0.1.tgz#d48598f6f4b1472f35bf6317a95945ace347f975" - integrity sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A== - dependencies: - camelcase-keys "^4.0.0" - decamelize-keys "^1.0.0" - loud-rejection "^1.0.0" - minimist "^1.1.3" - minimist-options "^3.0.1" - normalize-package-data "^2.3.4" - read-pkg-up "^3.0.0" - redent "^2.0.0" - trim-newlines "^2.0.0" +memoize-one@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-6.0.0.tgz#b2591b871ed82948aee4727dc6abceeeac8c1045" + integrity sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw== -meow@^8.0.0: +meow@^8.1.2: version "8.1.2" resolved "https://registry.yarnpkg.com/meow/-/meow-8.1.2.tgz#bcbe45bda0ee1729d350c03cffc8395a36c4e897" integrity sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q== @@ -10279,17 +9532,24 @@ meow@^8.0.0: type-fest "^0.18.0" yargs-parser "^20.2.3" -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= +merge-descriptors@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5" + integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== + +merge-options@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/merge-options/-/merge-options-3.0.4.tgz#84709c2aa2a4b24c1981f66c179fe5565cc6dbb7" + integrity sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ== + dependencies: + is-plain-obj "^2.1.0" merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -merge2@^1.2.3, merge2@^1.3.0, merge2@^1.4.1: +merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== @@ -10297,12 +9557,12 @@ merge2@^1.2.3, merge2@^1.3.0, merge2@^1.4.1: methods@^1.1.2, methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== micromark-core-commonmark@^1.0.1: - version "1.0.6" - resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-1.0.6.tgz#edff4c72e5993d93724a3c206970f5a15b0585ad" - integrity sha512-K+PkJTxqjFfSNkfAhp4GB+cZPfQd6dxtTXnf+RjZOV7T4EEXnvgzOcnp+eSTmpGk9d1S9sL6/lqrgSNn/s0HZA== + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz#1386628df59946b2d39fb2edfd10f3e8e0a75bb8" + integrity sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw== dependencies: decode-named-character-reference "^1.0.0" micromark-factory-destination "^1.0.0" @@ -10322,18 +9582,18 @@ micromark-core-commonmark@^1.0.1: uvu "^0.5.0" micromark-factory-destination@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-1.0.0.tgz#fef1cb59ad4997c496f887b6977aa3034a5a277e" - integrity sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw== + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz#eb815957d83e6d44479b3df640f010edad667b9f" + integrity sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg== dependencies: micromark-util-character "^1.0.0" micromark-util-symbol "^1.0.0" micromark-util-types "^1.0.0" micromark-factory-label@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-1.0.2.tgz#6be2551fa8d13542fcbbac478258fb7a20047137" - integrity sha512-CTIwxlOnU7dEshXDQ+dsr2n+yxpP0+fn271pu0bwDIS8uqfFcumXpj5mLn3hSC8iw2MUr6Gx8EcKng1dD7i6hg== + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz#cc95d5478269085cfa2a7282b3de26eb2e2dec68" + integrity sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w== dependencies: micromark-util-character "^1.0.0" micromark-util-symbol "^1.0.0" @@ -10341,28 +9601,27 @@ micromark-factory-label@^1.0.0: uvu "^0.5.0" micromark-factory-space@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-1.0.0.tgz#cebff49968f2b9616c0fcb239e96685cb9497633" - integrity sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew== + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz#c8f40b0640a0150751d3345ed885a080b0d15faf" + integrity sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ== dependencies: micromark-util-character "^1.0.0" micromark-util-types "^1.0.0" micromark-factory-title@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-1.0.2.tgz#7e09287c3748ff1693930f176e1c4a328382494f" - integrity sha512-zily+Nr4yFqgMGRKLpTVsNl5L4PMu485fGFDOQJQBl2NFpjGte1e86zC0da93wf97jrc4+2G2GQudFMHn3IX+A== + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz#dd0fe951d7a0ac71bdc5ee13e5d1465ad7f50ea1" + integrity sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ== dependencies: micromark-factory-space "^1.0.0" micromark-util-character "^1.0.0" micromark-util-symbol "^1.0.0" micromark-util-types "^1.0.0" - uvu "^0.5.0" micromark-factory-whitespace@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-1.0.0.tgz#e991e043ad376c1ba52f4e49858ce0794678621c" - integrity sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A== + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz#798fb7489f4c8abafa7ca77eed6b5745853c9705" + integrity sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ== dependencies: micromark-factory-space "^1.0.0" micromark-util-character "^1.0.0" @@ -10370,48 +9629,48 @@ micromark-factory-whitespace@^1.0.0: micromark-util-types "^1.0.0" micromark-util-character@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-1.1.0.tgz#d97c54d5742a0d9611a68ca0cd4124331f264d86" - integrity sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg== + version "1.2.0" + resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-1.2.0.tgz#4fedaa3646db249bc58caeb000eb3549a8ca5dcc" + integrity sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg== dependencies: micromark-util-symbol "^1.0.0" micromark-util-types "^1.0.0" micromark-util-chunked@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-1.0.0.tgz#5b40d83f3d53b84c4c6bce30ed4257e9a4c79d06" - integrity sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g== + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz#37a24d33333c8c69a74ba12a14651fd9ea8a368b" + integrity sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ== dependencies: micromark-util-symbol "^1.0.0" micromark-util-classify-character@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-1.0.0.tgz#cbd7b447cb79ee6997dd274a46fc4eb806460a20" - integrity sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA== + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz#6a7f8c8838e8a120c8e3c4f2ae97a2bff9190e9d" + integrity sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw== dependencies: micromark-util-character "^1.0.0" micromark-util-symbol "^1.0.0" micromark-util-types "^1.0.0" micromark-util-combine-extensions@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.0.0.tgz#91418e1e74fb893e3628b8d496085639124ff3d5" - integrity sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA== + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz#192e2b3d6567660a85f735e54d8ea6e3952dbe84" + integrity sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA== dependencies: micromark-util-chunked "^1.0.0" micromark-util-types "^1.0.0" micromark-util-decode-numeric-character-reference@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.0.0.tgz#dcc85f13b5bd93ff8d2868c3dba28039d490b946" - integrity sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w== + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz#b1e6e17009b1f20bc652a521309c5f22c85eb1c6" + integrity sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw== dependencies: micromark-util-symbol "^1.0.0" micromark-util-decode-string@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/micromark-util-decode-string/-/micromark-util-decode-string-1.0.2.tgz#942252ab7a76dec2dbf089cc32505ee2bc3acf02" - integrity sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q== + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz#dc12b078cba7a3ff690d0203f95b5d5537f2809c" + integrity sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ== dependencies: decode-named-character-reference "^1.0.0" micromark-util-character "^1.0.0" @@ -10419,42 +9678,42 @@ micromark-util-decode-string@^1.0.0: micromark-util-symbol "^1.0.0" micromark-util-encode@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-1.0.1.tgz#2c1c22d3800870ad770ece5686ebca5920353383" - integrity sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA== + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz#92e4f565fd4ccb19e0dcae1afab9a173bbeb19a5" + integrity sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw== micromark-util-html-tag-name@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.0.0.tgz#75737e92fef50af0c6212bd309bc5cb8dbd489ed" - integrity sha512-NenEKIshW2ZI/ERv9HtFNsrn3llSPZtY337LID/24WeLqMzeZhBEE6BQ0vS2ZBjshm5n40chKtJ3qjAbVV8S0g== + version "1.2.0" + resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz#48fd7a25826f29d2f71479d3b4e83e94829b3588" + integrity sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q== micromark-util-normalize-identifier@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.0.0.tgz#4a3539cb8db954bbec5203952bfe8cedadae7828" - integrity sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg== + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz#7a73f824eb9f10d442b4d7f120fecb9b38ebf8b7" + integrity sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q== dependencies: micromark-util-symbol "^1.0.0" micromark-util-resolve-all@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-1.0.0.tgz#a7c363f49a0162e931960c44f3127ab58f031d88" - integrity sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw== + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz#4652a591ee8c8fa06714c9b54cd6c8e693671188" + integrity sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA== dependencies: micromark-util-types "^1.0.0" -micromark-util-sanitize-uri@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.0.0.tgz#27dc875397cd15102274c6c6da5585d34d4f12b2" - integrity sha512-cCxvBKlmac4rxCGx6ejlIviRaMKZc0fWm5HdCHEeDWRSkn44l6NdYVRyU+0nT1XC72EQJMZV8IPHF+jTr56lAg== +micromark-util-sanitize-uri@^1.0.0, micromark-util-sanitize-uri@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz#613f738e4400c6eedbc53590c67b197e30d7f90d" + integrity sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A== dependencies: micromark-util-character "^1.0.0" micromark-util-encode "^1.0.0" micromark-util-symbol "^1.0.0" micromark-util-subtokenize@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-1.0.2.tgz#ff6f1af6ac836f8bfdbf9b02f40431760ad89105" - integrity sha512-d90uqCnXp/cy4G881Ub4psE57Sf8YD0pim9QdjCRNjfas2M1u6Lbt+XZK9gnHL2XFhnozZiEdCa9CNfXSfQ6xA== + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz#941c74f93a93eaf687b9054aeb94642b0e92edb1" + integrity sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A== dependencies: micromark-util-chunked "^1.0.0" micromark-util-symbol "^1.0.0" @@ -10462,19 +9721,19 @@ micromark-util-subtokenize@^1.0.0: uvu "^0.5.0" micromark-util-symbol@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-1.0.1.tgz#b90344db62042ce454f351cf0bebcc0a6da4920e" - integrity sha512-oKDEMK2u5qqAptasDAwWDXq0tG9AssVwAx3E9bBF3t/shRIGsWIRG+cGafs2p/SnDSOecnt6hZPCE2o6lHfFmQ== + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz#813cd17837bdb912d069a12ebe3a44b6f7063142" + integrity sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag== micromark-util-types@^1.0.0, micromark-util-types@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-1.0.2.tgz#f4220fdb319205812f99c40f8c87a9be83eded20" - integrity sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w== + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-1.1.0.tgz#e6676a8cae0bb86a2171c498167971886cb7e283" + integrity sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg== micromark@^3.0.0: - version "3.0.10" - resolved "https://registry.yarnpkg.com/micromark/-/micromark-3.0.10.tgz#1eac156f0399d42736458a14b0ca2d86190b457c" - integrity sha512-ryTDy6UUunOXy2HPjelppgJ2sNfcPz1pLlMdA6Rz9jPzhLikWXv/irpWV/I2jd68Uhmny7hHxAlAhk4+vWggpg== + version "3.2.0" + resolved "https://registry.yarnpkg.com/micromark/-/micromark-3.2.0.tgz#1af9fef3f995ea1ea4ac9c7e2f19c48fd5c006e9" + integrity sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA== dependencies: "@types/debug" "^4.0.0" debug "^4.0.0" @@ -10494,61 +9753,42 @@ micromark@^3.0.0: micromark-util-types "^1.0.1" uvu "^0.5.0" -micromatch@^3.1.10, micromatch@^3.1.4: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" - -micromatch@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== +micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5, micromatch@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== dependencies: - braces "^3.0.2" + braces "^3.0.3" picomatch "^2.3.1" -mime-db@1.52.0, mime-db@^1.28.0: +mime-db@1.52.0: version "1.52.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.1.12, mime-types@^2.1.25, mime-types@^2.1.27, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: +mime-db@^1.28.0: + version "1.53.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.53.0.tgz#3cb63cd820fc29896d9d4e8c32ab4fcd74ccb447" + integrity sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg== + +mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" -mime@1.6.0, mime@^1.4.1: +mime@1.6.0, mime@^1.4.1, mime@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== -mime@^2.0.3, mime@^2.4.4, mime@^2.4.6: +mime@2.6.0, mime@^2.4.4, mime@^2.5.2: version "2.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== -mimic-fn@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" - integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== - -mimic-fn@^2.0.0, mimic-fn@^2.1.0: +mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== @@ -10558,7 +9798,12 @@ mimic-fn@^3.0.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-3.1.0.tgz#65755145bbf3e36954b949c16450427451d5ca74" integrity sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ== -mimic-response@^1.0.0, mimic-response@^1.0.1: +mimic-fn@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" + integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== + +mimic-response@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== @@ -10573,34 +9818,61 @@ mimic-response@^3.1.0: resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== +mimic-response@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-4.0.0.tgz#35468b19e7c75d10f5165ea25e75a5ceea7cf70f" + integrity sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg== + min-indent@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== +mini-css-extract-plugin@^2.6.1: + version "2.9.2" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz#966031b468917a5446f4c24a80854b2947503c5b" + integrity sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w== + dependencies: + schema-utils "^4.0.0" + tapable "^2.2.1" + minimalistic-assert@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== -minimatch@3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== +minimatch@3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.5.tgz#4da8f1290ee0f0f8e83d60ca69f8f134068604a3" + integrity sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw== dependencies: brace-expansion "^1.1.7" -minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" -minimatch@^5.0.1: - version "5.1.0" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.0.tgz#1717b464f4971b144f6aabe8f2d0b8e4511e09c7" - integrity sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg== +minimatch@^5.0.1, minimatch@^5.1.0, minimatch@^5.1.1, minimatch@^5.1.6: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^8.0.2: + version "8.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-8.0.4.tgz#847c1b25c014d4e9a7f68aaf63dedd668a626229" + integrity sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^9.0.0, minimatch@^9.0.4: + version "9.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== dependencies: brace-expansion "^2.0.1" @@ -10613,18 +9885,10 @@ minimist-options@4.1.0: is-plain-obj "^1.1.0" kind-of "^6.0.3" -minimist-options@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-3.0.2.tgz#fba4c8191339e13ecf4d61beb03f070103f3d954" - integrity sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ== - dependencies: - arrify "^1.0.1" - is-plain-obj "^1.1.0" - -minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5, minimist@^1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" - integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== +minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== minipass-collect@^1.0.2: version "1.0.2" @@ -10633,23 +9897,23 @@ minipass-collect@^1.0.2: dependencies: minipass "^3.0.0" -minipass-fetch@^1.3.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-1.4.1.tgz#d75e0091daac1b0ffd7e9d41629faff7d0c1f1b6" - integrity sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw== +minipass-fetch@^2.0.3: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-2.1.2.tgz#95560b50c472d81a3bc76f20ede80eaed76d8add" + integrity sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA== dependencies: - minipass "^3.1.0" + minipass "^3.1.6" minipass-sized "^1.0.3" - minizlib "^2.0.0" + minizlib "^2.1.2" optionalDependencies: - encoding "^0.1.12" + encoding "^0.1.13" -minipass-fetch@^2.0.3: - version "2.1.0" - resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-2.1.0.tgz#ca1754a5f857a3be99a9271277246ac0b44c3ff8" - integrity sha512-H9U4UVBGXEyyWJnqYDCLp1PwD8XIkJ4akNHp1aGVI+2Ym7wQMlxDKi4IB4JbmyU+pl9pEs/cVrK6cOuvmbK4Sg== +minipass-fetch@^3.0.0: + version "3.0.5" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-3.0.5.tgz#f0f97e40580affc4a35cc4a1349f05ae36cb1e4c" + integrity sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg== dependencies: - minipass "^3.1.6" + minipass "^7.0.3" minipass-sized "^1.0.3" minizlib "^2.1.2" optionalDependencies: @@ -10662,7 +9926,15 @@ minipass-flush@^1.0.5: dependencies: minipass "^3.0.0" -minipass-pipeline@^1.2.2, minipass-pipeline@^1.2.4: +minipass-json-stream@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/minipass-json-stream/-/minipass-json-stream-1.0.2.tgz#5121616c77a11c406c3ffa77509e0b77bb267ec3" + integrity sha512-myxeeTm57lYs8pH2nxPzmEEg8DGIgW+9mv6D4JZD2pa81I/OBjeU7PtICXV6c9eRGTA5JMDsuIPUZRCyBMYNhg== + dependencies: + jsonparse "^1.3.1" + minipass "^3.0.0" + +minipass-pipeline@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== @@ -10676,29 +9948,29 @@ minipass-sized@^1.0.3: dependencies: minipass "^3.0.0" -minipass@^2.3.5, minipass@^2.6.0, minipass@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" - integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== - dependencies: - safe-buffer "^5.1.2" - yallist "^3.0.0" - -minipass@^3.0.0, minipass@^3.1.0, minipass@^3.1.1, minipass@^3.1.3, minipass@^3.1.6: - version "3.1.6" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.6.tgz#3b8150aa688a711a1521af5e8779c1d3bb4f45ee" - integrity sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ== +minipass@^3.0.0, minipass@^3.1.1, minipass@^3.1.6: + version "3.3.6" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" + integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== dependencies: yallist "^4.0.0" -minizlib@^1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" - integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== - dependencies: - minipass "^2.9.0" +minipass@^4.2.4: + version "4.2.8" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.2.8.tgz#f0010f64393ecfc1d1ccb5f582bcaf45f48e1a3a" + integrity sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ== + +minipass@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" + integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== + +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.3, minipass@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" + integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== -minizlib@^2.0.0, minizlib@^2.1.1, minizlib@^2.1.2: +minizlib@^2.1.1, minizlib@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== @@ -10706,135 +9978,84 @@ minizlib@^2.0.0, minizlib@^2.1.1, minizlib@^2.1.2: minipass "^3.0.0" yallist "^4.0.0" -mississippi@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" - integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== - dependencies: - concat-stream "^1.5.0" - duplexify "^3.4.2" - end-of-stream "^1.1.0" - flush-write-stream "^1.0.0" - from2 "^2.1.0" - parallel-transform "^1.1.0" - pump "^3.0.0" - pumpify "^1.3.3" - stream-each "^1.1.0" - through2 "^2.0.0" - -mixin-deep@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" - integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" +mitt@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/mitt/-/mitt-3.0.1.tgz#ea36cf0cc30403601ae074c8f77b7092cdab36d1" + integrity sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw== mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: version "0.5.3" resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== -mkdirp-promise@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz#e9b8f68e552c68a9c1713b84883f7a1dd039b8a1" - integrity sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE= +"mkdirp@>=0.5 0", mkdirp@^0.5.1, mkdirp@^0.5.4, mkdirp@^0.5.6: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== dependencies: - mkdirp "*" + minimist "^1.2.6" -mkdirp@*, mkdirp@^1.0.3, mkdirp@^1.0.4: +mkdirp@^1.0.3, mkdirp@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== -mkdirp@0.5.5: - version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== - dependencies: - minimist "^1.2.5" - -"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.4, mkdirp@^0.5.5: - version "0.5.6" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" - integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== +mocha@^10.1.0, mocha@^10.2.0: + version "10.8.2" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.8.2.tgz#8d8342d016ed411b12a429eb731b825f961afb96" + integrity sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg== dependencies: - minimist "^1.2.6" - -mocha@^7.0.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-7.2.0.tgz#01cc227b00d875ab1eed03a75106689cfed5a604" - integrity sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ== - dependencies: - ansi-colors "3.2.3" - browser-stdout "1.3.1" - chokidar "3.3.0" - debug "3.2.6" - diff "3.5.0" - escape-string-regexp "1.0.5" - find-up "3.0.0" - glob "7.1.3" - growl "1.10.5" - he "1.2.0" - js-yaml "3.13.1" - log-symbols "3.0.0" - minimatch "3.0.4" - mkdirp "0.5.5" - ms "2.1.1" - node-environment-flags "1.0.6" - object.assign "4.1.0" - strip-json-comments "2.0.1" - supports-color "6.0.0" - which "1.3.1" - wide-align "1.1.3" - yargs "13.3.2" - yargs-parser "13.1.2" - yargs-unparser "1.6.0" + ansi-colors "^4.1.3" + browser-stdout "^1.3.1" + chokidar "^3.5.3" + debug "^4.3.5" + diff "^5.2.0" + escape-string-regexp "^4.0.0" + find-up "^5.0.0" + glob "^8.1.0" + he "^1.2.0" + js-yaml "^4.1.0" + log-symbols "^4.1.0" + minimatch "^5.1.6" + ms "^2.1.3" + serialize-javascript "^6.0.2" + strip-json-comments "^3.1.1" + supports-color "^8.1.1" + workerpool "^6.5.1" + yargs "^16.2.0" + yargs-parser "^20.2.9" + yargs-unparser "^2.0.0" mockdate@^3.0.5: version "3.0.5" resolved "https://registry.yarnpkg.com/mockdate/-/mockdate-3.0.5.tgz#789be686deb3149e7df2b663d2bc4392bc3284fb" integrity sha512-iniQP4rj1FhBdBYS/+eQv7j1tadJ9lJtdzgOpvsOHng/GbcDh2Fhdeq+ZRldrPYdXvCyfFUmFeEwEGXZB5I/AQ== -modify-values@^1.0.0: +modify-values@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" integrity sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw== -moment@^2.18.1, moment@^2.24.0: - version "2.29.3" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.3.tgz#edd47411c322413999f7a5940d526de183c031f3" - integrity sha512-c6YRvhEo//6T2Jz/vVtYzqBzwvPT95JBQ+smCytzf7c50oMZRsR/a4w88aD34I+/QVSfnoAnSBFPJHItlOMJVw== +moment@^2.24.0, moment@^2.25.3: + version "2.30.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.30.1.tgz#f8c91c07b7a786e30c59926df530b4eac96974ae" + integrity sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how== mount-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/mount-point/-/mount-point-3.0.0.tgz#665cb9edebe80d110e658db56c31d0aef51a8f97" - integrity sha1-Zly57evoDREOZY21bDHQrvUaj5c= + integrity sha512-jAhfD7ZCG+dbESZjcY1SdFVFqSJkh/yGbdsifHcPkvuLRO5ugK0Ssmd9jdATu29BTd4JiN+vkpMzVvsUgP3SZA== dependencies: "@sindresorhus/df" "^1.0.1" pify "^2.3.0" pinkie-promise "^2.0.1" -move-concurrently@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" - integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= - dependencies: - aproba "^1.1.1" - copy-concurrently "^1.0.0" - fs-write-stream-atomic "^1.0.8" - mkdirp "^0.5.1" - rimraf "^2.5.4" - run-queue "^1.0.3" - -move-file@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/move-file/-/move-file-1.2.0.tgz#789f92d276c62511d214b1b285aa16e015c2f2fc" - integrity sha512-USHrRmxzGowUWAGBbJPdFjHzEqtxDU03pLHY0Rfqgtnq+q8FOIs8wvkkf+Udmg77SJKs47y9sI0jJvQeYsmiCA== +move-file@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/move-file/-/move-file-2.1.0.tgz#3bec9d34fbe4832df6865f112cda4492b56e8507" + integrity sha512-i9qLW6gqboJ5Ht8bauZi7KlTnQ3QFpBCvMvFfEcHADKgHGeJ9BZMO7SFCTwHPV9Qa0du9DYY1Yx3oqlGt30nXA== dependencies: - cp-file "^6.1.0" - make-dir "^3.0.0" - path-exists "^3.0.0" + path-exists "^4.0.0" mri@^1.1.0: version "1.2.0" @@ -10844,103 +10065,86 @@ mri@^1.1.0: ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= - -ms@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" - integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== -ms@2.1.3, ms@^2.0.0, ms@^2.1.1: +ms@2.1.3, ms@^2.0.0, ms@^2.1.1, ms@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -multer@^1.4.2: - version "1.4.4" - resolved "https://registry.yarnpkg.com/multer/-/multer-1.4.4.tgz#e2bc6cac0df57a8832b858d7418ccaa8ebaf7d8c" - integrity sha512-2wY2+xD4udX612aMqMcB8Ws2Voq6NIUPEtD1be6m411T4uDH/VtL9i//xvcyFlTVfRdaBsk7hV5tgrGQqhuBiw== +msgpackr-extract@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz#e9d87023de39ce714872f9e9504e3c1996d61012" + integrity sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA== + dependencies: + node-gyp-build-optional-packages "5.2.2" + optionalDependencies: + "@msgpackr-extract/msgpackr-extract-darwin-arm64" "3.0.3" + "@msgpackr-extract/msgpackr-extract-darwin-x64" "3.0.3" + "@msgpackr-extract/msgpackr-extract-linux-arm" "3.0.3" + "@msgpackr-extract/msgpackr-extract-linux-arm64" "3.0.3" + "@msgpackr-extract/msgpackr-extract-linux-x64" "3.0.3" + "@msgpackr-extract/msgpackr-extract-win32-x64" "3.0.3" + +msgpackr@^1.10.1, msgpackr@^1.10.2: + version "1.11.2" + resolved "https://registry.yarnpkg.com/msgpackr/-/msgpackr-1.11.2.tgz#4463b7f7d68f2e24865c395664973562ad24473d" + integrity sha512-F9UngXRlPyWCDEASDpTf6c9uNhGPTqnTeLVt7bN+bU1eajoR/8V9ys2BRaV5C/e5ihE6sJ9uPIKaYt6bFuO32g== + optionalDependencies: + msgpackr-extract "^3.0.2" + +multer@1.4.4-lts.1: + version "1.4.4-lts.1" + resolved "https://registry.yarnpkg.com/multer/-/multer-1.4.4-lts.1.tgz#24100f701a4611211cfae94ae16ea39bb314e04d" + integrity sha512-WeSGziVj6+Z2/MwQo3GvqzgR+9Uc+qt8SwHKh3gvNPiISKfsMfG4SvCOFYlxxgkXt7yIV2i1yczehm0EOKIxIg== dependencies: append-field "^1.0.0" - busboy "^0.2.11" + busboy "^1.0.0" concat-stream "^1.5.2" mkdirp "^0.5.4" object-assign "^4.1.1" - on-finished "^2.3.0" type-is "^1.6.4" xtend "^4.0.0" -multimatch@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-3.0.0.tgz#0e2534cc6bc238d9ab67e1b9cd5fcd85a6dbf70b" - integrity sha512-22foS/gqQfANZ3o+W7ST2x25ueHDVNWl/b9OlGcLpy/iKxjCpvcNCM51YCenUi7Mt/jAjjqv8JwZRs8YP5sRjA== +multimatch@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-5.0.0.tgz#932b800963cea7a31a033328fa1e0c3a1874dbe6" + integrity sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA== dependencies: - array-differ "^2.0.3" - array-union "^1.0.2" - arrify "^1.0.1" + "@types/minimatch" "^3.0.3" + array-differ "^3.0.0" + array-union "^2.1.0" + arrify "^2.0.1" minimatch "^3.0.4" -mute-stream@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" - integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= - -mute-stream@~0.0.4: +mute-stream@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== -mz@^2.5.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" - integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== - dependencies: - any-promise "^1.0.0" - object-assign "^4.0.1" - thenify-all "^1.0.0" +mute-stream@^1.0.0, mute-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-1.0.0.tgz#e31bd9fe62f0aed23520aa4324ea6671531e013e" + integrity sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA== -nan@^2.14.0: - version "2.15.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee" - integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ== +nan@^2.14.0, nan@^2.17.0: + version "2.22.2" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.22.2.tgz#6b504fd029fb8f38c0990e52ad5c26772fdacfbb" + integrity sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ== -nano@^9.0.5: - version "9.0.5" - resolved "https://registry.yarnpkg.com/nano/-/nano-9.0.5.tgz#2b767819f612907a3ac09b21f2929d4097407262" - integrity sha512-fEAhwAdXh4hDDnC8cYJtW6D8ivOmpvFAqT90+zEuQREpRkzA/mJPcI4EKv15JUdajaqiLTXNoKK6PaRF+/06DQ== +nano@^10.1.3: + version "10.1.4" + resolved "https://registry.yarnpkg.com/nano/-/nano-10.1.4.tgz#cb4cabd677733ddb81c88c1b8635101e2d84e926" + integrity sha512-bJOFIPLExIbF6mljnfExXX9Cub4W0puhDjVMp+qV40xl/DBvgKao7St4+6/GB6EoHZap7eFnrnx4mnp5KYgwJA== dependencies: - "@types/tough-cookie" "^4.0.0" - axios "^0.21.1" - axios-cookiejar-support "^1.0.1" - qs "^6.9.4" - tough-cookie "^4.0.0" + axios "^1.7.4" + node-abort-controller "^3.1.1" + qs "^6.13.0" -nanoid@^3.3.4: - version "3.3.4" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" - integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== - -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" +nanoid@^3.3.8: + version "3.3.9" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.9.tgz#e0097d8e026b3343ff053e9ccd407360a03f503a" + integrity sha512-SppoicMGpZvbF1l3z4x7No3OlIjP7QJvC9XR7AhZr1kL133KHnKPztkKDc+Ir4aJ/1VhTySrtKhrsycmrMQfvg== napi-build-utils@^1.0.1: version "1.0.2" @@ -10953,50 +10157,51 @@ native-keymap@^2.2.1: integrity sha512-EfdMpTcX40mlHBJSWidFV4WLpwwaebK3D3JFuO/42voOAnG2WHgDdg6JerbqcxXvRhvIg934GV+9PjB3jzfu9A== native-request@^1.0.5: - version "1.1.0" - resolved "https://registry.yarnpkg.com/native-request/-/native-request-1.1.0.tgz#acdb30fe2eefa3e1bc8c54b3a6852e9c5c0d3cb0" - integrity sha512-uZ5rQaeRn15XmpgE0xoPL8YWqcX90VtCFglYwAgkvKM5e8fog+vePLAhHxuuv/gRkrQxIeh5U3q9sMNUrENqWw== + version "1.1.2" + resolved "https://registry.yarnpkg.com/native-request/-/native-request-1.1.2.tgz#b677952757429db6cd41972a29c3b781977413ed" + integrity sha512-/etjwrK0J4Ebbcnt35VMWnfiUX/B04uwGJxyJInagxDqf2z5drSt/lsOvEMWGYunz1kaLZAFrV4NDAbOoDKvAQ== + +natural-compare-lite@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" + integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== ncp@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ncp/-/ncp-2.0.0.tgz#195a21d6c46e361d2fb1281ba38b91e9df7bdbb3" - integrity sha1-GVoh1sRuNh0vsSgbo4uR6d9727M= + integrity sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA== -negotiator@0.6.3, negotiator@^0.6.2, negotiator@^0.6.3: +negotiator@0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== +negotiator@^0.6.3: + version "0.6.4" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.4.tgz#777948e2452651c570b712dd01c23e262713fff7" + integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w== + neo-async@^2.6.0, neo-async@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== -nested-error-stacks@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/nested-error-stacks/-/nested-error-stacks-2.1.1.tgz#26c8a3cee6cc05fbcf1e333cd2fc3e003326c0b5" - integrity sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw== - -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== +netmask@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/netmask/-/netmask-2.0.2.tgz#8b01a07644065d536383835823bc52004ebac5e7" + integrity sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg== -nise@^5.1.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/nise/-/nise-5.1.1.tgz#ac4237e0d785ecfcb83e20f389185975da5c31f3" - integrity sha512-yr5kW2THW1AkxVmCnKEh4nbYkJdB3I7LUkiUgOvEkOp414mc2UMaHMA7pjq1nYowhdoJZGwEKGaQVbxfpWj10A== +nice-grpc-common@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/nice-grpc-common/-/nice-grpc-common-2.0.2.tgz#e6aeebb2bd19d87114b351e291e30d79dd38acf7" + integrity sha512-7RNWbls5kAL1QVUOXvBsv1uO0wPQK3lHv+cY1gwkTzirnG1Nop4cBJZubpgziNbaVc/bl9QJcyvsf/NQxa3rjQ== dependencies: - "@sinonjs/commons" "^1.8.3" - "@sinonjs/fake-timers" ">=5" - "@sinonjs/text-encoding" "^0.7.1" - just-extend "^4.0.2" - path-to-regexp "^1.7.0" + ts-error "^1.0.6" no-case@^3.0.4: version "3.0.4" @@ -11006,10 +10211,10 @@ no-case@^3.0.4: lower-case "^2.0.2" tslib "^2.0.3" -node-abi@*: - version "3.5.0" - resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.5.0.tgz#26e8b7b251c3260a5ac5ba5aef3b4345a0229248" - integrity sha512-LtHvNIBgOy5mO8mPEUtkCW/YCRWYEKshIvqhe1GHHyXEHEB5mgICyYnAcl4qan3uFeRROErKGzatFHPf6kDxWw== +node-abi@*, node-abi@^3.0.0: + version "3.74.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.74.0.tgz#5bfb4424264eaeb91432d2adb9da23c63a301ed0" + integrity sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w== dependencies: semver "^7.3.5" @@ -11020,27 +10225,30 @@ node-abi@^2.21.0, node-abi@^2.7.0: dependencies: semver "^5.4.1" -node-abi@^3.0.0, node-abi@^3.3.0: - version "3.15.0" - resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.15.0.tgz#cd9ac8c58328129b49998cc6fa16aa5506152716" - integrity sha512-Ic6z/j6I9RLm4ov7npo1I48UQr2BEyFCqh6p7S1dhEx9jPO0GPGq/e2Rb7x7DroQrmiVMz/Bw1vJm9sPAl2nxA== - dependencies: - semver "^7.3.5" +node-abort-controller@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/node-abort-controller/-/node-abort-controller-3.1.1.tgz#a94377e964a9a37ac3976d848cb5c765833b8548" + integrity sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ== -node-addon-api@*: - version "5.0.0" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-5.0.0.tgz#7d7e6f9ef89043befdb20c1989c905ebde18c501" - integrity sha512-CvkDw2OEnme7ybCykJpVcKH+uAOLV2qLqiyla128dN9TkEWfrYmxG6C2boDe5KcNQqZF3orkqzGgOMvZ/JNekA== +node-addon-api@^1.6.3: + version "1.7.2" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-1.7.2.tgz#3df30b95720b53c24e59948b49532b662444f54d" + integrity sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg== -node-addon-api@^3.0.0, node-addon-api@^3.1.0: +node-addon-api@^3.0.0, node-addon-api@^3.1.0, node-addon-api@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== -node-addon-api@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-4.3.0.tgz#52a1a0b475193e0928e98e0426a0d1254782b77f" - integrity sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ== +node-addon-api@^7.0.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-7.1.1.tgz#1aba6693b0f255258a049d621329329322aad558" + integrity sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ== + +node-addon-api@^8.2.0: + version "8.3.1" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-8.3.1.tgz#53bc8a4f8dbde3de787b9828059da94ba9fd4eed" + integrity sha512-lytcDEdxKjGJPTLEfW4mYMigRezMlyJY8W4wxJK8zE533Jlb8L8dRuObJFWg2P+AuOIxoCgKF+2Oq4d4Zd0OUA== node-api-version@^0.1.4: version "0.1.4" @@ -11049,113 +10257,100 @@ node-api-version@^0.1.4: dependencies: semver "^7.3.5" -node-environment-flags@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.6.tgz#a30ac13621f6f7d674260a54dede048c3982c088" - integrity sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw== - dependencies: - object.getownpropertydescriptors "^2.0.3" - semver "^5.7.0" - -node-fetch-npm@^2.0.2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/node-fetch-npm/-/node-fetch-npm-2.0.4.tgz#6507d0e17a9ec0be3bec516958a497cec54bf5a4" - integrity sha512-iOuIQDWDyjhv9qSDrj9aq/klt6F9z1p2otB3AV7v3zBDcL/x+OfGsvGQZZCcMZbUf4Ujw1xGNQkjvGnVT22cKg== - dependencies: - encoding "^0.1.11" - json-parse-better-errors "^1.0.0" - safe-buffer "^5.1.1" +node-domexception@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5" + integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ== -node-fetch@^2.5.0, node-fetch@^2.6.1, node-fetch@^2.6.7: +node-fetch@2.6.7: version "2.6.7" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== dependencies: whatwg-url "^5.0.0" -node-gyp-build@^4.2.1: - version "4.4.0" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.4.0.tgz#42e99687ce87ddeaf3a10b99dc06abc11021f3f4" - integrity sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ== +node-fetch@^2.6.1, node-fetch@^2.6.7, node-fetch@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== + dependencies: + whatwg-url "^5.0.0" -node-gyp@^5.0.2: - version "5.1.1" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-5.1.1.tgz#eb915f7b631c937d282e33aed44cb7a025f62a3e" - integrity sha512-WH0WKGi+a4i4DUt2mHnvocex/xPLp9pYt5R6M2JdFB7pJ7Z34hveZ4nDTGTiLXCkitA9T8HFZjhinBCiVHYcWw== +node-fetch@^3.2.10: + version "3.3.2" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-3.3.2.tgz#d1e889bacdf733b4ff3b2b243eb7a12866a0b78b" + integrity sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA== dependencies: - env-paths "^2.2.0" - glob "^7.1.4" - graceful-fs "^4.2.2" - mkdirp "^0.5.1" - nopt "^4.0.1" - npmlog "^4.1.2" - request "^2.88.0" - rimraf "^2.6.3" - semver "^5.7.1" - tar "^4.4.12" - which "^1.3.1" + data-uri-to-buffer "^4.0.0" + fetch-blob "^3.1.4" + formdata-polyfill "^4.0.10" -node-gyp@^8.4.0: - version "8.4.1" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-8.4.1.tgz#3d49308fc31f768180957d6b5746845fbd429937" - integrity sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w== +node-gyp-build-optional-packages@5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz#522f50c2d53134d7f3a76cd7255de4ab6c96a3a4" + integrity sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw== dependencies: - env-paths "^2.2.0" - glob "^7.1.4" - graceful-fs "^4.2.6" - make-fetch-happen "^9.1.0" - nopt "^5.0.0" - npmlog "^6.0.0" - rimraf "^3.0.2" - semver "^7.3.5" - tar "^6.1.2" - which "^2.0.2" + detect-libc "^2.0.1" -node-gyp@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-9.0.0.tgz#e1da2067427f3eb5bb56820cb62bc6b1e4bd2089" - integrity sha512-Ma6p4s+XCTPxCuAMrOA/IJRmVy16R8Sdhtwl4PrCr7IBlj4cPawF0vg/l7nOT1jPbuNS7lIRJpBSvVsXwEZuzw== +node-gyp-build@^4.2.1, node-gyp-build@^4.3.0: + version "4.8.4" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.4.tgz#8a70ee85464ae52327772a90d66c6077a900cfc8" + integrity sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ== + +node-gyp@^9.0.0, node-gyp@^9.3.0: + version "9.4.1" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-9.4.1.tgz#8a1023e0d6766ecb52764cc3a734b36ff275e185" + integrity sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ== dependencies: env-paths "^2.2.0" + exponential-backoff "^3.1.1" glob "^7.1.4" graceful-fs "^4.2.6" make-fetch-happen "^10.0.3" - nopt "^5.0.0" + nopt "^6.0.0" npmlog "^6.0.0" rimraf "^3.0.2" semver "^7.3.5" tar "^6.1.2" which "^2.0.2" -node-pty@0.11.0-beta17: - version "0.11.0-beta17" - resolved "https://registry.yarnpkg.com/node-pty/-/node-pty-0.11.0-beta17.tgz#7df6a60dced6bf7a3a282b65cf51980c68954af6" - integrity sha512-JALo4LgYKmzmmXI23CIfS6DpCuno647YJpNg3RT6jCKTHWrt+RHeB6JAlb/pJG9dFNSeaiIAWD+0waEg2AzlfA== +node-loader@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/node-loader/-/node-loader-2.1.0.tgz#8c4eb926e8bdcacb7349d17b40ebcc49fd2458d5" + integrity sha512-OwjPkyh8+7jW8DMd/iq71uU1Sspufr/C2+c3t0p08J3CrM9ApZ4U53xuisNrDXOHyGi5OYHgtfmmh+aK9zJA6g== dependencies: - nan "^2.14.0" + loader-utils "^2.0.3" -node-releases@^2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.4.tgz#f38252370c43854dc48aa431c766c6c398f40476" - integrity sha512-gbMzqQtTtDz/00jQzZ21PQzdI9PyLYqUSvD0p3naOhX4odFji0ZxYdnVwPTxmSwkmxhcFImpozceidSG+AgoPQ== +node-log-rotate@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/node-log-rotate/-/node-log-rotate-0.1.5.tgz#9a26e466b5892fa03705f5b00acca761298fe292" + integrity sha512-JKc6xqokIWvKf0ew7Rkk/6vV1Mj34UL5C6PqYhim30rwljCziR842RAtSLyA7khQcx4j0I2n0UiqG3pnENKRnQ== + dependencies: + lint-staged "^10.2.2" + lodash "^4.17.15" + moment "^2.25.3" + +node-machine-id@1.1.12: + version "1.1.12" + resolved "https://registry.yarnpkg.com/node-machine-id/-/node-machine-id-1.1.12.tgz#37904eee1e59b320bb9c5d6c0a59f3b469cb6267" + integrity sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ== + +node-pty@0.11.0-beta24: + version "0.11.0-beta24" + resolved "https://registry.yarnpkg.com/node-pty/-/node-pty-0.11.0-beta24.tgz#084841017187656edaf14b459946c4a1d7cf8392" + integrity sha512-CzItw3hitX+wnpw9dHA/A+kcbV7ETNKrsyQJ+s0ZGzsu70+CSGuIGPLPfMnAc17vOrQktxjyRQfaqij75GVJFw== + dependencies: + nan "^2.17.0" -node-uuid@^1.4.8: - version "1.4.8" - resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.8.tgz#b040eb0923968afabf8d32fb1f17f1167fdab907" - integrity sha1-sEDrCSOWivq/jTL7HxfxFn/auQc= +node-releases@^2.0.19: + version "2.0.19" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314" + integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== noop-logger@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz#94a2b1633c4f1317553007d8966fd0e841b6a4c2" - integrity sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI= - -nopt@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48" - integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg== - dependencies: - abbrev "1" - osenv "^0.1.4" + integrity sha512-6kM8CLXvuW5crTxsAtva2YLrRrDaiTIkIePWs9moLHqbFWT94WpNFjwS/5dfLfECg5i/lkmw3aoqVidxt23TEQ== nopt@^5.0.0: version "5.0.0" @@ -11164,7 +10359,14 @@ nopt@^5.0.0: dependencies: abbrev "1" -normalize-package-data@^2.0.0, normalize-package-data@^2.3.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.3.5, normalize-package-data@^2.4.0, normalize-package-data@^2.5.0: +nopt@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-6.0.0.tgz#245801d8ebf409c6df22ab9d95b65e1309cdb16d" + integrity sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g== + dependencies: + abbrev "^1.0.0" + +normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== @@ -11174,7 +10376,7 @@ normalize-package-data@^2.0.0, normalize-package-data@^2.3.0, normalize-package- semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-package-data@^3.0.0: +normalize-package-data@^3.0.0, normalize-package-data@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.3.tgz#dbcc3e2da59509a0983422884cd172eefdfa525e" integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA== @@ -11184,114 +10386,150 @@ normalize-package-data@^3.0.0: semver "^7.3.4" validate-npm-package-license "^3.0.1" +normalize-package-data@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-5.0.0.tgz#abcb8d7e724c40d88462b84982f7cbf6859b4588" + integrity sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q== + dependencies: + hosted-git-info "^6.0.0" + is-core-module "^2.8.1" + semver "^7.3.5" + validate-npm-package-license "^3.0.4" + normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -normalize-url@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-2.0.1.tgz#835a9da1551fa26f70e92329069a23aa6574d7e6" - integrity sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw== - dependencies: - prepend-http "^2.0.0" - query-string "^5.0.1" - sort-keys "^2.0.0" - -normalize-url@^4.1.0: - version "4.5.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" - integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== - -normalize-url@^6.0.1, normalize-url@^6.1.0: +normalize-url@^6.0.1: version "6.1.0" resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== -npm-bundled@^1.0.1: +normalize-url@^8.0.0: + version "8.0.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-8.0.1.tgz#9b7d96af9836577c58f5883e939365fa15623a4a" + integrity sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w== + +npm-bundled@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.2.tgz#944c78789bd739035b70baa2ca5cc32b8d860bc1" integrity sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ== dependencies: npm-normalize-package-bin "^1.0.1" -npm-conf@^1.1.0, npm-conf@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/npm-conf/-/npm-conf-1.1.3.tgz#256cc47bd0e218c259c4e9550bf413bc2192aff9" - integrity sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw== +npm-bundled@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-3.0.1.tgz#cca73e15560237696254b10170d8f86dad62da25" + integrity sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ== dependencies: - config-chain "^1.1.11" - pify "^3.0.0" + npm-normalize-package-bin "^3.0.0" -npm-lifecycle@^3.1.2: - version "3.1.5" - resolved "https://registry.yarnpkg.com/npm-lifecycle/-/npm-lifecycle-3.1.5.tgz#9882d3642b8c82c815782a12e6a1bfeed0026309" - integrity sha512-lDLVkjfZmvmfvpvBzA4vzee9cn+Me4orq0QF8glbswJVEbIcSNWib7qGOffolysc3teCqbbPZZkzbr3GQZTL1g== +npm-install-checks@^6.0.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-6.3.0.tgz#046552d8920e801fa9f919cad569545d60e826fe" + integrity sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw== dependencies: - byline "^5.0.0" - graceful-fs "^4.1.15" - node-gyp "^5.0.2" - resolve-from "^4.0.0" - slide "^1.1.6" - uid-number "0.0.6" - umask "^1.1.0" - which "^1.3.1" + semver "^7.1.1" -npm-normalize-package-bin@^1.0.0, npm-normalize-package-bin@^1.0.1: +npm-normalize-package-bin@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== -"npm-package-arg@^4.0.0 || ^5.0.0 || ^6.0.0", npm-package-arg@^6.0.0, npm-package-arg@^6.1.0: - version "6.1.1" - resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-6.1.1.tgz#02168cb0a49a2b75bf988a28698de7b529df5cb7" - integrity sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg== +npm-normalize-package-bin@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz#25447e32a9a7de1f51362c61a559233b89947832" + integrity sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ== + +npm-package-arg@8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-8.1.1.tgz#00ebf16ac395c63318e67ce66780a06db6df1b04" + integrity sha512-CsP95FhWQDwNqiYS+Q0mZ7FAEDytDZAkNxQqea6IaAFJTAY9Lhhqyl0irU/6PMc7BGfUmnsbHcqxJD7XuVM/rg== dependencies: - hosted-git-info "^2.7.1" - osenv "^0.1.5" - semver "^5.6.0" + hosted-git-info "^3.0.6" + semver "^7.0.0" validate-npm-package-name "^3.0.0" -npm-packlist@^1.4.4: - version "1.4.8" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e" - integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A== +npm-package-arg@^10.0.0, npm-package-arg@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-10.1.0.tgz#827d1260a683806685d17193073cc152d3c7e9b1" + integrity sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA== + dependencies: + hosted-git-info "^6.0.0" + proc-log "^3.0.0" + semver "^7.3.5" + validate-npm-package-name "^5.0.0" + +npm-packlist@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-5.1.1.tgz#79bcaf22a26b6c30aa4dd66b976d69cc286800e0" + integrity sha512-UfpSvQ5YKwctmodvPPkK6Fwk603aoVsf8AEbmVKAEECrfvL8SSe1A2YIwrJ6xmTHAITKPwwZsWo7WwEbNk0kxw== dependencies: - ignore-walk "^3.0.1" - npm-bundled "^1.0.1" + glob "^8.0.1" + ignore-walk "^5.0.1" + npm-bundled "^1.1.2" npm-normalize-package-bin "^1.0.1" -npm-pick-manifest@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-3.0.2.tgz#f4d9e5fd4be2153e5f4e5f9b7be8dc419a99abb7" - integrity sha512-wNprTNg+X5nf+tDi+hbjdHhM4bX+mKqv6XmPh7B5eG+QY9VARfQPfCEH013H5GqfNj6ee8Ij2fg8yk0mzps1Vw== +npm-packlist@^7.0.0: + version "7.0.4" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-7.0.4.tgz#033bf74110eb74daf2910dc75144411999c5ff32" + integrity sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q== dependencies: - figgy-pudding "^3.5.1" - npm-package-arg "^6.0.0" - semver "^5.4.1" + ignore-walk "^6.0.0" -npm-run-path@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-1.0.0.tgz#f5c32bf595fe81ae927daec52e82f8b000ac3c8f" - integrity sha1-9cMr9ZX+ga6Sfa7FLoL4sACsPI8= +npm-pick-manifest@^8.0.0: + version "8.0.2" + resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-8.0.2.tgz#2159778d9c7360420c925c1a2287b5a884c713aa" + integrity sha512-1dKY+86/AIiq1tkKVD3l0WI+Gd3vkknVGAggsFeBkTvbhMQ1OND/LKkYv4JtXPKUJ8bOTCyLiqEg2P6QNdK+Gg== + dependencies: + npm-install-checks "^6.0.0" + npm-normalize-package-bin "^3.0.0" + npm-package-arg "^10.0.0" + semver "^7.3.5" + +npm-registry-fetch@^14.0.0, npm-registry-fetch@^14.0.3, npm-registry-fetch@^14.0.5: + version "14.0.5" + resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-14.0.5.tgz#fe7169957ba4986a4853a650278ee02e568d115d" + integrity sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA== dependencies: - path-key "^1.0.0" + make-fetch-happen "^11.0.0" + minipass "^5.0.0" + minipass-fetch "^3.0.0" + minipass-json-stream "^1.0.1" + minizlib "^2.1.2" + npm-package-arg "^10.0.0" + proc-log "^3.0.0" npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== dependencies: path-key "^2.0.0" -npm-run-path@^4.0.1: +npm-run-path@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-3.1.0.tgz#7f91be317f6a466efed3c9f2980ad8a4ee8b0fa5" + integrity sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg== + dependencies: + path-key "^3.0.0" + +npm-run-path@^4.0.0, npm-run-path@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== dependencies: path-key "^3.0.0" -npmlog@^4.0.1, npmlog@^4.1.2: +npm-run-path@^5.1.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.3.0.tgz#e23353d0ebb9317f174e93417e4a4d82d0249e9f" + integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== + dependencies: + path-key "^4.0.0" + +npmlog@^4.0.1: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== @@ -11311,7 +10549,7 @@ npmlog@^5.0.1: gauge "^3.0.0" set-blocking "^2.0.0" -npmlog@^6.0.0: +npmlog@^6.0.0, npmlog@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.2.tgz#c8166017a42f2dea92d6453168dd865186a70830" integrity sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg== @@ -11321,144 +10559,134 @@ npmlog@^6.0.0: gauge "^4.0.3" set-blocking "^2.0.0" -nsfw@^2.1.2: - version "2.2.0" - resolved "https://registry.yarnpkg.com/nsfw/-/nsfw-2.2.0.tgz#83e2f5b965424b1bc0610da6c40ecd3afb37a8f7" - integrity sha512-hReNO00wSYakAm4im4WvL2GjCoIBgRn29F/sc/Zg41uT0AZTOT5YVrcBu22ISkH1vOYrntriYOjlMl9FmzD7zQ== - dependencies: - node-addon-api "*" - number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= - -nwsapi@^2.0.7: - version "2.2.0" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" - integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== - -oauth-sign@~0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" - integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== + +nwsapi@^2.2.4: + version "2.2.18" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.18.tgz#3c4d7927e1ef4d042d319438ecfda6cd81b7ee41" + integrity sha512-p1TRH/edngVEHVbwqWnxUViEmq5znDvyB+Sik5cmuLpGOIfDf/39zLiq3swPF8Vakqn+gvNiOQAZu8djYlQILA== + +nx@16.10.0, "nx@>=16.5.1 < 17": + version "16.10.0" + resolved "https://registry.yarnpkg.com/nx/-/nx-16.10.0.tgz#b070461f7de0a3d7988bd78558ea84cda3543ace" + integrity sha512-gZl4iCC0Hx0Qe1VWmO4Bkeul2nttuXdPpfnlcDKSACGu3ZIo+uySqwOF8yBAxSTIf8xe2JRhgzJN1aFkuezEBg== + dependencies: + "@nrwl/tao" "16.10.0" + "@parcel/watcher" "2.0.4" + "@yarnpkg/lockfile" "^1.1.0" + "@yarnpkg/parsers" "3.0.0-rc.46" + "@zkochan/js-yaml" "0.0.6" + axios "^1.0.0" + chalk "^4.1.0" + cli-cursor "3.1.0" + cli-spinners "2.6.1" + cliui "^8.0.1" + dotenv "~16.3.1" + dotenv-expand "~10.0.0" + enquirer "~2.3.6" + figures "3.2.0" + flat "^5.0.2" + fs-extra "^11.1.0" + glob "7.1.4" + ignore "^5.0.4" + jest-diff "^29.4.1" + js-yaml "4.1.0" + jsonc-parser "3.2.0" + lines-and-columns "~2.0.3" + minimatch "3.0.5" + node-machine-id "1.1.12" + npm-run-path "^4.0.1" + open "^8.4.0" + semver "7.5.3" + string-width "^4.2.3" + strong-log-transformer "^2.1.0" + tar-stream "~2.2.0" + tmp "~0.2.1" + tsconfig-paths "^4.1.2" + tslib "^2.3.0" + v8-compile-cache "2.3.0" + yargs "^17.6.2" + yargs-parser "21.1.1" + optionalDependencies: + "@nx/nx-darwin-arm64" "16.10.0" + "@nx/nx-darwin-x64" "16.10.0" + "@nx/nx-freebsd-x64" "16.10.0" + "@nx/nx-linux-arm-gnueabihf" "16.10.0" + "@nx/nx-linux-arm64-gnu" "16.10.0" + "@nx/nx-linux-arm64-musl" "16.10.0" + "@nx/nx-linux-x64-gnu" "16.10.0" + "@nx/nx-linux-x64-musl" "16.10.0" + "@nx/nx-win32-arm64-msvc" "16.10.0" + "@nx/nx-win32-x64-msvc" "16.10.0" object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= - -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== -object-inspect@^1.12.0, object-inspect@^1.9.0: - version "1.12.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" - integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== +object-inspect@^1.13.3: + version "1.13.4" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" + integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== -object-is@^1.1.4: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" - integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== +object-is@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.6.tgz#1a6a53aed2dd8f7e6775ff870bea58545956ab07" + integrity sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" + call-bind "^1.0.7" + define-properties "^1.2.1" -object-keys@^1.0.11, object-keys@^1.1.1: +object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= - dependencies: - isobject "^3.0.0" - -object.assign@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" - integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== - dependencies: - define-properties "^1.1.2" - function-bind "^1.1.1" - has-symbols "^1.0.0" - object-keys "^1.0.11" - -object.assign@^4.1.0, object.assign@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" - integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - has-symbols "^1.0.1" +object.assign@^4.1.4, object.assign@^4.1.7: + version "4.1.7" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.7.tgz#8c14ca1a424c6a561b0bb2a22f66f5049a945d3d" + integrity sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + has-symbols "^1.1.0" object-keys "^1.1.1" -object.entries@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.5.tgz#e1acdd17c4de2cd96d5a08487cfb9db84d881861" - integrity sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - -object.fromentries@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.5.tgz#7b37b205109c21e741e605727fe8b0ad5fa08251" - integrity sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - -object.getownpropertydescriptors@^2.0.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz#b223cf38e17fefb97a63c10c91df72ccb386df9e" - integrity sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - -object.hasown@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.1.tgz#ad1eecc60d03f49460600430d97f23882cf592a3" - integrity sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A== +object.entries@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.8.tgz#bffe6f282e01f4d17807204a24f8edd823599c41" + integrity sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ== dependencies: - define-properties "^1.1.4" - es-abstract "^1.19.5" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= +object.fromentries@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" + integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== dependencies: - isobject "^3.0.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" -object.values@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" - integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg== +object.values@^1.1.6, object.values@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.1.tgz#deed520a50809ff7f75a7cfd4bc64c7a038c6216" + integrity sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" -octokit-pagination-methods@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/octokit-pagination-methods/-/octokit-pagination-methods-1.1.0.tgz#cf472edc9d551055f9ef73f6e42b4dbb4c80bea4" - integrity sha512-fZ4qZdQ2nxJvtcasX7Ghl+WlWS/d9IgnBIwFZXVNNZUmzpno91SX5bc5vuxiuKoCtK78XxGGNuSCrDC7xYB3OQ== - -on-finished@2.4.1, on-finished@^2.3.0: +on-finished@2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== @@ -11468,17 +10696,10 @@ on-finished@2.4.1, on-finished@^2.3.0: once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" -onetime@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" - integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= - dependencies: - mimic-fn "^1.0.0" - onetime@^5.1.0, onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" @@ -11486,54 +10707,48 @@ onetime@^5.1.0, onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" -onigasm@^2.2.0: - version "2.2.5" - resolved "https://registry.yarnpkg.com/onigasm/-/onigasm-2.2.5.tgz#cc4d2a79a0fa0b64caec1f4c7ea367585a676892" - integrity sha512-F+th54mPc0l1lp1ZcFMyL/jTs2Tlq4SqIHKIXGZOR/VkHkF9A7Fr5rRr5+ZG/lWeRsyrClLYRq7s/yFQ/XhWCA== +onetime@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" + integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== dependencies: - lru-cache "^5.1.1" + mimic-fn "^4.0.0" -oniguruma@^7.2.0: - version "7.2.3" - resolved "https://registry.yarnpkg.com/oniguruma/-/oniguruma-7.2.3.tgz#e0b0b415302de8cdd6564e57a1a822ac0ab57012" - integrity sha512-PZZcE0yfg8Q1IvaJImh21RUTHl8ep0zwwyoE912KqlWVrsGByjjj29sdACcD1BFyX2bLkfuOJeP+POzAGVWtbA== +open@^7.4.2: + version "7.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" + integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== dependencies: - nan "^2.14.0" + is-docker "^2.0.0" + is-wsl "^2.1.1" -open@^8.0.6: - version "8.4.0" - resolved "https://registry.yarnpkg.com/open/-/open-8.4.0.tgz#345321ae18f8138f82565a910fdc6b39e8c244f8" - integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q== +open@^8.0.6, open@^8.4.0: + version "8.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" + integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== dependencies: define-lazy-prop "^2.0.0" is-docker "^2.1.1" is-wsl "^2.2.0" -optionator@^0.8.1: - version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" - integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.6" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - word-wrap "~1.2.3" +opener@^1.5.1: + version "1.5.2" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" + integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== -optionator@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" - integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== +optionator@^0.9.3: + version "0.9.4" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== dependencies: deep-is "^0.1.3" fast-levenshtein "^2.0.6" levn "^0.4.1" prelude-ls "^1.2.1" type-check "^0.4.0" - word-wrap "^1.2.3" + word-wrap "^1.2.5" -ora@^5.1.0: +ora@^5.1.0, ora@^5.4.1: version "5.4.1" resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== @@ -11551,84 +10766,61 @@ ora@^5.1.0: os-homedir@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= - -os-locale@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" - integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== - dependencies: - execa "^1.0.0" - lcid "^2.0.0" - mem "^4.0.0" + integrity sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ== -os-name@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/os-name/-/os-name-3.1.0.tgz#dec19d966296e1cd62d701a5a66ee1ddeae70801" - integrity sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg== - dependencies: - macos-release "^2.2.0" - windows-release "^3.1.0" - -os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: +os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== -osenv@^0.1.4, osenv@^0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" - integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== +own-keys@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/own-keys/-/own-keys-1.0.1.tgz#e4006910a2bf913585289676eebd6f390cf51358" + integrity sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg== dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" - -p-cancelable@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.4.1.tgz#35f363d67d52081c8d9585e37bcceb7e0bbcb2a0" - integrity sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ== + get-intrinsic "^1.2.6" + object-keys "^1.1.1" + safe-push-apply "^1.0.0" -p-cancelable@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" - integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== +p-any@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-any/-/p-any-4.0.0.tgz#0e9c8b0fa3e58cc79e6a1c6c715aa9326b6a4447" + integrity sha512-S/B50s+pAVe0wmEZHmBs/9yJXeZ5KhHzOsgKzt0hRdgkoR3DxW9ts46fcsWi/r3VnzsnkKS7q4uimze+zjdryw== + dependencies: + p-cancelable "^3.0.0" + p-some "^6.0.0" p-cancelable@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf" integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== +p-cancelable@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-3.0.0.tgz#63826694b54d61ca1c20ebcb6d3ecf5e14cd8050" + integrity sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw== + p-debounce@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/p-debounce/-/p-debounce-2.1.0.tgz#e79f70c6e325cbb9bddbcbec0b81025084671ad3" integrity sha512-M9bMt62TTnozdZhqFgs+V7XD2MnuKCaz+7fZdlu2/T7xruI3uIE5CicQ0vx1hV7HIUYF0jF+4/R1AgfOkl74Qw== -p-defer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" - integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= - -p-event@^2.1.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/p-event/-/p-event-2.3.1.tgz#596279ef169ab2c3e0cae88c1cfbb08079993ef6" - integrity sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA== +p-event@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/p-event/-/p-event-5.0.1.tgz#614624ec02ae7f4f13d09a721c90586184af5b0c" + integrity sha512-dd589iCQ7m1L0bmC5NLlVYfy3TbBEsMUfWx9PyAgPeIcFZ/E2yaTZ4Rz4MiBmmJShviiftHVXOqfnfzJ6kyMrQ== dependencies: - p-timeout "^2.0.1" + p-timeout "^5.0.2" p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= - -p-is-promise@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e" - integrity sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4= + integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== -p-is-promise@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" - integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== +p-finally@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-2.0.1.tgz#bd6fcaa9c559a096b680806f4d657b3f0f240561" + integrity sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw== p-limit@^1.1.0: version "1.3.0" @@ -11644,7 +10836,7 @@ p-limit@^2.0.0, p-limit@^2.2.0: dependencies: p-try "^2.0.0" -p-limit@^3.1.0: +p-limit@^3.0.2, p-limit@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== @@ -11654,7 +10846,7 @@ p-limit@^3.1.0: p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg== dependencies: p-limit "^1.1.0" @@ -11672,93 +10864,135 @@ p-locate@^4.1.0: dependencies: p-limit "^2.2.0" -p-map-series@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-map-series/-/p-map-series-1.0.0.tgz#bf98fe575705658a9e1351befb85ae4c1f07bdca" - integrity sha1-v5j+V1cFZYqeE1G++4WuTB8Hvco= +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== dependencies: - p-reduce "^1.0.0" + p-limit "^3.0.2" -p-map@^2.1.0: +p-map-series@2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" - integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== - -p-map@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" - integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== - dependencies: - aggregate-error "^3.0.0" + resolved "https://registry.yarnpkg.com/p-map-series/-/p-map-series-2.1.0.tgz#7560d4c452d9da0c07e692fdbfe6e2c81a2a91f2" + integrity sha512-RpYIIK1zXSNEOdwxcfe7FdvGcs7+y5n8rifMhMNWvaxRNMPINJHF5GDeuVxWqnfrcHPSCnp7Oo5yNXHId9Av2Q== -p-map@^4.0.0: +p-map@4.0.0, p-map@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== dependencies: aggregate-error "^3.0.0" -p-pipe@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/p-pipe/-/p-pipe-1.2.0.tgz#4b1a11399a11520a67790ee5a0c1d5881d6befe9" - integrity sha1-SxoROZoRUgpneQ7loMHViB1r7+k= +p-pipe@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-pipe/-/p-pipe-3.1.0.tgz#48b57c922aa2e1af6a6404cb7c6bf0eb9cc8e60e" + integrity sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw== + +p-queue@6.6.2: + version "6.6.2" + resolved "https://registry.yarnpkg.com/p-queue/-/p-queue-6.6.2.tgz#2068a9dcf8e67dd0ec3e7a2bcb76810faa85e426" + integrity sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ== + dependencies: + eventemitter3 "^4.0.4" + p-timeout "^3.2.0" p-queue@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/p-queue/-/p-queue-2.4.2.tgz#03609826682b743be9a22dba25051bd46724fc34" integrity sha512-n8/y+yDJwBjoLQe1GSJbbaYQLTI7QHNZI2+rpmCDbe++WLf9HC3gf6iqj5yfPAV71W4UF3ql5W1+UBPXoXTxng== -p-queue@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/p-queue/-/p-queue-4.0.0.tgz#ed0eee8798927ed6f2c2f5f5b77fdb2061a5d346" - integrity sha512-3cRXXn3/O0o3+eVmUroJPSj/esxoEFIm0ZOno/T+NzG/VZgPOqQ8WKmlNqubSEpZmCIngEy34unkHGg83ZIBmg== - dependencies: - eventemitter3 "^3.1.0" +p-reduce@2.1.0, p-reduce@^2.0.0, p-reduce@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-2.1.0.tgz#09408da49507c6c274faa31f28df334bc712b64a" + integrity sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw== -p-queue@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-queue/-/p-queue-5.0.0.tgz#80f1741d5e78a6fa72fce889406481baa5617a3c" - integrity sha512-6QfeouDf236N+MAxHch0CVIy8o/KBnmhttKjxZoOkUlzqU+u9rZgEyXH3OdckhTgawbqf5rpzmyR+07+Lv0+zg== +p-some@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/p-some/-/p-some-6.0.0.tgz#4613a822038abe125e42152ea9f7705a7967526f" + integrity sha512-CJbQCKdfSX3fIh8/QKgS+9rjm7OBNUTmwWswAFQAhc8j1NR1dsEDETUEuVUtQHZpV+J03LqWBEwvu0g1Yn+TYg== dependencies: - eventemitter3 "^3.1.0" - -p-reduce@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" - integrity sha1-GMKw3ZNqRpClKfgjH1ig/bakffo= + aggregate-error "^4.0.0" + p-cancelable "^3.0.0" -p-timeout@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-2.0.1.tgz#d8dd1979595d2dc0139e1fe46b8b646cb3cdf038" - integrity sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA== +p-timeout@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" + integrity sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg== dependencies: p-finally "^1.0.0" +p-timeout@^5.0.2, p-timeout@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-5.1.0.tgz#b3c691cf4415138ce2d9cfe071dba11f0fee085b" + integrity sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew== + p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== -p-try@^2.0.0, p-try@^2.2.0: +p-try@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== -p-waterfall@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-waterfall/-/p-waterfall-1.0.0.tgz#7ed94b3ceb3332782353af6aae11aa9fc235bb00" - integrity sha1-ftlLPOszMngjU69qrhGqn8I1uwA= +p-waterfall@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/p-waterfall/-/p-waterfall-2.1.1.tgz#63153a774f472ccdc4eb281cdb2967fcf158b2ee" + integrity sha512-RRTnDb2TBG/epPRI2yYXsimO0v3BXC8Yd3ogr1545IaqKK17VGhbWVeGGN+XfCm/08OK8635nH31c8bATkHuSw== dependencies: - p-reduce "^1.0.0" + p-reduce "^2.0.0" -parallel-transform@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" - integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== +pac-proxy-agent@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz#9cfaf33ff25da36f6147a20844230ec92c06e5df" + integrity sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA== + dependencies: + "@tootallnate/quickjs-emscripten" "^0.23.0" + agent-base "^7.1.2" + debug "^4.3.4" + get-uri "^6.0.1" + http-proxy-agent "^7.0.0" + https-proxy-agent "^7.0.6" + pac-resolver "^7.0.1" + socks-proxy-agent "^8.0.5" + +pac-resolver@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-7.0.1.tgz#54675558ea368b64d210fd9c92a640b5f3b8abb6" + integrity sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg== dependencies: - cyclist "^1.0.1" - inherits "^2.0.3" - readable-stream "^2.1.5" + degenerator "^5.0.0" + netmask "^2.0.2" + +package-json-from-dist@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" + integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== + +pacote@^15.2.0: + version "15.2.0" + resolved "https://registry.yarnpkg.com/pacote/-/pacote-15.2.0.tgz#0f0dfcc3e60c7b39121b2ac612bf8596e95344d3" + integrity sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA== + dependencies: + "@npmcli/git" "^4.0.0" + "@npmcli/installed-package-contents" "^2.0.1" + "@npmcli/promise-spawn" "^6.0.1" + "@npmcli/run-script" "^6.0.0" + cacache "^17.0.0" + fs-minipass "^3.0.0" + minipass "^5.0.0" + npm-package-arg "^10.0.0" + npm-packlist "^7.0.0" + npm-pick-manifest "^8.0.0" + npm-registry-fetch "^14.0.0" + proc-log "^3.0.0" + promise-retry "^2.0.1" + read-package-json "^6.0.0" + read-package-json-fast "^3.0.0" + sigstore "^1.3.0" + ssri "^10.0.0" + tar "^6.1.11" param-case@^3.0.4: version "3.0.4" @@ -11775,27 +11009,15 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -parse-github-repo-url@^1.3.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz#9e7d8bb252a6cb6ba42595060b7bf6df3dbc1f50" - integrity sha1-nn2LslKmy2ukJZUGC3v23z28H1A= - -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= - dependencies: - error-ex "^1.2.0" - parse-json@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== dependencies: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" -parse-json@^5.0.0: +parse-json@^5.0.0, parse-json@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== @@ -11805,40 +11027,26 @@ parse-json@^5.0.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" -parse-path@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/parse-path/-/parse-path-4.0.3.tgz#82d81ec3e071dcc4ab49aa9f2c9c0b8966bb22bf" - integrity sha512-9Cepbp2asKnWTJ9x2kpw6Fe8y9JDbqwahGCTvklzd/cEq5C5JC59x2Xb0Kx+x0QZ8bvNquGO8/BWP0cwBHzSAA== +parse-path@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/parse-path/-/parse-path-7.0.1.tgz#ae548cd36315fd8881a3610eae99fa08123ee0e2" + integrity sha512-6ReLMptznuuOEzLoGEa+I1oWRSj2Zna5jLWC+l6zlfAI4dbbSaIES29ThzuPkbhNahT65dWzfoZEO6cfJw2Ksg== dependencies: - is-ssh "^1.3.0" - protocols "^1.4.0" - qs "^6.9.4" - query-string "^6.13.8" + protocols "^2.0.0" -parse-url@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/parse-url/-/parse-url-6.0.0.tgz#f5dd262a7de9ec00914939220410b66cff09107d" - integrity sha512-cYyojeX7yIIwuJzledIHeLUBVJ6COVLeT4eF+2P6aKVzwvgKQPndCBv3+yQ7pcWjqToYwaligxzSYNNmGoMAvw== +parse-url@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/parse-url/-/parse-url-8.1.0.tgz#972e0827ed4b57fc85f0ea6b0d839f0d8a57a57d" + integrity sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w== dependencies: - is-ssh "^1.3.0" - normalize-url "^6.1.0" - parse-path "^4.0.0" - protocols "^1.4.0" - -parse5@4.0.0, parse5@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" - integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA== + parse-path "^7.0.0" -parseqs@0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.6.tgz#8e4bb5a19d1cdc844a08ac974d34e273afa670d5" - integrity sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w== - -parseuri@0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.6.tgz#e1496e829e3ac2ff47f39a4dd044b32823c4a25a" - integrity sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow== +parse5@^7.0.0, parse5@^7.1.2: + version "7.2.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.2.1.tgz#8928f55915e6125f430cc44309765bf17556a33a" + integrity sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ== + dependencies: + entities "^4.5.0" parseurl@~1.3.3: version "1.3.3" @@ -11853,10 +11061,26 @@ pascal-case@^3.1.2: no-case "^3.0.4" tslib "^2.0.3" -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= +patch-package@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-8.0.0.tgz#d191e2f1b6e06a4624a0116bcb88edd6714ede61" + integrity sha512-da8BVIhzjtgScwDJ2TtKsfT5JFWz1hYoBl9rUQ1f38MC2HwnEIkK8VN3dKMKcP7P7bvvgzNDbfNHtx3MsQb5vA== + dependencies: + "@yarnpkg/lockfile" "^1.1.0" + chalk "^4.1.2" + ci-info "^3.7.0" + cross-spawn "^7.0.3" + find-yarn-workspace-root "^2.0.0" + fs-extra "^9.0.0" + json-stable-stringify "^1.0.2" + klaw-sync "^6.0.0" + minimist "^1.2.6" + open "^7.4.2" + rimraf "^2.6.3" + semver "^7.5.3" + slash "^2.0.0" + tmp "^0.0.33" + yaml "^2.2.2" path-browserify@^1.0.1: version "1.0.1" @@ -11871,22 +11095,10 @@ path-case@^3.0.4: dot-case "^3.0.4" tslib "^2.0.3" -path-dirname@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" - integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= - -path-exists@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" - integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= - dependencies: - pinkie-promise "^2.0.0" - path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== path-exists@^4.0.0: version "4.0.0" @@ -11896,48 +11108,52 @@ path-exists@^4.0.0: path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -path-key@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-1.0.0.tgz#5d53d578019646c0d68800db4e146e6bdc2ac7af" - integrity sha1-XVPVeAGWRsDWiADbThRua9wqx68= + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== -path-key@^2.0.0, path-key@^2.0.1: +path-key@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-parse@^1.0.6, path-parse@^1.0.7: +path-key@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" + integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== + +path-parse@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= +path-root-regex@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" + integrity sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ== -path-to-regexp@^1.7.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" - integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== +path-root@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7" + integrity sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg== dependencies: - isarray "0.0.1" + path-root-regex "^0.1.0" -path-type@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" - integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= +path-scurry@^1.11.1, path-scurry@^1.6.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" + integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== dependencies: - graceful-fs "^4.1.2" - pify "^2.0.0" - pinkie-promise "^2.0.0" + lru-cache "^10.2.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + +path-to-regexp@0.1.12: + version "0.1.12" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.12.tgz#d5e1a12e478a976d432ef3c58d534b9923164bb7" + integrity sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ== path-type@^3.0.0: version "3.0.0" @@ -11959,73 +11175,66 @@ pathval@^1.1.1: pause-stream@0.0.11: version "0.0.11" resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" - integrity sha1-/lo0sMvOErWqaitAPuLnO2AvFEU= + integrity sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A== dependencies: through "~2.3" +peek-readable@^5.1.3: + version "5.4.2" + resolved "https://registry.yarnpkg.com/peek-readable/-/peek-readable-5.4.2.tgz#aff1e1ba27a7d6911ddb103f35252ffc1787af49" + integrity sha512-peBp3qZyuS6cNIJ2akRNG1uo1WJ1d0wTxg/fxMdZ0BqCVhx242bSFHM9eNqflfJVS9SsgkzgT/1UgnsurBOTMg== + pend@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" - integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= + integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== -perfect-scrollbar@^1.3.0, perfect-scrollbar@^1.5.0: +perfect-scrollbar@1.5.5, perfect-scrollbar@^1.5.0, perfect-scrollbar@^1.5.5: version "1.5.5" resolved "https://registry.yarnpkg.com/perfect-scrollbar/-/perfect-scrollbar-1.5.5.tgz#41a211a2fb52a7191eff301432134ea47052b27f" integrity sha512-dzalfutyP3e/FOpdlhVryN4AJ5XDVauVWxybSkLZmakFE2sS3y3pc4JnSprw8tGmHvkaG5Edr5T7LBTZ+WWU2g== -performance-now@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= - -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== +picocolors@^1.0.0, picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== -picomatch@^2.0.4, picomatch@^2.3.1: +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -pify@^2.0.0, pify@^2.2.0, pify@^2.3.0: +pify@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-5.0.0.tgz#1f5eca3f5e87ebec28cc6d54a0e4aaf00acc127f" + integrity sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA== + +pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== pify@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== pify@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== -pify@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-5.0.0.tgz#1f5eca3f5e87ebec28cc6d54a0e4aaf00acc127f" - integrity sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA== - pinkie-promise@^2.0.0, pinkie-promise@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= + integrity sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw== dependencies: pinkie "^2.0.0" pinkie@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= - -pkg-dir@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" - integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== - dependencies: - find-up "^3.0.0" + integrity sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg== pkg-dir@^4.1.0, pkg-dir@^4.2.0: version "4.2.0" @@ -12048,36 +11257,48 @@ please-upgrade-node@^3.2.0: dependencies: semver-compare "^1.0.0" -pn@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" - integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== +plist@^3.0.4, plist@^3.0.5: + version "3.1.0" + resolved "https://registry.yarnpkg.com/plist/-/plist-3.1.0.tgz#797a516a93e62f5bde55e0b9cc9c967f860893c9" + integrity sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ== + dependencies: + "@xmldom/xmldom" "^0.8.8" + base64-js "^1.5.1" + xmlbuilder "^15.1.1" -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= +portfinder@^1.0.28: + version "1.0.35" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.35.tgz#6ebaf945da4d14c55d996e907b217f73e1dc06c9" + integrity sha512-73JaFg4NwYNAufDtS5FsFu/PdM49ahJrO1i44aCRsDWju1z5wuGDaqyFUQWR6aJoK2JPDWlaYYAGFNIGTSUHSw== + dependencies: + async "^3.2.6" + debug "^4.3.6" -postcss-modules-extract-imports@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" - integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== +possible-typed-array-names@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz#93e3582bc0e5426586d9d07b79ee40fc841de4ae" + integrity sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg== -postcss-modules-local-by-default@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c" - integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== +postcss-modules-extract-imports@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz#b4497cb85a9c0c4b5aabeb759bb25e8d89f15002" + integrity sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q== + +postcss-modules-local-by-default@^4.0.5: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz#d150f43837831dae25e4085596e84f6f5d6ec368" + integrity sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw== dependencies: icss-utils "^5.0.0" - postcss-selector-parser "^6.0.2" + postcss-selector-parser "^7.0.0" postcss-value-parser "^4.1.0" -postcss-modules-scope@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" - integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== +postcss-modules-scope@^3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz#1bbccddcb398f1d7a511e0a2d1d047718af4078c" + integrity sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA== dependencies: - postcss-selector-parser "^6.0.4" + postcss-selector-parser "^7.0.0" postcss-modules-values@^4.0.0: version "4.0.0" @@ -12086,10 +11307,10 @@ postcss-modules-values@^4.0.0: dependencies: icss-utils "^5.0.0" -postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: - version "6.0.10" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz#79b61e2c0d1bfc2602d549e11d0876256f8df88d" - integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w== +postcss-selector-parser@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz#4d6af97eba65d73bc4d84bcb343e865d7dd16262" + integrity sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" @@ -12099,19 +11320,14 @@ postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^8.4.7: - version "8.4.14" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.14.tgz#ee9274d5622b4858c1007a74d76e42e56fd21caf" - integrity sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig== +postcss@^8.4.33: + version "8.5.3" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.3.tgz#1463b6f1c7fb16fe258736cba29a2de35237eafb" + integrity sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A== dependencies: - nanoid "^3.3.4" - picocolors "^1.0.0" - source-map-js "^1.0.2" - -postinstall-build@^5.0.1: - version "5.0.3" - resolved "https://registry.yarnpkg.com/postinstall-build/-/postinstall-build-5.0.3.tgz#238692f712a481d8f5bc8960e94786036241efc7" - integrity sha512-vPvPe8TKgp4FLgY3+DfxCE5PIfoXBK2lyLfNCxsRbDsV6vS4oU5RG/IWxrblMn6heagbnMED3MemUQllQ2bQUg== + nanoid "^3.3.8" + picocolors "^1.1.1" + source-map-js "^1.2.1" prebuild-install@^5.2.4: version "5.3.6" @@ -12153,40 +11369,11 @@ prebuild-install@^6.0.0: tar-fs "^2.0.0" tunnel-agent "^0.6.0" -prebuild-install@^7.0.1: - version "7.1.0" - resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.0.tgz#991b6ac16c81591ba40a6d5de93fb33673ac1370" - integrity sha512-CNcMgI1xBypOyGqjp3wOc8AAo1nMhZS3Cwd3iHIxOdAUbb+YxdNuM4Z5iIrZ8RLvOsf3F3bl7b7xGq6DjQoNYA== - dependencies: - detect-libc "^2.0.0" - expand-template "^2.0.3" - github-from-package "0.0.0" - minimist "^1.2.3" - mkdirp-classic "^0.5.3" - napi-build-utils "^1.0.1" - node-abi "^3.3.0" - npmlog "^4.0.1" - pump "^3.0.0" - rc "^1.2.7" - simple-get "^4.0.0" - tar-fs "^2.0.0" - tunnel-agent "^0.6.0" - prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= - -prepend-http@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" - integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= - prettier-linter-helpers@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" @@ -12195,21 +11382,40 @@ prettier-linter-helpers@^1.0.0: fast-diff "^1.1.2" prettier@^2.3.1: - version "2.6.2" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.6.2.tgz#e26d71a18a74c3d0f0597f55f01fb6c06c206032" - integrity sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew== + version "2.8.8" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" + integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== + +pretty-format@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" + integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== + dependencies: + "@jest/schemas" "^29.6.3" + ansi-styles "^5.0.0" + react-is "^18.0.0" private@~0.1.5: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== +proc-log@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-3.0.0.tgz#fb05ef83ccd64fd7b20bbe9c8c1070fc08338dd8" + integrity sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A== + process-nextick-args@^2.0.0, process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== -progress@^2.0.0, progress@^2.0.1, progress@^2.0.3: +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== + +progress@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== @@ -12217,15 +11423,7 @@ progress@^2.0.0, progress@^2.0.1, progress@^2.0.3: promise-inflight@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" - integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= - -promise-retry@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-1.1.1.tgz#6739e968e3051da20ce6497fb2b50f6911df3d6d" - integrity sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0= - dependencies: - err-code "^1.0.0" - retry "^0.10.0" + integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== promise-retry@^2.0.1: version "2.0.1" @@ -12235,14 +11433,14 @@ promise-retry@^2.0.1: err-code "^2.0.2" retry "^0.12.0" -promzard@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/promzard/-/promzard-0.3.0.tgz#26a5d6ee8c7dee4cb12208305acfb93ba382a9ee" - integrity sha1-JqXW7ox97kyxIggwWs+5O6OCqe4= +promzard@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/promzard/-/promzard-1.0.2.tgz#2226e7c6508b1da3471008ae17066a7c3251e660" + integrity sha512-2FPputGL+mP3jJ3UZg/Dl9YOkovB7DX0oOr+ck5QbZ5MtORtds8k/BZdn+02peDLI8/YWbmzx34k5fA+fHvCVQ== dependencies: - read "1" + read "^3.0.1" -prop-types@^15.0.0, prop-types@^15.5.0, prop-types@^15.5.6, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: +prop-types@^15.0.0, prop-types@^15.5.0, prop-types@^15.5.6, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.8.1: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== @@ -12252,19 +11450,14 @@ prop-types@^15.0.0, prop-types@^15.5.0, prop-types@^15.5.6, prop-types@^15.5.8, react-is "^16.13.1" property-information@^6.0.0: - version "6.1.1" - resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.1.1.tgz#5ca85510a3019726cb9afed4197b7b8ac5926a22" - integrity sha512-hrzC564QIl0r0vy4l6MvRLhafmUowhO/O3KgVSoXIbbA2Sz4j8HGpJc6T2cubRVwMwpdiG/vKGfhT4IixmKN9w== - -proto-list@~1.2.1: - version "1.2.4" - resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" - integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk= + version "6.5.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.5.0.tgz#6212fbb52ba757e92ef4fb9d657563b933b7ffec" + integrity sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig== -protobufjs@^6.10.0: - version "6.11.2" - resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.11.2.tgz#de39fabd4ed32beaa08e9bb1e30d08544c1edf8b" - integrity sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw== +protobufjs@^7.2.3, protobufjs@^7.2.5: + version "7.4.0" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.4.0.tgz#7efe324ce9b3b61c82aae5de810d287bc08a248a" + integrity sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw== dependencies: "@protobufjs/aspromise" "^1.1.2" "@protobufjs/base64" "^1.1.2" @@ -12276,34 +11469,13 @@ protobufjs@^6.10.0: "@protobufjs/path" "^1.1.2" "@protobufjs/pool" "^1.1.0" "@protobufjs/utf8" "^1.1.0" - "@types/long" "^4.0.1" "@types/node" ">=13.7.0" - long "^4.0.0" + long "^5.0.0" -protoc@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/protoc/-/protoc-1.0.4.tgz#fd0ba07132c459df80c6135889bd5cc92f0afec2" - integrity sha512-2crtOP6xhacdWBW+lkhQJmzwg2cPmqSsh51FOHQmgTd8dKksO9sFzlhzteh6x+qPTfPU7h6smC1eg5d9bqGpTQ== - dependencies: - glob "^7.1.6" - mkdirp "^0.5.1" - node-uuid "^1.4.8" - request "^2.88.0" - rimraf "^3.0.0" - unzipper "^0.10.5" - vinyl "^2.2.0" - -protocols@^1.1.0, protocols@^1.4.0: - version "1.4.8" - resolved "https://registry.yarnpkg.com/protocols/-/protocols-1.4.8.tgz#48eea2d8f58d9644a4a32caae5d5db290a075ce8" - integrity sha512-IgjKyaUSjsROSO8/D49Ab7hP8mJgTYcqApOqdPhLoPxAplXmkp+zRvsrSQjFn5by0rhm4VH0GAUELIPpx7B1yg== - -protoduck@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/protoduck/-/protoduck-5.0.1.tgz#03c3659ca18007b69a50fd82a7ebcc516261151f" - integrity sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg== - dependencies: - genfun "^5.0.0" +protocols@^2.0.0, protocols@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/protocols/-/protocols-2.0.2.tgz#822e8fcdcb3df5356538b3e91bfd890b067fd0a4" + integrity sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ== proxy-addr@~2.0.7: version "2.0.7" @@ -12313,7 +11485,21 @@ proxy-addr@~2.0.7: forwarded "0.2.0" ipaddr.js "1.9.1" -proxy-from-env@^1.0.0, proxy-from-env@^1.1.0: +proxy-agent@^6.4.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-6.5.0.tgz#9e49acba8e4ee234aacb539f89ed9c23d02f232d" + integrity sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A== + dependencies: + agent-base "^7.1.2" + debug "^4.3.4" + http-proxy-agent "^7.0.1" + https-proxy-agent "^7.0.6" + lru-cache "^7.14.1" + pac-proxy-agent "^7.1.0" + proxy-from-env "^1.1.0" + socks-proxy-agent "^8.0.5" + +proxy-from-env@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== @@ -12321,7 +11507,7 @@ proxy-from-env@^1.0.0, proxy-from-env@^1.1.0: prr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" - integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== ps-tree@^1.2.0: version "1.2.0" @@ -12333,12 +11519,23 @@ ps-tree@^1.2.0: pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= + integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== -psl@^1.1.28, psl@^1.1.33: - version "1.8.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" - integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== +psl@^1.1.33: + version "1.15.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.15.0.tgz#bdace31896f1d97cec6a79e8224898ce93d974c6" + integrity sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w== + dependencies: + punycode "^2.3.1" + +public-ip@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/public-ip/-/public-ip-5.0.0.tgz#b392fcc88552c3b36933a286068948816515f92a" + integrity sha512-xaH3pZMni/R2BG7ZXXaWS9Wc9wFlhyDVJF47IJ+3ali0TGv+2PsckKxbmo+rnx3ZxiV2wblVhtdS3bohAP6GGw== + dependencies: + dns-socket "^4.2.2" + got "^12.0.0" + is-ip "^3.1.0" pump@^1.0.0: version "1.0.3" @@ -12348,42 +11545,32 @@ pump@^1.0.0: end-of-stream "^1.1.0" once "^1.3.1" -pump@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" - integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + version "3.0.2" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.2.tgz#836f3edd6bc2ee599256c924ffe0d88573ddcbf8" + integrity sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw== dependencies: end-of-stream "^1.1.0" once "^1.3.1" -pumpify@^1.3.3: - version "1.5.1" - resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" - integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== - dependencies: - duplexify "^3.6.0" - inherits "^2.0.3" - pump "^2.0.0" - -punycode@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" - integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= - -punycode@^2.1.0, punycode@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -puppeteer-to-istanbul@^1.2.2: +punycode@^2.1.0, punycode@^2.1.1, punycode@^2.3.0, punycode@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +puppeteer-core@23.1.0: + version "23.1.0" + resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-23.1.0.tgz#50703d2e27c1d73d523c25b807f6e6d95a6b1c47" + integrity sha512-SvAsu+xnLN2FMXE/59bp3s3WXp8ewqUGzVV4AQtml/2xmsciZnU/bXcCW+eETHPWQ6Agg2vTI7QzWXPpEARK2g== + dependencies: + "@puppeteer/browsers" "2.3.1" + chromium-bidi "0.6.4" + debug "^4.3.6" + devtools-protocol "0.0.1312386" + typed-query-selector "^2.12.0" + ws "^8.18.0" + +puppeteer-to-istanbul@1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/puppeteer-to-istanbul/-/puppeteer-to-istanbul-1.4.0.tgz#451dced6f42652448f55cf0bc780b35512c8d1b0" integrity sha512-dzW8u/PMqMZppvoXCFod8IkCTI2JL0yP2YUBbaALnX+iJJ6gqjk77fIoK9MqnMqRZAcoa81GLFfZExakWg/Q4Q== @@ -12393,83 +11580,52 @@ puppeteer-to-istanbul@^1.2.2: v8-to-istanbul "^1.2.1" yargs "^15.3.1" -puppeteer@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-2.1.1.tgz#ccde47c2a688f131883b50f2d697bd25189da27e" - integrity sha512-LWzaDVQkk1EPiuYeTOj+CZRIjda4k2s5w4MK4xoH2+kgWV/SDlkYHmxatDdtYrciHUKSXTsGgPgPP8ILVdBsxg== - dependencies: - "@types/mime-types" "^2.1.0" - debug "^4.1.0" - extract-zip "^1.6.6" - https-proxy-agent "^4.0.0" - mime "^2.0.3" - mime-types "^2.1.25" - progress "^2.0.1" - proxy-from-env "^1.0.0" - rimraf "^2.6.1" - ws "^6.1.0" - -q@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" - integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= - -qs@6.10.3, qs@^6.10.1, qs@^6.9.4: - version "6.10.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" - integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== +puppeteer@23.1.0: + version "23.1.0" + resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-23.1.0.tgz#3abe4980670f214c8edfe689012e83418f81f9aa" + integrity sha512-m+CyicDlGN1AVUeOsCa6/+KQydJzxfsPowL7fQy+VGNeaWafB0m8G5aGfXdfZztKMxzCsdz7KNNzbJPeG9wwFw== dependencies: - side-channel "^1.0.4" - -qs@~6.5.2: - version "6.5.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" - integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== + "@puppeteer/browsers" "2.3.1" + chromium-bidi "0.6.4" + cosmiconfig "^9.0.0" + devtools-protocol "0.0.1312386" + puppeteer-core "23.1.0" + typed-query-selector "^2.12.0" -query-string@^5.0.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb" - integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw== +qs@6.13.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906" + integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg== dependencies: - decode-uri-component "^0.2.0" - object-assign "^4.1.0" - strict-uri-encode "^1.0.0" + side-channel "^1.0.6" -query-string@^6.13.8: - version "6.14.1" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.14.1.tgz#7ac2dca46da7f309449ba0f86b1fd28255b0c86a" - integrity sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw== +qs@^6.10.1, qs@^6.10.3, qs@^6.11.0, qs@^6.13.0, qs@^6.4.0: + version "6.14.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.14.0.tgz#c63fa40680d2c5c941412a0e899c89af60c0a930" + integrity sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w== dependencies: - decode-uri-component "^0.2.0" - filter-obj "^1.1.0" - split-on-first "^1.0.0" - strict-uri-encode "^2.0.0" + side-channel "^1.1.0" query-string@^7.0.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-7.1.1.tgz#754620669db978625a90f635f12617c271a088e1" - integrity sha512-MplouLRDHBZSG9z7fpuAAcI7aAYjDLhtsiVZsevsfaHWDS2IDdORKbSd1kWUA+V4zyva/HZoSfpwnYMMQDhb0w== + version "7.1.3" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-7.1.3.tgz#a1cf90e994abb113a325804a972d98276fe02328" + integrity sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg== dependencies: - decode-uri-component "^0.2.0" + decode-uri-component "^0.2.2" filter-obj "^1.1.0" split-on-first "^1.0.0" strict-uri-encode "^2.0.0" -querystring@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== -quick-lru@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8" - integrity sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g= - quick-lru@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" @@ -12492,10 +11648,10 @@ range-parser@~1.2.1: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -raw-body@2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" - integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== +raw-body@2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" + integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== dependencies: bytes "3.1.2" http-errors "2.0.0" @@ -12521,47 +11677,33 @@ react-autosize-textarea@^7.0.0: line-height "^0.3.1" prop-types "^15.5.6" -react-disable@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/react-disable/-/react-disable-0.1.0.tgz#e3474aefcb2b91fcb534693c66b7497fb28b85af" - integrity sha512-3RbSYuUtakIy1ulCfDf6yoJAsjHFNLv467bSBwyxkNDyez/z7CbcTZ6QUWCrhfybvfm81IN6QT3pUfDoKcvaFQ== +react-disable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/react-disable/-/react-disable-0.1.1.tgz#86d2d0932259f626a70fa46f63d6d61cbe7dd066" + integrity sha512-KKEDYJUnF8hIPlmGYJu38HG8BlBB4EElCFY1zfA9W46/MF76DSGvgcduWl1eVT/CAw3ahb2sWTSfhon+kPSiKw== -react-dom@^16.8.0: - version "16.14.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.14.0.tgz#7ad838ec29a777fb3c75c3a190f661cf92ab8b89" - integrity sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw== +react-dom@^18.2.0: + version "18.3.1" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" + integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== dependencies: loose-envify "^1.1.0" - object-assign "^4.1.1" - prop-types "^15.6.2" - scheduler "^0.19.1" - -react-input-autosize@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/react-input-autosize/-/react-input-autosize-3.0.0.tgz#6b5898c790d4478d69420b55441fcc31d5c50a85" - integrity sha512-nL9uS7jEs/zu8sqwFE5MAPx6pPkNAriACQ2rGLlqmKr2sPGtN7TXTyDdQt4lbNXVx7Uzadb40x8qotIuru6Rhg== - dependencies: - prop-types "^15.5.8" + scheduler "^0.23.2" -react-is@^16.13.1: +react-is@^16.13.1, react-is@^16.7.0: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== react-is@^18.0.0: - version "18.1.0" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.1.0.tgz#61aaed3096d30eacf2a2127118b5b41387d32a67" - integrity sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg== - -react-lifecycles-compat@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" - integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== + version "18.3.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" + integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== react-markdown@^8.0.0: - version "8.0.3" - resolved "https://registry.yarnpkg.com/react-markdown/-/react-markdown-8.0.3.tgz#e8aba0d2f5a1b2124d476ee1fff9448a2f57e4b3" - integrity sha512-We36SfqaKoVNpN1QqsZwWSv/OZt5J15LNgTLWynwAN5b265hrQrsjMtlRNwUvS+YyR3yDM8HpTNc4pK9H/Gc0A== + version "8.0.7" + resolved "https://registry.yarnpkg.com/react-markdown/-/react-markdown-8.0.7.tgz#c8dbd1b9ba5f1c5e7e5f2a44de465a3caafdf89b" + integrity sha512-bvWbzG4MtOU62XqBx3Xx+zB2raaFFsq4mYiAzfjXJMEz2sixgeAfraA3tvzULF02ZdOMUOKTBFFaZJDDrq+BJQ== dependencies: "@types/hast" "^2.0.0" "@types/prop-types" "^15.0.0" @@ -12574,12 +11716,12 @@ react-markdown@^8.0.0: remark-parse "^10.0.0" remark-rehype "^10.0.0" space-separated-tokens "^2.0.0" - style-to-object "^0.3.0" + style-to-object "^0.4.0" unified "^10.0.0" unist-util-visit "^4.0.0" vfile "^5.0.0" -react-perfect-scrollbar@^1.5.3: +react-perfect-scrollbar@^1.5.3, react-perfect-scrollbar@^1.5.8: version "1.5.8" resolved "https://registry.yarnpkg.com/react-perfect-scrollbar/-/react-perfect-scrollbar-1.5.8.tgz#380959387a325c5c9d0268afc08b3f73ed5b3078" integrity sha512-bQ46m70gp/HJtiBOF3gRzBISSZn8FFGNxznTdmTG8AAwpxG1bJCyn7shrgjEvGSQ5FJEafVEiosY+ccER11OSA== @@ -12587,113 +11729,109 @@ react-perfect-scrollbar@^1.5.3: perfect-scrollbar "^1.5.0" prop-types "^15.6.1" -react-select@^3.0.4: - version "3.2.0" - resolved "https://registry.yarnpkg.com/react-select/-/react-select-3.2.0.tgz#de9284700196f5f9b5277c5d850a9ce85f5c72fe" - integrity sha512-B/q3TnCZXEKItO0fFN/I0tWOX3WJvi/X2wtdffmwSQVRwg5BpValScTO1vdic9AxlUgmeSzib2hAZAwIUQUZGQ== - dependencies: - "@babel/runtime" "^7.4.4" - "@emotion/cache" "^10.0.9" - "@emotion/core" "^10.0.9" - "@emotion/css" "^10.0.9" - memoize-one "^5.0.0" +react-select@^5.6.0: + version "5.10.1" + resolved "https://registry.yarnpkg.com/react-select/-/react-select-5.10.1.tgz#e858dd98358ccd864b65d53ab0fb682cd5e96b89" + integrity sha512-roPEZUL4aRZDx6DcsD+ZNreVl+fM8VsKn0Wtex1v4IazH60ILp5xhdlp464IsEAlJdXeD+BhDAFsBVMfvLQueA== + dependencies: + "@babel/runtime" "^7.12.0" + "@emotion/cache" "^11.4.0" + "@emotion/react" "^11.8.1" + "@floating-ui/dom" "^1.0.1" + "@types/react-transition-group" "^4.4.0" + memoize-one "^6.0.0" prop-types "^15.6.0" - react-input-autosize "^3.0.0" react-transition-group "^4.3.0" + use-isomorphic-layout-effect "^1.2.0" -react-tabs@^3.1.2: - version "3.2.3" - resolved "https://registry.yarnpkg.com/react-tabs/-/react-tabs-3.2.3.tgz#ccbb3e1241ad3f601047305c75db661239977f2f" - integrity sha512-jx325RhRVnS9DdFbeF511z0T0WEqEoMl1uCE3LoZ6VaZZm7ytatxbum0B8bCTmaiV0KsU+4TtLGTGevCic7SWg== +react-tabs@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/react-tabs/-/react-tabs-6.1.0.tgz#a1fc9d9b8db4c6e7bb327a1b6783bc51a1c457a1" + integrity sha512-6QtbTRDKM+jA/MZTTefvigNxo0zz+gnBTVFw2CFVvq+f2BuH0nF0vDLNClL045nuTAdOoK/IL1vTP0ZLX0DAyQ== dependencies: - clsx "^1.1.0" + clsx "^2.0.0" prop-types "^15.5.0" react-tooltip@^4.2.21: - version "4.2.21" - resolved "https://registry.yarnpkg.com/react-tooltip/-/react-tooltip-4.2.21.tgz#840123ed86cf33d50ddde8ec8813b2960bfded7f" - integrity sha512-zSLprMymBDowknr0KVDiJ05IjZn9mQhhg4PRsqln0OZtURAJ1snt1xi5daZfagsh6vfsziZrc9pErPTDY1ACig== + version "4.5.1" + resolved "https://registry.yarnpkg.com/react-tooltip/-/react-tooltip-4.5.1.tgz#77eccccdf16adec804132e558ec20ca5783b866a" + integrity sha512-Zo+CSFUGXar1uV+bgXFFDe7VeS2iByeIp5rTgTcc2HqtuOS5D76QapejNNfx320MCY91TlhTQat36KGFTqgcvw== dependencies: - prop-types "^15.7.2" + prop-types "^15.8.1" uuid "^7.0.3" react-transition-group@^4.3.0: - version "4.4.2" - resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.2.tgz#8b59a56f09ced7b55cbd53c36768b922890d5470" - integrity sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg== + version "4.4.5" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1" + integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g== dependencies: "@babel/runtime" "^7.5.5" dom-helpers "^5.0.1" loose-envify "^1.4.0" prop-types "^15.6.2" -react-virtualized@^9.20.0: - version "9.22.3" - resolved "https://registry.yarnpkg.com/react-virtualized/-/react-virtualized-9.22.3.tgz#f430f16beb0a42db420dbd4d340403c0de334421" - integrity sha512-MKovKMxWTcwPSxE1kK1HcheQTWfuCxAuBoSTf2gwyMM21NdX/PXUhnoP8Uc5dRKd+nKm8v41R36OellhdCpkrw== +react-virtuoso@^2.17.0: + version "2.19.1" + resolved "https://registry.yarnpkg.com/react-virtuoso/-/react-virtuoso-2.19.1.tgz#a660a5c3cafcc7a84b59dfc356e1916e632c1e3a" + integrity sha512-zF6MAwujNGy2nJWCx/Df92ay/RnV2Kj4glUZfdyadI4suAn0kAZHB1BeI7yPFVp2iSccLzFlszhakWyr+fJ4Dw== dependencies: - "@babel/runtime" "^7.7.2" - clsx "^1.0.4" - dom-helpers "^5.1.3" - loose-envify "^1.4.0" - prop-types "^15.7.2" - react-lifecycles-compat "^3.0.4" + "@virtuoso.dev/react-urx" "^0.2.12" + "@virtuoso.dev/urx" "^0.2.12" react-window@^1.8.6: - version "1.8.7" - resolved "https://registry.yarnpkg.com/react-window/-/react-window-1.8.7.tgz#5e9fd0d23f48f432d7022cdb327219353a15f0d4" - integrity sha512-JHEZbPXBpKMmoNO1bNhoXOOLg/ujhL/BU4IqVU9r8eQPcy5KQnGHIHDRkJ0ns9IM5+Aq5LNwt3j8t3tIrePQzA== + version "1.8.11" + resolved "https://registry.yarnpkg.com/react-window/-/react-window-1.8.11.tgz#a857b48fa85bd77042d59cc460964ff2e0648525" + integrity sha512-+SRbUVT2scadgFSWx+R1P754xHPEqvcfSfVX10QYg6POOz+WNgkN48pS+BtZNIMGiL1HYrSEiCkwsMS15QogEQ== dependencies: "@babel/runtime" "^7.0.0" memoize-one ">=3.1.1 <6" -react@^16.8.0: - version "16.14.0" - resolved "https://registry.yarnpkg.com/react/-/react-16.14.0.tgz#94d776ddd0aaa37da3eda8fc5b6b18a4c9a3114d" - integrity sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g== +react@^18.2.0: + version "18.3.1" + resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" + integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== dependencies: loose-envify "^1.1.0" - object-assign "^4.1.1" - prop-types "^15.6.2" -read-cmd-shim@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-1.0.5.tgz#87e43eba50098ba5a32d0ceb583ab8e43b961c16" - integrity sha512-v5yCqQ/7okKoZZkBQUAfTsQ3sVJtXdNfbPnI5cceppoxEVLYA3k+VtV2omkeo8MS94JCy4fSiUwlRBAwCVRPUA== - dependencies: - graceful-fs "^4.1.2" +read-cmd-shim@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-4.0.0.tgz#640a08b473a49043e394ae0c7a34dd822c73b9bb" + integrity sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q== -"read-package-json@1 || 2", read-package-json@^2.0.0, read-package-json@^2.0.13: - version "2.1.2" - resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.1.2.tgz#6992b2b66c7177259feb8eaac73c3acd28b9222a" - integrity sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA== +read-config-file@6.3.2: + version "6.3.2" + resolved "https://registry.yarnpkg.com/read-config-file/-/read-config-file-6.3.2.tgz#556891aa6ffabced916ed57457cb192e61880411" + integrity sha512-M80lpCjnE6Wt6zb98DoW8WHR09nzMSpu8XHtPkiTHrJ5Az9CybfeQhTJ8D7saeBHpGhLPIVyA8lcL6ZmdKwY6Q== dependencies: - glob "^7.1.1" - json-parse-even-better-errors "^2.3.0" - normalize-package-data "^2.0.0" - npm-normalize-package-bin "^1.0.0" + config-file-ts "^0.2.4" + dotenv "^9.0.2" + dotenv-expand "^5.1.0" + js-yaml "^4.1.0" + json5 "^2.2.0" + lazy-val "^1.0.4" -read-package-tree@^5.1.6: - version "5.3.1" - resolved "https://registry.yarnpkg.com/read-package-tree/-/read-package-tree-5.3.1.tgz#a32cb64c7f31eb8a6f31ef06f9cedf74068fe636" - integrity sha512-mLUDsD5JVtlZxjSlPPx1RETkNjjvQYuweKwNVt1Sn8kP5Jh44pvYuUHCp6xSVDZWbNxVxG5lyZJ921aJH61sTw== +read-package-json-fast@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz#394908a9725dc7a5f14e70c8e7556dff1d2b1049" + integrity sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw== dependencies: - read-package-json "^2.0.0" - readdir-scoped-modules "^1.0.0" - util-promisify "^2.1.0" + json-parse-even-better-errors "^3.0.0" + npm-normalize-package-bin "^3.0.0" -read-pkg-up@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" - integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= +read-package-json@6.0.4, read-package-json@^6.0.0: + version "6.0.4" + resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-6.0.4.tgz#90318824ec456c287437ea79595f4c2854708836" + integrity sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw== dependencies: - find-up "^1.0.0" - read-pkg "^1.0.0" + glob "^10.2.2" + json-parse-even-better-errors "^3.0.0" + normalize-package-data "^5.0.0" + npm-normalize-package-bin "^3.0.0" read-pkg-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" - integrity sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc= + integrity sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw== dependencies: find-up "^2.0.0" read-pkg "^3.0.0" @@ -12707,19 +11845,10 @@ read-pkg-up@^7.0.1: read-pkg "^5.2.0" type-fest "^0.8.1" -read-pkg@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" - integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= - dependencies: - load-json-file "^1.0.0" - normalize-package-data "^2.3.2" - path-type "^1.0.0" - read-pkg@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" - integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= + integrity sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA== dependencies: load-json-file "^4.0.0" normalize-package-data "^2.3.2" @@ -12735,17 +11864,24 @@ read-pkg@^5.2.0: parse-json "^5.0.0" type-fest "^0.6.0" -read@1, read@~1.0.1: - version "1.0.7" - resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" - integrity sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ= +read@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/read/-/read-2.1.0.tgz#69409372c54fe3381092bc363a00650b6ac37218" + integrity sha512-bvxi1QLJHcaywCAEsAk4DG3nVoqiY2Csps3qzWalhj5hFqRn1d/OixkFXtLO1PrgHUcAP0FNaSY/5GYNfENFFQ== dependencies: - mute-stream "~0.0.4" + mute-stream "~1.0.0" -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== +read@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/read/-/read-3.0.1.tgz#926808f0f7c83fa95f1ef33c0e2c09dbb28fd192" + integrity sha512-SLBrDU/Srs/9EoWhU5GdbAoxG1GzpQHo/6qiGItaoLJ1thmYpcNIM1qISEUvyHBzfGlWIyd6p2DNi1oV1VmAuw== + dependencies: + mute-stream "^1.0.0" + +readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.5, readable-stream@~2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -12755,59 +11891,50 @@ read@1, read@~1.0.1: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@1.1.x: - version "1.1.14" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" - integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -"readable-stream@2 || 3", readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== +readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== dependencies: inherits "^2.0.3" string_decoder "^1.1.1" util-deprecate "^1.0.1" -readdir-scoped-modules@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz#8d45407b4f870a0dcaebc0e28670d18e74514309" - integrity sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw== +readable-stream@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.7.0.tgz#cedbd8a1146c13dfff8dab14068028d58c15ac91" + integrity sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg== dependencies: - debuglog "^1.0.1" - dezalgo "^1.0.0" - graceful-fs "^4.1.2" - once "^1.3.0" + abort-controller "^3.0.0" + buffer "^6.0.3" + events "^3.3.0" + process "^0.11.10" + string_decoder "^1.3.0" -readdirp@~3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.2.0.tgz#c30c33352b12c96dfb4b895421a49fd5a9593839" - integrity sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ== +readable-web-to-node-stream@^3.0.2: + version "3.0.4" + resolved "https://registry.yarnpkg.com/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.4.tgz#392ba37707af5bf62d725c36c1b5d6ef4119eefc" + integrity sha512-9nX56alTf5bwXQ3ZDipHJhusu9NTQJ/CVPtb/XHAJCXihZeitfJvIRS4GqQ/mfIoOE3IelHMrpayVrosdHBuLw== dependencies: - picomatch "^2.0.4" + readable-stream "^4.7.0" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" recast@^0.11.17: version "0.11.23" resolved "https://registry.yarnpkg.com/recast/-/recast-0.11.23.tgz#451fd3004ab1e4df9b4e4b66376b2a21912462d3" - integrity sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM= + integrity sha512-+nixG+3NugceyR8O1bLU45qs84JgI3+8EauyRZafLgC9XbdAOIVgwV1Pe2da0YzGo62KzWoZwUpVEQf6qNAXWA== dependencies: ast-types "0.9.6" esprima "~3.1.0" private "~0.1.5" source-map "~0.5.0" -rechoir@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" - integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= - dependencies: - resolve "^1.1.6" - rechoir@^0.7.0: version "0.7.1" resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.1.tgz#9478a96a1ca135b5e88fc027f03ee92d6c645686" @@ -12815,27 +11942,6 @@ rechoir@^0.7.0: dependencies: resolve "^1.9.0" -reconnecting-websocket@^4.2.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/reconnecting-websocket/-/reconnecting-websocket-4.4.0.tgz#3b0e5b96ef119e78a03135865b8bb0af1b948783" - integrity sha512-D2E33ceRPga0NvTDhJmphEgJ7FUYF0v4lr1ki0csq06OdlxKfugGzN0dSkxM/NfqCxYELK4KcaTOUOjTV6Dcng== - -redent@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" - integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= - dependencies: - indent-string "^2.1.0" - strip-indent "^1.0.1" - -redent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-2.0.0.tgz#c1b2007b42d57eb1389079b3c8333639d5e1ccaa" - integrity sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo= - dependencies: - indent-string "^3.0.0" - strip-indent "^2.0.0" - redent@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" @@ -12845,14 +11951,28 @@ redent@^3.0.0: strip-indent "^3.0.0" reflect-metadata@^0.1.10: - version "0.1.13" - resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" - integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== + version "0.1.14" + resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.14.tgz#24cf721fe60677146bb77eeb0e1f9dece3d65859" + integrity sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A== -regenerate-unicode-properties@^10.0.1: - version "10.0.1" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz#7f442732aa7934a3740c779bb9b3340dccc1fb56" - integrity sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw== +reflect.getprototypeof@^1.0.6, reflect.getprototypeof@^1.0.9: + version "1.0.10" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz#c629219e78a3316d8b604c765ef68996964e7bf9" + integrity sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw== + dependencies: + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.9" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.7" + get-proto "^1.0.1" + which-builtin-type "^1.2.1" + +regenerate-unicode-properties@^10.2.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz#626e39df8c372338ea9b8028d1f99dc3fd9c3db0" + integrity sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA== dependencies: regenerate "^1.4.2" @@ -12861,75 +11981,58 @@ regenerate@^1.4.2: resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== -regenerator-runtime@^0.13.4: - version "0.13.9" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" - integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== -regenerator-transform@^0.15.0: - version "0.15.0" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.0.tgz#cbd9ead5d77fae1a48d957cf889ad0586adb6537" - integrity sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg== +regenerator-transform@^0.15.2: + version "0.15.2" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4" + integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== dependencies: "@babel/runtime" "^7.8.4" -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - -regexp.prototype.flags@^1.3.0, regexp.prototype.flags@^1.4.1, regexp.prototype.flags@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" - integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== +regexp.prototype.flags@^1.5.1, regexp.prototype.flags@^1.5.3: + version "1.5.4" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz#1ad6c62d44a259007e55b3970e00f746efbcaa19" + integrity sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - functions-have-names "^1.2.2" - -regexpp@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" - integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== + call-bind "^1.0.8" + define-properties "^1.2.1" + es-errors "^1.3.0" + get-proto "^1.0.1" + gopd "^1.2.0" + set-function-name "^2.0.2" -regexpu-core@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.0.1.tgz#c531122a7840de743dcf9c83e923b5560323ced3" - integrity sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw== +regexpu-core@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-6.2.0.tgz#0e5190d79e542bf294955dccabae04d3c7d53826" + integrity sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA== dependencies: regenerate "^1.4.2" - regenerate-unicode-properties "^10.0.1" - regjsgen "^0.6.0" - regjsparser "^0.8.2" + regenerate-unicode-properties "^10.2.0" + regjsgen "^0.8.0" + regjsparser "^0.12.0" unicode-match-property-ecmascript "^2.0.0" - unicode-match-property-value-ecmascript "^2.0.0" - -regjsgen@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.6.0.tgz#83414c5354afd7d6627b16af5f10f41c4e71808d" - integrity sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA== + unicode-match-property-value-ecmascript "^2.1.0" -regjsparser@^0.8.2: - version "0.8.4" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.8.4.tgz#8a14285ffcc5de78c5b95d62bbf413b6bc132d5f" - integrity sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA== - dependencies: - jsesc "~0.5.0" +regjsgen@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.8.0.tgz#df23ff26e0c5b300a6470cad160a9d090c3a37ab" + integrity sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q== -relative@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/relative/-/relative-3.0.2.tgz#0dcd8ec54a5d35a3c15e104503d65375b5a5367f" - integrity sha1-Dc2OxUpdNaPBXhBFA9ZTdbWlNn8= +regjsparser@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.12.0.tgz#0e846df6c6530586429377de56e0475583b088dc" + integrity sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ== dependencies: - isobject "^2.0.0" + jsesc "~3.0.2" remark-parse@^10.0.0: - version "10.0.1" - resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-10.0.1.tgz#6f60ae53edbf0cf38ea223fe643db64d112e0775" - integrity sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw== + version "10.0.2" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-10.0.2.tgz#ca241fde8751c2158933f031a4e3efbaeb8bc262" + integrity sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw== dependencies: "@types/mdast" "^3.0.0" mdast-util-from-markdown "^1.0.0" @@ -12945,123 +12048,41 @@ remark-rehype@^10.0.0: mdast-util-to-hast "^12.1.0" unified "^10.0.0" -remarkable@^1.6.2, remarkable@^1.7.1: - version "1.7.4" - resolved "https://registry.yarnpkg.com/remarkable/-/remarkable-1.7.4.tgz#19073cb960398c87a7d6546eaa5e50d2022fcd00" - integrity sha512-e6NKUXgX95whv7IgddywbeN/ItCkWbISmc2DiqHJb0wTrqZIexqdco5b8Z3XZoo/48IdNVKM9ZCvTPJ4F5uvhg== - dependencies: - argparse "^1.0.10" - autolinker "~0.28.0" - remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= - -repeat-element@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" - integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== - -repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= - -repeating@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= - dependencies: - is-finite "^1.0.0" + integrity sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw== replace-ext@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.1.tgz#2d6d996d04a15855d967443631dd5f77825b016a" integrity sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw== -request-promise-core@1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f" - integrity sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw== - dependencies: - lodash "^4.17.19" - -request-promise-native@^1.0.5: - version "1.0.9" - resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.9.tgz#e407120526a5efdc9a39b28a5679bf47b9d9dc28" - integrity sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g== - dependencies: - request-promise-core "1.1.4" - stealthy-require "^1.1.1" - tough-cookie "^2.3.3" - -request@^2.82.0, request@^2.87.0, request@^2.88.0: - version "2.88.2" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" - integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.3" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.5.0" - tunnel-agent "^0.6.0" - uuid "^3.3.2" - -requestretry@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/requestretry/-/requestretry-7.1.0.tgz#d16a1a57a95295211147841550603f3dc527541e" - integrity sha512-TqVDgp251BW4b8ddQ2ptaj/57Z3LZHLscAUT7v6qs70buqF2/IoOVjYbpjJ6HiW7j5+waqegGI8xKJ/+uzgDmw== - dependencies: - extend "^3.0.2" - lodash "^4.17.15" - require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== require-from-string@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== -require-main-filename@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" - integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= - require-main-filename@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== -resolve-alpn@^1.0.0: +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + +resolve-alpn@^1.0.0, resolve-alpn@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== -resolve-cwd@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" - integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= - dependencies: - resolve-from "^3.0.0" - resolve-cwd@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" @@ -13069,64 +12090,54 @@ resolve-cwd@^3.0.0: dependencies: resolve-from "^5.0.0" -resolve-from@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" - integrity sha1-six699nWiBvItuZTM17rywoYh0g= +resolve-from@5.0.0, resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= +resolve-package-path@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/resolve-package-path/-/resolve-package-path-4.0.3.tgz#31dab6897236ea6613c72b83658d88898a9040aa" + integrity sha512-SRpNAPW4kewOaNUt8VPqhJ0UMxawMwzJD8V7m1cJfdSTK9ieZwS6K7Dabsm4bmLFM96Z5Y/UznrpG5kt1im8yA== + dependencies: + path-root "^0.1.1" -resolve@^1.1.6, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.9.0: - version "1.22.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" - integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== +resolve@^1.10.0, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.9.0: + version "1.22.10" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" + integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== dependencies: - is-core-module "^2.8.1" + is-core-module "^2.16.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -resolve@^2.0.0-next.3: - version "2.0.0-next.3" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.3.tgz#d41016293d4a8586a39ca5d9b5f15cbea1f55e46" - integrity sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q== - dependencies: - is-core-module "^2.2.0" - path-parse "^1.0.6" - -responselike@1.0.2, responselike@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" - integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= +resolve@^2.0.0-next.5: + version "2.0.0-next.5" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" + integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== dependencies: - lowercase-keys "^1.0.0" + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" responselike@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.0.tgz#26391bcc3174f750f9a79eacc40a12a5c42d7723" - integrity sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw== + version "2.0.1" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.1.tgz#9a0bc8fdc252f3fb1cca68b016591059ba1422bc" + integrity sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw== dependencies: lowercase-keys "^2.0.0" -restore-cursor@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" - integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= +responselike@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-3.0.0.tgz#20decb6c298aff0dbee1c355ca95461d42823626" + integrity sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg== dependencies: - onetime "^2.0.0" - signal-exit "^3.0.2" + lowercase-keys "^3.0.0" restore-cursor@^3.1.0: version "3.1.0" @@ -13136,45 +12147,49 @@ restore-cursor@^3.1.0: onetime "^5.1.0" signal-exit "^3.0.2" -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== - -retry@^0.10.0: - version "0.10.1" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4" - integrity sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q= - retry@^0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" - integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= + integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + version "1.1.0" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.1.0.tgz#0fe13b9522e1473f51b558ee796e08f11f9b489f" + integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== rfdc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" - integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== + version "1.4.1" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca" + integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== -rimraf@2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3: +rimraf@2, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== dependencies: glob "^7.1.3" -rimraf@^3.0.0, rimraf@^3.0.2: +rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== dependencies: glob "^7.1.3" +rimraf@^4.4.1: + version "4.4.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-4.4.1.tgz#bd33364f67021c5b79e93d7f4fa0568c7c21b755" + integrity sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og== + dependencies: + glob "^9.2.0" + +rimraf@^5.0.0: + version "5.0.10" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-5.0.10.tgz#23b9843d3dc92db71f96e1a2ce92e39fd2a8221c" + integrity sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ== + dependencies: + glob "^10.3.7" + rimraf@~2.6.2: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" @@ -13197,9 +12212,14 @@ roarr@^2.15.3: route-parser@^0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/route-parser/-/route-parser-0.0.5.tgz#7d1d09d335e49094031ea16991a4a79b01bbe1f4" - integrity sha1-fR0J0zXkkJQDHqFpkaSnmwG74fQ= + integrity sha512-nsii+MXoNb7NyF05LP9kaktx6AoBVT/7zUgDnzIb5IoYAvYkbZOAuoLJjVdsyEVxWv0swCxWkKDK4cMva+WDBA== -run-async@^2.2.0: +rrweb-cssom@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz#ed298055b97cbddcdeb278f904857629dec5e0e1" + integrity sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw== + +run-async@^2.4.0: version "2.4.1" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== @@ -13211,24 +12231,10 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -run-queue@^1.0.0, run-queue@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" - integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= - dependencies: - aproba "^1.1.1" - -rxjs@^6.4.0: - version "6.6.7" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" - integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== - dependencies: - tslib "^1.9.0" - -rxjs@^7.5.1: - version "7.5.5" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.5.tgz#2ebad89af0f560f460ad5cc4213219e1f7dd4e9f" - integrity sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw== +rxjs@^7.5.1, rxjs@^7.5.5: + version "7.8.2" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.2.tgz#955bc473ed8af11a002a2be52071bf475638607b" + integrity sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA== dependencies: tslib "^2.1.0" @@ -13239,40 +12245,79 @@ sade@^1.7.3: dependencies: mri "^1.1.0" -safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +safe-array-concat@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.3.tgz#c9e54ec4f603b0bbb8e7e5007a5ee7aecd1538c3" + integrity sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.2" + get-intrinsic "^1.2.6" + has-symbols "^1.1.0" + isarray "^2.0.5" -safe-buffer@~5.1.0, safe-buffer@~5.1.1: +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-regex@^1.1.0: +safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-push-apply@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-push-apply/-/safe-push-apply-1.0.0.tgz#01850e981c1602d398c85081f360e4e6d03d27f5" + integrity sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA== + dependencies: + es-errors "^1.3.0" + isarray "^2.0.5" + +safe-regex-test@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.1.0.tgz#7f87dfb67a3150782eaaf18583ff5d1711ac10c1" + integrity sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw== dependencies: - ret "~0.1.10" + call-bound "^1.0.2" + es-errors "^1.3.0" + is-regex "^1.2.1" + +safe-stable-stringify@^2.4.3: + version "2.5.0" + resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz#4ca2f8e385f2831c432a719b108a3bf7af42a1dd" + integrity sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA== -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@^2.1.2, safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== +sanitize-filename@^1.6.3: + version "1.6.3" + resolved "https://registry.yarnpkg.com/sanitize-filename/-/sanitize-filename-1.6.3.tgz#755ebd752045931977e30b2025d340d7c9090378" + integrity sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg== + dependencies: + truncate-utf8-bytes "^1.0.0" + sax@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + version "1.4.1" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.4.1.tgz#44cc8988377f126304d3b3fc1010c733b929ef0f" + integrity sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg== + +saxes@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5" + integrity sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA== + dependencies: + xmlchars "^2.2.0" -scheduler@^0.19.1: - version "0.19.1" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.1.tgz#4f3e2ed2c1a7d65681f4c854fa8c5a1ccb40f196" - integrity sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA== +scheduler@^0.23.2: + version "0.23.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" + integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== dependencies: loose-envify "^1.1.0" - object-assign "^4.1.1" schema-utils@^2.6.5: version "2.7.1" @@ -13283,68 +12328,68 @@ schema-utils@^2.6.5: ajv "^6.12.4" ajv-keywords "^3.5.2" -schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" - integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== +schema-utils@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" + integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== dependencies: "@types/json-schema" "^7.0.8" ajv "^6.12.5" ajv-keywords "^3.5.2" -schema-utils@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.0.0.tgz#60331e9e3ae78ec5d16353c467c34b3a0a1d3df7" - integrity sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg== +schema-utils@^4.0.0, schema-utils@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.3.0.tgz#3b669f04f71ff2dfb5aba7ce2d5a9d79b35622c0" + integrity sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g== dependencies: "@types/json-schema" "^7.0.9" - ajv "^8.8.0" + ajv "^8.9.0" ajv-formats "^2.1.1" - ajv-keywords "^5.0.0" + ajv-keywords "^5.1.0" + +secure-compare@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/secure-compare/-/secure-compare-3.0.1.tgz#f1a0329b308b221fae37b9974f3d578d0ca999e3" + integrity sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw== -seek-bzip@^1.0.5: +seek-bzip@^1.0.5, seek-bzip@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/seek-bzip/-/seek-bzip-1.0.6.tgz#35c4171f55a680916b52a07859ecf3b5857f21c4" integrity sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ== dependencies: commander "^2.8.1" -self-closing-tags@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/self-closing-tags/-/self-closing-tags-1.0.1.tgz#6c5fa497994bb826b484216916371accee490a5d" - integrity sha512-7t6hNbYMxM+VHXTgJmxwgZgLGktuXtVVD5AivWzNTdJBM4DBjnDKDzkf2SrNjihaArpeJYNjxkELBu1evI4lQA== - semver-compare@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" - integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= - -"semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.0, semver@^5.7.1: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" - integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + integrity sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow== -semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.6.0: + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== -semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: - version "7.3.7" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" - integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== +semver@7.5.3: + version "7.5.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.3.tgz#161ce8c2c6b4b3bdca6caadc9fa3317a4c4fe88e" + integrity sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ== dependencies: lru-cache "^6.0.0" -send@0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" - integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== +semver@^6.0.0, semver@^6.2.0, semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.0.0, semver@^7.1.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4, semver@^7.6.3: + version "7.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f" + integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA== + +send@0.19.0: + version "0.19.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8" + integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw== dependencies: debug "2.6.9" depd "2.0.0" @@ -13383,49 +12428,63 @@ serialize-javascript@^5.0.1: dependencies: randombytes "^2.1.0" -serialize-javascript@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" - integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== +serialize-javascript@^6.0.0, serialize-javascript@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" + integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== dependencies: randombytes "^2.1.0" -serve-static@1.15.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" - integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== +serve-static@1.16.2: + version "1.16.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.2.tgz#b6a5343da47f6bdd2673848bf45754941e803296" + integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw== dependencies: - encodeurl "~1.0.2" + encodeurl "~2.0.0" escape-html "~1.0.3" parseurl "~1.3.3" - send "0.18.0" + send "0.19.0" set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== -set-getter@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/set-getter/-/set-getter-0.1.1.tgz#a3110e1b461d31a9cfc8c5c9ee2e9737ad447102" - integrity sha512-9sVWOy+gthr+0G9DzqqLaYNA7+5OKkSmcqjL9cBpDEaZrr3ShQlyX2cZ/O/ozE41oxn/Tt0LGEM/w4Rub3A3gw== +set-function-length@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== dependencies: - to-object-path "^0.3.0" + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" -set-value@^2.0.0, set-value@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" - integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== +set-function-name@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" + integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.2" + +set-proto@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/set-proto/-/set-proto-1.0.0.tgz#0760dbcff30b2d7e801fd6e19983e56da337565e" + integrity sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw== dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" + dunder-proto "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" setimmediate@^1.0.5, setimmediate@~1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== setprototypeof@1.2.0: version "1.2.0" @@ -13439,13 +12498,6 @@ shallow-clone@^3.0.0: dependencies: kind-of "^6.0.2" -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= - dependencies: - shebang-regex "^1.0.0" - shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -13453,11 +12505,6 @@ shebang-command@^2.0.0: dependencies: shebang-regex "^3.0.0" -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= - shebang-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" @@ -13466,7 +12513,7 @@ shebang-regex@^3.0.0: shell-env@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/shell-env/-/shell-env-0.3.0.tgz#2250339022989165bda4eb7bf383afeaaa92dc34" - integrity sha1-IlAzkCKYkWW9pOt784Ov6qqS3DQ= + integrity sha512-VrC6OSm5riGAFWvlYExA80Rrlfi4STsztNXjyet9Jf20hbiVeeKvJIesb92gJk7zlmpQjB0wOZpy8ClzVdPVWQ== dependencies: default-shell "^1.0.0" execa "^0.5.0" @@ -13475,33 +12522,71 @@ shell-env@^0.3.0: shell-path@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/shell-path/-/shell-path-2.1.0.tgz#ea7d06ae1070874a1bac5c65bb9bdd62e4f67a38" - integrity sha1-6n0GrhBwh0obrFxlu5vdYuT2ejg= + integrity sha512-w+mbrnpA+r5jSFS4MgFfxZJ1Wx8qMKkR4gvQ+wgaZEoZCMMYZ6Yl/dcNjW/zLMfmx5a9IVIFwGAtUJcnDMmFrg== dependencies: shell-env "^0.3.0" -shelljs@^0.8.3: - version "0.8.5" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" - integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== +side-channel-list@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad" + integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== dependencies: - glob "^7.0.0" - interpret "^1.0.0" - rechoir "^0.6.2" + es-errors "^1.3.0" + object-inspect "^1.13.3" -side-channel@^1.0.3, side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== +side-channel-map@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42" + integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + +side-channel-weakmap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" + integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + side-channel-map "^1.0.1" -signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: +side-channel@^1.0.4, side-channel@^1.0.6, side-channel@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" + integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.3" + side-channel-list "^1.0.0" + side-channel-map "^1.0.1" + side-channel-weakmap "^1.0.2" + +signal-exit@3.0.7, signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== +signal-exit@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + +sigstore@^1.3.0, sigstore@^1.4.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/sigstore/-/sigstore-1.9.0.tgz#1e7ad8933aa99b75c6898ddd0eeebc3eb0d59875" + integrity sha512-0Zjz0oe37d08VeOtBIuB6cRriqXse2e8w+7yIy2XSXjshRKxbc2KkhXjL229jXSxEm7UbcjS76wcJDGQddVI9A== + dependencies: + "@sigstore/bundle" "^1.1.0" + "@sigstore/protobuf-specs" "^0.2.0" + "@sigstore/sign" "^1.0.0" + "@sigstore/tuf" "^1.0.3" + make-fetch-happen "^11.0.1" + simple-concat@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" @@ -13516,47 +12601,28 @@ simple-get@^3.0.3: once "^1.3.1" simple-concat "^1.0.0" -simple-get@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" - integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== +simple-update-notifier@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz#d70b92bdab7d6d90dfd73931195a30b6e3d7cebb" + integrity sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w== dependencies: - decompress-response "^6.0.0" - once "^1.3.1" - simple-concat "^1.0.0" - -sinon-chai@^3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/sinon-chai/-/sinon-chai-3.7.0.tgz#cfb7dec1c50990ed18c153f1840721cf13139783" - integrity sha512-mf5NURdUaSdnatJx3uhoBOrY9dtL19fiOtAdT1Azxg3+lNJFiuN0uzaU3xX1LeAfL17kHQhTAJgpsfhbMJMY2g== + semver "^7.5.3" -sinon@^12.0.1: - version "12.0.1" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-12.0.1.tgz#331eef87298752e1b88a662b699f98e403c859e9" - integrity sha512-iGu29Xhym33ydkAT+aNQFBINakjq69kKO6ByPvTsm3yyIACfyQttRTP03aBP/I8GfhFmLzrnKwNNkr0ORb1udg== - dependencies: - "@sinonjs/commons" "^1.8.3" - "@sinonjs/fake-timers" "^8.1.0" - "@sinonjs/samsam" "^6.0.2" - diff "^5.0.0" - nise "^5.1.0" - supports-color "^7.2.0" +slash@3.0.0, slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" - integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= + integrity sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg== slash@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - slice-ansi@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" @@ -13575,12 +12641,7 @@ slice-ansi@^4.0.0: astral-regex "^2.0.0" is-fullwidth-code-point "^3.0.0" -slide@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" - integrity sha1-VusCfWW00tzmyy4tMsTUr8nh1wc= - -smart-buffer@^4.1.0, smart-buffer@^4.2.0: +smart-buffer@^4.0.2, smart-buffer@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== @@ -13593,133 +12654,98 @@ snake-case@^3.0.4: dot-case "^3.0.4" tslib "^2.0.3" -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== +socket.io-adapter@~2.5.2: + version "2.5.5" + resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz#c7a1f9c703d7756844751b6ff9abfc1780664082" + integrity sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg== dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - -socket.io-adapter@~2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.3.3.tgz#4d6111e4d42e9f7646e365b4f578269821f13486" - integrity sha512-Qd/iwn3VskrpNO60BeRyCyr8ZWw9CPZyitW4AQwmRZ8zCiyDiL+znRnWX6tDHXnWn1sJrM1+b6Mn6wEDJJ4aYQ== + debug "~4.3.4" + ws "~8.17.1" -socket.io-client@4.4.1: - version "4.4.1" - resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-4.4.1.tgz#b6aa9448149d09b8d0b2bbf3d2fac310631fdec9" - integrity sha512-N5C/L5fLNha5Ojd7Yeb/puKcPWWcoB/A09fEjjNsg91EDVr5twk/OEyO6VT9dlLSUNY85NpW6KBhVMvaLKQ3vQ== +socket.io-client@^4.5.3: + version "4.8.1" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-4.8.1.tgz#1941eca135a5490b94281d0323fe2a35f6f291cb" + integrity sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ== dependencies: - "@socket.io/component-emitter" "~3.0.0" - backo2 "~1.0.2" + "@socket.io/component-emitter" "~3.1.0" debug "~4.3.2" - engine.io-client "~6.1.1" - parseuri "0.0.6" - socket.io-parser "~4.1.1" - -socket.io-parser@~4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.0.4.tgz#9ea21b0d61508d18196ef04a2c6b9ab630f4c2b0" - integrity sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g== - dependencies: - "@types/component-emitter" "^1.2.10" - component-emitter "~1.3.0" - debug "~4.3.1" + engine.io-client "~6.6.1" + socket.io-parser "~4.2.4" -socket.io-parser@~4.1.1: - version "4.1.2" - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.1.2.tgz#0a97d4fb8e67022158a568450a6e41887e42035e" - integrity sha512-j3kk71QLJuyQ/hh5F/L2t1goqzdTL0gvDzuhTuNSwihfuFUrcSji0qFZmJJPtG6Rmug153eOPsUizeirf1IIog== +socket.io-parser@~4.2.4: + version "4.2.4" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.4.tgz#c806966cf7270601e47469ddeec30fbdfda44c83" + integrity sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew== dependencies: - "@socket.io/component-emitter" "~3.0.0" + "@socket.io/component-emitter" "~3.1.0" debug "~4.3.1" -socket.io@4.4.1: - version "4.4.1" - resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.4.1.tgz#cd6de29e277a161d176832bb24f64ee045c56ab8" - integrity sha512-s04vrBswdQBUmuWJuuNTmXUVJhP0cVky8bBDhdkf8y0Ptsu7fKU2LuLbts9g+pdmAdyMMn8F/9Mf1/wbtUN0fg== +socket.io@^4.5.3: + version "4.8.1" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.8.1.tgz#fa0eaff965cc97fdf4245e8d4794618459f7558a" + integrity sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg== dependencies: accepts "~1.3.4" base64id "~2.0.0" + cors "~2.8.5" debug "~4.3.2" - engine.io "~6.1.0" - socket.io-adapter "~2.3.3" - socket.io-parser "~4.0.4" + engine.io "~6.6.0" + socket.io-adapter "~2.5.2" + socket.io-parser "~4.2.4" -socks-proxy-agent@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz#3c8991f3145b2799e70e11bd5fbc8b1963116386" - integrity sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg== +socks-proxy-agent@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz#032fb583048a29ebffec2e6a73fca0761f48177e" + integrity sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ== dependencies: - agent-base "~4.2.1" - socks "~2.3.2" + agent-base "^6.0.2" + debug "4" + socks "^2.3.3" -socks-proxy-agent@^6.0.0, socks-proxy-agent@^6.1.1: - version "6.2.0" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-6.2.0.tgz#f6b5229cc0cbd6f2f202d9695f09d871e951c85e" - integrity sha512-wWqJhjb32Q6GsrUqzuFkukxb/zzide5quXYcMVpIjxalDBBYy2nqKCFQ/9+Ie4dvOYSQdOk3hUlZSdzZOd3zMQ== +socks-proxy-agent@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz#dc069ecf34436621acb41e3efa66ca1b5fed15b6" + integrity sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww== dependencies: agent-base "^6.0.2" debug "^4.3.3" socks "^2.6.2" -socks@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.6.2.tgz#ec042d7960073d40d94268ff3bb727dc685f111a" - integrity sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA== +socks-proxy-agent@^8.0.5: + version "8.0.5" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz#b9cdb4e7e998509d7659d689ce7697ac21645bee" + integrity sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw== dependencies: - ip "^1.1.5" - smart-buffer "^4.2.0" + agent-base "^7.1.2" + debug "^4.3.4" + socks "^2.8.3" -socks@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.3.3.tgz#01129f0a5d534d2b897712ed8aceab7ee65d78e3" - integrity sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA== +socks@^2.3.3, socks@^2.6.2, socks@^2.8.3: + version "2.8.4" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.4.tgz#07109755cdd4da03269bda4725baa061ab56d5cc" + integrity sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ== dependencies: - ip "1.1.5" - smart-buffer "^4.1.0" + ip-address "^9.0.5" + smart-buffer "^4.2.0" sort-keys-length@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/sort-keys-length/-/sort-keys-length-1.0.1.tgz#9cb6f4f4e9e48155a6aa0671edd336ff1479a188" - integrity sha1-nLb09OnkgVWmqgZx7dM2/xR5oYg= + integrity sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw== dependencies: sort-keys "^1.0.0" sort-keys@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" - integrity sha1-RBttTTRnmPG05J6JIK37oOVD+a0= + integrity sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg== dependencies: is-plain-obj "^1.0.0" sort-keys@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128" - integrity sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg= + integrity sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg== dependencies: is-plain-obj "^1.0.0" @@ -13728,10 +12754,10 @@ source-map-js@^0.6.2: resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-0.6.2.tgz#0bb5de631b41cfbda6cfba8bd05a80efdfd2385e" integrity sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug== -source-map-js@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" - integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== +source-map-js@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" + integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== source-map-loader@^2.0.1: version "2.0.2" @@ -13742,17 +12768,6 @@ source-map-loader@^2.0.1: iconv-lite "^0.6.2" source-map-js "^0.6.2" -source-map-resolve@^0.5.0: - version "0.5.3" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" - integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== - dependencies: - atob "^2.1.2" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - source-map-support@^0.5.19, source-map-support@~0.5.20: version "0.5.21" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" @@ -13761,45 +12776,33 @@ source-map-support@^0.5.19, source-map-support@~0.5.20: buffer-from "^1.0.0" source-map "^0.6.0" -source-map-url@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" - integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== - -source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.0: +source-map@^0.5.7, source-map@~0.5.0: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -source-map@~0.8.0-beta.0: - version "0.8.0-beta.0" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.8.0-beta.0.tgz#d4c1bb42c3f7ee925f005927ba10709e0d1d1f11" - integrity sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA== - dependencies: - whatwg-url "^7.0.0" - space-separated-tokens@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-2.0.1.tgz#43193cec4fb858a2ce934b7f98b7f2c18107098b" - integrity sha512-ekwEbFp5aqSPKaqeY1PGrlGQxPNaq+Cnx4+bE2D8sciBQrHpbwoBbawqTN2+6jPs9IdWxxiUcN0K2pkczD3zmw== + version "2.0.2" + resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz#1ecd9d2350a3844572c3f4a312bceb018348859f" + integrity sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q== spdx-correct@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" - integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== + version "3.2.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" + integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== dependencies: spdx-expression-parse "^3.0.0" spdx-license-ids "^3.0.0" spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + version "2.5.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz#5d607d27fc806f66d7b64a766650fa890f04ed66" + integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w== spdx-expression-parse@^3.0.0: version "3.0.1" @@ -13810,30 +12813,16 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.11" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz#50c0d8c40a14ec1bf449bae69a0ea4685a9d9f95" - integrity sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g== + version "3.0.21" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz#6d6e980c9df2b6fc905343a3b2d702a6239536c3" + integrity sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg== split-on-first@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f" integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw== -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== - dependencies: - extend-shallow "^3.0.0" - -split2@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/split2/-/split2-2.2.0.tgz#186b2575bcf83e85b7d18465756238ee4ee42493" - integrity sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw== - dependencies: - through2 "^2.0.2" - -split2@^3.0.0: +split2@^3.2.2: version "3.2.2" resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg== @@ -13843,115 +12832,85 @@ split2@^3.0.0: split@0.3: version "0.3.3" resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" - integrity sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8= + integrity sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA== dependencies: through "2" -split@^1.0.0: +split@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" integrity sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg== dependencies: through "2" -sprintf-js@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" - integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== +sprintf-js@^1.1.2, sprintf-js@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a" + integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= - -sshpk@^1.7.0: - version "1.17.0" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" - integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - bcrypt-pbkdf "^1.0.0" - dashdash "^1.12.0" - ecc-jsbn "~0.1.1" - getpass "^0.1.1" - jsbn "~0.1.0" - safer-buffer "^2.0.2" - tweetnacl "~0.14.0" - -ssri@^6.0.0, ssri@^6.0.1: - version "6.0.2" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.2.tgz#157939134f20464e7301ddba3e90ffa8f7728ac5" - integrity sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q== - dependencies: - figgy-pudding "^3.5.1" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== -ssri@^8.0.0, ssri@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" - integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== +ssri@^10.0.0, ssri@^10.0.1: + version "10.0.6" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-10.0.6.tgz#a8aade2de60ba2bce8688e3fa349bad05c7dc1e5" + integrity sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ== dependencies: - minipass "^3.1.1" + minipass "^7.0.3" -ssri@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-9.0.0.tgz#70ad90e339eb910f1a7ff1dcf4afc268326c4547" - integrity sha512-Y1Z6J8UYnexKFN1R/hxUaYoY2LVdKEzziPmVAFKiKX8fiwvCJTVzn/xYE9TEWod5OVyNfIHHuVfIEuBClL/uJQ== +ssri@^9.0.0, ssri@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-9.0.1.tgz#544d4c357a8d7b71a19700074b6883fcb4eae057" + integrity sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q== dependencies: minipass "^3.1.1" -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" +stat-mode@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stat-mode/-/stat-mode-1.0.0.tgz#68b55cb61ea639ff57136f36b216a291800d1465" + integrity sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg== statuses@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== -stealthy-require@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" - integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= - -stream-combiner@~0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" - integrity sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ= - dependencies: - duplexer "~0.1.1" - -stream-each@^1.1.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" - integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== - dependencies: - end-of-stream "^1.1.0" - stream-shift "^1.0.0" - -stream-shift@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" - integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== +stop-iteration-iterator@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz#f481ff70a548f6124d0312c3aa14cbfa7aa542ad" + integrity sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ== + dependencies: + es-errors "^1.3.0" + internal-slot "^1.1.0" -streamsearch@0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a" - integrity sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo= +stream-combiner@~0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" + integrity sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw== + dependencies: + duplexer "~0.1.1" -strict-uri-encode@^1.0.0: +streamsearch@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" - integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= + resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" + integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== + +streamx@^2.15.0, streamx@^2.21.0: + version "2.22.0" + resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.22.0.tgz#cd7b5e57c95aaef0ff9b2aef7905afa62ec6e4a7" + integrity sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw== + dependencies: + fast-fifo "^1.3.2" + text-decoder "^1.1.0" + optionalDependencies: + bare-events "^2.2.0" strict-uri-encode@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" - integrity sha1-ucczDHBChi9rFC3CdLvMWGbONUY= + integrity sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ== string-argv@0.3.1: version "0.3.1" @@ -13968,24 +12927,7 @@ string-natural-compare@^2.0.3: resolved "https://registry.yarnpkg.com/string-natural-compare/-/string-natural-compare-2.0.3.tgz#9dbe1dd65490a5fe14f7a5c9bc686fc67cb9c6e4" integrity sha512-4Kcl12rNjc+6EKhY8QyDVuQTAlMWwRiNbsxnVwBUKFr7dYPQuXVrtNU4sEkjF9LHY0AY6uVbB3ktbkIH4LC+BQ== -string-width@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -13994,59 +12936,90 @@ string-width@^1.0.1: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string-width@^3.0.0, string-width@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw== dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" -string.prototype.matchall@^4.0.7: - version "4.0.7" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz#8e6ecb0d8a1fb1fda470d81acecb2dba057a481d" - integrity sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg== +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - get-intrinsic "^1.1.1" - has-symbols "^1.0.3" - internal-slot "^1.0.3" - regexp.prototype.flags "^1.4.1" - side-channel "^1.0.4" + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" -string.prototype.trimend@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz#914a65baaab25fbdd4ee291ca7dde57e869cb8d0" - integrity sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog== +string.prototype.matchall@^4.0.12: + version "4.0.12" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz#6c88740e49ad4956b1332a911e949583a275d4c0" + integrity sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + es-abstract "^1.23.6" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.6" + gopd "^1.2.0" + has-symbols "^1.1.0" + internal-slot "^1.1.0" + regexp.prototype.flags "^1.5.3" + set-function-name "^2.0.2" + side-channel "^1.1.0" + +string.prototype.repeat@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz#e90872ee0308b29435aa26275f6e1b762daee01a" + integrity sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.19.5" + define-properties "^1.1.3" + es-abstract "^1.17.5" + +string.prototype.trim@^1.2.10: + version "1.2.10" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz#40b2dd5ee94c959b4dcfb1d65ce72e90da480c81" + integrity sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.2" + define-data-property "^1.1.4" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-object-atoms "^1.0.0" + has-property-descriptors "^1.0.2" + +string.prototype.trimend@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz#62e2731272cd285041b36596054e9f66569b6942" + integrity sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.2" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" -string.prototype.trimstart@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz#5466d93ba58cfa2134839f81d7f42437e8c01fef" - integrity sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg== +string.prototype.trimstart@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" + integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.19.5" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" -string_decoder@^1.1.1: +string_decoder@^1.1.1, string_decoder@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== dependencies: safe-buffer "~5.2.0" -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= - string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" @@ -14054,7 +13027,7 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -stringify-object@3.3.0: +stringify-object@3.3.0, stringify-object@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== @@ -14063,45 +13036,36 @@ stringify-object@3.3.0: is-obj "^1.0.1" is-regexp "^1.0.0" -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= - dependencies: - ansi-regex "^2.0.0" - -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= - dependencies: - ansi-regex "^3.0.0" - -strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== - dependencies: - ansi-regex "^4.1.0" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" -strip-bom@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" - integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== dependencies: - is-utf8 "^0.2.0" + ansi-regex "^6.0.1" strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== strip-dirs@^2.0.0: version "2.1.0" @@ -14110,27 +13074,28 @@ strip-dirs@^2.0.0: dependencies: is-natural-number "^4.0.1" +strip-dirs@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-dirs/-/strip-dirs-3.0.0.tgz#7c9a5d7822ce079a9db40387a4b20d5654746f42" + integrity sha512-I0sdgcFTfKQlUPZyAqPJmSG3HLO9rWDFnxonnIbskYNM3DwFOeTNB5KzVq3dA1GdRAc/25b5Y7UO2TQfKWw4aQ== + dependencies: + inspect-with-kind "^1.0.5" + is-plain-obj "^1.1.0" + strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== strip-final-newline@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== -strip-indent@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" - integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= - dependencies: - get-stdin "^4.0.1" - -strip-indent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" - integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g= +strip-final-newline@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" + integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== strip-indent@^3.0.0: version "3.0.0" @@ -14139,29 +13104,29 @@ strip-indent@^3.0.0: dependencies: min-indent "^1.0.0" -strip-json-comments@2.0.1, strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= - -strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: +strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -strip-outer@^1.0.0, strip-outer@^1.0.1: +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== + +strip-outer@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.1.tgz#b2fd2abf6604b9d1e6013057195df836b8a9d631" integrity sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg== dependencies: escape-string-regexp "^1.0.2" -striptags@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/striptags/-/striptags-3.2.0.tgz#cc74a137db2de8b0b9a370006334161f7dd67052" - integrity sha512-g45ZOGzHDMe2bdYMdIvdAfCQkCTDMGBazSw1ypMowwGIee7ZQ5dU0rBJ8Jqgl+jAKIv4dbeE1jscZq9wid1Tkw== +strip-outer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-2.0.0.tgz#c45c724ed9b1ff6be5f660503791404f4714084b" + integrity sha512-A21Xsm1XzUkK0qK1ZrytDUvqsQWict2Cykhvi0fBQntGG5JSprESasEyV1EZ/4CiR5WB5KjzLTrP/bO37B0wPg== -strong-log-transformer@^2.0.0: +strong-log-transformer@2.1.0, strong-log-transformer@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz#0f5ed78d325e0421ac6f90f7f10e691d6ae3ae10" integrity sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA== @@ -14170,17 +13135,25 @@ strong-log-transformer@^2.0.0: minimist "^1.2.0" through "^2.3.4" +strtok3@^7.0.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/strtok3/-/strtok3-7.1.1.tgz#f548fd9dc59d0a76d5567ff8c16be31221f29dfc" + integrity sha512-mKX8HA/cdBqMKUr0MMZAFssCkIGoZeSCMXgnt79yKxNFguMLVFgRe6wB+fsL0NmoHDbeyZXczy7vEPSoo3rkzg== + dependencies: + "@tokenizer/token" "^0.3.0" + peek-readable "^5.1.3" + style-dictionary@^3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/style-dictionary/-/style-dictionary-3.7.0.tgz#02f4b17232cbb1142a3fdc09a17dfb08aafde3b0" - integrity sha512-BL4AQS5kNDBXbFHWJhlCve6+ojnHgHkiwhf2nNByU698elXWdyK5b27OprphT4q0/tJ52zB+lodhqxIxbNOajQ== + version "3.9.2" + resolved "https://registry.yarnpkg.com/style-dictionary/-/style-dictionary-3.9.2.tgz#5b3ecd4af28a64f4855db71c90d24fd288f27318" + integrity sha512-M2pcQ6hyRtqHOh+NyT6T05R3pD/gwNpuhREBKvxC1En0vyywx+9Wy9nXWT1SZ9ePzv1vAo65ItnpA16tT9ZUCg== dependencies: chalk "^4.0.0" change-case "^4.1.2" commander "^8.3.0" fs-extra "^10.0.0" - glob "^7.2.0" - json5 "^2.2.0" + glob "^10.3.10" + json5 "^2.2.2" jsonc-parser "^3.0.0" lodash "^4.17.15" tinycolor2 "^1.4.1" @@ -14193,17 +13166,17 @@ style-loader@^2.0.0: loader-utils "^2.0.0" schema-utils "^3.0.0" -style-to-object@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.3.0.tgz#b1b790d205991cc783801967214979ee19a76e46" - integrity sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA== +style-to-object@^0.4.0: + version "0.4.4" + resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.4.4.tgz#266e3dfd56391a7eefb7770423612d043c3f33ec" + integrity sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg== dependencies: inline-style-parser "0.1.1" -success-symbol@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/success-symbol/-/success-symbol-0.1.0.tgz#24022e486f3bf1cdca094283b769c472d3b72897" - integrity sha1-JAIuSG878c3KCUKDt2nEctO3KJc= +stylis@4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.2.0.tgz#79daee0208964c8fe695a42fcffcac633a211a51" + integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw== sumchecker@^3.0.1: version "3.0.1" @@ -14212,45 +13185,31 @@ sumchecker@^3.0.1: dependencies: debug "^4.1.0" -superagent@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/superagent/-/superagent-5.3.1.tgz#d62f3234d76b8138c1320e90fa83dc1850ccabf1" - integrity sha512-wjJ/MoTid2/RuGCOFtlacyGNxN9QLMgcpYLDQlWFIhhdJ93kNscFonGvrpAHSCVjRVj++DGCglocF7Aej1KHvQ== +superagent@^7.1.5: + version "7.1.6" + resolved "https://registry.yarnpkg.com/superagent/-/superagent-7.1.6.tgz#64f303ed4e4aba1e9da319f134107a54cacdc9c6" + integrity sha512-gZkVCQR1gy/oUXr+kxJMLDjla434KmSOKbx5iGD30Ql+AkJQ/YlPKECJy2nhqOsHLjGHzoDTXNSjhnvWhzKk7g== dependencies: component-emitter "^1.3.0" - cookiejar "^2.1.2" - debug "^4.1.1" - fast-safe-stringify "^2.0.7" - form-data "^3.0.0" - formidable "^1.2.2" + cookiejar "^2.1.3" + debug "^4.3.4" + fast-safe-stringify "^2.1.1" + form-data "^4.0.0" + formidable "^2.0.1" methods "^1.1.2" - mime "^2.4.6" - qs "^6.9.4" + mime "2.6.0" + qs "^6.10.3" readable-stream "^3.6.0" - semver "^7.3.2" + semver "^7.3.7" -supports-color@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a" - integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg== - dependencies: - has-flag "^3.0.0" - -supports-color@8.1.1, supports-color@^8.0.0: +supports-color@8.1.1, supports-color@^8.0.0, supports-color@^8.1.1: version "8.1.1" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== dependencies: has-flag "^4.0.0" -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.1.0, supports-color@^7.2.0: +supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== @@ -14262,31 +13221,20 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -symbol-tree@^3.2.2: +symbol-tree@^3.2.4: version "3.2.4" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== -table@^6.0.9: - version "6.8.0" - resolved "https://registry.yarnpkg.com/table/-/table-6.8.0.tgz#87e28f14fa4321c3377ba286f07b79b281a3b3ca" - integrity sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA== - dependencies: - ajv "^8.0.1" - lodash.truncate "^4.4.2" - slice-ansi "^4.0.0" - string-width "^4.2.3" - strip-ansi "^6.0.1" - -tapable@^2.1.1, tapable@^2.2.0: +tapable@^2.1.1, tapable@^2.2.0, tapable@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== tar-fs@^1.16.2: - version "1.16.3" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-1.16.3.tgz#966a628841da2c4010406a82167cbd5e0c72d509" - integrity sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw== + version "1.16.4" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-1.16.4.tgz#d3f0e1edf164b821f086640b1f0596f004021dc8" + integrity sha512-u3XczWoYAIVXe5GOKK6+VeWaHjtc47W7hyuTo3+4cNakcCcuDmlkYiiHEsECwTkcI3h1VUgtwBQ54+RvY6cM4w== dependencies: chownr "^1.0.1" mkdirp "^0.5.1" @@ -14294,15 +13242,26 @@ tar-fs@^1.16.2: tar-stream "^1.1.2" tar-fs@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" - integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== + version "2.1.2" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.2.tgz#425f154f3404cb16cb8ff6e671d45ab2ed9596c5" + integrity sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA== dependencies: chownr "^1.1.1" mkdirp-classic "^0.5.2" pump "^3.0.0" tar-stream "^2.1.4" +tar-fs@^3.0.6: + version "3.0.8" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-3.0.8.tgz#8f62012537d5ff89252d01e48690dc4ebed33ab7" + integrity sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg== + dependencies: + pump "^3.0.0" + tar-stream "^3.1.5" + optionalDependencies: + bare-fs "^4.0.1" + bare-path "^3.0.0" + tar-stream@^1.1.2, tar-stream@^1.5.2: version "1.6.2" resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555" @@ -14316,7 +13275,7 @@ tar-stream@^1.1.2, tar-stream@^1.5.2: to-buffer "^1.1.1" xtend "^4.0.0" -tar-stream@^2.1.4: +tar-stream@^2.1.4, tar-stream@~2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== @@ -14327,20 +13286,16 @@ tar-stream@^2.1.4: inherits "^2.0.3" readable-stream "^3.1.1" -tar@^4.0.0, tar@^4.4.10, tar@^4.4.12, tar@^4.4.8: - version "4.4.19" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.19.tgz#2e4d7263df26f2b914dee10c825ab132123742f3" - integrity sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA== +tar-stream@^3.1.4, tar-stream@^3.1.5: + version "3.1.7" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-3.1.7.tgz#24b3fb5eabada19fe7338ed6d26e5f7c482e792b" + integrity sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ== dependencies: - chownr "^1.1.4" - fs-minipass "^1.2.7" - minipass "^2.9.0" - minizlib "^1.3.3" - mkdirp "^0.5.5" - safe-buffer "^5.2.1" - yallist "^3.1.1" + b4a "^1.6.4" + fast-fifo "^1.2.0" + streamx "^2.15.0" -tar@^6.0.2, tar@^6.0.5, tar@^6.1.11, tar@^6.1.2: +tar@6.1.11: version "6.1.11" resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA== @@ -14352,27 +13307,35 @@ tar@^6.0.2, tar@^6.0.5, tar@^6.1.11, tar@^6.1.2: mkdirp "^1.0.3" yallist "^4.0.0" -temp-dir@^1.0.0: +tar@^6.0.5, tar@^6.1.11, tar@^6.1.12, tar@^6.1.2: + version "6.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a" + integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^5.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + +temp-dir@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" - integrity sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0= + integrity sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ== temp-dir@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-2.0.0.tgz#bde92b05bdfeb1516e804c9c00ad45177f31321e" integrity sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg== -temp-write@^3.4.0: +temp-file@^3.4.0: version "3.4.0" - resolved "https://registry.yarnpkg.com/temp-write/-/temp-write-3.4.0.tgz#8cff630fb7e9da05f047c74ce4ce4d685457d492" - integrity sha1-jP9jD7fp2gXwR8dM5M5NaFRX1JI= + resolved "https://registry.yarnpkg.com/temp-file/-/temp-file-3.4.0.tgz#766ea28911c683996c248ef1a20eea04d51652c7" + integrity sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg== dependencies: - graceful-fs "^4.1.2" - is-stream "^1.1.0" - make-dir "^1.0.0" - pify "^3.0.0" - temp-dir "^1.0.0" - uuid "^3.0.1" + async-exit-hook "^2.0.1" + fs-extra "^10.0.0" temp@^0.9.1: version "0.9.4" @@ -14382,27 +13345,34 @@ temp@^0.9.1: mkdirp "^0.5.1" rimraf "~2.6.2" -terser-webpack-plugin@^5.1.3: - version "5.3.1" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz#0320dcc270ad5372c1e8993fabbd927929773e54" - integrity sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g== +terser-webpack-plugin@^5.3.11: + version "5.3.14" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz#9031d48e57ab27567f02ace85c7d690db66c3e06" + integrity sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw== dependencies: + "@jridgewell/trace-mapping" "^0.3.25" jest-worker "^27.4.5" - schema-utils "^3.1.1" - serialize-javascript "^6.0.0" - source-map "^0.6.1" - terser "^5.7.2" + schema-utils "^4.3.0" + serialize-javascript "^6.0.2" + terser "^5.31.1" -terser@^5.7.2: - version "5.13.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.13.1.tgz#66332cdc5a01b04a224c9fad449fc1a18eaa1799" - integrity sha512-hn4WKOfwnwbYfe48NgrQjqNOH9jzLqRcIfbYytOXCOv46LBfWr9bDS17MQqOi+BWGD0sJK3Sj5NC/gJjiojaoA== +terser@^5.31.1: + version "5.39.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.39.0.tgz#0e82033ed57b3ddf1f96708d123cca717d86ca3a" + integrity sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw== dependencies: - acorn "^8.5.0" + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" commander "^2.20.0" - source-map "~0.8.0-beta.0" source-map-support "~0.5.20" +text-decoder@^1.1.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/text-decoder/-/text-decoder-1.2.3.tgz#b19da364d981b2326d5f43099c310cc80d770c65" + integrity sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA== + dependencies: + b4a "^1.6.4" + text-extensions@^1.0.0: version "1.9.0" resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.9.0.tgz#1853e45fee39c945ce6f6c36b2d659b5aabc2a26" @@ -14411,23 +13381,9 @@ text-extensions@^1.0.0: text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= - -thenify-all@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" - integrity sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY= - dependencies: - thenify ">= 3.1.0 < 4" - -"thenify@>= 3.1.0 < 4": - version "3.3.1" - resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" - integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== - dependencies: - any-promise "^1.0.0" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== -through2@^2.0.0, through2@^2.0.2: +through2@^2.0.0: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== @@ -14435,40 +13391,15 @@ through2@^2.0.0, through2@^2.0.2: readable-stream "~2.3.6" xtend "~4.0.1" -through2@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.2.tgz#99f88931cfc761ec7678b41d5d7336b5b6a07bf4" - integrity sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ== - dependencies: - inherits "^2.0.4" - readable-stream "2 || 3" - -through2@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/through2/-/through2-4.0.2.tgz#a7ce3ac2a7a8b0b966c80e7c49f0484c3b239764" - integrity sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw== - dependencies: - readable-stream "3" - through@2, "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.6, through@^2.3.8, through@~2.3, through@~2.3.1: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= - -time-stamp@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" - integrity sha1-dkpaEa9QVhkhsTPztE5hhofg9cM= - -timed-out@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" - integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== tinycolor2@^1.4.1: - version "1.4.2" - resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.2.tgz#3f6a4d1071ad07676d7fa472e1fac40a719d8803" - integrity sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA== + version "1.6.0" + resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.6.0.tgz#f98007460169b0263b97072c5ae92484ce02d09e" + integrity sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw== tippy.js@^6.3.1: version "6.3.7" @@ -14477,6 +13408,13 @@ tippy.js@^6.3.1: dependencies: "@popperjs/core" "^2.9.0" +tmp-promise@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/tmp-promise/-/tmp-promise-3.0.3.tgz#60a1a1cc98c988674fcbfd23b6e3367bdeac4ce7" + integrity sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ== + dependencies: + tmp "^0.2.0" + tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -14484,41 +13422,16 @@ tmp@^0.0.33: dependencies: os-tmpdir "~1.0.2" +tmp@^0.2.0, tmp@~0.2.1: + version "0.2.3" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.3.tgz#eb783cc22bc1e8bebd0671476d46ea4eb32a79ae" + integrity sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w== + to-buffer@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80" integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg== -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= - -to-gfm-code-block@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/to-gfm-code-block/-/to-gfm-code-block-0.1.1.tgz#25d045a5fae553189e9637b590900da732d8aa82" - integrity sha1-JdBFpfrlUxielje1kJANpzLYqoI= - -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= - dependencies: - kind-of "^3.0.2" - -to-readable-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" - integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -14526,84 +13439,69 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - toidentifier@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== -tough-cookie@^2.3.3, tough-cookie@^2.3.4, tough-cookie@~2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" - integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== +token-types@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/token-types/-/token-types-5.0.1.tgz#aa9d9e6b23c420a675e55413b180635b86a093b4" + integrity sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg== dependencies: - psl "^1.1.28" - punycode "^2.1.1" + "@tokenizer/token" "^0.3.0" + ieee754 "^1.2.1" -tough-cookie@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" - integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== +tough-cookie@^4.1.2: + version "4.1.4" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36" + integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag== dependencies: psl "^1.1.33" punycode "^2.1.1" - universalify "^0.1.2" + universalify "^0.2.0" + url-parse "^1.5.3" -tr46@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" - integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= +tr46@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-4.1.1.tgz#281a758dcc82aeb4fe38c7dfe4d11a395aac8469" + integrity sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw== dependencies: - punycode "^2.1.0" + punycode "^2.3.0" tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== -trash@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/trash/-/trash-6.1.1.tgz#8fb863421b31f32571f2650b53534934d5e63025" - integrity sha512-4i56lCmz2RG6WZN018hf4L75L5HboaFuKkHx3wDG/ihevI99e0OgFyl8w6G4ioqBm62V4EJqCy5xw3vQSNXU8A== +trash@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/trash/-/trash-7.2.0.tgz#c5ad0c9b13d7e7cad0b4187b3cfe38cd8b39abe2" + integrity sha512-3bR8Z5aWO8b9qybS6skBoaavH/hX9Onb1RrdIIhJxv9VpH3aBtpbKuAX4rIh/0xpDZ7K4ga36wONk/okbhjTlA== dependencies: - "@stroncium/procfs" "^1.0.0" + "@stroncium/procfs" "^1.2.1" globby "^7.1.1" is-path-inside "^3.0.2" - make-dir "^3.0.0" - move-file "^1.1.0" - p-map "^3.0.0" - p-try "^2.2.0" - uuid "^3.3.2" - xdg-trashdir "^2.1.1" + make-dir "^3.1.0" + move-file "^2.0.0" + p-map "^4.0.0" + uuid "^8.3.2" + xdg-trashdir "^3.1.0" "traverse@>=0.3.0 <0.4": version "0.3.9" resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.3.9.tgz#717b8f220cc0bb7b44e40514c22b2e8bbc70d8b9" - integrity sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk= + integrity sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ== tree-kill@^1.2.1: version "1.2.2" resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== -trim-newlines@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" - integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= - -trim-newlines@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-2.0.0.tgz#b403d0b91be50c331dfc4b82eeceb22c3de16d20" - integrity sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA= +trim-lines@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-3.0.1.tgz#d802e332a07df861c48802c04321017b1bd87338" + integrity sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg== trim-newlines@^3.0.0: version "3.0.1" @@ -14613,29 +13511,57 @@ trim-newlines@^3.0.0: trim-repeated@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/trim-repeated/-/trim-repeated-1.0.0.tgz#e3646a2ea4e891312bf7eace6cfb05380bc01c21" - integrity sha1-42RqLqTokTEr9+rObPsFOAvAHCE= + integrity sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg== dependencies: escape-string-regexp "^1.0.2" +trim-repeated@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/trim-repeated/-/trim-repeated-2.0.0.tgz#5d60556d6d40d9461b7c7e06c3ac20b6b1d50090" + integrity sha512-QUHBFTJGdOwmp0tbOG505xAgOp/YliZP/6UgafFXYZ26WT1bvQmSMJUvkeVSASuJJHbqsFbynTvkd5W8RBTipg== + dependencies: + escape-string-regexp "^5.0.0" + trough@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/trough/-/trough-2.1.0.tgz#0f7b511a4fde65a46f18477ab38849b22c554876" - integrity sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g== + version "2.2.0" + resolved "https://registry.yarnpkg.com/trough/-/trough-2.2.0.tgz#94a60bd6bd375c152c1df911a4b11d5b0256f50f" + integrity sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw== + +truncate-utf8-bytes@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz#405923909592d56f78a5818434b0b78489ca5f2b" + integrity sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ== + dependencies: + utf8-byte-length "^1.0.1" + +ts-error@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/ts-error/-/ts-error-1.0.6.tgz#277496f2a28de6c184cfce8dfd5cdd03a4e6b0fc" + integrity sha512-tLJxacIQUM82IR7JO1UUkKlYuUTmoY9HBJAmNWFzheSlDS5SPMcNIepejHJa4BpPQLAcbRhRf3GDJzyj6rbKvA== ts-md5@^1.2.2: - version "1.2.11" - resolved "https://registry.yarnpkg.com/ts-md5/-/ts-md5-1.2.11.tgz#0bbdf884eecf7da3952fe8671a109d7e55d322c6" - integrity sha512-vAwy9rEuRE6a8xa1MavIVkLFyyU0ydk4CLMFA5vOVccmQKLOuGb/BHm3oEN7XHf2FoqS+z0pSvhaad/ombd1Vg== + version "1.3.1" + resolved "https://registry.yarnpkg.com/ts-md5/-/ts-md5-1.3.1.tgz#f5b860c0d5241dd9bb4e909dd73991166403f511" + integrity sha512-DiwiXfwvcTeZ5wCE0z+2A9EseZsztaiZtGrtSaY5JOD7ekPnR/GoIVD5gXZAlK9Na9Kvpo9Waz5rW64WKAWApg== + +tsconfig-paths@^4.1.2: + version "4.2.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz#ef78e19039133446d244beac0fd6a1632e2d107c" + integrity sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg== + dependencies: + json5 "^2.2.2" + minimist "^1.2.6" + strip-bom "^3.0.0" -tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0: +tslib@^1.10.0, tslib@^1.8.1: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.1: - version "2.4.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" - integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== +tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.3.1, tslib@^2.4.0, tslib@^2.6.2: + version "2.8.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== tsutils@^3.21.0: version "3.21.0" @@ -14644,23 +13570,22 @@ tsutils@^3.21.0: dependencies: tslib "^1.8.1" +tuf-js@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/tuf-js/-/tuf-js-1.1.7.tgz#21b7ae92a9373015be77dfe0cb282a80ec3bbe43" + integrity sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg== + dependencies: + "@tufjs/models" "1.0.4" + debug "^4.3.4" + make-fetch-happen "^11.1.1" + tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== dependencies: safe-buffer "^5.0.1" -tunnel@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.6.tgz#72f1314b34a5b192db012324df2cc587ca47f92c" - integrity sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg== - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= - type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" @@ -14668,17 +13593,10 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= - dependencies: - prelude-ls "~1.1.2" - -type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5, type-detect@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== +type-detect@^4.0.0, type-detect@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.1.0.tgz#deb2453e8f08dcae7ae98c626b13dddb0155906c" + integrity sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw== type-fest@^0.13.1: version "0.13.1" @@ -14700,10 +13618,10 @@ type-fest@^0.21.3: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== -type-fest@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.3.1.tgz#63d00d204e059474fe5e1b7c011112bbd1dc29e1" - integrity sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ== +type-fest@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.4.1.tgz#8bdf77743385d8a4f13ba95f610f5ccd68c728f8" + integrity sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw== type-fest@^0.6.0: version "0.6.0" @@ -14715,10 +13633,10 @@ type-fest@^0.8.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== -type-fest@^1.0.2: - version "1.4.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" - integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== +type-fest@^2.17.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" + integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== type-is@^1.6.4, type-is@~1.6.18: version "1.6.18" @@ -14728,31 +13646,70 @@ type-is@^1.6.4, type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= +typed-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz#a72395450a4869ec033fd549371b47af3a2ee536" + integrity sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + is-typed-array "^1.1.14" -typemoq@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/typemoq/-/typemoq-2.1.0.tgz#4452ce360d92cf2a1a180f0c29de2803f87af1e8" - integrity sha512-DtRNLb7x8yCTv/KHlwes+NI+aGb4Vl1iPC63Hhtcvk1DpxSAZzKWQv0RQFY0jX2Uqj0SDBNl8Na4e6MV6TNDgw== +typed-array-byte-length@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz#8407a04f7d78684f3d252aa1a143d2b77b4160ce" + integrity sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg== dependencies: - circular-json "^0.3.1" - lodash "^4.17.4" - postinstall-build "^5.0.1" + call-bind "^1.0.8" + for-each "^0.3.3" + gopd "^1.2.0" + has-proto "^1.2.0" + is-typed-array "^1.1.14" -typeof-article@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/typeof-article/-/typeof-article-0.1.1.tgz#9f07e733c3fbb646ffa9e61c08debacd460e06af" - integrity sha1-nwfnM8P7tkb/qeYcCN66zUYOBq8= +typed-array-byte-offset@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz#ae3698b8ec91a8ab945016108aef00d5bff12355" + integrity sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" + for-each "^0.3.3" + gopd "^1.2.0" + has-proto "^1.2.0" + is-typed-array "^1.1.15" + reflect.getprototypeof "^1.0.9" + +typed-array-length@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.7.tgz#ee4deff984b64be1e118b0de8c9c877d5ce73d3d" + integrity sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg== dependencies: - kind-of "^3.1.0" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + is-typed-array "^1.1.13" + possible-typed-array-names "^1.0.0" + reflect.getprototypeof "^1.0.6" + +typed-query-selector@^2.12.0: + version "2.12.0" + resolved "https://registry.yarnpkg.com/typed-query-selector/-/typed-query-selector-2.12.0.tgz#92b65dbc0a42655fccf4aeb1a08b1dddce8af5f2" + integrity sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg== + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== -typescript@~4.5.5: - version "4.5.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.5.5.tgz#d8c953832d28924a9e3d37c73d729c846c5896f3" - integrity sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA== +"typescript@>=3 < 6", typescript@^5.3.3, typescript@^5.4.5: + version "5.8.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.8.2.tgz#8170b3702f74b79db2e5a96207c15e65807999e4" + integrity sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ== + +typescript@~5.4.5: + version "5.4.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.5.tgz#42ccef2c571fdbd0f6718b1d1f5e6e5ef006f611" + integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== uc.micro@^1.0.1, uc.micro@^1.0.5: version "1.0.6" @@ -14760,19 +13717,9 @@ uc.micro@^1.0.1, uc.micro@^1.0.5: integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== uglify-js@^3.1.4: - version "3.15.5" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.15.5.tgz#2b10f9e0bfb3f5c15a8e8404393b6361eaeb33b3" - integrity sha512-hNM5q5GbBRB5xB+PMqVRcgYe4c8jbyZ1pzZhS6jbq54/4F2gFK869ZheiE5A8/t+W5jtTNpWef/5Q9zk639FNQ== - -uid-number@0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" - integrity sha1-DqEOgDXo61uOREnwbaHHMGY7qoE= - -umask@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/umask/-/umask-1.1.0.tgz#f29cebf01df517912bb58ff9c4e50fde8e33320d" - integrity sha1-8pzr8B31F5ErtY/5xOUP3o4zMg0= + version "3.19.3" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.19.3.tgz#82315e9bbc6f2b25888858acd1fff8441035b77f" + integrity sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ== umd-compat-loader@^2.1.2: version "2.1.2" @@ -14783,17 +13730,17 @@ umd-compat-loader@^2.1.2: loader-utils "^1.0.3" recast "^0.11.17" -unbox-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" - integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== +unbox-primitive@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.1.0.tgz#8d9d2c9edeea8460c7f35033a88867944934d1e2" + integrity sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw== dependencies: - call-bind "^1.0.2" + call-bound "^1.0.3" has-bigints "^1.0.2" - has-symbols "^1.0.3" - which-boxed-primitive "^1.0.2" + has-symbols "^1.1.0" + which-boxed-primitive "^1.1.1" -unbzip2-stream@^1.0.9: +unbzip2-stream@^1.0.9, unbzip2-stream@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz#b0da04c4371311df771cdc215e87f2130991ace7" integrity sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg== @@ -14801,15 +13748,25 @@ unbzip2-stream@^1.0.9: buffer "^5.2.1" through "^2.3.8" +undici-types@~6.19.2: + version "6.19.8" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" + integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== + +undici-types@~6.20.0: + version "6.20.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433" + integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== + unfetch@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-4.2.0.tgz#7e21b0ef7d363d8d9af0fb929a5555f6ef97a3be" integrity sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA== unicode-canonical-property-names-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" - integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== + version "2.0.1" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz#cb3173fe47ca743e228216e4a3ddc4c84d628cc2" + integrity sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg== unicode-match-property-ecmascript@^2.0.0: version "2.0.0" @@ -14819,15 +13776,15 @@ unicode-match-property-ecmascript@^2.0.0: unicode-canonical-property-names-ecmascript "^2.0.0" unicode-property-aliases-ecmascript "^2.0.0" -unicode-match-property-value-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz#1a01aa57247c14c568b89775a54938788189a714" - integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw== +unicode-match-property-value-ecmascript@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz#a0401aee72714598f739b68b104e4fe3a0cb3c71" + integrity sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg== unicode-property-aliases-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz#0a36cb9a585c4f6abd51ad1deddb285c165297c8" - integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ== + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" + integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== unified@^10.0.0: version "10.1.2" @@ -14842,142 +13799,113 @@ unified@^10.0.0: trough "^2.0.0" vfile "^5.0.0" -union-value@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" - integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== +union@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/union/-/union-0.5.0.tgz#b2c11be84f60538537b846edb9ba266ba0090075" + integrity sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA== dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^2.0.1" + qs "^6.4.0" -unique-filename@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" - integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== +unique-filename@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-2.0.1.tgz#e785f8675a9a7589e0ac77e0b5c34d2eaeac6da2" + integrity sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A== dependencies: - unique-slug "^2.0.0" + unique-slug "^3.0.0" -unique-slug@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" - integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== +unique-filename@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-3.0.0.tgz#48ba7a5a16849f5080d26c760c86cf5cf05770ea" + integrity sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g== dependencies: - imurmurhash "^0.1.4" + unique-slug "^4.0.0" -unist-builder@^3.0.0: +unique-slug@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/unist-builder/-/unist-builder-3.0.0.tgz#728baca4767c0e784e1e64bb44b5a5a753021a04" - integrity sha512-GFxmfEAa0vi9i5sd0R2kcrI9ks0r82NasRq5QHh2ysGngrc6GiqD5CDf1FjPenY4vApmFASBIIlk/jj5J5YbmQ== + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-3.0.0.tgz#6d347cf57c8a7a7a6044aabd0e2d74e4d76dc7c9" + integrity sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w== dependencies: - "@types/unist" "^2.0.0" + imurmurhash "^0.1.4" + +unique-slug@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-4.0.0.tgz#6bae6bb16be91351badd24cdce741f892a6532e3" + integrity sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ== + dependencies: + imurmurhash "^0.1.4" unist-util-generated@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-2.0.0.tgz#86fafb77eb6ce9bfa6b663c3f5ad4f8e56a60113" - integrity sha512-TiWE6DVtVe7Ye2QxOVW9kqybs6cZexNwTwSMVgkfjEReqy/xwGpAXb99OxktoWwmL+Z+Epb0Dn8/GNDYP1wnUw== + version "2.0.1" + resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-2.0.1.tgz#e37c50af35d3ed185ac6ceacb6ca0afb28a85cae" + integrity sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A== unist-util-is@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-5.1.1.tgz#e8aece0b102fa9bc097b0fef8f870c496d4a6236" - integrity sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ== - -unist-util-position@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-4.0.3.tgz#5290547b014f6222dff95c48d5c3c13a88fadd07" - integrity sha512-p/5EMGIa1qwbXjA+QgcBXaPWjSnZfQ2Sc3yBEEfgPwsEmJd8Qh+DSk3LGnmOM4S1bY2C0AjmMnB8RuEYxpPwXQ== - dependencies: - "@types/unist" "^2.0.0" - -unist-util-stringify-position@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz#5c6aa07c90b1deffd9153be170dce628a869a447" - integrity sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg== + version "5.2.1" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-5.2.1.tgz#b74960e145c18dcb6226bc57933597f5486deae9" + integrity sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw== dependencies: "@types/unist" "^2.0.0" -unist-util-visit-parents@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-4.1.1.tgz#e83559a4ad7e6048a46b1bdb22614f2f3f4724f2" - integrity sha512-1xAFJXAKpnnJl8G7K5KgU7FY55y3GcLIXqkzUj5QF/QVP7biUm0K0O2oqVkYsdjzJKifYeWn9+o6piAK2hGSHw== +unist-util-position@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-4.0.4.tgz#93f6d8c7d6b373d9b825844645877c127455f037" + integrity sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg== dependencies: "@types/unist" "^2.0.0" - unist-util-is "^5.0.0" -unist-util-visit-parents@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-5.1.0.tgz#44bbc5d25f2411e7dfc5cecff12de43296aa8521" - integrity sha512-y+QVLcY5eR/YVpqDsLf/xh9R3Q2Y4HxkZTp7ViLDU6WtJCEcPmRzW1gpdWDCDIqIlhuPDXOgttqPlykrHYDekg== +unist-util-stringify-position@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz#03ad3348210c2d930772d64b489580c13a7db39d" + integrity sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg== dependencies: "@types/unist" "^2.0.0" - unist-util-is "^5.0.0" -unist-util-visit@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-3.1.0.tgz#9420d285e1aee938c7d9acbafc8e160186dbaf7b" - integrity sha512-Szoh+R/Ll68QWAyQyZZpQzZQm2UPbxibDvaY8Xc9SUtYgPsDzx5AWSk++UUt2hJuow8mvwR+rG+LQLw+KsuAKA== +unist-util-visit-parents@^5.1.1: + version "5.1.3" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz#b4520811b0ca34285633785045df7a8d6776cfeb" + integrity sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg== dependencies: "@types/unist" "^2.0.0" unist-util-is "^5.0.0" - unist-util-visit-parents "^4.0.0" unist-util-visit@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-4.1.0.tgz#f41e407a9e94da31594e6b1c9811c51ab0b3d8f5" - integrity sha512-n7lyhFKJfVZ9MnKtqbsqkQEk5P1KShj0+//V7mAcoI6bpbUjh3C/OG8HVD+pBihfh6Ovl01m8dkcv9HNqYajmQ== + version "4.1.2" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-4.1.2.tgz#125a42d1eb876283715a3cb5cceaa531828c72e2" + integrity sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg== dependencies: "@types/unist" "^2.0.0" unist-util-is "^5.0.0" - unist-util-visit-parents "^5.0.0" - -universal-user-agent@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-4.0.1.tgz#fd8d6cb773a679a709e967ef8288a31fcc03e557" - integrity sha512-LnST3ebHwVL2aNe4mejI9IQh2HfZ1RLo8Io2HugSif8ekzD1TlWpHpColOB/eh8JHMLkGH3Akqf040I+4ylNxg== - dependencies: - os-name "^3.1.0" + unist-util-visit-parents "^5.1.1" universal-user-agent@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.0.tgz#3381f8503b251c0d9cd21bc1de939ec9df5480ee" - integrity sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w== + version "6.0.1" + resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.1.tgz#15f20f55da3c930c57bddbf1734c6654d5fd35aa" + integrity sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ== -universalify@^0.1.0, universalify@^0.1.2: +universalify@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== +universalify@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" + integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== + universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + version "2.0.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= - -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== -unzip-stream@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/unzip-stream/-/unzip-stream-0.3.1.tgz#2333b5cd035d29db86fb701ca212cf8517400083" - integrity sha512-RzaGXLNt+CW+T41h1zl6pGz3EaeVhYlK+rdAap+7DxW5kqsqePO8kRtWPaCiVqdhZc86EctSPVYNix30YOMzmw== - dependencies: - binary "^0.3.0" - mkdirp "^0.5.1" - -unzipper@^0.10.5: - version "0.10.11" - resolved "https://registry.yarnpkg.com/unzipper/-/unzipper-0.10.11.tgz#0b4991446472cbdb92ee7403909f26c2419c782e" - integrity sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw== +unzipper@^0.10.11: + version "0.10.14" + resolved "https://registry.yarnpkg.com/unzipper/-/unzipper-0.10.14.tgz#d2b33c977714da0fbc0f82774ad35470a7c962b1" + integrity sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g== dependencies: big-integer "^1.6.17" binary "~0.3.0" @@ -15005,10 +13933,18 @@ unzipper@^0.9.11: readable-stream "~2.3.6" setimmediate "~1.0.4" -upath@^1.1.2, upath@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" - integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== +upath@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/upath/-/upath-2.0.1.tgz#50c73dea68d6f6b990f51d279ce6081665d61a8b" + integrity sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w== + +update-browserslist-db@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz#348377dd245216f9e7060ff50b15a1b740b75420" + integrity sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw== + dependencies: + escalade "^3.2.0" + picocolors "^1.1.1" upper-case-first@^2.0.2: version "2.0.2" @@ -15031,95 +13967,97 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= - url-join@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/url-join/-/url-join-4.0.1.tgz#b642e21a2646808ffa178c4c5fda39844e12cde7" integrity sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA== -url-parse-lax@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" - integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= +url-parse@^1.5.3: + version "1.5.10" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== dependencies: - prepend-http "^2.0.0" + querystringify "^2.1.1" + requires-port "^1.0.0" -url-to-options@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9" - integrity sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k= - -url@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" - integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= - dependencies: - punycode "1.3.2" - querystring "0.2.0" +urlpattern-polyfill@10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz#f0a03a97bfb03cdf33553e5e79a2aadd22cac8ec" + integrity sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg== -use@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== +use-isomorphic-layout-effect@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.2.0.tgz#afb292eb284c39219e8cb8d3d62d71999361a21d" + integrity sha512-q6ayo8DWoPZT0VdG4u3D3uxcgONP3Mevx2i2b0434cwWBoL+aelL1DzkXI6w3PhTZzUeR2kaVlZn70iCiseP6w== user-home@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f" - integrity sha1-nHC/2Babwdy/SGBODwS4tJzenp8= + integrity sha512-KMWqdlOcjCYdtIJpicDSFBQ8nFwS2i9sslAd6f4+CBGcU4gist2REnr2fxj2YocvJFxSF3ZOHLYLVZnUxv4BZQ== dependencies: os-homedir "^1.0.0" +utf8-byte-length@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz#f9f63910d15536ee2b2d5dd4665389715eac5c1e" + integrity sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA== + util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== -util-promisify@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/util-promisify/-/util-promisify-2.1.0.tgz#3c2236476c4d32c5ff3c47002add7c13b9a82a53" - integrity sha1-PCI2R2xNMsX/PEcAKt18E7moKlM= +util@^0.12.5: + version "0.12.5" + resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" + integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== dependencies: - object.getownpropertydescriptors "^2.0.3" + inherits "^2.0.3" + is-arguments "^1.0.4" + is-generator-function "^1.0.7" + is-typed-array "^1.1.3" + which-typed-array "^1.1.2" utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= - -uuid@^3.0.1, uuid@^3.2.1, uuid@^3.3.2: - version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== uuid@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.3.tgz#c5c9f2c8cf25dc0a372c4df1441c41f5bd0c680b" integrity sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg== -uuid@^8.0.0, uuid@^8.3.2: +uuid@^8.3.2: version "8.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== +uuid@^9.0.0, uuid@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" + integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== + uvu@^0.5.0: - version "0.5.3" - resolved "https://registry.yarnpkg.com/uvu/-/uvu-0.5.3.tgz#3d83c5bc1230f153451877bfc7f4aea2392219ae" - integrity sha512-brFwqA3FXzilmtnIyJ+CxdkInkY/i4ErvP7uV0DnUVxQcQ55reuHphorpF+tZoVHK2MniZ/VJzI7zJQoc9T9Yw== + version "0.5.6" + resolved "https://registry.yarnpkg.com/uvu/-/uvu-0.5.6.tgz#2754ca20bcb0bb59b64e9985e84d2e81058502df" + integrity sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA== dependencies: dequal "^2.0.0" diff "^5.0.0" kleur "^4.0.3" sade "^1.7.3" -v8-compile-cache@^2.0.3, v8-compile-cache@^2.2.0: +v8-compile-cache@2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== +v8-compile-cache@^2.2.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz#cdada8bec61e15865f05d097c5f4fd30e94dc128" + integrity sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw== + v8-to-istanbul@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-1.2.1.tgz#8f63a94b7f91243f5dcc6a495540b5653beb1279" @@ -15128,11 +14066,11 @@ v8-to-istanbul@^1.2.1: valid-filename@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/valid-filename/-/valid-filename-2.0.1.tgz#0768d6f364b1ed3bdf68f0d15abffb0d9d6cecaf" - integrity sha1-B2jW82Sx7TvfaPDRWr/7DZ1s7K8= + integrity sha512-7eF/iUZ5SPd3FighoKgatSjXDJ25Vopo/6yvEKGyX4FIeZVHcLjHmyvbQ1WdFD9RQZ9PoBA7nrSxxAz/oC64SQ== dependencies: filename-reserved-regex "^2.0.0" -validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.3: +validate-npm-package-license@3.0.4, validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== @@ -15140,39 +14078,51 @@ validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.3: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" +validate-npm-package-name@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz#f16afd48318e6f90a1ec101377fa0384cfc8c713" + integrity sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ== + dependencies: + builtins "^5.0.0" + validate-npm-package-name@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" - integrity sha1-X6kS2B630MdK/BQN5zF/DKffQ34= + integrity sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw== dependencies: builtins "^1.0.3" +validate-npm-package-name@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz#a316573e9b49f3ccd90dbb6eb52b3f06c6d604e8" + integrity sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ== + vary@^1, vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= +verror@^1.10.0: + version "1.10.1" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.1.tgz#4bf09eeccf4563b109ed4b3d458380c972b0cdeb" + integrity sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg== dependencies: assert-plus "^1.0.0" core-util-is "1.0.2" extsprintf "^1.2.0" vfile-message@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-3.1.2.tgz#a2908f64d9e557315ec9d7ea3a910f658ac05f7d" - integrity sha512-QjSNP6Yxzyycd4SVOtmKKyTsSvClqBPJcd00Z0zuPj3hOIjg0rUPG6DbFGPvUKRgYyaIWLPKpuEclcuvb3H8qA== + version "3.1.4" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-3.1.4.tgz#15a50816ae7d7c2d1fa87090a7f9f96612b59dea" + integrity sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw== dependencies: "@types/unist" "^2.0.0" unist-util-stringify-position "^3.0.0" vfile@^5.0.0: - version "5.3.2" - resolved "https://registry.yarnpkg.com/vfile/-/vfile-5.3.2.tgz#b499fbc50197ea50ad3749e9b60beb16ca5b7c54" - integrity sha512-w0PLIugRY3Crkgw89TeMvHCzqCs/zpreR31hl4D92y6SOE07+bfJe+dK5Q2akwS+i/c801kzjoOr9gMcTe6IAA== + version "5.3.7" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-5.3.7.tgz#de0677e6683e3380fafc46544cfe603118826ab7" + integrity sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g== dependencies: "@types/unist" "^2.0.0" is-buffer "^2.0.0" @@ -15182,9 +14132,9 @@ vfile@^5.0.0: vhost@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/vhost/-/vhost-3.0.2.tgz#2fb1decd4c466aa88b0f9341af33dc1aff2478d5" - integrity sha1-L7HezUxGaqiLD5NBrzPcGv8keNU= + integrity sha512-S3pJdWrpFWrKMboRU4dLYgMrTgoPALsmYwOvyebK2M6X95b9kQrjZy5rwl3uzzpfpENe/XrNYu/2U+e7/bmT5g== -vinyl@^2.2.0: +vinyl@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.2.1.tgz#23cfb8bbab5ece3803aa2c0a1eb28af7cbba1974" integrity sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw== @@ -15196,77 +14146,64 @@ vinyl@^2.2.0: remove-trailing-separator "^1.0.1" replace-ext "^1.0.0" -vscode-debugprotocol@^1.32.0: - version "1.51.0" - resolved "https://registry.yarnpkg.com/vscode-debugprotocol/-/vscode-debugprotocol-1.51.0.tgz#c03168dac778b6c24ce17b3511cb61e89c11b2df" - integrity sha512-dzKWTMMyebIMPF1VYMuuQj7gGFq7guR8AFya0mKacu+ayptJfaRuM0mdHCqiOth4FnRP8mPhEroFPx6Ift8wHA== +vscode-arduino-api@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/vscode-arduino-api/-/vscode-arduino-api-0.1.2.tgz#11d294fd72c36bbea1ccacd101f16c11df490b77" + integrity sha512-FxZllcBIUKxYMiakCSOZ2VSaxscQACxzo0tI5xu8HrbDBU5yvl4zvBzwss4PIYvBG0oZeSKDf950i37Qn7dcmA== + dependencies: + "@types/vscode" "^1.78.0" + ardunno-cli "^0.1.2" + safe-stable-stringify "^2.4.3" -vscode-jsonrpc@^5.0.0, vscode-jsonrpc@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-5.0.1.tgz#9bab9c330d89f43fc8c1e8702b5c36e058a01794" - integrity sha512-JvONPptw3GAQGXlVV2utDcHx0BiY34FupW/kI6mZ5x06ER5DdPG/tXWMVHjTNULF5uKPOUUD0SaXg5QaubJL0A== +vscode-jsonrpc@8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz#f43dfa35fb51e763d17cd94dcca0c9458f35abf9" + integrity sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA== -vscode-languageserver-protocol@~3.15.3: - version "3.15.3" - resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.15.3.tgz#3fa9a0702d742cf7883cb6182a6212fcd0a1d8bb" - integrity sha512-zrMuwHOAQRhjDSnflWdJG+O2ztMWss8GqUUB8dXLR/FPenwkiBNkMIJJYfSN6sgskvsF0rHAoBowNQfbyZnnvw== +vscode-languageserver-protocol@^3.17.2: + version "3.17.5" + resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz#864a8b8f390835572f4e13bd9f8313d0e3ac4bea" + integrity sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg== dependencies: - vscode-jsonrpc "^5.0.1" - vscode-languageserver-types "3.15.1" + vscode-jsonrpc "8.2.0" + vscode-languageserver-types "3.17.5" vscode-languageserver-textdocument@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.4.tgz#3cd56dd14cec1d09e86c4bb04b09a246cb3df157" - integrity sha512-/xhqXP/2A2RSs+J8JNXpiiNVvvNM0oTosNVmQnunlKvq9o4mupHOBAnnzH0lwIPKazXKvAKsVp1kr+H/K4lgoQ== + version "1.0.12" + resolved "https://registry.yarnpkg.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz#457ee04271ab38998a093c68c2342f53f6e4a631" + integrity sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA== -vscode-languageserver-types@3.15.1: - version "3.15.1" - resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.15.1.tgz#17be71d78d2f6236d414f0001ce1ef4d23e6b6de" - integrity sha512-+a9MPUQrNGRrGU630OGbYVQ+11iOIovjCkqxajPa9w57Sd5ruK8WQNsslzpa0x/QJqC8kRc2DUxWjIFwoNm4ZQ== +vscode-languageserver-types@3.17.5: + version "3.17.5" + resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz#3273676f0cf2eab40b3f44d085acbb7f08a39d8a" + integrity sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg== -vscode-ripgrep@^1.2.4: - version "1.13.2" - resolved "https://registry.yarnpkg.com/vscode-ripgrep/-/vscode-ripgrep-1.13.2.tgz#8ccebc33f14d54442c4b11962aead163c55b506e" - integrity sha512-RlK9U87EokgHfiOjDQ38ipQQX936gWOcWPQaJpYf+kAkz1PQ1pK2n7nhiscdOmLu6XGjTs7pWFJ/ckonpN7twQ== - dependencies: - https-proxy-agent "^4.0.0" - proxy-from-env "^1.1.0" +vscode-oniguruma@1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/vscode-oniguruma/-/vscode-oniguruma-1.6.1.tgz#2bf4dfcfe3dd2e56eb549a3068c8ee39e6c30ce5" + integrity sha512-vc4WhSIaVpgJ0jJIejjYxPvURJavX6QG41vu0mGhqywMkQqulezEqEQ3cO3gc8GvcOpX6ycmKGqRoROEMBNXTQ== -vscode-textmate@^4.0.1, vscode-textmate@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-4.4.0.tgz#14032afeb50152e8f53258c95643e555f2948305" - integrity sha512-dFpm2eK0HwEjeFSD1DDh3j0q47bDSVuZt20RiJWxGqjtm73Wu2jip3C2KaZI3dQx/fSeeXCr/uEN4LNaNj7Ytw== - dependencies: - oniguruma "^7.2.0" +vscode-textmate@^9.0.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-9.2.0.tgz#be2b04b3f8853135b2d67274670540215c5bb92b" + integrity sha512-rkvG4SraZQaPSN/5XjwKswdU0OP9MF28QjrYzUBbhb8QyG3ljB1Ky996m++jiI7KdiAP2CkBiQZd9pqEDTClqA== vscode-uri@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-2.1.2.tgz#c8d40de93eb57af31f3c715dd650e2ca2c096f1c" integrity sha512-8TEXQxlldWAuIODdukIb+TR5s+9Ds40eSJrw+1iDDA9IFORPjMELarNQE3myz5XIkWWpdprmJjm1/SxMlWOC8A== -vscode-ws-jsonrpc@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/vscode-ws-jsonrpc/-/vscode-ws-jsonrpc-0.2.0.tgz#5e9c26e10da54a1a235da7d59e74508bbcb8edd9" - integrity sha512-NE9HNRgPjCaPyTJvIudcpyIWPImxwRDtuTX16yks7SAiZgSXigxAiZOvSvVBGmD1G/OMfrFo6BblOtjVR9DdVA== - dependencies: - vscode-jsonrpc "^5.0.0" - -w3c-hr-time@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" - integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== +w3c-xmlserializer@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz#aebdc84920d806222936e3cdce408e32488a3073" + integrity sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw== dependencies: - browser-process-hrtime "^1.0.0" + xml-name-validator "^4.0.0" -warning-symbol@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/warning-symbol/-/warning-symbol-0.1.0.tgz#bb31dd11b7a0f9d67ab2ed95f457b65825bbad21" - integrity sha1-uzHdEbeg+dZ6su2V9Fe2WCW7rSE= - -watchpack@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.3.1.tgz#4200d9447b401156eeca7767ee610f8809bc9d25" - integrity sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA== +watchpack@^2.4.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.2.tgz#2feeaed67412e7c33184e5a79ca738fbd38564da" + integrity sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw== dependencies: glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" @@ -15274,19 +14211,24 @@ watchpack@^2.3.1: wcwidth@^1.0.0, wcwidth@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" - integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= + integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== dependencies: defaults "^1.0.3" +web-streams-polyfill@^3.0.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz#2073b91a2fdb1fbfbd401e7de0ac9f8214cecb4b" + integrity sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw== + webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== -webidl-conversions@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" - integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== +webidl-conversions@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" + integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== webpack-cli@4.7.0: version "4.7.0" @@ -15308,11 +14250,12 @@ webpack-cli@4.7.0: webpack-merge "^5.7.3" webpack-merge@^5.7.3: - version "5.8.0" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61" - integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== + version "5.10.0" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.10.0.tgz#a3ad5d773241e9c682803abf628d4cd62b8a4177" + integrity sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA== dependencies: clone-deep "^4.0.1" + flat "^5.0.2" wildcard "^2.0.0" webpack-sources@^3.2.3: @@ -15320,118 +14263,127 @@ webpack-sources@^3.2.3: resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== -webpack@^5.48.0: - version "5.72.1" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.72.1.tgz#3500fc834b4e9ba573b9f430b2c0a61e1bb57d13" - integrity sha512-dXG5zXCLspQR4krZVR6QgajnZOjW2K/djHvdcRaDQvsjV9z9vaW6+ja5dZOYbqBBjF6kGXka/2ZyxNdc+8Jung== - dependencies: - "@types/eslint-scope" "^3.7.3" - "@types/estree" "^0.0.51" - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/wasm-edit" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - acorn "^8.4.1" - acorn-import-assertions "^1.7.6" - browserslist "^4.14.5" +webpack@^5.76.0: + version "5.98.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.98.0.tgz#44ae19a8f2ba97537978246072fb89d10d1fbd17" + integrity sha512-UFynvx+gM44Gv9qFgj0acCQK2VE1CtdfwFdimkapco3hlPCJ/zeq73n2yVKimVbtm+TnApIugGhLJnkU6gjYXA== + dependencies: + "@types/eslint-scope" "^3.7.7" + "@types/estree" "^1.0.6" + "@webassemblyjs/ast" "^1.14.1" + "@webassemblyjs/wasm-edit" "^1.14.1" + "@webassemblyjs/wasm-parser" "^1.14.1" + acorn "^8.14.0" + browserslist "^4.24.0" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.9.3" - es-module-lexer "^0.9.0" + enhanced-resolve "^5.17.1" + es-module-lexer "^1.2.1" eslint-scope "5.1.1" events "^3.2.0" glob-to-regexp "^0.4.1" - graceful-fs "^4.2.9" + graceful-fs "^4.2.11" json-parse-even-better-errors "^2.3.1" loader-runner "^4.2.0" mime-types "^2.1.27" neo-async "^2.6.2" - schema-utils "^3.1.0" + schema-utils "^4.3.0" tapable "^2.1.1" - terser-webpack-plugin "^5.1.3" - watchpack "^2.3.1" + terser-webpack-plugin "^5.3.11" + watchpack "^2.4.1" webpack-sources "^3.2.3" -whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3: - version "1.0.5" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" - integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== +whatwg-encoding@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz#e7635f597fd87020858626805a2729fa7698ac53" + integrity sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg== dependencies: - iconv-lite "0.4.24" + iconv-lite "0.6.3" -whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" - integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== +whatwg-mimetype@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" + integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== + +whatwg-url@^12.0.0, whatwg-url@^12.0.1: + version "12.0.1" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-12.0.1.tgz#fd7bcc71192e7c3a2a97b9a8d6b094853ed8773c" + integrity sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ== + dependencies: + tr46 "^4.1.1" + webidl-conversions "^7.0.0" whatwg-url@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== dependencies: tr46 "~0.0.3" webidl-conversions "^3.0.0" -whatwg-url@^6.4.1: - version "6.5.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" - integrity sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ== +which-boxed-primitive@^1.0.2, which-boxed-primitive@^1.1.0, which-boxed-primitive@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz#d76ec27df7fa165f18d5808374a5fe23c29b176e" + integrity sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA== dependencies: - lodash.sortby "^4.7.0" - tr46 "^1.0.1" - webidl-conversions "^4.0.2" + is-bigint "^1.1.0" + is-boolean-object "^1.2.1" + is-number-object "^1.1.1" + is-string "^1.1.1" + is-symbol "^1.1.1" -whatwg-url@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" - integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== - dependencies: - lodash.sortby "^4.7.0" - tr46 "^1.0.1" - webidl-conversions "^4.0.2" +which-builtin-type@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.2.1.tgz#89183da1b4907ab089a6b02029cc5d8d6574270e" + integrity sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q== + dependencies: + call-bound "^1.0.2" + function.prototype.name "^1.1.6" + has-tostringtag "^1.0.2" + is-async-function "^2.0.0" + is-date-object "^1.1.0" + is-finalizationregistry "^1.1.0" + is-generator-function "^1.0.10" + is-regex "^1.2.1" + is-weakref "^1.0.2" + isarray "^2.0.5" + which-boxed-primitive "^1.1.0" + which-collection "^1.0.2" + which-typed-array "^1.1.16" -which-boxed-primitive@^1.0.1, which-boxed-primitive@^1.0.2: +which-collection@^1.0.1, which-collection@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== - dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" - -which-collection@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" - integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" + integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== dependencies: - is-map "^2.0.1" - is-set "^2.0.1" - is-weakmap "^2.0.1" - is-weakset "^2.0.1" + is-map "^2.0.3" + is-set "^2.0.3" + is-weakmap "^2.0.2" + is-weakset "^2.0.3" which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + version "2.0.1" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" + integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== which-pm-runs@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.1.0.tgz#35ccf7b1a0fce87bd8b92a478c9d045785d3bf35" integrity sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA== -which-typed-array@^1.1.2: - version "1.1.8" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.8.tgz#0cfd53401a6f334d90ed1125754a42ed663eb01f" - integrity sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw== +which-typed-array@^1.1.13, which-typed-array@^1.1.16, which-typed-array@^1.1.18, which-typed-array@^1.1.2: + version "1.1.19" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.19.tgz#df03842e870b6b88e117524a4b364b6fc689f956" + integrity sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw== dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - es-abstract "^1.20.0" - for-each "^0.3.3" - has-tostringtag "^1.0.0" - is-typed-array "^1.1.9" + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" + call-bound "^1.0.4" + for-each "^0.3.5" + get-proto "^1.0.1" + gopd "^1.2.0" + has-tostringtag "^1.0.2" -which@1.3.1, which@^1.2.8, which@^1.2.9, which@^1.3.1: +which@^1.2.9: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -15445,12 +14397,12 @@ which@^2.0.1, which@^2.0.2: dependencies: isexe "^2.0.0" -wide-align@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== +which@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/which/-/which-3.0.1.tgz#89f1cd0c23f629a8105ffe69b8172791c87b4be1" + integrity sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg== dependencies: - string-width "^1.0.2 || 2" + isexe "^2.0.0" wide-align@^1.1.0, wide-align@^1.1.2, wide-align@^1.1.5: version "1.1.5" @@ -15460,31 +14412,24 @@ wide-align@^1.1.0, wide-align@^1.1.2, wide-align@^1.1.5: string-width "^1.0.2 || 2 || 3 || 4" wildcard@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" - integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== + version "2.0.1" + resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" + integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== winchan@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/winchan/-/winchan-0.2.2.tgz#6766917b88e5e1cb75f455ffc7cc13f51e5c834e" integrity sha512-pvN+IFAbRP74n/6mc6phNyCH8oVkzXsto4KCHPJ2AScniAnA1AmeLI03I2BzjePpaClGSI4GUMowzsD3qz5PRQ== -windows-release@^3.1.0: - version "3.3.3" - resolved "https://registry.yarnpkg.com/windows-release/-/windows-release-3.3.3.tgz#1c10027c7225743eec6b89df160d64c2e0293999" - integrity sha512-OSOGH1QYiW5yVor9TtmXKQvt2vjQqbYS+DqmsZw+r7xDwLXEeT3JGW0ZppFmHx4diyXmxt238KFR3N9jzevBRg== - dependencies: - execa "^1.0.0" - -word-wrap@^1.2.3, word-wrap@~1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== +word-wrap@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== wordwrap@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= + integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== worker-loader@^3.0.8: version "3.0.8" @@ -15494,24 +14439,21 @@ worker-loader@^3.0.8: loader-utils "^2.0.0" schema-utils "^3.0.0" -wrap-ansi@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" - integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" +workerpool@^6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.5.1.tgz#060f73b39d0caf97c6db64da004cd01b4c099544" + integrity sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA== -wrap-ansi@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" - integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: - ansi-styles "^3.2.0" - string-width "^3.0.0" - strip-ansi "^5.0.0" + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" -wrap-ansi@^6.2.0: +wrap-ansi@^6.0.1, wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== @@ -15520,21 +14462,29 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +write-file-atomic@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-5.0.1.tgz#68df4717c55c6fa4281a7860b4c2ba0a6d2b11e7" + integrity sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^4.0.1" -write-file-atomic@^2.0.0, write-file-atomic@^2.3.0, write-file-atomic@^2.4.2: +write-file-atomic@^2.0.0, write-file-atomic@^2.4.2: version "2.4.3" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== @@ -15546,7 +14496,7 @@ write-file-atomic@^2.0.0, write-file-atomic@^2.3.0, write-file-atomic@^2.4.2: write-json-file@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/write-json-file/-/write-json-file-2.3.0.tgz#2b64c8a33004d54b8698c76d585a77ceb61da32f" - integrity sha1-K2TIozAE1UuGmMdtWFp3zrYdoy8= + integrity sha512-84+F0igFp2dPD6UpAQjOUX3CdKUOqUzn6oE9sDBNzUXINR5VceJ1rauZltqQB/bcYsx3EpKys4C7/PivKUAiWQ== dependencies: detect-indent "^5.0.0" graceful-fs "^4.1.2" @@ -15567,70 +14517,64 @@ write-json-file@^3.2.0: sort-keys "^2.0.0" write-file-atomic "^2.4.2" -write-pkg@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/write-pkg/-/write-pkg-3.2.0.tgz#0e178fe97820d389a8928bc79535dbe68c2cff21" - integrity sha512-tX2ifZ0YqEFOF1wjRW2Pk93NLsj02+n1UP5RvO6rCs0K6R2g1padvf006cY74PQJKMGS2r42NK7FD0dG6Y6paw== +write-pkg@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/write-pkg/-/write-pkg-4.0.0.tgz#675cc04ef6c11faacbbc7771b24c0abbf2a20039" + integrity sha512-v2UQ+50TNf2rNHJ8NyWttfm/EJUBWMJcx6ZTYZr6Qp52uuegWw/lBkCtCbnYZEmPRNL61m+u67dAmGxo+HTULA== dependencies: sort-keys "^2.0.0" - write-json-file "^2.2.0" - -ws@^5.2.0: - version "5.2.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.3.tgz#05541053414921bc29c63bee14b8b0dd50b07b3d" - integrity sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA== - dependencies: - async-limiter "~1.0.0" - -ws@^6.1.0: - version "6.2.2" - resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e" - integrity sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw== - dependencies: - async-limiter "~1.0.0" + type-fest "^0.4.1" + write-json-file "^3.2.0" -ws@^7.1.2: - version "7.5.7" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.7.tgz#9e0ac77ee50af70d58326ecff7e85eb3fa375e67" - integrity sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A== +ws@^8.13.0, ws@^8.17.1, ws@^8.18.0: + version "8.18.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.1.tgz#ea131d3784e1dfdff91adb0a4a116b127515e3cb" + integrity sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w== -ws@~8.2.3: - version "8.2.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.2.3.tgz#63a56456db1b04367d0b721a0b80cae6d8becbba" - integrity sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA== +ws@~8.17.1: + version "8.17.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" + integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== -xdg-basedir@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-2.0.0.tgz#edbc903cc385fc04523d966a335504b5504d1bd2" - integrity sha1-7byQPMOF/ARSPZZqM1UEtVBNG9I= - dependencies: - os-homedir "^1.0.0" +xdg-basedir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" + integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== -xdg-trashdir@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/xdg-trashdir/-/xdg-trashdir-2.1.1.tgz#59a60aaf8e6f9240c1daed9a0944b2f514c27d8e" - integrity sha512-KcVhPaOu2ZurYNHSRTf1+ZHORkTZGCQ+u0JHN17QixRISJq4pXOnjt/lQcehvtHL5QAKhSzKgyjrcNnPdkPBHA== +xdg-trashdir@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/xdg-trashdir/-/xdg-trashdir-3.1.0.tgz#7294262d5793eb5488c2f529fba883ec32a24ea0" + integrity sha512-N1XQngeqMBoj9wM4ZFadVV2MymImeiFfYD+fJrNlcVcOHsJFFQe7n3b+aBoTPwARuq2HQxukfzVpQmAk1gN4sQ== dependencies: - "@sindresorhus/df" "^2.1.0" + "@sindresorhus/df" "^3.1.1" mount-point "^3.0.0" - pify "^2.2.0" user-home "^2.0.0" - xdg-basedir "^2.0.0" + xdg-basedir "^4.0.0" xhr2@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/xhr2/-/xhr2-0.2.1.tgz#4e73adc4f9cfec9cbd2157f73efdce3a5f108a93" integrity sha512-sID0rrVCqkVNUn8t6xuv9+6FViXjUVXq8H5rWOH2rz9fDNQEd4g0EA2XlcEdJXRz5BMEn4O1pJFdT+z4YHhoWw== -xml-name-validator@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" - integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== +xml-name-validator@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" + integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== -xmlhttprequest-ssl@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz#91360c86b914e67f44dce769180027c0da618c67" - integrity sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A== +xmlbuilder@>=11.0.1, xmlbuilder@^15.1.1: + version "15.1.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-15.1.1.tgz#9dcdce49eea66d8d10b42cae94a79c3c8d0c2ec5" + integrity sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg== + +xmlchars@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + +xmlhttprequest-ssl@~2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.2.tgz#e9e8023b3f29ef34b97a859f584c5e6c61418e23" + integrity sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ== xtend@^4.0.0, xtend@~4.0.1: version "4.0.2" @@ -15642,20 +14586,25 @@ xterm-addon-fit@^0.5.0: resolved "https://registry.yarnpkg.com/xterm-addon-fit/-/xterm-addon-fit-0.5.0.tgz#2d51b983b786a97dcd6cde805e700c7f913bc596" integrity sha512-DsS9fqhXHacEmsPxBJZvfj2la30Iz9xk+UKjhQgnYNkrUIN5CYLbw7WEfz117c7+S86S/tpHPfvNxJsF5/G8wQ== -xterm-addon-search@^0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/xterm-addon-search/-/xterm-addon-search-0.8.2.tgz#be7aa74d5ff12c901707c6ff674229f214318032" - integrity sha512-I1863mjn8P6uVrqm/X+btalVsqjAKLhnhpbP7SavAOpEkI1jJhbHU2UTp7NjeRtcKTks6UWk/ycgds5snDSejg== +xterm-addon-fit@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/xterm-addon-fit/-/xterm-addon-fit-0.8.0.tgz#48ca99015385141918f955ca7819e85f3691d35f" + integrity sha512-yj3Np7XlvxxhYF/EJ7p3KHaMt6OdwQ+HDu573Vx1lRXsVxOcnVJs51RgjZOouIZOczTsskaS+CpXspK81/DLqw== + +xterm-addon-search@^0.13.0: + version "0.13.0" + resolved "https://registry.yarnpkg.com/xterm-addon-search/-/xterm-addon-search-0.13.0.tgz#21286f4db48aa949fbefce34bb8bc0c9d3cec627" + integrity sha512-sDUwG4CnqxUjSEFh676DlS3gsh3XYCzAvBPSvJ5OPgF3MRL3iHLPfsb06doRicLC2xXNpeG2cWk8x1qpESWJMA== xterm@^4.16.0: - version "4.18.0" - resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.18.0.tgz#a1f6ab2c330c3918fb094ae5f4c2562987398ea1" - integrity sha512-JQoc1S0dti6SQfI0bK1AZvGnAxH4MVw45ZPFSO6FHTInAiau3Ix77fSxNx3mX4eh9OL4AYa8+4C8f5UvnSfppQ== + version "4.19.0" + resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.19.0.tgz#c0f9d09cd61de1d658f43ca75f992197add9ef6d" + integrity sha512-c3Cp4eOVsYY5Q839dR5IejghRPpxciGmLWWaP9g+ppfMeBChMeLa1DCA+pmX/jyDZ+zxFOmlJL/82qVdayVoGQ== -y18n@^3.2.1: - version "3.2.2" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.2.tgz#85c901bd6470ce71fc4bb723ad209b70f7f28696" - integrity sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ== +xterm@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/xterm/-/xterm-5.3.0.tgz#867daf9cc826f3d45b5377320aabd996cb0fce46" + integrity sha512-8QqjlekLUFTrU6x7xck1MsPzPA571K5zNqWm0M0oroYEWVOptZ0+ubQSkQ3uxIEhcIHRujJy6emDWX4A7qyFzg== y18n@^4.0.0: version "4.0.3" @@ -15670,9 +14619,9 @@ y18n@^5.0.5: yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= + integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A== -yallist@^3.0.0, yallist@^3.0.2, yallist@^3.1.1: +yallist@^3.0.2: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== @@ -15682,26 +14631,25 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yaml@^1.10.0, yaml@^1.7.2: +yaml@^1.10.0, yaml@^1.10.2: version "1.10.2" resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== -yargs-parser@13.1.2, yargs-parser@^13.1.2: - version "13.1.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" - integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" +yaml@^2.2.2: + version "2.7.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.7.0.tgz#aef9bb617a64c937a9a748803786ad8d3ffe1e98" + integrity sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA== -yargs-parser@^15.0.1: - version "15.0.3" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-15.0.3.tgz#316e263d5febe8b38eef61ac092b33dfcc9b1115" - integrity sha512-/MVEVjTXy/cGAjdtQf8dW3V9b97bPN7rNn8ETj6BmAQL7ibC7O1Q9SPJbGjgh3SlwoBNXMzj/ZGIj8mBgl12YA== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" +yargs-parser@20.2.4: + version "20.2.4" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== + +yargs-parser@21.1.1, yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== yargs-parser@^18.1.2: version "18.1.3" @@ -15711,82 +14659,33 @@ yargs-parser@^18.1.2: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^20.2.2, yargs-parser@^20.2.3: +yargs-parser@^20.2.2, yargs-parser@^20.2.3, yargs-parser@^20.2.9: version "20.2.9" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== -yargs-parser@^21.0.0: - version "21.0.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.0.1.tgz#0267f286c877a4f0f728fceb6f8a3e4cb95c6e35" - integrity sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg== - -yargs-parser@^9.0.2: - version "9.0.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077" - integrity sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc= - dependencies: - camelcase "^4.1.0" - -yargs-unparser@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f" - integrity sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw== - dependencies: - flat "^4.1.0" - lodash "^4.17.15" - yargs "^13.3.0" - -yargs@13.3.2, yargs@^13.3.0: - version "13.3.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" - integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== +yargs-unparser@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== dependencies: - cliui "^5.0.0" - find-up "^3.0.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^3.0.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^13.1.2" - -yargs@^11.1.0: - version "11.1.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.1.tgz#5052efe3446a4df5ed669c995886cc0f13702766" - integrity sha512-PRU7gJrJaXv3q3yQZ/+/X6KBswZiaQ+zOmdprZcouPYtQgvNU35i+68M4b1ZHLZtYFT5QObFLV+ZkmJYcwKdiw== - dependencies: - cliui "^4.0.0" - decamelize "^1.1.1" - find-up "^2.1.0" - get-caller-file "^1.0.1" - os-locale "^3.1.0" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1" - yargs-parser "^9.0.2" + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" -yargs@^14.2.2: - version "14.2.3" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-14.2.3.tgz#1a1c3edced1afb2a2fea33604bc6d1d8d688a414" - integrity sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg== +yargs@16.2.0, yargs@^16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== dependencies: - cliui "^5.0.0" - decamelize "^1.2.0" - find-up "^3.0.0" - get-caller-file "^2.0.1" + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^3.0.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^15.0.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" yargs@^15.3.1: version "15.4.1" @@ -15805,51 +14704,33 @@ yargs@^15.3.1: y18n "^4.0.0" yargs-parser "^18.1.2" -yargs@^16.2.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - -yargs@^17.0.1: - version "17.5.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.5.1.tgz#e109900cab6fcb7fd44b1d8249166feb0b36e58e" - integrity sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA== +yargs@^17.0.1, yargs@^17.6.2, yargs@^17.7.2: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== dependencies: - cliui "^7.0.2" + cliui "^8.0.1" escalade "^3.1.1" get-caller-file "^2.0.5" require-directory "^2.1.1" string-width "^4.2.3" y18n "^5.0.5" - yargs-parser "^21.0.0" + yargs-parser "^21.1.1" -yauzl@^2.10.0, yauzl@^2.4.2: +yauzl@^2.10.0, yauzl@^2.4.2, yauzl@^2.9.2: version "2.10.0" resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" - integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= + integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== dependencies: buffer-crc32 "~0.2.3" fd-slicer "~1.1.0" -year@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/year/-/year-0.2.1.tgz#4083ae520a318b23ec86037f3000cb892bdf9bb0" - integrity sha1-QIOuUgoxiyPshgN/MADLiSvfm7A= - -yeast@0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" - integrity sha1-AI4G2AlDIMNy28L47XagymyKxBk= - yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zod@3.23.8: + version "3.23.8" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.23.8.tgz#e37b957b5d52079769fb8097099b592f0ef4067d" + integrity sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==